@bpfdev/oly-ui 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/AddCommentInput/AddCommentInput.tsx","../src/components/AdvancedFiltersDialog/AdvancedFiltersDialog.tsx","../src/components/FalconMultiSelect/FalconMultiSelect.tsx","../src/components/ButtonWithIcon/ButtonWithIcon.tsx","../src/components/WidgetHeaderFilter/WidgetHeaderFilter.tsx","../src/components/utils/ChartWidgetHeaderSeparator/ChartWidgetHeaderSeparator.tsx","../src/components/ChartWidgetInfoButton/ChartWidgetInfoButton.tsx","../src/components/widgets/RankedBarList/RankedBarList.tsx","../src/components/tabs/ChartWidgetSegmentedTabs/ChartWidgetSegmentedTabs.tsx","../src/components/filters/TimePeriodFilter/TimePeriodFilter.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdownCustomizationContext.tsx","../src/components/QueueTimeBreakdown/queueTimeBreakdown.rechartsTooltip.ts","../src/components/QueueTimeBreakdown/queueTimeBreakdownCustomization.merge.ts","../src/components/filters/timePeriodFilter.infoPopover.ts","../src/components/FalconButton/FalconButton.tsx","../src/components/FalconDIstrictFilter/FalconDIstrictFilter.tsx","../src/components/FalconGrayButton/FalconGrayButton.tsx","../src/components/FalconPagination/FalconPagination.tsx","../src/components/FalconSelect/FalconSelect.tsx","../src/components/FalconSingleSwitch/FalconSingleSwitch.tsx","../src/components/FalconTable/FalconTable.tsx","../src/components/FalconTicketColumsFilter/FalconTicketColumsFilter.tsx","../src/components/FalconTicketFilter/FalconTicketFilter.tsx","../src/components/widgets/FootfallByAgeGroups/FootfallByAgeGroups.tsx","../src/components/_chart/resolveChartCardMaxWidth.ts","../src/components/HeatMapChartLegend/HeatMapChartLegend.tsx","../src/components/card/KpiStatCard/KpiStatCard.tsx","../src/components/card/KpiStatCard/useAnimatedMetric.ts","../src/components/ProgressBarNumber/ProgressBarNumber.tsx","../src/components/widgets/WalkinAnalysis/WalkinAnalysis.tsx","../src/components/widgets/FootfallByGender/FootfallByGender.tsx","../src/components/widgets/PasserbyConversion/PasserbyConversion.tsx","../src/components/_chart/useChartPlotScrollToEnd.ts","../src/components/widgets/WalkinTraffic/WalkinTraffic.tsx","../src/components/widgets/FootFallHeatMap/FootFallHeatMapView.tsx","../src/components/widgets/FootFallHeatMap/FootFallHeatMapView.types.ts","../src/components/widgets/FootFallHeatMap/footfallHeatMapDerivedStrip.ts","../src/components/widgets/FootFallHeatMap/footfallHeatMapTree.ts","../src/components/widgets/FootFallHeatMap/ZoneWiseKpiCards.tsx","../src/components/QueueTimeBreakdown/queueTimeBreakdown.chartTokens.ts","../src/components/QueueTimeBreakdown/QueueTimeBreakdown.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdownArea.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdownAreaTooltip.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdownDonut.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdownStackedBar.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdown.types.ts","../src/components/QueueTimeBreakdown/queueTimeBreakdown.mock.ts","../src/components/BillingCounterAnalytics/billingCounterAnalytics.chartTokens.ts","../src/components/BillingCounterAnalytics/billingCounterAnalytics.defaultInfoPopover.ts","../src/components/BillingCounterAnalytics/billingCounterAnalytics.mock.ts","../src/components/BillingCounterAnalytics/BillingCounterAnalytics.tsx","../src/components/BillingCounterAnalytics/billingCounterAnalyticsCustomization.merge.ts","../src/components/BillingCounterAnalytics/BillingCounterAnalyticsCustomizationContext.tsx","../src/components/BillingCounterAnalytics/BillingCounterAnalyticsTooltip.tsx","../src/components/widgets/PeakBillingHours/peakBillingHours.defaultInfoPopover.ts","../src/components/widgets/PeakBillingHours/peakBillingHours.mock.ts","../src/components/widgets/PeakBillingHours/PeakBillingHours.tsx","../src/components/widgets/PeakBillingHours/PeakBillingHoursCustomizationContext.tsx","../src/components/widgets/PeakBillingHours/PeakBillingHoursTooltip.tsx","../src/components/FalconThemeProvider/FalconThemeProvider.tsx"],"sourcesContent":["// Core components\nexport { AddCommentInput } from './components/AddCommentInput';\nexport type { AddCommentInputProps } from './components/AddCommentInput';\nexport { AdvancedFiltersDialog } from './components/AdvancedFiltersDialog';\nexport type { AdvancedFiltersDialogProps } from './components/AdvancedFiltersDialog';\nexport { ButtonWithIcon } from './components/ButtonWithIcon';\nexport type { ButtonWithIconProps } from './components/ButtonWithIcon';\nexport { WidgetHeaderFilter } from './components/WidgetHeaderFilter';\nexport type {\n WidgetHeaderFilterProps,\n WidgetHeaderFilterStyleProps,\n WidgetHeaderMultiSelectConfig,\n} from './components/WidgetHeaderFilter';\nexport { ChartWidgetHeaderSeparator } from './components/utils/ChartWidgetHeaderSeparator';\nexport { ChartWidgetInfoButton } from './components/ChartWidgetInfoButton';\nexport type {\n ChartWidgetInfoButtonProps,\n ChartWidgetInfoPopoverContent,\n} from './components/ChartWidgetInfoButton';\nexport { RankedBarList } from './components/widgets/RankedBarList';\nexport type {\n RankedBarListItem,\n RankedBarListProps,\n RankedBarListSegment,\n} from './components/widgets/RankedBarList';\n/** @deprecated Use {@link RankedBarList}. */\nexport { RankedBarList as ChartWidgetRankedBarList } from './components/widgets/RankedBarList';\n/** @deprecated Use {@link RankedBarListItem}. */\nexport type { RankedBarListItem as ChartWidgetRankedBarListItem } from './components/widgets/RankedBarList';\n/** @deprecated Use {@link RankedBarListProps}. */\nexport type { RankedBarListProps as ChartWidgetRankedBarListProps } from './components/widgets/RankedBarList';\n/** @deprecated Use {@link RankedBarListSegment}. */\nexport type { RankedBarListSegment as ChartWidgetRankedBarSegment } from './components/widgets/RankedBarList';\nexport { ChartWidgetSegmentedTabs } from './components/tabs/ChartWidgetSegmentedTabs';\nexport type {\n ChartWidgetSegmentedTab,\n ChartWidgetSegmentedTabLayout,\n ChartWidgetSegmentedTabsProps,\n} from './components/tabs/ChartWidgetSegmentedTabs';\nexport { TimePeriodFilter } from './components/filters/TimePeriodFilter';\nexport type { TimePeriodFilterProps } from './components/filters/TimePeriodFilter';\n/** @deprecated Use {@link TimePeriodFilter}. */\nexport { TimePeriodFilter as QueueTimePeriodFilter } from './components/filters/TimePeriodFilter';\n/** @deprecated Use {@link TimePeriodFilterProps}. */\nexport type { TimePeriodFilterProps as QueueTimePeriodFilterProps } from './components/filters/TimePeriodFilter';\nexport {\n CHART_PERIOD_FILTER_INFO_POPOVER,\n DEFAULT_QUEUE_TIME_BREAKDOWN_INFO_POPOVER,\n QUEUE_TIME_BREAKDOWN_INFO_POPOVER,\n TIME_PERIOD_FILTER_INFO_POPOVER,\n TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN,\n} from './components/filters/timePeriodFilter.infoPopover';\nexport { FalconButton } from './components/FalconButton';\nexport type { FalconButtonProps } from './components/FalconButton';\nexport { FalconDIstrictFilter } from './components/FalconDIstrictFilter';\nexport type {\n FalconDIstrictFilterOption,\n FalconDIstrictFilterProps,\n} from './components/FalconDIstrictFilter';\nexport { FalconGrayButton } from './components/FalconGrayButton';\nexport type { FalconGrayButtonProps } from './components/FalconGrayButton';\nexport { FalconMultiSelect } from './components/FalconMultiSelect';\nexport type {\n FalconMultiSelectOption,\n FalconMultiSelectProps,\n FalconMultiSelectStyleProps,\n} from './components/FalconMultiSelect';\nexport { FalconPagination } from './components/FalconPagination';\nexport type { FalconPaginationProps } from './components/FalconPagination';\nexport { FalconSelect } from './components/FalconSelect';\nexport type {\n FalconSelectOption,\n FalconSelectProps,\n} from './components/FalconSelect';\nexport { FalconSingleSwitch } from './components/FalconSingleSwitch';\nexport type { FalconSingleSwitchProps } from './components/FalconSingleSwitch';\nexport { FalconTable } from './components/FalconTable';\nexport type { FalconTableProps } from './components/FalconTable';\nexport { FalconTicketColumsFilter } from './components/FalconTicketColumsFilter';\nexport type { FalconTicketColumsFilterProps } from './components/FalconTicketColumsFilter';\nexport { FalconTicketFilter } from './components/FalconTicketFilter';\nexport type { FalconTicketFilterProps } from './components/FalconTicketFilter';\nexport { FootfallByAgeGroups } from './components/widgets/FootfallByAgeGroups';\nexport type {\n FootfallByAgeGroupsCardMaxWidth,\n FootfallByAgeGroupsChartColors,\n FootfallByAgeGroupsChartMargin,\n FootfallByAgeGroupsHorizontalScroll,\n FootfallByAgeGroupsProps,\n FootfallByAgeGroupsRow,\n FootfallByAgeGroupsSeries,\n FootfallByAgeGroupsTooltipStyles,\n} from './components/widgets/FootfallByAgeGroups';\nexport { HeatMapChartLegend } from './components/HeatMapChartLegend';\nexport type {\n HeatMapChartLegendProps,\n HeatMapLegendItem,\n} from './components/HeatMapChartLegend';\nexport { KpiStatCard } from './components/card/KpiStatCard';\nexport type {\n KpiStatCardDetailedProps,\n KpiStatCardIconBackdropShape,\n KpiStatCardInfoPlacement,\n KpiStatCardInlineProps,\n KpiStatCardProps,\n KpiTrend,\n KpiTrendLayout,\n} from './components/card/KpiStatCard';\nexport { ProgressBarNumber } from './components/ProgressBarNumber';\nexport type { ProgressBarNumberProps } from './components/ProgressBarNumber';\nexport { WalkinAnalysis } from './components/widgets/WalkinAnalysis';\nexport type {\n WalkinAnalysisCardMaxWidth,\n WalkinAnalysisPieSize,\n WalkinAnalysisProps,\n WalkinAnalysisSlice,\n WalkinAnalysisTab,\n WalkinAnalysisTypography,\n} from './components/widgets/WalkinAnalysis';\nexport { FootfallByGender } from './components/widgets/FootfallByGender';\nexport type {\n FootfallByGenderCardMaxWidth,\n FootfallByGenderChartColors,\n FootfallByGenderChartMargin,\n FootfallByGenderHorizontalScroll,\n FootfallByGenderProps,\n FootfallByGenderRow,\n FootfallByGenderTooltipStyles,\n} from './components/widgets/FootfallByGender';\nexport { PasserbyConversion } from './components/widgets/PasserbyConversion';\nexport type {\n PasserbyConversionCardMaxWidth,\n PasserbyConversionChartColors,\n PasserbyConversionChartMargin,\n PasserbyConversionHorizontalScroll,\n PasserbyConversionProps,\n PasserbyConversionRow,\n PasserbyConversionTooltipStyles,\n} from './components/widgets/PasserbyConversion';\nexport { WalkinTraffic } from './components/widgets/WalkinTraffic';\nexport type {\n WalkinTrafficCardMaxWidth,\n WalkinTrafficChartColors,\n WalkinTrafficChartMargin,\n WalkinTrafficHorizontalScroll,\n WalkinTrafficProps,\n WalkinTrafficRow,\n WalkinTrafficTooltipStyles,\n} from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTraffic}. */\nexport { WalkinTraffic as WalkinTrafficByHour } from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTrafficRow}. */\nexport type { WalkinTrafficRow as WalkinTrafficByHourRow } from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTrafficProps}. */\nexport type { WalkinTrafficProps as WalkinTrafficByHourProps } from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTrafficTooltipStyles}. */\nexport type { WalkinTrafficTooltipStyles as WalkinTrafficByHourTooltipStyles } from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTrafficChartMargin}. */\nexport type { WalkinTrafficChartMargin as WalkinTrafficByHourChartMargin } from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTrafficChartColors}. */\nexport type { WalkinTrafficChartColors as WalkinTrafficByHourChartColors } from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTrafficHorizontalScroll}. */\nexport type { WalkinTrafficHorizontalScroll as WalkinTrafficByHourHorizontalScroll } from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTrafficCardMaxWidth}. */\nexport type { WalkinTrafficCardMaxWidth as WalkinTrafficByHourCardMaxWidth } from './components/widgets/WalkinTraffic';\nexport * from './components/widgets/FootFallHeatMap';\nexport * from './components/QueueTimeBreakdown';\nexport * from './components/BillingCounterAnalytics';\nexport * from './components/widgets/PeakBillingHours';\n\n// Theme\nexport { FalconThemeProvider } from './components/FalconThemeProvider';\nexport type {\n FalconThemeDirection,\n FalconThemeMode,\n FalconThemeProviderProps,\n FalconThemeSettings,\n} from './components/FalconThemeProvider';\n","import { Button, InputAdornment, TextField } from '@mui/material';\nimport type { ChangeEvent } from 'react';\nimport type { AddCommentInputProps } from './AddCommentInput.types';\n\nexport const AddCommentInput = ({\n value,\n setValue,\n handleAddComment,\n placeholder = 'Write Comment here',\n buttonLabel = 'Add Comment',\n}: AddCommentInputProps) => {\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n setValue(event.target.value);\n };\n\n return (\n <TextField\n label=\"\"\n fullWidth\n sx={{ width: '550px', maxWidth: '100%' }}\n value={value}\n placeholder={placeholder}\n onChange={handleChange}\n type=\"text\"\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\">\n <Button\n variant=\"contained\"\n sx={{\n background: '#000',\n color: '#fff',\n position: 'absolute',\n right: 0,\n top: 0,\n padding: '16px',\n cursor: 'pointer',\n borderRadius: '0 5px 5px 0',\n }}\n onClick={handleAddComment}\n onMouseDown={(e) => e.preventDefault()}\n >\n {buttonLabel}\n </Button>\n </InputAdornment>\n ),\n }}\n />\n );\n};\n","import { Close as CloseIcon } from '@mui/icons-material';\nimport {\n\tBox,\n\tButton,\n\tDialog,\n\tDialogActions,\n\tDialogContent,\n\tDialogTitle,\n\tIconButton,\n\tTypography,\n} from '@mui/material';\nimport { FalconMultiSelect } from '../FalconMultiSelect';\nimport type { AdvancedFiltersDialogProps } from './AdvancedFiltersDialog.types';\n\nconst defaultLocationOptions = [\n\t{ id: 1, label: 'Location A' },\n\t{ id: 2, label: 'Location B' },\n];\n\nconst defaultBusinessAreaOptions = [\n\t{ id: 1, label: 'Retail' },\n\t{ id: 2, label: 'Healthcare' },\n];\n\nexport const AdvancedFiltersDialog = ({\n\topen,\n\tonClose,\n\tlocationOptions = defaultLocationOptions.map((option) => ({\n\t\tid: option.id,\n\t\tname: option.label,\n\t})),\n\tbusinessAreaOptions = defaultBusinessAreaOptions.map((option) => ({\n\t\tid: option.id,\n\t\tname: option.label,\n\t})),\n\tselectedLocations = [],\n\tselectedBusinessAreas = [],\n\tonLocationsChange = () => { },\n\tonBusinessAreasChange = () => { },\n\tonApply,\n\tonCancel,\n}: AdvancedFiltersDialogProps) => {\n\tconst handleApply = () => {\n\t\tonApply?.();\n\t\tonClose();\n\t};\n\n\tconst handleCancel = () => {\n\t\tonCancel?.();\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Dialog open={open} onClose={onClose} maxWidth=\"sm\" fullWidth>\n\t\t\t<DialogTitle>\n\t\t\t\t<Box display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n\t\t\t\t\t<Typography variant=\"h6\">Advanced Filters</Typography>\n\t\t\t\t\t<IconButton onClick={onClose} size=\"small\" aria-label=\"Close\">\n\t\t\t\t\t\t<CloseIcon />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Box>\n\t\t\t</DialogTitle>\n\t\t\t<DialogContent>\n\t\t\t\t<Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, pt: 1 }}>\n\t\t\t\t\t<FalconMultiSelect\n\t\t\t\t\t\tlabel=\"Locations\"\n\t\t\t\t\t\tlist={locationOptions}\n\t\t\t\t\t\tdata={selectedLocations}\n\t\t\t\t\t\tsetData={onLocationsChange}\n\t\t\t\t\t/>\n\t\t\t\t\t<FalconMultiSelect\n\t\t\t\t\t\tlabel=\"Business Areas\"\n\t\t\t\t\t\tlist={businessAreaOptions}\n\t\t\t\t\t\tdata={selectedBusinessAreas}\n\t\t\t\t\t\tsetData={onBusinessAreasChange}\n\t\t\t\t\t/>\n\t\t\t\t</Box>\n\t\t\t</DialogContent>\n\t\t\t<DialogActions>\n\t\t\t\t<Button onClick={handleCancel}>Cancel</Button>\n\t\t\t\t<Button variant=\"contained\" onClick={handleApply}>\n\t\t\t\t\tApply\n\t\t\t\t</Button>\n\t\t\t</DialogActions>\n\t\t</Dialog>\n\t);\n};\n","import { Icon } from '@iconify/react';\nimport { Stack, Typography } from '@mui/material';\nimport Autocomplete, {\n AutocompleteCloseReason,\n autocompleteClasses,\n} from '@mui/material/Autocomplete';\nimport Box from '@mui/material/Box';\nimport ButtonBase from '@mui/material/ButtonBase';\nimport Checkbox from '@mui/material/Checkbox';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport Popper from '@mui/material/Popper';\nimport TextField from '@mui/material/TextField';\nimport { styled } from '@mui/material/styles';\nimport * as React from 'react';\nimport type {\n FalconMultiSelectOption,\n FalconMultiSelectProps,\n} from './FalconMultiSelect.types';\n\nexport const FalconMultiSelect = ({\n // core\n label,\n data,\n setData,\n list,\n // trigger\n triggerBg = '#EFEFEF',\n triggerColor,\n triggerMinWidth = 250,\n triggerBorderRadius = '6px',\n triggerSx,\n // popper panel\n popperWidth = 300,\n popperBorderColor = '#e1e4e8',\n popperBorderColorDark = '#30363d',\n popperBg = '#fff',\n popperBgDark = '#1c2128',\n popperColor = '#24292e',\n popperColorDark = '#c9d1d9',\n // options\n optionBorderColor = '#D6D6D6',\n optionHeight = 60,\n checkboxColor = 'green',\n checkboxCheckedColor = '#6750A4',\n // search\n searchLabel = 'Search State',\n searchIconColor = '#49454F',\n // buttons\n applyBg = '#333',\n applyColor = 'white',\n applyLabel = 'Apply',\n clearColor = 'black',\n clearLabel = 'Clear',\n}: FalconMultiSelectProps) => {\n const [checked, setChecked] = React.useState<FalconMultiSelectOption[]>(\n data ?? []\n );\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [pendingValue, setPendingValue] = React.useState<\n FalconMultiSelectOption[]\n >([]);\n\n const open = Boolean(anchorEl);\n const id = open ? 'falcon-multiselect' : undefined;\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n setPendingValue(checked);\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n if (anchorEl) anchorEl.focus();\n setAnchorEl(null);\n };\n\n const handleApply = () => {\n setData(checked);\n handleClose();\n };\n\n const handleClear = () => {\n setChecked([]);\n setData([]);\n handleClose();\n };\n\n const handleToggle = (option: FalconMultiSelectOption) => {\n setChecked(prev => {\n const exists = prev.some(x => x.id === option.id);\n return exists ? prev.filter(x => x.id !== option.id) : [...prev, option];\n });\n };\n\n const triggerLabel =\n checked.length === 0\n ? `Filter by ${label}`\n : checked.length === 1\n ? checked[0].name\n : `${checked[0].name}, ${checked[1].name}${checked.length > 2 ? '…' : ''}`;\n\n return (\n <React.Fragment>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={2}\n onClick={handleClick}\n sx={{\n minWidth: triggerMinWidth,\n background: triggerBg,\n borderRadius: triggerBorderRadius,\n cursor: 'pointer',\n padding: '12px',\n ...(triggerColor ? { color: triggerColor } : {}),\n ...triggerSx,\n }}\n >\n <Typography\n variant=\"body2\"\n sx={triggerColor ? { color: triggerColor } : undefined}\n >\n {triggerLabel}\n </Typography>\n <Icon\n icon={open ? 'tabler:chevron-up' : 'tabler:chevron-down'}\n color={triggerColor}\n />\n </Stack>\n\n <StyledPopper\n id={id}\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-start\"\n ownerState={{\n popperWidth,\n popperBorderColor,\n popperBorderColorDark,\n popperBg,\n popperBgDark,\n popperColor,\n popperColorDark,\n }}\n >\n <ClickAwayListener onClickAway={handleClose}>\n <div>\n <Autocomplete\n open\n multiple\n onClose={(\n _: React.SyntheticEvent,\n reason: AutocompleteCloseReason\n ) => {\n if (reason === 'escape') handleClose();\n }}\n value={pendingValue}\n onChange={(_, newValue) => setPendingValue(newValue)}\n disableCloseOnSelect\n slots={{ popper: PopperComponent }}\n noOptionsText=\"No labels\"\n options={list}\n getOptionLabel={option => option.name}\n isOptionEqualToValue={(option, val) => option.id === val.id}\n renderOption={(props, option) => (\n <li\n {...props}\n key={option.id}\n style={{\n height: optionHeight,\n border: `1px solid ${optionBorderColor}`,\n margin: '16px 12px',\n flexShrink: 0,\n borderRadius: 6,\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <Box\n sx={{\n flexGrow: 3,\n borderRadius: '3px',\n ml: 1,\n mt: '1px',\n justifyContent: 'start',\n alignItems: 'center',\n width: '80%',\n fontSize: '13px',\n }}\n >\n {option.name}\n </Box>\n <Box\n component=\"span\"\n sx={{\n flexShrink: 0,\n borderRadius: '3px',\n mr: 1,\n mt: '2px',\n flexGrow: 1,\n justifyContent: 'end',\n width: '20%',\n alignItems: 'center',\n }}\n >\n <Checkbox\n slotProps={{ input: { 'aria-label': option.name } }}\n checked={checked.some(x => x.id === option.id)}\n onChange={() => handleToggle(option)}\n sx={{\n color: checkboxColor,\n '&.Mui-checked': { color: checkboxCheckedColor },\n }}\n />\n </Box>\n </li>\n )}\n renderInput={params => (\n <Box\n sx={{\n position: 'relative',\n '& > :not(style)': { width: '100%' },\n }}\n >\n <TextField\n label={searchLabel}\n variant=\"filled\"\n sx={{\n width: '100%',\n margin: '10px',\n '& > :not(style)': { width: '94%' },\n }}\n ref={params.InputProps.ref}\n slotProps={{ htmlInput: params.inputProps }}\n />\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ position: 'absolute', left: 110, top: 30 }}\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M14.76 13.27L20.49 19L19 20.49L13.27 14.76C12.2 15.53 10.91 16 9.5 16C5.91 16 3 13.09 3 9.5C3 5.91 5.91 3 9.5 3C13.09 3 16 5.91 16 9.5C16 10.91 15.53 12.2 14.76 13.27ZM9.5 5C7.01 5 5 7.01 5 9.5C5 11.99 7.01 14 9.5 14C11.99 14 14 11.99 14 9.5C14 7.01 11.99 5 9.5 5Z\"\n fill={searchIconColor}\n />\n </svg>\n </Box>\n )}\n />\n\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n m: '8px',\n height: 110,\n }}\n >\n <ActionButton\n onClick={handleApply}\n sx={{\n height: '42px',\n borderRadius: '3px',\n background: applyBg,\n margin: '5px 0 10px 0',\n color: applyColor,\n }}\n >\n {applyLabel}\n </ActionButton>\n <ActionButton\n onClick={handleClear}\n sx={{\n height: '42px',\n borderRadius: '3px',\n mb: '8px',\n color: clearColor,\n }}\n >\n {clearLabel}\n </ActionButton>\n </Box>\n </div>\n </ClickAwayListener>\n </StyledPopper>\n </React.Fragment>\n );\n};\n\n// ─── Internal types ──────────────────────────────────────────────────────────\n\ninterface PopperComponentProps {\n anchorEl?: unknown;\n disablePortal?: boolean;\n open: boolean;\n}\n\ninterface StyledPopperOwnerState {\n popperWidth: number | string;\n popperBorderColor: string;\n popperBorderColorDark: string;\n popperBg: string;\n popperBgDark: string;\n popperColor: string;\n popperColorDark: string;\n}\n\n// ─── Styled components ───────────────────────────────────────────────────────\n\nconst StyledAutocompletePopper = styled('div')(({ theme }) => ({\n [`& .${autocompleteClasses.paper}`]: {\n boxShadow: 'none',\n color: 'inherit',\n fontSize: 13,\n },\n [`& .${autocompleteClasses.listbox}`]: {\n backgroundColor: theme.palette.mode === 'light' ? '#fff' : '#1c2128',\n padding: 0,\n [`& .${autocompleteClasses.option}`]: {\n minHeight: 'auto',\n alignItems: 'flex-start',\n padding: 8,\n borderBottom: `1px solid ${theme.palette.mode === 'light' ? '#eaecef' : '#30363d'}`,\n '&[aria-selected=\"true\"]': { backgroundColor: 'transparent' },\n [`&.${autocompleteClasses.focused}, &.${autocompleteClasses.focused}[aria-selected=\"true\"]`]:\n {\n backgroundColor: theme.palette.action.hover,\n },\n },\n },\n [`&.${autocompleteClasses.popperDisablePortal}`]: { position: 'relative' },\n}));\n\nfunction PopperComponent({\n disablePortal: _d,\n anchorEl: _a,\n open: _o,\n ...other\n}: PopperComponentProps) {\n return <StyledAutocompletePopper {...other} />;\n}\n\nconst StyledPopper = styled(Popper, {\n shouldForwardProp: prop => prop !== 'ownerState',\n})<{ ownerState: StyledPopperOwnerState }>(({ theme, ownerState }) => ({\n border: `1px solid ${theme.palette.mode === 'light' ? ownerState.popperBorderColor : ownerState.popperBorderColorDark}`,\n boxShadow: `0 8px 24px ${theme.palette.mode === 'light' ? 'rgba(149, 157, 165, 0.2)' : 'rgb(1, 4, 9)'}`,\n borderRadius: 6,\n width: ownerState.popperWidth,\n zIndex: theme.zIndex.modal,\n fontSize: 13,\n color:\n theme.palette.mode === 'light'\n ? ownerState.popperColor\n : ownerState.popperColorDark,\n backgroundColor:\n theme.palette.mode === 'light'\n ? ownerState.popperBg\n : ownerState.popperBgDark,\n}));\n\nconst ActionButton = styled(ButtonBase)(() => ({\n fontSize: 13,\n width: '100%',\n textAlign: 'left',\n paddingBottom: 8,\n fontWeight: 600,\n '& span': { width: '100%' },\n '& svg': { width: 16, height: 16 },\n}));\n","import { Box, Button, Typography } from '@mui/material';\nimport type { ButtonWithIconProps } from './ButtonWithIcon.types';\n\nexport const ButtonWithIcon = ({\n size = 'large',\n variant = 'contained',\n children,\n icon,\n ...props\n}: ButtonWithIconProps) => (\n <Button\n fullWidth\n size={size}\n variant={variant}\n sx={{ minWidth: '200px', maxWidth: '250px', backgroundColor: 'white', color: 'black' }}\n {...props}\n >\n <Box display=\"flex\" gap={1} justifyContent=\"space-between\" alignItems=\"center\">\n <Typography variant=\"inherit\">{children}</Typography>\n {icon && (\n <Box mt={0.25} ml={0.5}>\n {icon}\n </Box>\n )}\n </Box>\n </Button>\n);\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport List from '@mui/material/List';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport ListItemText from '@mui/material/ListItemText';\nimport Paper from '@mui/material/Paper';\nimport Popper from '@mui/material/Popper';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { useTheme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { WidgetHeaderFilterProps } from './WidgetHeaderFilter.types';\n\nconst defaultTriggerBg = '#F3F3F3';\n/** Default trigger width (px). Override with **`triggerMinWidth`** for wider filters or dense layouts. */\nconst defaultTriggerMinWidth = 160;\nconst defaultTriggerBorderRadius = '10px';\n/** Fixed panel width when `popperMatchTrigger={false}` and `popperWidth` is omitted (Falcon multi-select default). */\nconst defaultFixedPopperWidth = 300;\n\n/** When `popperMatchTrigger` is true, the list matches the trigger width (see Popper modifiers below). */\nconst headerFilterPopperModifiersMatchTrigger: NonNullable<\n React.ComponentProps<typeof Popper>['modifiers']\n> = [\n { name: 'offset', options: { offset: [0, 2] } },\n {\n name: 'sameWidth',\n enabled: true,\n phase: 'beforeWrite',\n requires: ['computeStyles'],\n fn({ state }) {\n state.styles.popper.width = `${state.rects.reference.width}px`;\n },\n effect({ state }) {\n const { reference, popper } = state.elements;\n if (reference instanceof HTMLElement) {\n popper.style.width = `${reference.getBoundingClientRect().width}px`;\n }\n },\n },\n];\n\nconst headerFilterPopperModifiersOffsetOnly: NonNullable<\n React.ComponentProps<typeof Popper>['modifiers']\n> = [{ name: 'offset', options: { offset: [0, 2] } }];\n\ntype FilterOption = { id: number; name: string };\n\nfunction selectionSummary(selected: FilterOption[]): string {\n if (selected.length === 0) return 'All';\n if (selected.length === 1) return selected[0].name;\n return `${selected[0].name}, ${selected[1].name}${selected.length > 2 ? '…' : ''}`;\n}\n\n/**\n * Widget header filter styled like the provided mock:\n * two-line trigger + simple dropdown list.\n */\nexport const WidgetHeaderFilter = ({\n label,\n list,\n data,\n setData,\n triggerBg = defaultTriggerBg,\n triggerColor,\n triggerMinWidth = defaultTriggerMinWidth,\n triggerBorderRadius = defaultTriggerBorderRadius,\n triggerSx,\n popperMatchTrigger = true,\n popperWidth,\n popperSx,\n popperBorderColor = '#e1e4e8',\n popperBorderColorDark = '#30363d',\n popperBg = '#fff',\n popperBgDark = '#1c2128',\n popperColor = '#24292e',\n popperColorDark = '#c9d1d9',\n}: WidgetHeaderFilterProps) => {\n const theme = useTheme();\n const isDark = theme.palette.mode === 'dark';\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n\n const open = Boolean(anchorEl);\n const matchTriggerWidth = popperMatchTrigger;\n const fixedPopperWidth = popperWidth ?? defaultFixedPopperWidth;\n\n const valueLine = selectionSummary(data);\n const triggerTextColor = triggerColor ?? '#1a1a1a';\n const triggerChevronColor = triggerColor ?? '#101010';\n\n const handleOpen = (event: React.MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleSelect = (option: FilterOption) => {\n setData([option]);\n handleClose();\n };\n\n return (\n <Box sx={{ flexShrink: 0, position: 'relative' }}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n spacing={1.5}\n onClick={handleOpen}\n sx={{\n minWidth: triggerMinWidth,\n background: triggerBg,\n borderRadius: triggerBorderRadius,\n cursor: 'pointer',\n px: 1.75,\n py: 0.65,\n border: '1px solid #D8D8E5',\n color: triggerTextColor,\n ...triggerSx,\n }}\n >\n <Stack spacing={0.125} sx={{ flex: 1, minWidth: 0, textAlign: 'left' }}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 700, fontSize: 13, lineHeight: 1.2 }}\n >\n {label}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 500, fontSize: 14, lineHeight: 1.2 }}\n >\n {valueLine}\n </Typography>\n </Stack>\n <Icon\n icon={open ? 'tabler:chevron-up' : 'tabler:chevron-down'}\n width={18}\n height={18}\n color={triggerChevronColor}\n style={{ flexShrink: 0 }}\n />\n </Stack>\n\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-start\"\n sx={{ zIndex: theme.zIndex.modal }}\n modifiers={\n matchTriggerWidth\n ? headerFilterPopperModifiersMatchTrigger\n : headerFilterPopperModifiersOffsetOnly\n }\n >\n <ClickAwayListener onClickAway={handleClose}>\n <Paper\n elevation={8}\n sx={{\n width: matchTriggerWidth ? '100%' : fixedPopperWidth,\n border: `1px solid ${isDark ? popperBorderColorDark : popperBorderColor}`,\n borderRadius: 1.5,\n bgcolor: isDark ? popperBgDark : popperBg,\n color: isDark ? popperColorDark : popperColor,\n overflow: 'hidden',\n boxShadow:\n theme.palette.mode === 'light'\n ? '0 10px 24px rgba(15, 23, 42, 0.14)'\n : '0 10px 24px rgb(1, 4, 9)',\n ...popperSx,\n }}\n >\n <List disablePadding>\n {list.map(option => (\n <ListItemButton\n key={option.id}\n onClick={() => handleSelect(option)}\n dense\n sx={{\n py: 0.75,\n px: 2,\n minHeight: 36,\n borderBottom: '1px solid rgba(0,0,0,0.06)',\n '&:last-of-type': { borderBottom: 'none' },\n '&:hover': { bgcolor: 'rgba(0,0,0,0.03)' },\n }}\n >\n <ListItemText\n primary={option.name}\n slotProps={{\n primary: {\n fontSize: 14,\n fontWeight: 500,\n lineHeight: 1.3,\n },\n }}\n />\n </ListItemButton>\n ))}\n </List>\n </Paper>\n </ClickAwayListener>\n </Popper>\n </Box>\n );\n};\n","import Divider from '@mui/material/Divider';\n\nexport const ChartWidgetHeaderSeparator = () => (\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={{\n alignSelf: 'center',\n borderColor: '#E0E0E0',\n height: 40,\n my: 0.5,\n }}\n />\n);\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport IconButton from '@mui/material/IconButton';\nimport Popper, { type PopperPlacementType } from '@mui/material/Popper';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { useTheme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type {\n ChartWidgetInfoButtonProps,\n ChartWidgetInfoPopoverContent,\n} from './ChartWidgetInfoButton.types';\n\nconst defaultIconColor = '#6750A4';\nconst defaultTriggerBg = '#EFEFEF';\nconst defaultTriggerHoverBg = '#E5E5E5';\nconst defaultButtonSize = 30;\nconst defaultIconSize = 22;\nconst defaultPopoverWidth = 320;\nconst compactButtonSize = 22;\nconst compactIconSize = 15;\nconst compactPopoverWidth = 240;\nconst popperBorder = '#e1e4e8';\nconst popperBorderDark = '#30363d';\n\n/** Triangle + track sized from trigger so legend-sized buttons get a smaller, proportional caret. */\nfunction resolveCaretMetrics(triggerWidth: number): {\n caretInset: number;\n trackW: number;\n halfOuter: number;\n halfInner: number;\n triH: number;\n stripH: number;\n} {\n const compact = triggerWidth <= 26;\n const halfOuter = compact ? 6 : 9;\n const halfInner = halfOuter - 1;\n const triH = compact ? 7 : 10;\n const stripH = triH;\n const minTrack = halfOuter * 2 + 4;\n const trackW = Math.max(triggerWidth, minTrack);\n /** Inset of the caret track from the popper’s start/end edge that aligns with the anchor (see `caretHorizontalAxis`). */\n const caretInset = Math.max(0, (triggerWidth - trackW) / 2);\n return { caretInset, trackW, halfOuter, halfInner, triH, stripH };\n}\n\n/** Popper flips to `top-*` when there is no room below; caret must attach on the edge that faces the anchor. */\nfunction popoverCaretPointsDown(placement: PopperPlacementType): boolean {\n return placement.startsWith('top');\n}\n\n/**\n * Maps Popper placement to where the caret sits on the panel width.\n * `bottom-end` / `top-end` → anchor’s end edge; `*-start` → start edge; `top`/`bottom` → centered under anchor.\n */\nfunction caretHorizontalAxis(\n placement: PopperPlacementType\n): 'end' | 'start' | 'center' {\n if (placement === 'bottom' || placement === 'top') {\n return 'center';\n }\n if (placement.endsWith('-start')) {\n return 'start';\n }\n if (placement.endsWith('-end')) {\n return 'end';\n }\n /* `auto`, side placements: keep caret readable */\n if (placement.startsWith('left') || placement.startsWith('right')) {\n return 'center';\n }\n return 'end';\n}\n\nfunction PopoverCaret({\n metrics,\n border,\n paperBg,\n pointsDown,\n placement,\n}: {\n metrics: ReturnType<typeof resolveCaretMetrics>;\n border: string;\n paperBg: string;\n /** `true` when placement is `top-*` (panel above the button; arrow on bottom of panel). */\n pointsDown: boolean;\n placement: PopperPlacementType;\n}) {\n const { caretInset, trackW, halfOuter, halfInner, triH, stripH } = metrics;\n const horizontal = caretHorizontalAxis(placement);\n\n const trackPositionSx =\n horizontal === 'center'\n ? {\n insetInlineStart: '50%',\n marginInlineStart: `${-trackW / 2}px`,\n width: trackW,\n }\n : horizontal === 'start'\n ? { insetInlineStart: caretInset, width: trackW }\n : { insetInlineEnd: caretInset, width: trackW };\n\n return (\n <Box\n aria-hidden\n sx={{\n position: 'relative',\n zIndex: 3,\n height: stripH,\n width: '100%',\n flexShrink: 0,\n pointerEvents: 'none',\n }}\n >\n <Box\n sx={{\n position: 'absolute',\n ...trackPositionSx,\n ...(pointsDown ? { top: 0 } : { bottom: 0 }),\n height: stripH,\n zIndex: 2,\n ...(pointsDown\n ? {\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n top: 0,\n transform: 'translateX(-50%)',\n borderLeft: `${halfOuter}px solid transparent`,\n borderRight: `${halfOuter}px solid transparent`,\n borderTop: `${triH}px solid ${border}`,\n },\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n top: '-2px',\n transform: 'translateX(-50%)',\n borderLeft: `${halfInner}px solid transparent`,\n borderRight: `${halfInner}px solid transparent`,\n borderTop: `${triH}px solid ${paperBg}`,\n },\n }\n : {\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n bottom: 0,\n transform: 'translateX(-50%)',\n borderLeft: `${halfOuter}px solid transparent`,\n borderRight: `${halfOuter}px solid transparent`,\n borderBottom: `${triH}px solid ${border}`,\n },\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n bottom: '-2px',\n transform: 'translateX(-50%)',\n borderLeft: `${halfInner}px solid transparent`,\n borderRight: `${halfInner}px solid transparent`,\n borderBottom: `${triH}px solid ${paperBg}`,\n },\n }),\n }}\n />\n </Box>\n );\n}\n\nfunction InfoPopoverPanel({\n content,\n width,\n isDark,\n triggerWidth,\n placement,\n compact,\n}: {\n content: ChartWidgetInfoPopoverContent;\n width: number;\n isDark: boolean;\n /** Matches the anchor button width so the caret lines up with the icon center (right-aligned popper). */\n triggerWidth: number;\n /** Actual Popper placement (may flip when there is no space below). */\n placement: PopperPlacementType;\n /** Smaller padding and type scale (see `ChartWidgetInfoButton` `density=\"compact\"`). */\n compact: boolean;\n}) {\n const helpTitle = content.helpTitle ?? 'How does it help?';\n const border = isDark ? popperBorderDark : popperBorder;\n const paperBg = isDark ? '#1c2128' : '#fff';\n const textPrimary = isDark ? '#f0f6fc' : '#1a1a1a';\n const textSecondary = isDark ? '#8b949e' : '#424242';\n\n const panelShadow = isDark\n ? '0 10px 24px rgb(1, 4, 9)'\n : '0 10px 24px rgba(15, 23, 42, 0.14)';\n\n const metrics = resolveCaretMetrics(triggerWidth);\n const caretDown = popoverCaretPointsDown(placement);\n\n const titleFs = compact ? 13 : 16;\n const bodyFs = compact ? 12 : 14;\n const helpFs = compact ? 12 : 14;\n const stackSpacing = compact ? 1 : 1.75;\n const paperPadding = compact ? 1.5 : 2.25;\n\n const paper = (\n <Box\n sx={{\n position: 'relative',\n zIndex: 1,\n width: '100%',\n ...(caretDown ? { mb: '-2px' } : { mt: '-2px' }),\n border: `1px solid ${border}`,\n borderRadius: compact ? 1.5 : 2,\n bgcolor: paperBg,\n p: paperPadding,\n boxShadow: panelShadow,\n }}\n >\n <Stack spacing={stackSpacing} sx={{ position: 'relative', zIndex: 1 }}>\n <Typography\n component=\"h3\"\n sx={{\n fontWeight: 700,\n fontSize: titleFs,\n lineHeight: 1.35,\n color: textPrimary,\n }}\n >\n {content.title}\n </Typography>\n <Typography\n sx={{\n fontSize: bodyFs,\n lineHeight: 1.5,\n color: textSecondary,\n }}\n >\n {content.description}\n </Typography>\n <Typography\n sx={{\n fontWeight: 700,\n fontSize: helpFs,\n lineHeight: 1.35,\n color: textPrimary,\n pt: compact ? 0 : 0.25,\n }}\n >\n {helpTitle}\n </Typography>\n <Box\n component=\"ul\"\n sx={{\n m: 0,\n pl: compact ? 2 : 2.5,\n color: textSecondary,\n fontSize: bodyFs,\n lineHeight: 1.55,\n listStyleType: 'disc',\n listStylePosition: 'outside',\n '& li': {\n display: 'list-item',\n mb: compact ? 0.5 : 0.75,\n '&:last-of-type': { mb: 0 },\n },\n }}\n >\n {content.helpBullets.map(item => (\n <Typography\n key={item}\n component=\"li\"\n sx={{\n fontSize: bodyFs,\n lineHeight: 1.55,\n display: 'list-item',\n }}\n >\n {item}\n </Typography>\n ))}\n </Box>\n </Stack>\n </Box>\n );\n\n const caret = (\n <PopoverCaret\n metrics={metrics}\n border={border}\n paperBg={paperBg}\n pointsDown={caretDown}\n placement={placement}\n />\n );\n\n return (\n <Box sx={{ position: 'relative', width }}>\n {caretDown ? (\n <>\n {paper}\n {caret}\n </>\n ) : (\n <>\n {caret}\n {paper}\n </>\n )}\n </Box>\n );\n}\n\nconst hoverCloseDelayMs = 120;\n\nexport const ChartWidgetInfoButton = ({\n onClick,\n ariaLabel = 'More information',\n sx,\n iconColor = defaultIconColor,\n buttonBg = defaultTriggerBg,\n buttonHoverBg = defaultTriggerHoverBg,\n iconSize: iconSizeProp,\n buttonSize: buttonSizeProp,\n popover,\n popoverWidth: popoverWidthProp,\n density = 'default',\n}: ChartWidgetInfoButtonProps) => {\n const isCompact = density === 'compact';\n const buttonSize =\n buttonSizeProp ?? (isCompact ? compactButtonSize : defaultButtonSize);\n const iconSize =\n iconSizeProp ?? (isCompact ? compactIconSize : defaultIconSize);\n const popoverWidth =\n popoverWidthProp ?? (isCompact ? compactPopoverWidth : defaultPopoverWidth);\n const theme = useTheme();\n const isDark = theme.palette.mode === 'dark';\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const closeTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const open = Boolean(anchorEl) && Boolean(popover);\n\n const clearCloseTimer = React.useCallback(() => {\n if (closeTimerRef.current !== null) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n React.useEffect(() => () => clearCloseTimer(), [clearCloseTimer]);\n\n const scheduleClose = React.useCallback(() => {\n clearCloseTimer();\n closeTimerRef.current = setTimeout(() => {\n setAnchorEl(null);\n closeTimerRef.current = null;\n }, hoverCloseDelayMs);\n }, [clearCloseTimer]);\n\n const handleButtonMouseEnter = (\n event: React.MouseEvent<HTMLButtonElement>\n ) => {\n if (!popover) return;\n clearCloseTimer();\n setAnchorEl(event.currentTarget);\n };\n\n const handleButtonMouseLeave = () => {\n if (!popover) return;\n scheduleClose();\n };\n\n const handlePopperMouseEnter = () => {\n clearCloseTimer();\n };\n\n const handlePopperMouseLeave = () => {\n scheduleClose();\n };\n\n const handleToggle = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.();\n if (!popover) return;\n clearCloseTimer();\n setAnchorEl(prev => (prev ? null : event.currentTarget));\n };\n\n const handleClose = () => {\n clearCloseTimer();\n setAnchorEl(null);\n };\n\n return (\n <Box sx={{ flexShrink: 0, position: 'relative', display: 'inline-flex' }}>\n <IconButton\n type=\"button\"\n size=\"small\"\n onClick={handleToggle}\n onMouseEnter={handleButtonMouseEnter}\n onMouseLeave={handleButtonMouseLeave}\n aria-label={ariaLabel}\n aria-expanded={open}\n aria-haspopup={popover ? 'dialog' : undefined}\n sx={{\n flexShrink: 0,\n bgcolor: buttonBg,\n width: buttonSize,\n height: buttonSize,\n minWidth: buttonSize,\n p: 0,\n border: 'none',\n borderRadius: '50%',\n '&:hover': { bgcolor: buttonHoverBg },\n ...sx,\n }}\n >\n <Box\n component=\"span\"\n sx={{\n display: 'inline-flex',\n lineHeight: 0,\n pointerEvents: 'none',\n }}\n >\n <Icon\n icon=\"bi:info\"\n width={iconSize}\n height={iconSize}\n color={iconColor}\n />\n </Box>\n </IconButton>\n\n {popover ? (\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-end\"\n sx={{ zIndex: theme.zIndex.modal }}\n modifiers={[\n {\n name: 'offset',\n options: { offset: [0, 4] },\n },\n {\n name: 'flip',\n options: {\n fallbackPlacements: [\n 'bottom-start',\n 'bottom',\n 'top-end',\n 'top-start',\n 'top',\n ],\n },\n },\n {\n name: 'preventOverflow',\n options: {\n padding: 12,\n altAxis: true,\n },\n },\n ]}\n >\n {({ placement }) => (\n <ClickAwayListener onClickAway={handleClose}>\n <Box\n onMouseEnter={handlePopperMouseEnter}\n onMouseLeave={handlePopperMouseLeave}\n >\n <InfoPopoverPanel\n content={popover}\n width={popoverWidth}\n isDark={isDark}\n triggerWidth={buttonSize}\n placement={placement ?? 'bottom-end'}\n compact={isCompact}\n />\n </Box>\n </ClickAwayListener>\n )}\n </Popper>\n ) : null}\n </Box>\n );\n};\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type {\n RankedBarListItem,\n RankedBarListProps,\n RankedBarListSegment,\n} from './RankedBarList.types';\n\nconst defaultBarColor = '#8963F0';\nconst defaultTrackColor = '#E8E8E8';\n\nfunction defaultFormatSegmentTooltip(\n segment: RankedBarListSegment,\n _row: RankedBarListItem\n): string {\n return `${segment.label} : ${segment.value}`;\n}\n\n/** MUI Popper surface: no padding so the custom card controls layout. */\nconst segmentTooltipPopperSx: SxProps<Theme> = {\n p: 0,\n m: 0,\n bgcolor: 'transparent',\n boxShadow: 'none',\n border: 'none',\n maxWidth: 'none',\n};\n\nconst defaultSegmentTooltipCardSx: SxProps<Theme> = {\n maxWidth: 280,\n bgcolor: '#fff',\n borderRadius: 1,\n border: '1px solid #E8E8E8',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n overflow: 'hidden',\n};\n\nfunction SegmentTooltipTitle({\n segment,\n row,\n formatSegmentTooltip,\n segmentTooltipSx,\n}: {\n segment: RankedBarListSegment;\n row: RankedBarListItem;\n formatSegmentTooltip: (\n segment: RankedBarListSegment,\n row: RankedBarListItem\n ) => string;\n segmentTooltipSx?: SxProps<Theme>;\n}): React.ReactElement {\n const customText = formatSegmentTooltip(segment, row);\n const defaultPattern = `${segment.label} : ${segment.value}`;\n const useStructured = customText === defaultPattern;\n\n const cardSx = segmentTooltipSx\n ? ([defaultSegmentTooltipCardSx, segmentTooltipSx] as SxProps<Theme>)\n : defaultSegmentTooltipCardSx;\n\n return (\n <Box sx={cardSx}>\n <Box sx={{ height: 3, bgcolor: 'grey.200', width: '100%' }} />\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 0.5,\n rowGap: 0.5,\n px: 1.5,\n py: 1.25,\n }}\n >\n <Box\n component=\"span\"\n aria-hidden\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: segment.color,\n flexShrink: 0,\n }}\n />\n {useStructured ? (\n <>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {segment.label}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {' : '}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 700,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {segment.value}\n </Typography>\n </>\n ) : (\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 500,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {customText}\n </Typography>\n )}\n </Box>\n </Box>\n );\n}\n\nfunction resolveCardMaxWidth(\n cardMaxWidth: RankedBarListProps['cardMaxWidth'],\n fullWidth: boolean | undefined\n):\n | number\n | string\n | { xs?: number | string; sm?: number | string; md?: number | string } {\n if (fullWidth) {\n return '100%';\n }\n if (cardMaxWidth === undefined) {\n return { xs: '100%', sm: 640 };\n }\n if (typeof cardMaxWidth === 'number') {\n return `${cardMaxWidth}px`;\n }\n if (typeof cardMaxWidth === 'string') {\n return cardMaxWidth;\n }\n return {\n xs:\n cardMaxWidth.xs !== undefined\n ? typeof cardMaxWidth.xs === 'number'\n ? `${cardMaxWidth.xs}px`\n : cardMaxWidth.xs\n : '100%',\n sm:\n cardMaxWidth.sm !== undefined\n ? typeof cardMaxWidth.sm === 'number'\n ? `${cardMaxWidth.sm}px`\n : cardMaxWidth.sm\n : 640,\n ...(cardMaxWidth.md !== undefined\n ? {\n md:\n typeof cardMaxWidth.md === 'number'\n ? `${cardMaxWidth.md}px`\n : cardMaxWidth.md,\n }\n : {}),\n };\n}\n\nfunction RankedBarRowTrack({\n pct,\n row,\n barColor,\n barTrackColor,\n barHeight,\n isBarWidthAnimationActive,\n formatSegmentTooltip,\n segmentTooltipSx,\n}: {\n pct: number;\n row: RankedBarListItem;\n barColor: string;\n barTrackColor: string;\n barHeight: number;\n isBarWidthAnimationActive: boolean;\n formatSegmentTooltip: (\n segment: RankedBarListSegment,\n row: RankedBarListItem\n ) => string;\n segmentTooltipSx?: SxProps<Theme>;\n}): React.ReactElement {\n const segments = row.segments;\n const segSum = segments?.reduce((acc, s) => acc + s.value, 0) ?? 0;\n const useStack = Boolean(segments?.length) && segSum > 0;\n\n const widthTransition = isBarWidthAnimationActive\n ? (theme: Theme) =>\n theme.transitions.create('width', {\n duration: theme.transitions.duration.shorter,\n })\n : 'none';\n\n /** Theme `borderRadius: 2` can exceed bar height and causes uneven corner clamping between slices. */\n const endCapRadius = `${Math.max(1, Math.floor(barHeight / 2))}px`;\n\n return (\n <Box\n sx={{\n height: barHeight,\n borderRadius: endCapRadius,\n bgcolor: barTrackColor,\n overflow: 'hidden',\n width: '100%',\n }}\n >\n {useStack && segments ? (\n <Box\n sx={{\n height: barHeight,\n width: `${pct}%`,\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'stretch',\n alignContent: 'stretch',\n minWidth: 0,\n transition: widthTransition,\n }}\n >\n {segments.map((seg, i) => (\n <Tooltip\n key={seg.id}\n title={\n <SegmentTooltipTitle\n segment={seg}\n row={row}\n formatSegmentTooltip={formatSegmentTooltip}\n segmentTooltipSx={segmentTooltipSx}\n />\n }\n enterTouchDelay={0}\n slotProps={{\n tooltip: {\n sx: segmentTooltipPopperSx,\n },\n }}\n >\n <Box\n sx={{\n flexGrow: seg.value,\n flexShrink: 1,\n flexBasis: 0,\n minWidth: 2,\n height: barHeight,\n minHeight: barHeight,\n maxHeight: barHeight,\n boxSizing: 'border-box',\n lineHeight: 0,\n bgcolor: seg.color,\n cursor: 'default',\n ...(i === 0\n ? {\n borderTopLeftRadius: endCapRadius,\n borderBottomLeftRadius: endCapRadius,\n }\n : {}),\n ...(i === segments.length - 1\n ? {\n borderTopRightRadius: endCapRadius,\n borderBottomRightRadius: endCapRadius,\n }\n : {}),\n }}\n />\n </Tooltip>\n ))}\n </Box>\n ) : (\n <Box\n sx={{\n height: '100%',\n width: `${pct}%`,\n borderRadius: endCapRadius,\n bgcolor: barColor,\n transition: widthTransition,\n }}\n />\n )}\n </Box>\n );\n}\n\n/**\n * Ranked list widget: title row, optional header actions, scrollable list of labels with\n * horizontal bars sized by numeric value (highest value = full bar width).\n */\nexport const RankedBarList = ({\n title,\n items,\n sortByValueDescending = true,\n maxValue: maxValueProp,\n listHeaderLabel = 'Cameras (High to Low)',\n valueColumnHeader = 'No. of Alerts',\n showSortControl = true,\n onSortClick,\n headerActions,\n barColor = defaultBarColor,\n barTrackColor = defaultTrackColor,\n barHeight = 7,\n formatSegmentTooltip = defaultFormatSegmentTooltip,\n segmentTooltipSx,\n listMaxHeight = 280,\n fullWidth,\n fillHeight,\n cardMaxWidth,\n cardSx,\n emptyStateText = 'No data',\n isBarWidthAnimationActive = true,\n scrollListToTopOnItemsChange = true,\n}: RankedBarListProps) => {\n const listScrollRef = React.useRef<HTMLDivElement>(null);\n\n const itemsSignature = React.useMemo(\n () =>\n items\n .map(i => {\n const seg =\n i.segments?.map(s => `${s.id}:${s.value}`).join('|') ?? '';\n return `${i.id}:${i.value}:${seg}`;\n })\n .join('\\0'),\n [items]\n );\n\n React.useLayoutEffect(() => {\n if (!scrollListToTopOnItemsChange) {\n return;\n }\n const el = listScrollRef.current;\n if (!el) {\n return;\n }\n el.scrollTop = 0;\n }, [itemsSignature, scrollListToTopOnItemsChange]);\n\n const rows = React.useMemo(() => {\n const copy = [...items];\n if (sortByValueDescending) {\n copy.sort((a, b) => b.value - a.value);\n }\n return copy;\n }, [items, sortByValueDescending]);\n\n const maxValue = React.useMemo(() => {\n if (maxValueProp !== undefined && maxValueProp > 0) {\n return maxValueProp;\n }\n const m = rows.reduce((acc, r) => Math.max(acc, r.value), 0);\n return m > 0 ? m : 1;\n }, [maxValueProp, rows]);\n\n return (\n <Box\n sx={{\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n minWidth: 0,\n maxWidth: resolveCardMaxWidth(cardMaxWidth, fullWidth),\n boxSizing: 'border-box',\n ...(fillHeight\n ? {\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n }\n : {}),\n ...cardSx,\n }}\n >\n <Stack\n spacing={2}\n sx={\n fillHeight ? { flex: 1, minHeight: 0, overflow: 'hidden' } : undefined\n }\n >\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n gap={2}\n sx={fillHeight ? { flexShrink: 0 } : undefined}\n >\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={{\n fontWeight: 700,\n color: 'text.primary',\n pr: 1,\n fontSize: { xs: 16, sm: 18 },\n }}\n >\n {title}\n </Typography>\n {headerActions ? (\n <Box sx={{ flexShrink: 0 }}>{headerActions}</Box>\n ) : null}\n </Stack>\n\n <Box\n sx={{\n border: '1px solid #E8E8E8',\n borderRadius: 2,\n bgcolor: '#FAFAFA',\n overflow: 'hidden',\n ...(fillHeight\n ? {\n flex: 1,\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n }\n : {}),\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{\n px: 2,\n py: 1.25,\n borderBottom: '1px solid rgba(0,0,0,0.08)',\n bgcolor: '#fff',\n flexShrink: 0,\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 600, color: 'text.primary', fontSize: 13 }}\n >\n {listHeaderLabel}\n </Typography>\n {showSortControl ? (\n <IconButton\n size=\"small\"\n aria-label=\"Sort\"\n onClick={onSortClick}\n sx={{ p: 0.35, color: 'text.secondary' }}\n >\n <Icon icon=\"tabler:arrows-sort\" width={18} height={18} />\n </IconButton>\n ) : null}\n </Stack>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 600, color: 'text.secondary', fontSize: 12 }}\n >\n {valueColumnHeader}\n </Typography>\n </Stack>\n\n <Box\n ref={listScrollRef}\n sx={{\n ...(fillHeight\n ? {\n flex: 1,\n minHeight: 0,\n maxHeight: 'none',\n }\n : { maxHeight: listMaxHeight }),\n overflowY: 'auto',\n bgcolor: '#fff',\n }}\n >\n {rows.length === 0 ? (\n <Box sx={{ px: 2, py: 3, textAlign: 'center' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {emptyStateText}\n </Typography>\n </Box>\n ) : (\n rows.map((row, index) => {\n const pct = Math.min(\n 100,\n Math.max(0, (row.value / maxValue) * 100)\n );\n return (\n <Box\n key={row.id}\n sx={{\n px: 2,\n py: 1.5,\n borderBottom:\n index < rows.length - 1\n ? '1px solid rgba(0,0,0,0.06)'\n : 'none',\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{ mb: 0.75 }}\n >\n <Typography\n variant=\"body2\"\n sx={{\n color: 'text.primary',\n fontWeight: 500,\n fontSize: 14,\n }}\n >\n {row.label}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{\n color: 'text.primary',\n fontWeight: 600,\n fontSize: 14,\n minWidth: 28,\n textAlign: 'right',\n }}\n >\n {row.value}\n </Typography>\n </Stack>\n <RankedBarRowTrack\n pct={pct}\n row={row}\n barColor={barColor}\n barTrackColor={barTrackColor}\n barHeight={barHeight}\n isBarWidthAnimationActive={isBarWidthAnimationActive}\n formatSegmentTooltip={formatSegmentTooltip}\n segmentTooltipSx={segmentTooltipSx}\n />\n </Box>\n );\n })\n )}\n </Box>\n </Box>\n </Stack>\n </Box>\n );\n};\n","import Box from '@mui/material/Box';\nimport * as React from 'react';\nimport type { ChartWidgetSegmentedTabsProps } from './ChartWidgetSegmentedTabs.types';\n\ntype IndicatorRect = {\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\nconst defaultIndicator: IndicatorRect = {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n};\n\n/**\n * Pill-style segmented control for chart cards (e.g. Walk-in scope tabs, billing analytics).\n *\n * **Defaults** match the classic walk-in look: grey track, **white** selected pill, dark text, light shadow.\n * Override **`trackBackgroundColor`**, **`activeTabBackground`**, **`activeTabColor`**, **`inactiveTabColor`**, and\n * **`activeTabBoxShadow`** for other themes (e.g. violet selected pill + white text, **`activeTabBoxShadow: 'none'`**).\n *\n * Use **`tabLayout=\"equalWidth\"`** when the track is full width and each tab should grow to **fill** the bar;\n * default **`intrinsic`** keeps label-sized pills aligned to the **start** (walk-in style).\n *\n * The active segment uses a **sliding pill** (animated with **`tabIndicatorTransitionMs`**).\n */\nexport const ChartWidgetSegmentedTabs = ({\n tabs,\n activeTabId,\n onTabChange,\n ariaLabel = 'Scope',\n fullWidth = true,\n tabFontSize = 14,\n rootSx,\n trackBackgroundColor = '#ECECEC',\n activeTabBackground = '#fff',\n activeTabColor = '#2a2a2a',\n inactiveTabColor = '#2a2a2a',\n activeTabBoxShadow = '0 1px 2px rgba(0,0,0,0.08)',\n tabLayout = 'intrinsic',\n activeTabFontWeight = 700,\n inactiveTabFontWeight = 600,\n tabIndicatorTransitionMs = 260,\n}: ChartWidgetSegmentedTabsProps) => {\n const trackRef = React.useRef<HTMLDivElement>(null);\n const tabRefs = React.useRef<(HTMLDivElement | null)[]>([]);\n const [indicator, setIndicator] =\n React.useState<IndicatorRect>(defaultIndicator);\n\n const activeIndex = React.useMemo(() => {\n const i = tabs.findIndex(t => t.id === activeTabId);\n return i >= 0 ? i : 0;\n }, [tabs, activeTabId]);\n\n const updateIndicator = React.useCallback(() => {\n const track = trackRef.current;\n const tabEl = tabRefs.current[activeIndex];\n if (!track || !tabEl) {\n return;\n }\n const trackRect = track.getBoundingClientRect();\n const tabRect = tabEl.getBoundingClientRect();\n setIndicator({\n left: tabRect.left - trackRect.left,\n top: tabRect.top - trackRect.top,\n width: tabRect.width,\n height: tabRect.height,\n });\n }, [activeIndex]);\n\n React.useLayoutEffect(() => {\n updateIndicator();\n }, [updateIndicator, tabs, activeTabId, tabLayout, fullWidth]);\n\n React.useLayoutEffect(() => {\n const track = trackRef.current;\n if (!track) {\n return;\n }\n const ro = new ResizeObserver(() => {\n updateIndicator();\n });\n ro.observe(track);\n return () => {\n ro.disconnect();\n };\n }, [updateIndicator]);\n\n return (\n <Box\n ref={trackRef}\n sx={{\n position: 'relative',\n display: 'flex',\n p: 0.5,\n borderRadius: 999,\n bgcolor: trackBackgroundColor,\n gap: 0.5,\n flexWrap: tabLayout === 'equalWidth' ? 'nowrap' : 'wrap',\n boxSizing: 'border-box',\n ...(fullWidth\n ? { alignSelf: 'stretch', width: '100%' }\n : {\n alignSelf: 'flex-start',\n width: 'fit-content',\n maxWidth: '100%',\n }),\n ...rootSx,\n }}\n role=\"tablist\"\n aria-label={ariaLabel}\n >\n {indicator.width > 0 ? (\n <Box\n aria-hidden\n sx={{\n position: 'absolute',\n left: indicator.left,\n top: indicator.top,\n width: indicator.width,\n height: indicator.height,\n borderRadius: 999,\n bgcolor: activeTabBackground,\n boxShadow: activeTabBoxShadow,\n transition: `left ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), top ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), width ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), height ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1)`,\n pointerEvents: 'none',\n zIndex: 0,\n }}\n />\n ) : null}\n {tabs.map((tab, index) => {\n const selected = tab.id === activeTabId;\n return (\n <Box\n key={tab.id}\n ref={(el: HTMLDivElement | null) => {\n tabRefs.current[index] = el;\n }}\n role=\"tab\"\n aria-selected={selected}\n tabIndex={selected ? 0 : -1}\n onClick={() => onTabChange(tab.id)}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onTabChange(tab.id);\n }\n }}\n sx={{\n position: 'relative',\n zIndex: 1,\n px: 2.25,\n py: 0.85,\n borderRadius: 999,\n cursor: 'pointer',\n userSelect: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n bgcolor: 'transparent',\n fontWeight: selected\n ? activeTabFontWeight\n : inactiveTabFontWeight,\n fontSize: tabFontSize,\n color: selected ? activeTabColor : inactiveTabColor,\n transition: theme =>\n theme.transitions.create(['color'], {\n duration: theme.transitions.duration.shorter,\n }),\n ...(tabLayout === 'equalWidth'\n ? {\n flex: '1 1 0',\n minWidth: 0,\n }\n : {}),\n }}\n >\n {tabLayout === 'equalWidth' ? (\n <Box\n component=\"span\"\n sx={{\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n width: '100%',\n }}\n >\n {tab.label}\n </Box>\n ) : (\n tab.label\n )}\n </Box>\n );\n })}\n </Box>\n );\n};\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport ToggleButton from '@mui/material/ToggleButton';\nimport ToggleButtonGroup from '@mui/material/ToggleButtonGroup';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport { ChartWidgetInfoButton } from '../../ChartWidgetInfoButton';\nimport type {\n ChartWidgetInfoButtonProps,\n ChartWidgetInfoPopoverContent,\n} from '../../ChartWidgetInfoButton/ChartWidgetInfoButton.types';\nimport { useQueueTimeBreakdownCustomization } from '../../QueueTimeBreakdown/QueueTimeBreakdownCustomizationContext';\nimport type { QueueTimeChartFilter } from '../../QueueTimeBreakdown/QueueTimeBreakdown.types';\nimport { mergeSx } from '../../QueueTimeBreakdown/queueTimeBreakdownCustomization.merge';\nimport { ChartWidgetHeaderSeparator } from '../../utils/ChartWidgetHeaderSeparator';\n\nfunction mergeInfoButtonPresentation(\n fromTheme: Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>> | undefined,\n fromProps: Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>> | undefined\n): Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>> {\n return {\n ...fromTheme,\n ...fromProps,\n sx: mergeSx(fromTheme?.sx, fromProps?.sx),\n };\n}\n\nexport type TimePeriodFilterProps = {\n selectedFilter: QueueTimeChartFilter;\n onFilterChange: React.Dispatch<React.SetStateAction<QueueTimeChartFilter>>;\n /**\n * Info popover beside D/W/M/Y. Pass **`ChartWidgetInfoPopoverContent`** to show separator +\n * **ChartWidgetInfoButton**. Omit or **`null`** hides them (no implicit copy). For standalone use,\n * prefer **`TIME_PERIOD_FILTER_INFO_POPOVER`** (neutral D/W/M/Y). **`TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN`**\n * is for **QueueTimeBreakdown** only — that card injects it when **`infoPopover`** is omitted; do not\n * use the breakdown preset on **TimePeriodFilter** outside that widget.\n */\n infoPopover?: ChartWidgetInfoPopoverContent | null;\n /**\n * Presentation for **ChartWidgetInfoButton** (ignored when **infoPopover** is omitted or **`null`**).\n * Overrides the same fields from **customization.periodFilter.infoButtonProps** when both are set.\n */\n infoButtonProps?: Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>>;\n /** Overrides the same keys from **customization.periodFilter.rootSx** when both are set. */\n sx?: SxProps<Theme>;\n};\n\nconst PERIODS = ['Day', 'Week', 'Month', 'Year'] as const;\n\nfunction periodLetter(period: (typeof PERIODS)[number]): string {\n switch (period) {\n case 'Day':\n return 'D';\n case 'Week':\n return 'W';\n case 'Month':\n return 'M';\n case 'Year':\n return 'Y';\n default:\n return '';\n }\n}\n\n/**\n * Day / Week / Month / Year segmented control — square D/W/M/Y cells, optional info button.\n * Layout-neutral: no title or page-level alignment; wrap in your own **Stack** / **Box** or pass **sx**.\n *\n * Theme **customization.periodFilter** supports colours, **toggleGroupSx**, **toggleButtonSx**,\n * **infoStackSx**, and **infoButtonProps**; component **infoButtonProps** override theme **infoButtonProps** for overlapping keys.\n *\n * Source: **`packages/falcon-ui/src/components/filters/TimePeriodFilter/`** (see **`components/tabs/`** for a similar package layout).\n */\nexport function TimePeriodFilter({\n selectedFilter,\n onFilterChange,\n infoPopover,\n infoButtonProps,\n sx,\n}: TimePeriodFilterProps): React.ReactElement {\n const { periodFilter: pf } = useQueueTimeBreakdownCustomization();\n const SEGMENT_PX = pf?.segmentSizePx ?? 36;\n const borderRadius = pf?.borderRadiusPx ?? 8;\n const fontSize = pf?.fontSizePx ?? 13;\n const borderCol = pf?.borderColor ?? '#E5E7EB';\n const trackBg = pf?.trackBackground ?? '#F3F4F6';\n const dividerCol = pf?.dividerColor ?? borderCol;\n const inactiveColor = pf?.inactiveColor ?? '#0f172a';\n const activeBg = pf?.activeBackground ?? '#000000';\n const activeColor = pf?.activeColor ?? '#ffffff';\n const hoverBg = pf?.inactiveHoverBackground ?? 'rgba(15, 23, 42, 0.06)';\n\n const handleChange = (\n _event: React.MouseEvent<HTMLElement>,\n next: QueueTimeChartFilter | null\n ): void => {\n if (next !== null) {\n onFilterChange(next);\n }\n };\n\n const resolvedInfoPopover: ChartWidgetInfoPopoverContent | null =\n infoPopover ?? null;\n\n const mergedInfoButton = React.useMemo(\n () =>\n mergeInfoButtonPresentation(pf?.infoButtonProps, infoButtonProps ?? {}),\n [pf?.infoButtonProps, infoButtonProps]\n );\n\n return (\n <Box\n sx={mergeSx(\n {\n display: 'inline-flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 1.5,\n rowGap: 1,\n },\n pf?.rootSx,\n sx\n )}\n >\n <ToggleButtonGroup\n exclusive\n value={selectedFilter}\n onChange={handleChange}\n aria-label=\"Time period\"\n sx={mergeSx(\n {\n display: 'inline-flex',\n width: 'auto',\n border: `1px solid ${borderCol}`,\n borderRadius: `${borderRadius}px`,\n overflow: 'hidden',\n bgcolor: trackBg,\n '& .MuiToggleButtonGroup-grouped': {\n border: 0,\n borderRadius: 0,\n margin: 0,\n },\n '& .MuiToggleButton-root': {\n boxSizing: 'border-box',\n width: SEGMENT_PX,\n height: SEGMENT_PX,\n minWidth: SEGMENT_PX,\n maxWidth: SEGMENT_PX,\n px: 0,\n py: 0,\n flex: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: 700,\n fontSize: `${fontSize}px`,\n lineHeight: 1,\n textTransform: 'none',\n color: inactiveColor,\n bgcolor: 'transparent',\n border: 'none',\n '&:not(:first-of-type)': {\n borderLeft: `1px solid ${dividerCol}`,\n },\n '&:hover': {\n bgcolor: hoverBg,\n },\n '&.Mui-selected': {\n bgcolor: activeBg,\n color: activeColor,\n '&:hover': {\n bgcolor: activeBg,\n },\n },\n },\n },\n pf?.toggleGroupSx\n )}\n >\n {PERIODS.map(period => (\n <ToggleButton\n key={period}\n value={period}\n disableRipple\n sx={mergeSx(pf?.toggleButtonSx)}\n >\n {periodLetter(period)}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n {resolvedInfoPopover ? (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.5}\n sx={mergeSx({ flexShrink: 0 }, pf?.infoStackSx)}\n >\n <ChartWidgetHeaderSeparator />\n <ChartWidgetInfoButton\n {...mergedInfoButton}\n popover={resolvedInfoPopover}\n ariaLabel={mergedInfoButton.ariaLabel ?? 'Time period information'}\n />\n </Stack>\n ) : null}\n </Box>\n );\n}\n","import * as React from 'react';\nimport type { QueueTimeBreakdownCustomization } from './queueTimeBreakdown.customization.types';\n\nconst QueueTimeBreakdownCustomizationContext =\n React.createContext<QueueTimeBreakdownCustomization>({});\n\nexport type QueueTimeBreakdownCustomizationProviderProps = {\n value: QueueTimeBreakdownCustomization;\n children: React.ReactNode;\n};\n\nexport function QueueTimeBreakdownCustomizationProvider({\n value,\n children,\n}: QueueTimeBreakdownCustomizationProviderProps): React.ReactElement {\n const memo = React.useMemo(() => value, [value]);\n return (\n <QueueTimeBreakdownCustomizationContext.Provider value={memo}>\n {children}\n </QueueTimeBreakdownCustomizationContext.Provider>\n );\n}\n\nexport function useQueueTimeBreakdownCustomization(): QueueTimeBreakdownCustomization {\n return React.useContext(QueueTimeBreakdownCustomizationContext);\n}\n","import type { CSSProperties } from 'react';\n\n/**\n * Shared Recharts `<Tooltip />` look for QueueTimeBreakdown (donut / stacked bar):\n * light panel, rounded corners — matches dashboard light tooltip reference.\n */\nexport const queueRechartsTooltipContentStyle: CSSProperties = {\n backgroundColor: '#F4F4F5',\n border: '1px solid #E4E4E7',\n borderRadius: 8,\n padding: '8px 12px',\n fontSize: 12,\n lineHeight: 1.45,\n boxShadow: '0 4px 16px rgba(15, 23, 42, 0.1)',\n};\n\nexport const queueRechartsTooltipItemStyle: CSSProperties = {\n color: '#3f3f46',\n fontSize: 12,\n padding: '4px 0',\n};\n\n/** Category line when Recharts renders a label (stacked bar / donut). */\nexport const queueRechartsTooltipLabelStyleCategory: CSSProperties = {\n color: '#71717A',\n fontSize: 12,\n fontWeight: 600,\n marginBottom: 8,\n paddingBottom: 8,\n borderBottom: '1px solid #D4D4D8',\n};\n\nexport const queueRechartsTooltipLabelStyleMuted: CSSProperties = {\n color: '#71717A',\n fontSize: 12,\n fontWeight: 600,\n};\n","import type { CSSProperties } from 'react';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport type {\n QueueTimeAreaTooltipTheme,\n QueueTimeRechartsTooltipTheme,\n} from './queueTimeBreakdown.customization.types';\nimport {\n queueRechartsTooltipContentStyle,\n queueRechartsTooltipItemStyle,\n queueRechartsTooltipLabelStyleMuted,\n} from './queueTimeBreakdown.rechartsTooltip';\n\nexport function mergeCss(a: CSSProperties, b?: CSSProperties): CSSProperties {\n if (!b) {\n return { ...a };\n }\n return { ...a, ...b };\n}\n\nexport function mergeSx(\n ...parts: Array<SxProps<Theme> | undefined>\n): SxProps<Theme> | undefined {\n const flat = parts.filter(Boolean) as SxProps<Theme>[];\n if (flat.length === 0) {\n return undefined;\n }\n if (flat.length === 1) {\n return flat[0];\n }\n return flat.flat() as SxProps<Theme>;\n}\n\nexport function mergeRechartsTooltipStyles(\n overrides?: QueueTimeRechartsTooltipTheme\n): {\n contentStyle: CSSProperties;\n itemStyle: CSSProperties;\n labelStyle: CSSProperties;\n wrapperStyle: CSSProperties;\n} {\n return {\n contentStyle: mergeCss(\n queueRechartsTooltipContentStyle,\n overrides?.contentStyle\n ),\n itemStyle: mergeCss(queueRechartsTooltipItemStyle, overrides?.itemStyle),\n labelStyle: mergeCss(\n queueRechartsTooltipLabelStyleMuted,\n overrides?.labelStyle\n ),\n wrapperStyle: mergeCss({ outline: 'none' }, overrides?.wrapperStyle),\n };\n}\n\nconst defaultAreaTooltipBase: Required<QueueTimeAreaTooltipTheme> = {\n container: {\n background: '#F4F4F5',\n border: '1px solid #E4E4E7',\n borderRadius: 8,\n width: 'max-content',\n maxWidth: 220,\n boxShadow: '0 4px 16px rgba(15, 23, 42, 0.1)',\n overflow: 'hidden',\n fontSize: 11,\n fontFamily: 'inherit',\n },\n header: {\n background: '#EBEBED',\n padding: '6px 8px',\n color: '#71717A',\n fontWeight: 600,\n borderBottom: '1px solid #D4D4D8',\n },\n body: { padding: '6px 8px' },\n row: {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '3px 0',\n whiteSpace: 'nowrap',\n },\n dot: {\n width: 7,\n height: 7,\n borderRadius: '50%',\n flexShrink: 0,\n },\n label: { color: '#71717A' },\n value: { fontWeight: 600, color: '#18181B' },\n};\n\nexport function mergeAreaTooltipStyles(\n overrides?: QueueTimeAreaTooltipTheme\n): Required<QueueTimeAreaTooltipTheme> {\n return {\n container: mergeCss(defaultAreaTooltipBase.container, overrides?.container),\n header: mergeCss(defaultAreaTooltipBase.header, overrides?.header),\n body: mergeCss(defaultAreaTooltipBase.body, overrides?.body),\n row: mergeCss(defaultAreaTooltipBase.row, overrides?.row),\n dot: mergeCss(defaultAreaTooltipBase.dot, overrides?.dot),\n label: mergeCss(defaultAreaTooltipBase.label, overrides?.label),\n value: mergeCss(defaultAreaTooltipBase.value, overrides?.value),\n };\n}\n","import type { ChartWidgetInfoPopoverContent } from '../ChartWidgetInfoButton/ChartWidgetInfoButton.types';\n\n/**\n * Ready-made **`ChartWidgetInfoPopoverContent`** for **TimePeriodFilter** (D / W / M / Y) when you want\n * generic help — **not** tied to **QueueTimeBreakdown** or any other specific card.\n *\n * **Use this when:** you show the period control next to charts or KPIs on any page and need a short\n * explanation of what the control does and why it matters, without duplicating copy in your app.\n *\n * **What it contains (for authors / Storybook):**\n * - **`title`:** “Time period” — names the control.\n * - **`description`:** Explains that switching day / week / month / year changes grouping or how the time axis is labelled.\n * - **`helpTitle`:** “How does it help?”\n * - **`helpBullets`:** (1) Align the view with your reporting window; (2) Keep period in sync with other controls on the page.\n *\n * Pass as **`infoPopover={TIME_PERIOD_FILTER_INFO_POPOVER}`** on **TimePeriodFilter**, or use your own\n * **`ChartWidgetInfoPopoverContent`** if you need product-specific wording.\n */\nexport const TIME_PERIOD_FILTER_INFO_POPOVER: ChartWidgetInfoPopoverContent = {\n title: 'Time period',\n description:\n 'Switch between day, week, month, and year to change how data is grouped or how the time axis is labelled.',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'Match the view to your reporting window (e.g. weekly reviews vs monthly rollups).',\n 'Use the same period across controls on the page so everything stays in sync.',\n ],\n};\n\n/**\n * Info copy aligned with the **QueueTimeBreakdown** composite card (header next to D/W/M/Y).\n * **QueueTimeBreakdown** uses this when **`infoPopover`** is omitted on the card.\n * Use **`TIME_PERIOD_FILTER_INFO_POPOVER`** instead when the filter is not on that card.\n */\nexport const TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN: ChartWidgetInfoPopoverContent =\n {\n title: 'Queue Time Breakdown',\n description:\n 'Shows how visitors distribute across queue-time buckets for each row, compares today vs yesterday in the donuts, and plots the trend for the selected period (day, week, month, year).',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'See which stores or zones keep people longer in each time band.',\n 'Switch D / W / M / Y to align the area chart with your reporting window.',\n 'Compare donut slices to spot day-over-day shifts in bucket mix.',\n ],\n };\n\n/** @deprecated Use {@link TIME_PERIOD_FILTER_INFO_POPOVER}. */\nexport const CHART_PERIOD_FILTER_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n TIME_PERIOD_FILTER_INFO_POPOVER;\n\n/** @deprecated Use {@link TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN}. */\nexport const QUEUE_TIME_BREAKDOWN_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN;\n\n/**\n * @deprecated Use {@link TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN}.\n */\nexport const DEFAULT_QUEUE_TIME_BREAKDOWN_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN;\n","import { Button as MuiButton, CircularProgress } from '@mui/material';\nimport type { FalconButtonProps } from './FalconButton.types';\n\nexport const FalconButton = ({\n loading = false,\n disabled,\n children,\n size = 'large',\n variant = 'contained',\n type = 'submit',\n fullWidth = true,\n className = 'falcon-btn',\n ...props\n}: FalconButtonProps) => (\n <MuiButton\n disabled={disabled || loading}\n size={size}\n variant={variant}\n type={type}\n fullWidth={fullWidth}\n className={className}\n {...props}\n >\n {loading ? <CircularProgress size={16} color=\"inherit\" /> : children}\n </MuiButton>\n);\n","import { Autocomplete, TextField } from '@mui/material';\nimport type { FalconDIstrictFilterProps } from './FalconDIstrictFilter.types';\n\n/** District filter — full implementation can be migrated from apps/docs. */\nexport const FalconDIstrictFilter = ({\n label = 'District',\n options = [],\n value = [],\n onChange,\n}: FalconDIstrictFilterProps) => (\n <Autocomplete\n multiple\n options={options}\n value={value}\n onChange={(_, newValue) => onChange?.(newValue)}\n getOptionLabel={(opt) =>\n typeof opt === 'object' && opt !== null ? opt.label : ''\n }\n isOptionEqualToValue={(a, b) => a.id === b.id}\n renderInput={(params) => (\n <TextField {...params} label={label} placeholder=\"Select districts\" />\n )}\n />\n);\n","import { Box, Stack, Typography, useTheme } from '@mui/material';\nimport type { FalconGrayButtonProps } from './FalconGrayButton.types';\n\nexport const FalconGrayButton = ({\n text,\n Icon,\n onClick,\n}: FalconGrayButtonProps) => {\n const theme = useTheme();\n return (\n <Box\n sx={{\n cursor: onClick ? 'pointer' : 'default',\n padding: 4,\n borderRadius: '8px',\n background: theme.palette.secondary?.light ?? '#f0f0f0',\n }}\n onClick={onClick}\n role={onClick ? 'button' : undefined}\n >\n <Stack direction=\"row\" justifyContent=\"center\" gap={4} alignItems=\"center\">\n {Icon}\n <Typography fontSize={12} align=\"center\" fontWeight=\"bold\">\n {text}\n </Typography>\n </Stack>\n </Box>\n );\n};\n","import { Box, Divider, Stack } from '@mui/material';\nimport type { FalconPaginationProps } from './FalconPagination.types';\n\nconst selectStyle = {\n border: 'none',\n backgroundColor: 'transparent',\n padding: '5px 10px',\n fontSize: '14px',\n fontWeight: 500,\n color: '#555770',\n cursor: 'pointer',\n outline: 'none',\n} as const;\n\nconst optionStyle = { padding: '5px 10px' } as const;\n\nconst btnStyle = {\n border: 'none',\n backgroundColor: 'transparent',\n padding: '5px 10px',\n cursor: 'pointer',\n outline: 'none',\n} as const;\n\nexport const FalconPagination = ({\n pageNo,\n setPageNo,\n perPage,\n setPerPage,\n totalItems,\n perPageOptions = [12, 24, 36],\n}: FalconPaginationProps) => {\n const totalPage = Math.ceil(totalItems / perPage) || 1;\n\n return (\n <Stack\n spacing={2}\n alignItems=\"center\"\n direction=\"row\"\n width=\"100%\"\n bgcolor=\"#F0F0F0\"\n >\n <Box>\n <select\n style={selectStyle}\n value={perPage}\n onChange={(e) => setPerPage(Number(e.target.value))}\n aria-label=\"Items per page\"\n >\n {perPageOptions.map((n) => (\n <option key={n} style={optionStyle} value={n}>\n {n}\n </option>\n ))}\n </select>\n </Box>\n <Divider orientation=\"vertical\" flexItem />\n\n <Box sx={{ flex: 1 }}>\n <Box sx={{ color: '#525252', fontFamily: 'roboto' }}>\n {perPage * (pageNo - 1) + 1} - {Math.min(perPage * pageNo, totalItems)}{' '}\n of {totalItems} items\n </Box>\n </Box>\n <Divider orientation=\"vertical\" flexItem />\n\n <Stack alignItems=\"center\" direction=\"row\" gap={1}>\n <Box>\n <select\n style={selectStyle}\n value={pageNo}\n onChange={(e) => setPageNo(Number(e.target.value))}\n aria-label=\"Page number\"\n >\n {Array.from({ length: totalPage }, (_, i) => (\n <option key={i} style={optionStyle} value={i + 1}>\n {i + 1}\n </option>\n ))}\n </select>\n </Box>\n <Box sx={{ color: '#525252', fontFamily: 'roboto' }}>\n of {totalPage} pages\n </Box>\n </Stack>\n\n <Divider orientation=\"vertical\" flexItem />\n\n <Stack direction=\"row\" gap={1}>\n <button\n type=\"button\"\n disabled={pageNo === 1}\n onClick={() => setPageNo(pageNo - 1)}\n style={btnStyle}\n aria-label=\"Previous page\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path d=\"M10 12L5 8L10 4V12Z\" fill=\"#161616\" />\n </svg>\n </button>\n <button\n type=\"button\"\n disabled={pageNo === totalPage}\n onClick={() => setPageNo(pageNo + 1)}\n style={btnStyle}\n aria-label=\"Next page\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path d=\"M6 4L11 8L6 12V4Z\" fill=\"#161616\" />\n </svg>\n </button>\n </Stack>\n </Stack>\n );\n};\n","import {\n FormControl,\n InputLabel,\n MenuItem,\n Select,\n SelectChangeEvent,\n} from '@mui/material';\nimport type { FalconSelectProps } from './FalconSelect.types';\n\nfunction normalizeOptions(\n options: string[] | { value: string; label: string }[]\n): { value: string; label: string }[] {\n return options.map((opt) =>\n typeof opt === 'string' ? { value: opt.toLowerCase(), label: opt } : opt\n );\n}\n\nexport const FalconSelect = ({\n label,\n value,\n onChange,\n options,\n disabled = false,\n clearable = true,\n}: FalconSelectProps) => {\n const items = normalizeOptions(options);\n const handleChange = (event: SelectChangeEvent<string>) => {\n const v = event.target.value as string;\n onChange(v !== '' ? v : '');\n };\n\n return (\n <FormControl variant=\"filled\" fullWidth color=\"primary\">\n <InputLabel id={`falcon-select-${label}-label`}>\n Select {label} *\n </InputLabel>\n <Select\n disabled={disabled}\n value={value?.toLowerCase() ?? ''}\n label={`Select ${label}`}\n onChange={handleChange}\n labelId={`falcon-select-${label}-label`}\n id={`falcon-select-${label}`}\n >\n {clearable && (\n <MenuItem value=\"\">\n <em>--Clear--</em>\n </MenuItem>\n )}\n {items.map((item, i) => (\n <MenuItem key={i} value={item.value}>\n {item.label}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n );\n};\n","import Stack from '@mui/material/Stack';\nimport Switch from '@mui/material/Switch';\nimport { styled } from '@mui/material/styles';\nimport type { FalconSingleSwitchProps } from './FalconSingleSwitch.types';\n\nconst AntSwitch = styled(Switch)(() => ({\n width: 28,\n height: 16,\n padding: 0,\n display: 'flex',\n '&:active': {\n '& .MuiSwitch-thumb': { width: 15 },\n '& .MuiSwitch-switchBase.Mui-checked': { transform: 'translateX(9px)' },\n },\n '& .MuiSwitch-switchBase': {\n padding: 2,\n '&.Mui-checked': {\n transform: 'translateX(12px)',\n color: '#fff',\n '& + .MuiSwitch-track': { opacity: 1 },\n },\n },\n '& .MuiSwitch-thumb': {\n boxShadow: '0 2px 4px 0 rgb(0 35 11 / 20%)',\n width: 12,\n height: 12,\n borderRadius: 6,\n },\n '& .MuiSwitch-track': {\n borderRadius: 8,\n opacity: 1,\n backgroundColor: 'rgba(0,0,0,.25)',\n boxSizing: 'border-box',\n },\n}));\n\nexport const FalconSingleSwitch = ({\n color,\n setStatus,\n value = false,\n onChange,\n}: FalconSingleSwitchProps) => {\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>, checked: boolean) => {\n setStatus?.(checked);\n onChange?.(event, checked);\n };\n\n return (\n <Stack direction=\"row\" margin={2} spacing={1} alignItems=\"center\">\n <AntSwitch\n checked={value}\n onChange={handleChange}\n color={color}\n size=\"medium\"\n inputProps={{ 'aria-label': 'toggle' }}\n />\n </Stack>\n );\n};\n","import { Box } from '@mui/material';\nimport { DataGrid } from '@mui/x-data-grid';\nimport { useState } from 'react';\nimport type { FalconTableProps } from './FalconTable.types';\n\nexport const FalconTable = <T extends Record<string, unknown>>({\n rows,\n getRowId,\n columns,\n pageSizeOptions = [7, 10, 25, 50],\n}: FalconTableProps<T>) => {\n const [paginationModel, setPaginationModel] = useState({\n page: 0,\n pageSize: 7,\n });\n\n return (\n <Box\n sx={{\n border: '2px solid #F2F2F2',\n padding: '16px',\n borderRadius: '12px',\n }}\n >\n <DataGrid\n autoHeight\n sx={{\n minHeight: '48px',\n '& .MuiDataGrid-columnHeaders': {\n borderBottom: '0px',\n borderRadius: '6px !important',\n },\n '& .MuiDataGrid-columnHeaderTitle': {\n color: '#7A7A7A !important',\n },\n }}\n rows={rows ?? []}\n getRowId={getRowId}\n columns={columns}\n disableRowSelectionOnClick\n pageSizeOptions={pageSizeOptions}\n paginationModel={paginationModel}\n onPaginationModelChange={setPaginationModel}\n />\n </Box>\n );\n};\n","import { Box, Typography } from '@mui/material';\nimport type { FalconTicketColumsFilterProps } from './FalconTicketColumsFilter.types';\n\n/** Column filter UI — full implementation can be migrated from apps/docs. */\nexport const FalconTicketColumsFilter = ({\n columns = [],\n selected = [],\n onSelectionChange,\n}: FalconTicketColumsFilterProps) => (\n <Box sx={{ p: 2, minWidth: 280 }}>\n <Typography variant=\"subtitle2\" gutterBottom>\n Select columns\n </Typography>\n {columns.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No columns configured. Pass columns prop.\n </Typography>\n ) : (\n <Typography variant=\"body2\">\n {selected.length} of {columns.length} selected\n </Typography>\n )}\n {onSelectionChange && (\n <Typography variant=\"caption\" display=\"block\" sx={{ mt: 1 }}>\n (Column checkboxes to be wired from app)\n </Typography>\n )}\n </Box>\n);\n","import { Button, Popover } from '@mui/material';\nimport { useState } from 'react';\nimport type { FalconTicketFilterProps } from './FalconTicketFilter.types';\n\nexport const FalconTicketFilter = ({\n children,\n label = 'FILTERS',\n open: controlledOpen,\n onOpenChange,\n}: FalconTicketFilterProps) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const open = controlledOpen ?? internalOpen;\n const setOpen = onOpenChange ?? setInternalOpen;\n\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n setOpen(true);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n setOpen(false);\n };\n\n return (\n <>\n <Button onClick={handleClick} variant=\"outlined\" size=\"medium\">\n {label}\n </Button>\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <div style={{ padding: 16, minWidth: 280 }}>{children}</div>\n </Popover>\n </>\n );\n};\n","import Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Cell,\n LabelList,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport type {\n FootfallByAgeGroupsProps,\n FootfallByAgeGroupsRow,\n FootfallByAgeGroupsSeries,\n FootfallByAgeGroupsTooltipStyles,\n} from './FootfallByAgeGroups.types';\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\n/** Merge MUI \\`sx\\` with a base object (supports array / function overrides). */\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nfunction rowTotal(\n row: FootfallByAgeGroupsRow,\n series: FootfallByAgeGroupsSeries[]\n): number {\n return series.reduce((acc, s) => {\n const v = row[s.dataKey];\n return acc + (typeof v === 'number' ? v : Number(v) || 0);\n }, 0);\n}\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}K`;\n }\n return String(value);\n}\n\ntype FootfallAgeTooltipProps = TooltipContentProps & {\n isBarHovered: boolean;\n series: FootfallByAgeGroupsSeries[];\n categoryLabel: string;\n overallLabel: string;\n tooltipStyles?: FootfallByAgeGroupsTooltipStyles;\n};\n\nfunction FootfallAgeTooltip({\n active,\n payload,\n label,\n isBarHovered,\n series,\n categoryLabel,\n overallLabel,\n tooltipStyles,\n}: FootfallAgeTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || !isBarHovered || label === undefined) {\n return null;\n }\n\n const total = payload.reduce((sum: number, entry: TooltipPayloadEntry) => {\n const v = entry.value;\n const n = typeof v === 'number' ? v : Number(v);\n return sum + (Number.isFinite(n) ? n : 0);\n }, 0);\n\n const ts = tooltipStyles;\n const sectionBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n marginBottom: '8px',\n };\n\n return (\n <div\n style={mergeCss(\n {\n backgroundColor: 'white',\n borderRadius: '8px',\n padding: '16px',\n minWidth: '180px',\n maxWidth: '260px',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n },\n ts?.container\n )}\n >\n <div\n style={mergeCss(\n { ...sectionBase, marginBottom: '8px' },\n ts?.sectionRow\n )}\n >\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {categoryLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {label}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {overallLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {total.toLocaleString()}\n </div>\n </div>\n {series.map((s: FootfallByAgeGroupsSeries) => {\n const entry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === s.dataKey\n );\n const raw = entry?.value;\n const value = typeof raw === 'number' ? raw : Number(raw ?? 0);\n return (\n <div style={mergeCss(sectionBase, ts?.sectionRow)} key={s.dataKey}>\n <div\n style={mergeCss(\n {\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: s.color,\n },\n ts?.seriesDot\n )}\n />\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 700,\n },\n ts?.seriesName\n )}\n >\n {s.label}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {value.toLocaleString()}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/** Props passed by Recharts `LabelList` `content` renderer. */\ninterface RechartsBarLabelListProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n index?: number;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction StackTotalLabel({\n series,\n rows,\n x,\n y,\n width,\n height,\n index,\n stackTotalFill,\n}: RechartsBarLabelListProps & {\n series: FootfallByAgeGroupsSeries[];\n rows: FootfallByAgeGroupsRow[];\n stackTotalFill: string;\n}) {\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n const nh = toNum(height);\n if (\n index === undefined ||\n nx === undefined ||\n ny === undefined ||\n nw === undefined ||\n nh === undefined\n ) {\n return null;\n }\n const row = rows[index];\n if (!row) return null;\n const total = rowTotal(row, series);\n const cx = nx + nw / 2;\n const cy = ny - 4;\n return (\n <text\n x={cx}\n y={cy}\n fill={stackTotalFill}\n fontSize={12}\n fontWeight={500}\n textAnchor=\"middle\"\n >\n {formatBarLabel(total)}\n </text>\n );\n}\n\n/**\n * Stacked bar chart for footfall (or counts) by age groups per category, with hover dimming, optional horizontal scroll, and a custom tooltip.\n */\nconst defaultMinWidthPerCategory = 56;\n/** Default Recharts \\`maxBarSize\\` cap (slimmer than category min width when bands are wide). */\nconst defaultMaxBarThickness = 36;\n/** Left/right space for Y-axis ticks and padding inside the scrollable plot. */\nconst chartWidthAxisGutter = 72;\n\nconst defaultChartMargin = {\n top: 36,\n right: 28,\n left: 12,\n bottom: 8,\n} as const;\n\nconst defaultChartColors = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n stackTotalLabelFill: '#28293D',\n} as const;\n\nexport function FootfallByAgeGroups({\n title,\n data,\n series,\n chartHeight = 430,\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendRowSx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n emptyStateTextSx,\n headerActions,\n tooltipCategoryLabel = 'Time',\n tooltipOverallLabel = 'Overall',\n tooltipStyles,\n showLegend = true,\n chartMargin: chartMarginProp,\n chartColors: chartColorsProp,\n dimmedStackOpacity = 0.35,\n barStackId = 'footfall-by-age-groups',\n emptyStateText = 'No data',\n}: FootfallByAgeGroupsProps) {\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\n const [barHovered, setBarHovered] = React.useState(false);\n\n const handleMouseEnter = React.useCallback((_: unknown, index: number) => {\n setBarHovered(true);\n setActiveIndex(index);\n }, []);\n\n const handleMouseLeave = React.useCallback(() => {\n setBarHovered(false);\n setActiveIndex(null);\n }, []);\n\n const processedData = React.useMemo(\n () => data.map(row => ({ ...row })),\n [data]\n );\n\n const resolvedMaxBarSize = React.useMemo(() => {\n if (maxBarSizeProp !== undefined) {\n return maxBarSizeProp;\n }\n const categoryCap =\n minWidthPerCategory > 0\n ? minWidthPerCategory\n : defaultMinWidthPerCategory;\n return Math.min(categoryCap, defaultMaxBarThickness);\n }, [maxBarSizeProp, minWidthPerCategory]);\n\n const categoryScrollActive = React.useMemo(() => {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScrollProp === 'off') {\n return false;\n }\n if (horizontalScrollProp === 'on') {\n return true;\n }\n return processedData.length > 1;\n }, [horizontalScrollProp, minWidthPerCategory, processedData.length]);\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n /**\n * Explicit pixel width so Recharts lays out correctly inside `overflow-x: auto` (ResponsiveContainer + % widths clip in flex/Storybook).\n * When category scroll is active: at least category minimum or the visible viewport, whichever is wider.\n */\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n const barOpacity = (index: number) =>\n activeIndex === null || activeIndex === index ? 1 : dimmedStackOpacity;\n\n const lastSeriesIndex = series.length - 1;\n\n const chartMargin = React.useMemo(\n () => ({\n ...defaultChartMargin,\n ...chartMarginProp,\n }),\n [chartMarginProp]\n );\n\n const chartColors = React.useMemo(\n () => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n },\n titleRowSx\n )}\n >\n {headerActions ? (\n <Box\n sx={{\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 1,\n }}\n >\n {headerActions}\n </Box>\n ) : null}\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'center',\n width: '100%',\n px: headerActions ? 5 : 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n {showLegend && series.length > 0 ? (\n <Box\n sx={sxChain(\n {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'center',\n alignItems: 'center',\n columnGap: { xs: 2, sm: 3 },\n rowGap: 1,\n py: 0.5,\n px: { xs: 0, sm: 1 },\n },\n legendRowSx\n )}\n >\n {series.map(s => (\n <Stack\n key={s.dataKey}\n direction=\"row\"\n alignItems=\"center\"\n sx={sxChain({ gap: 1 }, legendItemSx)}\n >\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n flexShrink: 0,\n bgcolor: s.color,\n borderRadius: '2px',\n },\n legendSwatchSx\n )}\n />\n <Typography\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {s.legendLabel ?? s.label}\n </Typography>\n </Stack>\n ))}\n </Box>\n ) : null}\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {processedData.length > 0 ? (\n <BarChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n maxBarSize={resolvedMaxBarSize}\n onMouseLeave={handleMouseLeave}\n style={{ overflow: 'visible' }}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n angle={-38}\n textAnchor=\"end\"\n interval={0}\n height={57}\n dy={8}\n tick={{ fontSize: 12 }}\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400 }}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <Tooltip\n cursor={false}\n content={(tooltipProps: TooltipContentProps) => (\n <FootfallAgeTooltip\n {...tooltipProps}\n isBarHovered={barHovered}\n series={series}\n categoryLabel={tooltipCategoryLabel}\n overallLabel={tooltipOverallLabel}\n tooltipStyles={tooltipStyles}\n />\n )}\n />\n {series.map((s, i) => (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n name={s.label}\n stackId={barStackId}\n fill={s.color}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {processedData.map((row, index) => (\n <Cell\n key={`${s.dataKey}-${row.name}-${index}`}\n fillOpacity={barOpacity(index)}\n />\n ))}\n {i === lastSeriesIndex ? (\n <LabelList\n content={(labelProps: RechartsBarLabelListProps) => (\n <StackTotalLabel\n {...labelProps}\n series={series}\n rows={processedData}\n stackTotalFill={chartColors.stackTotalLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n ))}\n </BarChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={emptyStateTextSx}\n >\n {emptyStateText}\n </Typography>\n </Box>\n )}\n </Box>\n </Stack>\n </Box>\n );\n}\n","/** Shared max-width rules for chart cards (WalkinAnalysis-style). */\nexport type ChartCardMaxWidth =\n | number\n | string\n | {\n xs?: number | string;\n sm?: number | string;\n md?: number | string;\n };\n\nexport function resolveChartCardMaxWidth(\n cardMaxWidth: ChartCardMaxWidth | undefined\n):\n | number\n | string\n | { xs?: number | string; sm?: number | string; md?: number | string } {\n if (cardMaxWidth === undefined) {\n return { xs: '100%', sm: 640 };\n }\n if (typeof cardMaxWidth === 'number') {\n return `${cardMaxWidth}px`;\n }\n if (typeof cardMaxWidth === 'string') {\n return cardMaxWidth;\n }\n return {\n xs:\n cardMaxWidth.xs !== undefined\n ? typeof cardMaxWidth.xs === 'number'\n ? `${cardMaxWidth.xs}px`\n : cardMaxWidth.xs\n : '100%',\n sm:\n cardMaxWidth.sm !== undefined\n ? typeof cardMaxWidth.sm === 'number'\n ? `${cardMaxWidth.sm}px`\n : cardMaxWidth.sm\n : 640,\n ...(cardMaxWidth.md !== undefined\n ? {\n md:\n typeof cardMaxWidth.md === 'number'\n ? `${cardMaxWidth.md}px`\n : cardMaxWidth.md,\n }\n : {}),\n };\n}\n","import type { HeatMapChartLegendProps } from './HeatMapChartLegend.types';\n\nexport const HeatMapChartLegend = ({\n title,\n items,\n gradientId,\n gradientStops,\n}: HeatMapChartLegendProps) => (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n marginBottom: '16px',\n fontFamily: 'sans-serif',\n }}\n >\n <span\n style={{\n fontSize: '12px',\n fontWeight: 700,\n color: '#374151',\n minWidth: '80px',\n textAlign: 'right',\n }}\n >\n {title}\n </span>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n flex: 1,\n maxWidth: '600px',\n }}\n >\n <svg\n width=\"100%\"\n height=\"32\"\n style={{ filter: 'drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1))' }}\n >\n <defs>\n <linearGradient\n id={gradientId}\n x1=\"0%\"\n y1=\"0%\"\n x2=\"100%\"\n y2=\"0%\"\n >\n {gradientStops.map((stop, index) => (\n <stop\n key={index}\n offset={stop.offset}\n stopColor={stop.color}\n stopOpacity=\"1\"\n />\n ))}\n </linearGradient>\n </defs>\n <rect\n width=\"100%\"\n height=\"100%\"\n fill={`url(#${gradientId})`}\n />\n </svg>\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingLeft: '16px',\n paddingRight: '16px',\n }}\n >\n {items.map((item, index) => (\n <span\n key={index}\n style={{\n fontSize: '9px',\n fontWeight: 600,\n color: 'white',\n textShadow: '0 1px 2px rgba(0, 0, 0, 0.5)',\n letterSpacing: '0.025em',\n }}\n >\n {item.label}\n </span>\n ))}\n </div>\n </div>\n </div>\n);\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport Paper from '@mui/material/Paper';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport type { TypographyProps } from '@mui/material/Typography';\nimport { useLayoutEffect, useRef, useState } from 'react';\nimport { ChartWidgetInfoButton } from '../../ChartWidgetInfoButton';\nimport type { KpiStatCardProps } from './KpiStatCard.types';\nimport { useAnimatedMetric } from './useAnimatedMetric';\n\nconst defaultInlineIconSize = 48;\n/** Decorative icon inside the detailed card badge (px). */\nconst defaultDetailedIconSize = 30;\n/** Width/height of the top-right icon backdrop (px). */\nconst defaultIconBackdropSize = 48;\nconst defaultIconColor = '#5c6bc0';\n\n/** @default when `metricColor` omitted */\nconst defaultMetricColor = '#000000';\n\n/** Detailed card defaults (px). */\nconst defaultCardWidthPx = 247;\nconst defaultCardPaddingPx = 12;\nconst defaultBlockGapPx = 8;\nconst defaultInlineCardMinHeightPx = 96;\nconst defaultDetailedCardMinHeightPx = 118;\n\n/** Row trend defaults (px). */\nconst defaultRowTrendFontSizePx = 12;\nconst defaultRowTrendIconSizePx = 16;\n\nfunction formatValue(value: string | number): string {\n if (typeof value === 'number') {\n return value.toLocaleString();\n }\n return value;\n}\n\ntype KpiMetricValueDisplayProps = {\n value: string | number;\n metricColor: string;\n animateValue: boolean;\n valueAnimationDurationMs: number;\n valueAnimationUseGrouping: boolean;\n valueAnimationLocale?: string;\n layout: 'inline' | 'detailed';\n};\n\nfunction KpiMetricValueDisplay({\n value,\n metricColor,\n animateValue,\n valueAnimationDurationMs,\n valueAnimationUseGrouping,\n valueAnimationLocale,\n layout,\n}: KpiMetricValueDisplayProps) {\n const isNumeric = typeof value === 'number' && Number.isFinite(value);\n const animated = useAnimatedMetric(\n isNumeric ? value : 0,\n isNumeric && animateValue,\n valueAnimationDurationMs\n );\n\n const displayText =\n isNumeric && animateValue\n ? Math.round(animated).toLocaleString(valueAnimationLocale, {\n useGrouping: valueAnimationUseGrouping,\n })\n : formatValue(value);\n\n const tooltipText = formatValue(value);\n\n if (layout === 'inline') {\n return (\n <OverflowTooltipTypography\n tooltip={tooltipText}\n variant=\"h5\"\n fontWeight={700}\n lineHeight={1.2}\n sx={{ color: metricColor, width: '100%' }}\n >\n {displayText}\n </OverflowTooltipTypography>\n );\n }\n\n return (\n <OverflowTooltipTypography\n tooltip={tooltipText}\n variant=\"h4\"\n fontWeight={700}\n sx={{\n color: metricColor,\n fontSize: { xs: 26, sm: 30 },\n minWidth: 0,\n flex: '0 1 auto',\n }}\n >\n {displayText}\n </OverflowTooltipTypography>\n );\n}\n\ntype OverflowTooltipTypographyProps = TypographyProps & { tooltip: string };\n\n/**\n * Shows {@link Tooltip} with full text only when the line is truncated (ellipsis).\n */\nfunction OverflowTooltipTypography({\n tooltip,\n ...typographyProps\n}: OverflowTooltipTypographyProps) {\n const ref = useRef<HTMLElement>(null);\n const [isTruncated, setIsTruncated] = useState(false);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) {\n return;\n }\n const update = () => {\n setIsTruncated(el.scrollWidth > el.clientWidth + 0.5);\n };\n update();\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => {\n ro.disconnect();\n };\n }, [tooltip, typographyProps.children]);\n\n return (\n <Tooltip\n title={tooltip}\n disableHoverListener={!isTruncated}\n placement=\"top-start\"\n enterDelay={400}\n >\n <Typography ref={ref} noWrap {...typographyProps} />\n </Tooltip>\n );\n}\n\nexport const KpiStatCard = (props: KpiStatCardProps) => {\n const { title, value, icon, iconColor = defaultIconColor, sx } = props;\n const metricColor = props.metricColor ?? defaultMetricColor;\n const animateValue = props.animateValue ?? true;\n const valueAnimationDurationMs = props.valueAnimationDurationMs ?? 1000;\n const valueAnimationUseGrouping = props.valueAnimationUseGrouping ?? true;\n const { valueAnimationLocale } = props;\n const iconSize =\n props.iconSize ??\n (props.variant === 'inline'\n ? defaultInlineIconSize\n : defaultDetailedIconSize);\n\n if (props.variant === 'inline') {\n const { cardMinHeightPx = defaultInlineCardMinHeightPx, cardMaxHeightPx } =\n props;\n return (\n <Paper\n elevation={0}\n sx={{\n p: 2,\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: 2,\n minHeight: cardMinHeightPx,\n ...(cardMaxHeightPx != null\n ? { maxHeight: cardMaxHeightPx, overflow: 'auto' as const }\n : {}),\n ...sx,\n }}\n >\n <Box\n sx={{\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Icon\n icon={icon}\n color={iconColor}\n width={iconSize}\n height={iconSize}\n />\n </Box>\n <Stack\n spacing={0.5}\n alignItems=\"flex-start\"\n justifyContent=\"center\"\n sx={{ flex: 1, minWidth: 0 }}\n >\n <OverflowTooltipTypography\n tooltip={title}\n variant=\"subtitle2\"\n fontWeight={700}\n color=\"text.primary\"\n sx={{ width: '100%' }}\n >\n {title}\n </OverflowTooltipTypography>\n <KpiMetricValueDisplay\n value={value}\n metricColor={metricColor}\n animateValue={animateValue}\n valueAnimationDurationMs={valueAnimationDurationMs}\n valueAnimationUseGrouping={valueAnimationUseGrouping}\n valueAnimationLocale={valueAnimationLocale}\n layout=\"inline\"\n />\n </Stack>\n </Paper>\n );\n }\n\n const {\n trend,\n infoPopover,\n infoPlacement = 'value',\n iconBackdropColor = '#EDE7F6',\n iconBackdropShape = 'rounded',\n trendColor,\n titleColor = 'text.secondary',\n cardWidthPx = defaultCardWidthPx,\n cardPaddingPx = defaultCardPaddingPx,\n blockGapPx = defaultBlockGapPx,\n cardMinHeightPx = defaultDetailedCardMinHeightPx,\n cardMaxHeightPx,\n iconBackdropSizePx = defaultIconBackdropSize,\n rowTrendFontSizePx = defaultRowTrendFontSizePx,\n rowTrendIconSizePx = defaultRowTrendIconSizePx,\n rowTrendComparisonColor,\n } = props;\n\n const resolvedTrendColor =\n trendColor ?? (trend.direction === 'down' ? '#d32f2f' : '#2e7d32');\n const trendLayout = trend.layout ?? 'row';\n const stackedHighlightColor = trend.comparisonColor ?? '#5E35B1';\n const stackedPrefixColor = trend.comparisonPrefixColor ?? 'text.secondary';\n const rowComparisonColor = rowTrendComparisonColor ?? 'text.secondary';\n const stackedSplit =\n trendLayout === 'stacked' &&\n typeof trend.comparisonPrefix === 'string' &&\n trend.comparisonPrefix.length > 0 &&\n typeof trend.comparisonHighlight === 'string' &&\n trend.comparisonHighlight.length > 0;\n\n const infoButton = infoPopover ? (\n <ChartWidgetInfoButton\n density=\"compact\"\n popover={infoPopover}\n ariaLabel={`${title} more information`}\n sx={{ flexShrink: 0 }}\n />\n ) : null;\n\n return (\n <Paper\n elevation={0}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n boxSizing: 'border-box',\n width: cardWidthPx,\n maxWidth: '100%',\n p: `${cardPaddingPx}px`,\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n boxShadow: '0 1px 3px rgba(0,0,0,0.06)',\n position: 'relative',\n overflow: cardMaxHeightPx != null ? 'auto' : 'hidden',\n minHeight: cardMinHeightPx,\n ...(cardMaxHeightPx != null ? { maxHeight: cardMaxHeightPx } : {}),\n ...sx,\n }}\n >\n <Stack\n spacing={`${blockGapPx}px`}\n alignItems=\"stretch\"\n sx={{ width: '100%', minWidth: 0 }}\n >\n {props.slotHeader ? (\n <Box sx={{ width: '100%' }}>{props.slotHeader}</Box>\n ) : null}\n\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"flex-start\"\n sx={{ width: '100%', minWidth: 0 }}\n >\n <Stack\n spacing={`${blockGapPx}px`}\n alignItems=\"flex-start\"\n sx={{ flex: 1, minWidth: 0, pr: 7 }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.5}\n useFlexGap\n sx={{ minWidth: 0, alignSelf: 'stretch', maxWidth: '100%' }}\n >\n <OverflowTooltipTypography\n tooltip={title}\n variant=\"body2\"\n fontWeight={600}\n sx={{\n color: titleColor,\n minWidth: 0,\n flex: '0 1 auto',\n }}\n >\n {title}\n </OverflowTooltipTypography>\n {infoPlacement === 'title' ? infoButton : null}\n </Stack>\n\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.75}\n useFlexGap\n sx={{ minWidth: 0, alignSelf: 'stretch', maxWidth: '100%' }}\n >\n <KpiMetricValueDisplay\n value={value}\n metricColor={metricColor}\n animateValue={animateValue}\n valueAnimationDurationMs={valueAnimationDurationMs}\n valueAnimationUseGrouping={valueAnimationUseGrouping}\n valueAnimationLocale={valueAnimationLocale}\n layout=\"detailed\"\n />\n {infoPlacement === 'value' ? infoButton : null}\n </Stack>\n\n {trendLayout === 'stacked' ? (\n stackedSplit ? (\n <Typography\n variant=\"body2\"\n component=\"div\"\n sx={{\n fontWeight: 400,\n lineHeight: 1.4,\n minWidth: 0,\n alignSelf: 'stretch',\n }}\n >\n <Typography\n component=\"span\"\n variant=\"body2\"\n sx={{ fontWeight: 400, color: stackedPrefixColor }}\n >\n {trend.comparisonPrefix}\n </Typography>\n <Typography\n component=\"span\"\n variant=\"body2\"\n sx={{ fontWeight: 400, color: stackedHighlightColor }}\n >\n {trend.comparisonHighlight}\n </Typography>\n </Typography>\n ) : typeof trend.comparisonText === 'string' ? (\n <Typography\n variant=\"body2\"\n sx={{\n color: trend.comparisonColor ?? 'text.secondary',\n fontWeight: 400,\n lineHeight: 1.4,\n minWidth: 0,\n alignSelf: 'stretch',\n }}\n >\n {trend.comparisonText}\n </Typography>\n ) : trend.comparisonText != null ? (\n <Box\n sx={{\n typography: 'body2',\n color: trend.comparisonColor ?? 'text.secondary',\n fontWeight: 400,\n lineHeight: 1.4,\n minWidth: 0,\n alignSelf: 'stretch',\n '& strong': { fontWeight: 600 },\n }}\n >\n {trend.comparisonText}\n </Box>\n ) : null\n ) : (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.75}\n flexWrap=\"nowrap\"\n useFlexGap\n sx={{ width: '100%', minWidth: 0 }}\n >\n {trend.percentLabel ? (\n <Typography\n component=\"span\"\n fontWeight={600}\n sx={{\n color: resolvedTrendColor,\n flexShrink: 0,\n fontSize: `${rowTrendFontSizePx}px`,\n lineHeight: 1.35,\n }}\n >\n {trend.percentLabel}\n </Typography>\n ) : null}\n <Box sx={{ flexShrink: 0, lineHeight: 0, display: 'flex' }}>\n <Icon\n icon={\n trend.direction === 'down'\n ? 'mdi:trending-down'\n : 'mdi:trending-up'\n }\n width={rowTrendIconSizePx}\n height={rowTrendIconSizePx}\n style={{ color: resolvedTrendColor }}\n />\n </Box>\n {trend.comparisonText != null ? (\n typeof trend.comparisonText === 'string' ? (\n <OverflowTooltipTypography\n tooltip={trend.comparisonText}\n component=\"span\"\n fontWeight={700}\n sx={{\n fontSize: `${rowTrendFontSizePx}px`,\n lineHeight: 1.35,\n color: rowComparisonColor,\n minWidth: 0,\n flex: '1 1 auto',\n }}\n >\n {trend.comparisonText}\n </OverflowTooltipTypography>\n ) : (\n <Box\n sx={{\n fontSize: `${rowTrendFontSizePx}px`,\n lineHeight: 1.35,\n fontWeight: 700,\n color: rowComparisonColor,\n minWidth: 0,\n flex: '1 1 auto',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n '& strong': {\n fontWeight: 700,\n color: rowComparisonColor,\n fontSize: 'inherit',\n },\n }}\n >\n {trend.comparisonText}\n </Box>\n )\n ) : null}\n </Stack>\n )}\n </Stack>\n </Stack>\n </Stack>\n\n <Box\n sx={{\n position: 'absolute',\n top: cardPaddingPx,\n right: cardPaddingPx,\n width: iconBackdropSizePx,\n height: iconBackdropSizePx,\n borderRadius: iconBackdropShape === 'round' ? '50%' : 2,\n bgcolor: iconBackdropColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n zIndex: 1,\n }}\n >\n <Icon\n icon={icon}\n color={iconColor}\n width={iconSize}\n height={iconSize}\n />\n </Box>\n </Paper>\n );\n};\n","import { useEffect, useRef, useState } from 'react';\n\n/**\n * Ease-out cubic for a natural deceleration (similar to many count-up UIs).\n */\nfunction easeOutCubic(t: number): number {\n return 1 - (1 - t) ** 3;\n}\n\n/**\n * Animates a numeric metric when `target` changes. First paint uses `target` with no tween\n * (avoids flashing from 0 on mount). Opt out with `enabled: false`.\n */\nexport function useAnimatedMetric(\n target: number,\n enabled: boolean,\n durationMs: number\n): number {\n const [display, setDisplay] = useState(target);\n const displayRef = useRef(target);\n const didMountRef = useRef(false);\n const rafRef = useRef(0);\n\n useEffect(() => {\n const cancelRaf = () => {\n if (rafRef.current !== 0) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = 0;\n }\n };\n\n if (!enabled || !Number.isFinite(target)) {\n cancelRaf();\n displayRef.current = target;\n setDisplay(target);\n return;\n }\n\n if (!didMountRef.current) {\n didMountRef.current = true;\n displayRef.current = target;\n setDisplay(target);\n return;\n }\n\n const from = displayRef.current;\n if (from === target) {\n return;\n }\n\n cancelRaf();\n const start = performance.now();\n let cancelled = false;\n\n const step = (now: number) => {\n if (cancelled) {\n return;\n }\n const elapsed = now - start;\n const t = Math.min(1, elapsed / durationMs);\n const eased = easeOutCubic(t);\n const next = from + (target - from) * eased;\n displayRef.current = next;\n setDisplay(next);\n if (t < 1) {\n rafRef.current = requestAnimationFrame(step);\n } else {\n displayRef.current = target;\n setDisplay(target);\n rafRef.current = 0;\n }\n };\n\n rafRef.current = requestAnimationFrame(step);\n\n return () => {\n cancelled = true;\n cancelRaf();\n };\n }, [target, enabled, durationMs]);\n\n return display;\n}\n","import type { ProgressBarNumberProps } from './ProgressBarNumber.types';\n\nconst FullProgress = ({\n number,\n numColor,\n}: Omit<ProgressBarNumberProps, 'progress'>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={56}\n height={56}\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n >\n <circle\n cx={28}\n cy={28}\n r={26}\n fill=\"#D9D9D9\"\n stroke=\"#222222\"\n strokeWidth={4}\n />\n <text x={28} y={36} fontSize={24} textAnchor=\"middle\" fill={numColor}>\n {number}\n </text>\n </svg>\n);\n\nconst HalfProgress = ({\n number,\n numColor,\n}: Omit<ProgressBarNumberProps, 'progress'>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={56}\n height={56}\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n >\n <circle\n cx={28}\n cy={28}\n r={26}\n fill=\"#D9D9D9\"\n stroke=\"#222222\"\n strokeWidth={4}\n strokeDasharray={85}\n strokeDashoffset={130}\n />\n <text x={28} y={36} fontSize={24} textAnchor=\"middle\" fill={numColor}>\n {number}\n </text>\n </svg>\n);\n\nconst NoProgress = ({\n number,\n numColor,\n}: Omit<ProgressBarNumberProps, 'progress'>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={56}\n height={56}\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n >\n <circle\n cx={28}\n cy={28}\n r={26}\n fill=\"#D9D9D9\"\n stroke=\"#222222\"\n strokeOpacity=\"0.1\"\n strokeWidth=\"4\"\n />\n <text x={28} y={36} fontSize={24} textAnchor=\"middle\" fill={numColor}>\n {number}\n </text>\n </svg>\n);\n\nexport const ProgressBarNumber = ({\n number,\n progress,\n numColor,\n}: ProgressBarNumberProps) => {\n if (progress === 0) {\n return <NoProgress number={number} numColor={numColor} />;\n }\n if (progress === 50) {\n return <HalfProgress number={number} numColor={numColor} />;\n }\n if (progress === 100) {\n return <FullProgress number={number} numColor={numColor} />;\n }\n return <div>Invalid Progress</div>;\n};\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport { useTheme } from '@mui/material/styles';\nimport * as React from 'react';\nimport { Cell, Pie, PieChart, ResponsiveContainer, Tooltip } from 'recharts';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport { ChartWidgetSegmentedTabs } from '../../tabs/ChartWidgetSegmentedTabs';\nimport type {\n WalkinAnalysisCardMaxWidth,\n WalkinAnalysisPieSize,\n WalkinAnalysisProps,\n WalkinAnalysisSlice,\n WalkinAnalysisTypography,\n} from './WalkinAnalysis.types';\n\nconst walkinPieSizeDefaults = { xs: 180, sm: 220, md: 260 } as const;\n\nfunction px(n: number): string {\n return `${n}px`;\n}\n\nfunction resolveFontSize(\n value: number | string | undefined,\n fallbackPx: number\n): number | string {\n if (value === undefined) return fallbackPx;\n if (typeof value === 'number') return value;\n return value;\n}\n\nfunction resolveCardMaxWidth(\n cardMaxWidth: WalkinAnalysisCardMaxWidth | undefined\n):\n | number\n | string\n | { xs?: number | string; sm?: number | string; md?: number | string } {\n if (cardMaxWidth === undefined) {\n return { xs: '100%', sm: 640 };\n }\n if (typeof cardMaxWidth === 'number') {\n return px(cardMaxWidth);\n }\n if (typeof cardMaxWidth === 'string') {\n return cardMaxWidth;\n }\n return {\n xs:\n cardMaxWidth.xs !== undefined\n ? typeof cardMaxWidth.xs === 'number'\n ? px(cardMaxWidth.xs)\n : cardMaxWidth.xs\n : '100%',\n sm:\n cardMaxWidth.sm !== undefined\n ? typeof cardMaxWidth.sm === 'number'\n ? px(cardMaxWidth.sm)\n : cardMaxWidth.sm\n : 640,\n ...(cardMaxWidth.md !== undefined\n ? {\n md:\n typeof cardMaxWidth.md === 'number'\n ? px(cardMaxWidth.md)\n : cardMaxWidth.md,\n }\n : {}),\n };\n}\n\nfunction useWalkinResolvedPieSize(\n pieSize: WalkinAnalysisPieSize | undefined\n): number {\n const theme = useTheme();\n const mdUp = useMediaQuery(theme.breakpoints.up('md'));\n const smUp = useMediaQuery(theme.breakpoints.up('sm'));\n\n if (typeof pieSize === 'number') {\n return pieSize;\n }\n const merged = {\n xs: pieSize?.xs ?? walkinPieSizeDefaults.xs,\n sm: pieSize?.sm ?? walkinPieSizeDefaults.sm,\n md: pieSize?.md ?? walkinPieSizeDefaults.md,\n };\n if (mdUp) return merged.md;\n if (smUp) return merged.sm;\n return merged.xs;\n}\n\nconst numberFormatter = new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 0,\n});\n\n/** Recharts `Pie` row: positive counts only (zero-count slices stay in the legend only). */\ntype WalkinPieDatum = Pick<\n WalkinAnalysisSlice,\n 'id' | 'label' | 'color' | 'segmentPercentColor'\n> & { value: number };\n\nfunction walkinSlicesToPieData(\n slices: WalkinAnalysisSlice[]\n): WalkinPieDatum[] {\n return slices\n .filter(s => s.count > 0)\n .map(s => ({\n id: s.id,\n label: s.label,\n value: s.count,\n color: s.color,\n segmentPercentColor: s.segmentPercentColor,\n }));\n}\n\ntype WalkinPieTooltipProps = TooltipContentProps & {\n sliceTotal: number;\n titleFontSize: number | string;\n valueFontSize: number | string;\n};\n\nfunction WalkinPieTooltip({\n active,\n payload,\n sliceTotal,\n titleFontSize,\n valueFontSize,\n}: WalkinPieTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length) {\n return null;\n }\n const first = payload[0] as TooltipPayloadEntry;\n const datum = first.payload as WalkinPieDatum | undefined;\n if (!datum || typeof datum.value !== 'number') {\n return null;\n }\n const pct = sliceTotal > 0 ? Math.round((datum.value / sliceTotal) * 100) : 0;\n return (\n <Box\n sx={{\n bgcolor: '#fff',\n borderRadius: 1,\n px: 1.5,\n py: 1.25,\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n border: '1px solid #E8E8E8',\n minWidth: 168,\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ mb: 0.75 }}>\n <Box\n sx={{\n width: 12,\n height: 12,\n borderRadius: 0.5,\n bgcolor: datum.color,\n flexShrink: 0,\n }}\n />\n <Typography\n sx={{\n fontSize: titleFontSize,\n fontWeight: 700,\n color: '#1a1a1a',\n lineHeight: 1.3,\n }}\n >\n {datum.label}\n </Typography>\n </Stack>\n <Typography\n variant=\"body2\"\n sx={{ color: '#333', fontSize: valueFontSize }}\n >\n {numberFormatter.format(datum.value)} ({pct}%)\n </Typography>\n </Box>\n );\n}\n\nfunction WalkinPiePercentLabel(props: {\n cx?: number;\n cy?: number;\n midAngle?: number;\n innerRadius?: number;\n outerRadius?: number;\n percent?: number;\n payload?: WalkinPieDatum;\n fontSize: number | string;\n}): React.ReactElement | null {\n const {\n cx: cxProp,\n cy: cyProp,\n midAngle: midProp,\n innerRadius: innerProp,\n outerRadius: outerProp,\n percent: percentProp,\n payload,\n fontSize,\n } = props;\n const cx = cxProp ?? 0;\n const cy = cyProp ?? 0;\n const midAngle = midProp ?? 0;\n const innerRadius = innerProp ?? 0;\n const outerRadius = outerProp ?? 0;\n const percent = percentProp ?? 0;\n const rounded = Math.round(percent * 100);\n if (rounded <= 0) {\n return null;\n }\n const labelRadius = innerRadius + (outerRadius - innerRadius) * 0.58;\n const rad = (-midAngle * Math.PI) / 180;\n const x = cx + labelRadius * Math.cos(rad);\n const y = cy + labelRadius * Math.sin(rad);\n return (\n <text\n x={x}\n y={y}\n fill={payload?.segmentPercentColor ?? '#fff'}\n fontSize={fontSize}\n fontWeight={600}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n >\n {rounded}%\n </text>\n );\n}\n\nfunction WalkinPieChart({\n slices,\n size,\n typography,\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n}: {\n slices: WalkinAnalysisSlice[];\n size: number;\n typography: WalkinAnalysisTypography | undefined;\n isChartAnimationActive?: boolean;\n chartAnimationDuration?: number;\n}) {\n const total = slices.reduce((sum, s) => sum + s.count, 0);\n const pieData = React.useMemo(() => walkinSlicesToPieData(slices), [slices]);\n\n const summary =\n total > 0\n ? slices.map(s => `${s.label}: ${s.count}`).join('; ')\n : 'No data';\n\n const piePercentSize = resolveFontSize(typography?.piePercent, 14);\n const tooltipTitleSize = resolveFontSize(typography?.tooltipTitle, 13);\n const tooltipValueSize = resolveFontSize(typography?.tooltipValue, 12);\n const emptyStateSize = typography?.emptyState;\n\n if (total <= 0) {\n return (\n <Box\n sx={{\n width: size,\n height: size,\n borderRadius: '50%',\n bgcolor: '#F0F0F0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n role=\"img\"\n aria-label={summary}\n >\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={\n emptyStateSize !== undefined\n ? { fontSize: emptyStateSize }\n : undefined\n }\n >\n No data\n </Typography>\n </Box>\n );\n }\n\n const outerRadius = size * 0.42;\n\n return (\n <Box\n role=\"img\"\n aria-label={summary}\n sx={{\n width: size,\n height: size,\n lineHeight: 0,\n '& .recharts-surface:focus': { outline: 'none' },\n }}\n >\n <ResponsiveContainer width={size} height={size}>\n <PieChart>\n <Tooltip\n content={(props: TooltipContentProps) => (\n <WalkinPieTooltip\n {...props}\n sliceTotal={total}\n titleFontSize={tooltipTitleSize}\n valueFontSize={tooltipValueSize}\n />\n )}\n wrapperStyle={{ outline: 'none', zIndex: 2 }}\n />\n <Pie\n data={pieData}\n dataKey=\"value\"\n nameKey=\"label\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={0}\n outerRadius={outerRadius}\n startAngle={90}\n endAngle={450}\n paddingAngle={0}\n stroke=\"none\"\n labelLine={false}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n label={labelProps => (\n <WalkinPiePercentLabel\n {...labelProps}\n fontSize={piePercentSize}\n />\n )}\n >\n {pieData.map(entry => (\n <Cell key={entry.id} fill={entry.color} stroke=\"none\" />\n ))}\n </Pie>\n </PieChart>\n </ResponsiveContainer>\n </Box>\n );\n}\n\n/**\n * Walk-in style analysis card: title row (optional `headerActions`), tabs, Recharts pie, legend.\n * Pie and legend are driven by `slices` (`label`, `count`, `color`, optional legend / segment % colors).\n */\nexport const WalkinAnalysis = ({\n title,\n tabs,\n activeTabId,\n onTabChange,\n segmentedTabsFullWidth,\n segmentedTabsSx,\n slices,\n headerActions,\n cardSx,\n cardMaxWidth,\n pieSize,\n typography,\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n}: WalkinAnalysisProps) => {\n const resolvedPieSize = useWalkinResolvedPieSize(pieSize);\n const total = slices.reduce((sum, s) => sum + s.count, 0);\n\n return (\n <Box\n sx={{\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n ...cardSx,\n }}\n >\n <Stack spacing={2.5}>\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n gap={2}\n >\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={{\n fontWeight: 700,\n color: '#1a1a1a',\n pr: 1,\n ...(typography?.title != null\n ? { fontSize: typography.title }\n : {}),\n }}\n >\n {title}\n </Typography>\n {headerActions ? (\n <Box sx={{ flexShrink: 0 }}>{headerActions}</Box>\n ) : null}\n </Stack>\n\n <ChartWidgetSegmentedTabs\n tabs={tabs}\n activeTabId={activeTabId}\n onTabChange={onTabChange}\n ariaLabel=\"Analysis scope\"\n fullWidth={segmentedTabsFullWidth}\n tabFontSize={typography?.tabs}\n rootSx={segmentedTabsSx}\n />\n\n <Stack\n direction={{ xs: 'column', sm: 'row' }}\n spacing={3}\n alignItems=\"center\"\n justifyContent=\"flex-start\"\n sx={{ width: '100%' }}\n >\n <Box sx={{ flexShrink: 0, lineHeight: 0 }}>\n <WalkinPieChart\n slices={slices}\n size={resolvedPieSize}\n typography={typography}\n isChartAnimationActive={isChartAnimationActive}\n chartAnimationDuration={chartAnimationDuration}\n />\n </Box>\n <Stack\n spacing={2}\n sx={{\n flex: 1,\n minWidth: 0,\n alignSelf: { xs: 'stretch', sm: 'auto' },\n width: { xs: '100%', sm: 'auto' },\n }}\n >\n {slices.map(slice => {\n const pct =\n total > 0 ? Math.round((slice.count / total) * 100) : 0;\n return (\n <Stack key={slice.id} spacing={0.75}>\n <Typography\n sx={{\n fontStyle: 'italic',\n fontWeight: 700,\n color: slice.legendLabelColor ?? '#424242',\n fontSize: resolveFontSize(typography?.legendLabel, 13),\n }}\n >\n {slice.label}\n </Typography>\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <Box\n sx={{\n width: 14,\n height: 14,\n borderRadius: 0.5,\n bgcolor: slice.color,\n flexShrink: 0,\n }}\n />\n <Typography\n variant=\"body2\"\n sx={{\n color: slice.legendValueColor ?? '#333',\n fontSize: resolveFontSize(typography?.legendValue, 12),\n }}\n >\n {numberFormatter.format(slice.count)} ({pct}%)\n </Typography>\n {slice.legendInfo ? (\n <Box sx={{ display: 'inline-flex', flexShrink: 0 }}>\n {slice.legendInfo}\n </Box>\n ) : null}\n </Stack>\n </Stack>\n );\n })}\n </Stack>\n </Stack>\n </Stack>\n </Box>\n );\n};\n","import Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Cell,\n LabelList,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport type {\n FootfallByGenderChartColors,\n FootfallByGenderHorizontalScroll,\n FootfallByGenderProps,\n FootfallByGenderRow,\n FootfallByGenderTooltipStyles,\n} from './FootfallByGender.types';\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nconst defaultSeriesLabels = { male: 'Male', female: 'Female' } as const;\nconst defaultSeriesColors = { male: '#0071C1', female: '#FF7F1E' } as const;\n\nconst defaultMinWidthPerCategory = 72;\nconst defaultMaxBarThickness = 32;\nconst chartWidthAxisGutter = 88;\n\nconst defaultChartMargin = {\n top: 28,\n right: 20,\n left: 16,\n bottom: 56,\n} as const;\n\nconst defaultChartColors: FootfallByGenderChartColors = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n barValueLabelFill: '#4B5563',\n};\n\nconst topReserveForBarLabels = 58;\nconst topReserveNoBarLabels = 28;\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}k`;\n }\n return String(value);\n}\n\nfunction formatYAxisTickDefault(value: number): string {\n if (!Number.isFinite(value)) {\n return '';\n }\n const abs = Math.abs(value);\n if (abs >= 1000) {\n const k = value / 1000;\n const text = Number.isInteger(k) ? String(k) : k.toFixed(1);\n return `${text}k`;\n }\n return String(value);\n}\n\ntype GenderTooltipProps = TooltipContentProps & {\n isBarHovered: boolean;\n categoryLabel: string;\n overallLabel: string;\n seriesLabels: { male: string; female: string };\n seriesColors: { male: string; female: string };\n tooltipStyles?: FootfallByGenderTooltipStyles;\n};\n\nfunction GenderTooltip({\n active,\n payload,\n label,\n isBarHovered,\n categoryLabel,\n overallLabel,\n seriesLabels,\n seriesColors,\n tooltipStyles,\n}: GenderTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || !isBarHovered || label === undefined) {\n return null;\n }\n\n const maleEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === 'male'\n );\n const femaleEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === 'female'\n );\n const male = Number(maleEntry?.value ?? 0);\n const female = Number(femaleEntry?.value ?? 0);\n const total = male + female;\n\n const ts = tooltipStyles;\n const sectionBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n marginBottom: '8px',\n };\n\n return (\n <div\n style={mergeCss(\n {\n backgroundColor: 'white',\n borderRadius: '8px',\n padding: '16px',\n width: '180px',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n },\n ts?.container\n )}\n >\n <div\n style={mergeCss(\n { ...sectionBase, marginBottom: '8px' },\n ts?.sectionRow\n )}\n >\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {categoryLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {label}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {overallLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {total.toLocaleString()}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: seriesColors.male,\n },\n ts?.seriesDot\n )}\n />\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.seriesName\n )}\n >\n {seriesLabels.male}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {male.toLocaleString()}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: seriesColors.female,\n },\n ts?.seriesDot\n )}\n />\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.seriesName\n )}\n >\n {seriesLabels.female}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {female.toLocaleString()}\n </div>\n </div>\n </div>\n );\n}\n\nfunction resolveCategoryScroll(\n minWidthPerCategory: number,\n horizontalScroll: FootfallByGenderHorizontalScroll,\n categoryCount: number\n): boolean {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScroll === 'off') {\n return false;\n }\n if (horizontalScroll === 'on') {\n return true;\n }\n return categoryCount > 1;\n}\n\n/**\n * Grouped bar chart: two series (male / female) per category, with hover dimming and a custom tooltip.\n */\nexport function FootfallByGender({\n title,\n data,\n seriesLabels: seriesLabelsProp,\n seriesColors: seriesColorsProp,\n chartHeight = 430,\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n barGap = 0,\n showLegend = true,\n showBarValueLabels = true,\n dimmedBarOpacity = 0.3,\n hoveredBarOpacity = 0.9,\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendOverlaySx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartViewportSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n emptyStateTextSx,\n headerActions,\n tooltipCategoryLabel = 'Region',\n tooltipOverallLabel = 'Overall Walk-ins',\n tooltipStyles,\n chartMargin: chartMarginProp,\n chartColors: chartColorsProp,\n yAxisTickFormatter,\n emptyStateText = 'No data',\n}: FootfallByGenderProps) {\n const seriesLabels = { ...defaultSeriesLabels, ...seriesLabelsProp };\n const seriesColors = { ...defaultSeriesColors, ...seriesColorsProp };\n\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\n const [barHovered, setBarHovered] = React.useState(false);\n\n const handleMouseEnter = React.useCallback((_: unknown, index: number) => {\n setBarHovered(true);\n setActiveIndex(index);\n }, []);\n\n const handleMouseLeave = React.useCallback(() => {\n setBarHovered(false);\n setActiveIndex(null);\n }, []);\n\n const processedData = React.useMemo((): FootfallByGenderRow[] => {\n return data.map(row => ({ ...row }));\n }, [data]);\n\n const categoryScrollActive = React.useMemo(\n () =>\n resolveCategoryScroll(\n minWidthPerCategory,\n horizontalScrollProp,\n processedData.length\n ),\n [horizontalScrollProp, minWidthPerCategory, processedData.length]\n );\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n const resolvedMaxBarSize = React.useMemo(() => {\n if (maxBarSizeProp !== undefined) {\n return maxBarSizeProp;\n }\n const categoryCap =\n minWidthPerCategory > 0\n ? minWidthPerCategory\n : defaultMinWidthPerCategory;\n return Math.min(categoryCap, defaultMaxBarThickness);\n }, [maxBarSizeProp, minWidthPerCategory]);\n\n const chartMargin = React.useMemo(() => {\n const top = showBarValueLabels\n ? topReserveForBarLabels\n : topReserveNoBarLabels;\n return {\n ...defaultChartMargin,\n top,\n ...chartMarginProp,\n };\n }, [showBarValueLabels, chartMarginProp]);\n\n const chartColors = React.useMemo(\n () => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n const yAxisTick = yAxisTickFormatter ?? formatYAxisTickDefault;\n\n const barOpacity = (index: number) =>\n activeIndex === null || activeIndex === index\n ? hoveredBarOpacity\n : dimmedBarOpacity;\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n },\n titleRowSx\n )}\n >\n {headerActions ? (\n <Box\n sx={{\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 1,\n }}\n >\n {headerActions}\n </Box>\n ) : null}\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'center',\n width: '100%',\n px: headerActions ? 5 : 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n },\n chartViewportSx\n )}\n >\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n height: '100%',\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {processedData.length > 0 ? (\n <BarChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n barGap={barGap}\n maxBarSize={resolvedMaxBarSize}\n onMouseLeave={handleMouseLeave}\n style={{ overflow: 'visible' }}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n angle={-38}\n textAnchor=\"end\"\n interval={0}\n height={68}\n tickMargin={10}\n dy={6}\n tick={{ fontSize: 12 }}\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n width={52}\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400 }}\n tickFormatter={yAxisTick}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <Tooltip\n cursor={false}\n content={(tooltipProps: TooltipContentProps) => (\n <GenderTooltip\n {...tooltipProps}\n isBarHovered={barHovered}\n categoryLabel={tooltipCategoryLabel}\n overallLabel={tooltipOverallLabel}\n seriesLabels={seriesLabels}\n seriesColors={seriesColors}\n tooltipStyles={tooltipStyles}\n />\n )}\n />\n <Bar\n dataKey=\"male\"\n name={seriesLabels.male}\n fill={seriesColors.male}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {processedData.map((row, index) => (\n <Cell\n key={`m-${row.name}-${index}`}\n fillOpacity={barOpacity(index)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n dataKey=\"male\"\n position=\"top\"\n offset={12}\n fill={chartColors.barValueLabelFill}\n fontSize={12}\n angle={-90}\n formatter={label => formatBarLabel(Number(label))}\n />\n ) : null}\n </Bar>\n <Bar\n dataKey=\"female\"\n name={seriesLabels.female}\n fill={seriesColors.female}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {processedData.map((row, index) => (\n <Cell\n key={`f-${row.name}-${index}`}\n fillOpacity={barOpacity(index)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n dataKey=\"female\"\n position=\"top\"\n offset={12}\n fill={chartColors.barValueLabelFill}\n fontSize={12}\n angle={-90}\n formatter={label => formatBarLabel(Number(label))}\n />\n ) : null}\n </Bar>\n </BarChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={emptyStateTextSx}\n >\n {emptyStateText}\n </Typography>\n </Box>\n )}\n </Box>\n {showLegend && processedData.length > 0 ? (\n <Box\n component=\"ul\"\n sx={sxChain(\n {\n position: 'absolute',\n top: 6,\n right: 10,\n zIndex: 2,\n listStyle: 'none',\n m: 0,\n p: 0,\n pl: 1,\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'nowrap',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 2,\n pointerEvents: 'none',\n },\n legendOverlaySx\n )}\n >\n <Box\n component=\"li\"\n sx={sxChain(\n {\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n flexShrink: 0,\n },\n legendItemSx\n )}\n >\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n borderRadius: '3px',\n bgcolor: seriesColors.male,\n flexShrink: 0,\n },\n legendSwatchSx\n )}\n />\n <Typography\n component=\"span\"\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {seriesLabels.male}\n </Typography>\n </Box>\n <Box\n component=\"li\"\n sx={sxChain(\n {\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n flexShrink: 0,\n },\n legendItemSx\n )}\n >\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n borderRadius: '3px',\n bgcolor: seriesColors.female,\n flexShrink: 0,\n },\n legendSwatchSx\n )}\n />\n <Typography\n component=\"span\"\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {seriesLabels.female}\n </Typography>\n </Box>\n </Box>\n ) : null}\n </Box>\n </Stack>\n </Box>\n );\n}\n","import Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport {\n Bar,\n CartesianGrid,\n Cell,\n ComposedChart,\n LabelList,\n Line,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport { useChartPlotScrollToEnd } from '../../_chart/useChartPlotScrollToEnd';\nimport type {\n PasserbyConversionChartColors,\n PasserbyConversionProps,\n PasserbyConversionRow,\n PasserbyConversionTooltipStyles,\n} from './PasserbyConversion.types';\n\nconst PASSERBY_KEY = 'passerby';\nconst WALKINS_KEY = 'walkIns';\nconst CONVERSION_KEY = 'conversion';\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}k`;\n }\n return String(value);\n}\n\nfunction formatYAxisTickDefault(value: number): string {\n if (!Number.isFinite(value)) {\n return '';\n }\n const abs = Math.abs(value);\n if (abs >= 1000) {\n const k = value / 1000;\n const text = Number.isInteger(k) ? String(k) : k.toFixed(1);\n return `${text}k`;\n }\n return String(value);\n}\n\ninterface RechartsBarLabelListProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n value?: number | string | null;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction BarTopLabel({\n x,\n y,\n width,\n value,\n fill,\n}: RechartsBarLabelListProps & { fill: string }) {\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n if (nx === undefined || ny === undefined || nw === undefined) {\n return null;\n }\n const n =\n value === null || value === undefined\n ? NaN\n : typeof value === 'number'\n ? value\n : Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n return null;\n }\n const cx = nx + nw / 2;\n const cy = ny - 6;\n return (\n <text\n x={cx}\n y={cy}\n fill={fill}\n fontSize={12}\n fontWeight={500}\n textAnchor=\"middle\"\n >\n {formatBarLabel(n)}\n </text>\n );\n}\n\nfunction tooltipDatumFromPayload(\n payload: TooltipContentProps['payload']\n): PasserbyConversionRow | undefined {\n const raw = payload?.[0]?.payload;\n if (\n raw &&\n typeof raw === 'object' &&\n PASSERBY_KEY in raw &&\n WALKINS_KEY in raw\n ) {\n return raw as PasserbyConversionRow;\n }\n return undefined;\n}\n\ntype ConversionTooltipProps = TooltipContentProps & {\n timeLabel: string;\n overallLabel: string;\n walkInsLabel: string;\n passerbyLabel: string;\n conversionLabel: string;\n formatConversion: (value: number) => string;\n colors: { walkIns: string; passerby: string; conversion: string };\n showConversionRow: boolean;\n tooltipStyles?: PasserbyConversionTooltipStyles;\n};\n\nfunction ConversionTooltip({\n active,\n payload,\n label,\n timeLabel,\n overallLabel,\n walkInsLabel,\n passerbyLabel,\n conversionLabel,\n formatConversion,\n colors,\n showConversionRow,\n tooltipStyles,\n}: ConversionTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || label === undefined) {\n return null;\n }\n\n const datum = tooltipDatumFromPayload(payload);\n const passerbyEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === PASSERBY_KEY\n );\n const walkEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === WALKINS_KEY\n );\n const passerby = Number(passerbyEntry?.value ?? 0);\n const walkIns = Number(walkEntry?.value ?? 0);\n const overall = passerby + walkIns;\n\n const timeDisplay =\n datum?.timeSlotLabel !== undefined && datum.timeSlotLabel !== ''\n ? datum.timeSlotLabel\n : String(label);\n\n const convRaw = datum?.conversion;\n const conversion =\n typeof convRaw === 'number' && Number.isFinite(convRaw) ? convRaw : NaN;\n const showConv = showConversionRow && Number.isFinite(conversion);\n\n const ts = tooltipStyles;\n const rowBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 6,\n rowGap: 2,\n marginBottom: 8,\n };\n const labelStyle = mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 700 },\n ts?.label\n );\n const valueStyle = mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.value\n );\n const dotBase = mergeCss(\n {\n width: 10,\n height: 10,\n borderRadius: '50%',\n flexShrink: 0,\n },\n ts?.seriesDot\n );\n\n return (\n <div\n style={mergeCss(\n {\n backgroundColor: '#fff',\n borderRadius: 8,\n padding: '12px 14px',\n width: 'max-content',\n maxWidth: 220,\n minWidth: 0,\n boxSizing: 'border-box',\n boxShadow: '0 2px 12px rgba(0, 0, 0, 0.12)',\n border: '1px solid #E8E8E8',\n },\n ts?.container\n )}\n >\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{timeLabel}:</span>\n <span style={valueStyle}>{timeDisplay}</span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{overallLabel}:</span>\n <span style={valueStyle}>{overall.toLocaleString()}</span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span\n style={mergeCss({ ...dotBase, backgroundColor: colors.walkIns })}\n />\n <span\n style={mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 500 },\n ts?.seriesName\n )}\n >\n {walkInsLabel}:\n </span>\n <span\n style={mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {walkIns.toLocaleString()}\n </span>\n </div>\n <div\n style={mergeCss(\n { ...rowBase, marginBottom: showConv ? 8 : 0 },\n ts?.row\n )}\n >\n <span\n style={mergeCss({ ...dotBase, backgroundColor: colors.passerby })}\n />\n <span\n style={mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 500 },\n ts?.seriesName\n )}\n >\n {passerbyLabel}:\n </span>\n <span\n style={mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {passerby.toLocaleString()}\n </span>\n </div>\n {showConv ? (\n <div style={mergeCss({ ...rowBase, marginBottom: 0 }, ts?.row)}>\n <span\n style={mergeCss({ ...dotBase, backgroundColor: colors.conversion })}\n />\n <span\n style={mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 500 },\n ts?.seriesName\n )}\n >\n {conversionLabel}:\n </span>\n <span\n style={mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {formatConversion(conversion)}\n </span>\n </div>\n ) : null}\n </div>\n );\n}\n\nconst defaultMinWidthPerCategory = 56;\nconst defaultMaxBarThickness = 28;\nconst chartWidthAxisGutter = 108;\n\nconst defaultChartMargin = {\n top: 28,\n right: 8,\n left: 4,\n bottom: 52,\n} as const;\n\nconst topReserveForBarLabels = 52;\nconst topReserveNoBarLabels = 22;\n\nconst defaultChartColors = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n passerbyBarFill: '#FFCC4D',\n walkInsBarFill: '#008099',\n conversionLineStroke: '#6B4C84',\n barValueLabelFill: '#374151',\n} as const;\n\nfunction defaultFormatTooltipConversion(value: number): string {\n return `${Math.round(value)}%`;\n}\n\nexport function PasserbyConversion({\n title,\n data,\n timeSlots,\n fillMissingTimeSlots = true,\n chartHeight = 430,\n passerbySeriesName = 'Passerby',\n walkInsSeriesName = 'Walk-ins',\n conversionSeriesName = 'Conversion',\n lineType = 'natural',\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n barGap = 0,\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendRowSx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n emptyStateTextSx,\n headerActions,\n tooltipTimeLabel = 'Time',\n tooltipOverallLabel = 'Overall',\n tooltipWalkInsLabel,\n tooltipPasserbyLabel,\n tooltipConversionLabel = 'Conversion(%)',\n formatTooltipConversion = defaultFormatTooltipConversion,\n conversionAxisLabel,\n yAxisTickFormatter,\n conversionAxisTickFormatter,\n tooltipStyles,\n showLegend = true,\n showConversionLine: showConversionLineProp,\n showBarValueLabels = true,\n chartMargin: chartMarginProp,\n chartColors: chartColorsProp,\n emptyStateText = 'No data',\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n scrollChartToEndOnDataChange = true,\n}: PasserbyConversionProps) {\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\n\n const handleBarMouseEnter = React.useCallback((_: unknown, index: number) => {\n setActiveIndex(index);\n }, []);\n\n const handleChartMouseLeave = React.useCallback(() => {\n setActiveIndex(null);\n }, []);\n\n const processedData = React.useMemo(() => {\n const clone = data.map(row => ({ ...row }));\n if (!timeSlots || !fillMissingTimeSlots) {\n return clone;\n }\n const byName = new Map(clone.map(r => [r.name, r] as const));\n return timeSlots.map(slot => {\n const existing = byName.get(slot.name);\n if (existing) return existing;\n return {\n name: slot.name,\n timeSlotLabel: slot.timeSlotLabel ?? slot.name,\n passerby: 0,\n walkIns: 0,\n conversion: null,\n };\n });\n }, [data, timeSlots, fillMissingTimeSlots]);\n\n const hasConversionData = React.useMemo(\n () =>\n processedData.some(\n r => typeof r.conversion === 'number' && Number.isFinite(r.conversion)\n ),\n [processedData]\n );\n\n const showConversionLine =\n showConversionLineProp !== undefined\n ? showConversionLineProp\n : hasConversionData;\n\n const resolvedMaxBarSize = React.useMemo(() => {\n if (maxBarSizeProp !== undefined) {\n return maxBarSizeProp;\n }\n const categoryCap =\n minWidthPerCategory > 0\n ? minWidthPerCategory\n : defaultMinWidthPerCategory;\n // Two grouped `<Bar>` series: Recharts `maxBarSize` is per bar. Capping at `defaultMaxBarThickness`\n // while `minWidthPerCategory` is large (e.g. horizontal scroll) leaves a wide empty band *between* the bars.\n if (categoryCap <= 2 * defaultMaxBarThickness) {\n return Math.min(categoryCap, defaultMaxBarThickness);\n }\n const perBarIdeal = Math.max(8, Math.floor((categoryCap / 2) * 0.92));\n return Math.min(perBarIdeal, categoryCap);\n }, [maxBarSizeProp, minWidthPerCategory]);\n\n const categoryScrollActive = React.useMemo(() => {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScrollProp === 'off') {\n return false;\n }\n if (horizontalScrollProp === 'on') {\n return true;\n }\n return processedData.length > 1;\n }, [horizontalScrollProp, minWidthPerCategory, processedData.length]);\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n useChartPlotScrollToEnd(scrollRef, {\n enabled: scrollChartToEndOnDataChange,\n categoryScrollActive,\n dataLength: processedData.length,\n dataVersion: processedData,\n });\n\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n const chartColors = React.useMemo(\n (): Required<PasserbyConversionChartColors> => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n const chartMargin = React.useMemo(() => {\n const top = showBarValueLabels\n ? topReserveForBarLabels\n : topReserveNoBarLabels;\n const right = showConversionLine ? 52 : defaultChartMargin.right;\n return {\n ...defaultChartMargin,\n top,\n right,\n ...chartMarginProp,\n };\n }, [showBarValueLabels, showConversionLine, chartMarginProp]);\n\n const yTickLeft = yAxisTickFormatter ?? formatYAxisTickDefault;\n const yTickRight = conversionAxisTickFormatter ?? formatYAxisTickDefault;\n\n const barFillOpacity = React.useCallback(\n (index: number) =>\n activeIndex === null || activeIndex === index ? 1 : 0.38,\n [activeIndex]\n );\n\n const resolvedWalkInsTooltipLabel = tooltipWalkInsLabel ?? walkInsSeriesName;\n const resolvedPasserbyTooltipLabel =\n tooltipPasserbyLabel ?? passerbySeriesName;\n\n const legendItems = React.useMemo(() => {\n const items: {\n key: string;\n label: string;\n color: string;\n isLine?: boolean;\n }[] = [\n {\n key: 'walkins',\n label: walkInsSeriesName,\n color: chartColors.walkInsBarFill,\n },\n {\n key: 'passerby',\n label: passerbySeriesName,\n color: chartColors.passerbyBarFill,\n },\n ];\n if (showConversionLine) {\n items.push({\n key: 'conversion',\n label: conversionSeriesName,\n color: chartColors.conversionLineStroke,\n isLine: true,\n });\n }\n return items;\n }, [\n passerbySeriesName,\n walkInsSeriesName,\n conversionSeriesName,\n chartColors.walkInsBarFill,\n chartColors.passerbyBarFill,\n chartColors.conversionLineStroke,\n showConversionLine,\n ]);\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n width: '100%',\n minWidth: 0,\n },\n titleRowSx\n )}\n >\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'left',\n flex: 1,\n minWidth: 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n {headerActions ? (\n <Box sx={{ flexShrink: 0, display: 'flex', alignItems: 'center' }}>\n {headerActions}\n </Box>\n ) : null}\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n {showLegend && legendItems.length > 0 ? (\n <Box\n sx={sxChain(\n {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'flex-end',\n alignItems: 'center',\n columnGap: { xs: 2, sm: 3 },\n rowGap: 1,\n py: 0.5,\n px: { xs: 0, sm: 1 },\n },\n legendRowSx\n )}\n >\n {legendItems.map(item => (\n <Stack\n key={item.key}\n direction=\"row\"\n alignItems=\"center\"\n sx={sxChain({ gap: 1 }, legendItemSx)}\n >\n {item.isLine ? (\n <Box\n sx={sxChain(\n {\n width: 16,\n height: 3,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: 0.5,\n alignSelf: 'center',\n },\n legendSwatchSx\n )}\n />\n ) : (\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: '2px',\n },\n legendSwatchSx\n )}\n />\n )}\n <Typography\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {item.label}\n </Typography>\n </Stack>\n ))}\n </Box>\n ) : null}\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {processedData.length > 0 ? (\n <ComposedChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n maxBarSize={resolvedMaxBarSize}\n barGap={barGap}\n style={{ overflow: 'visible' }}\n onMouseLeave={handleChartMouseLeave}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n xAxisId=\"bottom\"\n angle={-42}\n textAnchor=\"end\"\n interval={0}\n height={64}\n tickMargin={8}\n dy={4}\n tick={{ fontSize: 12 }}\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n yAxisId=\"left\"\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400 }}\n tickFormatter={yTickLeft}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n width={44}\n />\n {showConversionLine ? (\n <YAxis\n yAxisId=\"right\"\n orientation=\"right\"\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400 }}\n tickFormatter={yTickRight}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n width={44}\n {...(conversionAxisLabel\n ? {\n label: {\n value: conversionAxisLabel,\n angle: 90,\n position: 'insideRight' as const,\n offset: 8,\n style: {\n fill: '#424242',\n fontSize: 11,\n fontWeight: 500,\n textAnchor: 'middle' as const,\n },\n },\n }\n : {})}\n />\n ) : null}\n <Tooltip\n cursor={false}\n wrapperStyle={{ outline: 'none', zIndex: 10 }}\n content={(tooltipProps: TooltipContentProps) => (\n <ConversionTooltip\n {...tooltipProps}\n timeLabel={tooltipTimeLabel}\n overallLabel={tooltipOverallLabel}\n walkInsLabel={resolvedWalkInsTooltipLabel}\n passerbyLabel={resolvedPasserbyTooltipLabel}\n conversionLabel={tooltipConversionLabel}\n formatConversion={formatTooltipConversion}\n colors={{\n walkIns: chartColors.walkInsBarFill,\n passerby: chartColors.passerbyBarFill,\n conversion: chartColors.conversionLineStroke,\n }}\n showConversionRow={showConversionLine}\n tooltipStyles={tooltipStyles}\n />\n )}\n />\n <Bar\n yAxisId=\"left\"\n xAxisId=\"bottom\"\n dataKey={PASSERBY_KEY}\n name={passerbySeriesName}\n fill={chartColors.passerbyBarFill}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n radius={[2, 2, 0, 0]}\n onMouseEnter={handleBarMouseEnter}\n >\n {processedData.map((_, i) => (\n <Cell\n key={`pb-${i}`}\n fill={chartColors.passerbyBarFill}\n fillOpacity={barFillOpacity(i)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n content={props => (\n <BarTopLabel\n {...(props as RechartsBarLabelListProps)}\n fill={chartColors.barValueLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n <Bar\n yAxisId=\"left\"\n xAxisId=\"bottom\"\n dataKey={WALKINS_KEY}\n name={walkInsSeriesName}\n fill={chartColors.walkInsBarFill}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n radius={[2, 2, 0, 0]}\n onMouseEnter={handleBarMouseEnter}\n >\n {processedData.map((_, i) => (\n <Cell\n key={`wi-${i}`}\n fill={chartColors.walkInsBarFill}\n fillOpacity={barFillOpacity(i)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n content={props => (\n <BarTopLabel\n {...(props as RechartsBarLabelListProps)}\n fill={chartColors.barValueLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n {showConversionLine ? (\n <Line\n yAxisId=\"right\"\n xAxisId=\"bottom\"\n type={lineType}\n dataKey={CONVERSION_KEY}\n name={conversionSeriesName}\n stroke={chartColors.conversionLineStroke}\n strokeWidth={2}\n dot={{\n r: 3,\n fill: chartColors.conversionLineStroke,\n strokeWidth: 0,\n }}\n connectNulls={false}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n />\n ) : null}\n </ComposedChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={emptyStateTextSx}\n >\n {emptyStateText}\n </Typography>\n </Box>\n )}\n </Box>\n </Stack>\n </Box>\n );\n}\n","import * as React from 'react';\n\n/**\n * When the plot is wider than the viewport (`overflow-x: auto`), scrolls horizontally\n * to the end after data updates so the latest categories stay in view.\n */\nexport function useChartPlotScrollToEnd(\n scrollRef: React.RefObject<HTMLElement | null>,\n options: {\n enabled: boolean;\n categoryScrollActive: boolean;\n dataLength: number;\n /** Triggers when row content changes (e.g. pass `processedData`). */\n dataVersion: unknown;\n }\n): void {\n const { enabled, categoryScrollActive, dataLength, dataVersion } = options;\n\n React.useLayoutEffect(() => {\n if (!enabled) {\n return;\n }\n if (!categoryScrollActive) {\n return;\n }\n if (dataLength === 0) {\n return;\n }\n const el = scrollRef.current;\n if (!el) {\n return;\n }\n const scrollToEnd = (): void => {\n el.scrollLeft = Math.max(0, el.scrollWidth - el.clientWidth);\n };\n scrollToEnd();\n requestAnimationFrame(scrollToEnd);\n }, [enabled, categoryScrollActive, dataLength, dataVersion]);\n}\n","import Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport {\n Bar,\n CartesianGrid,\n ComposedChart,\n LabelList,\n Line,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport { useChartPlotScrollToEnd } from '../../_chart/useChartPlotScrollToEnd';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport type {\n WalkinTrafficProps,\n WalkinTrafficRow,\n WalkinTrafficTooltipStyles,\n} from './WalkinTraffic.types';\n\nconst defaultFfGrowthTooltipFooterNote =\n \"*This FF Growth % compares today's hourly FF with the same hours on this date last year.\";\n\nfunction hasFooterText(note: string | null | undefined): note is string {\n return typeof note === 'string' && note.trim().length > 0;\n}\n\nfunction tooltipDatumFromPayload(\n payload: TooltipContentProps['payload']\n): WalkinTrafficRow | undefined {\n const raw = payload?.[0]?.payload;\n if (raw && typeof raw === 'object' && 'walkIns' in raw) {\n return raw as WalkinTrafficRow;\n }\n return undefined;\n}\n\nfunction GrowthDirectionIcon({ direction }: { direction: 'up' | 'down' }) {\n const bg = direction === 'up' ? '#22C55E' : '#EF4444';\n const glyph = direction === 'up' ? '▲' : '▼';\n return (\n <span\n style={{\n display: 'inline-flex',\n width: 16,\n height: 16,\n borderRadius: '50%',\n backgroundColor: bg,\n alignItems: 'center',\n justifyContent: 'center',\n marginLeft: 6,\n flexShrink: 0,\n }}\n aria-hidden\n >\n <span\n style={{\n color: '#fff',\n fontSize: 8,\n lineHeight: 1,\n transform: direction === 'up' ? undefined : 'translateY(0.5px)',\n }}\n >\n {glyph}\n </span>\n </span>\n );\n}\n\nconst BAR_KEY = 'walkIns';\nconst TREND_KEY = 'trend';\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}k`;\n }\n return String(value);\n}\n\nfunction formatYAxisTickDefault(value: number): string {\n if (!Number.isFinite(value)) {\n return '';\n }\n const abs = Math.abs(value);\n if (abs >= 1000) {\n const k = value / 1000;\n const text = Number.isInteger(k) ? String(k) : k.toFixed(1);\n return `${text}k`;\n }\n return String(value);\n}\n\ninterface RechartsBarLabelListProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n value?: number | string | null;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction BarTopLabel({\n x,\n y,\n width,\n value,\n fill,\n}: RechartsBarLabelListProps & { fill: string }) {\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n if (nx === undefined || ny === undefined || nw === undefined) {\n return null;\n }\n const n =\n value === null || value === undefined\n ? NaN\n : typeof value === 'number'\n ? value\n : Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n return null;\n }\n const cx = nx + nw / 2;\n const cy = ny - 6;\n return (\n <text\n x={cx}\n y={cy}\n fill={fill}\n fontSize={12}\n fontWeight={500}\n textAnchor=\"middle\"\n >\n {formatBarLabel(n)}\n </text>\n );\n}\n\ntype TrafficTooltipProps = TooltipContentProps & {\n tooltipTitle: string;\n timeLabel: string;\n currentYearLabel: string;\n lastYearLabel: string;\n growthLabel: string;\n footerNote: string | null | undefined;\n showTrendLine: boolean;\n accentColor: string;\n tooltipStyles?: WalkinTrafficTooltipStyles;\n};\n\nfunction TrafficTooltip({\n active,\n payload,\n label,\n tooltipTitle,\n timeLabel,\n currentYearLabel,\n lastYearLabel,\n growthLabel,\n footerNote,\n showTrendLine,\n accentColor,\n tooltipStyles,\n}: TrafficTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || label === undefined) {\n return null;\n }\n\n const datum = tooltipDatumFromPayload(payload);\n\n const barEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === BAR_KEY\n );\n const lineEntry = showTrendLine\n ? payload.find((p: TooltipPayloadEntry) => String(p.dataKey) === TREND_KEY)\n : undefined;\n\n const walk = Number(barEntry?.value ?? 0);\n const trendRaw = lineEntry?.value;\n const trend =\n typeof trendRaw === 'number'\n ? trendRaw\n : trendRaw === null || trendRaw === undefined\n ? NaN\n : Number(trendRaw);\n\n const timeDisplay =\n datum?.timeSlotLabel !== undefined && datum.timeSlotLabel !== ''\n ? datum.timeSlotLabel\n : String(label);\n\n const growthRaw = datum?.ffGrowthPercent;\n const growth =\n typeof growthRaw === 'number' && Number.isFinite(growthRaw)\n ? growthRaw\n : NaN;\n const showGrowthRow = Number.isFinite(growth);\n const growthDirection: 'up' | 'down' | null = !showGrowthRow\n ? null\n : growth > 0\n ? 'up'\n : growth < 0\n ? 'down'\n : null;\n\n const showFooter = hasFooterText(footerNote);\n const footerText =\n showFooter && typeof footerNote === 'string' ? footerNote.trim() : '';\n\n const ts = tooltipStyles;\n const rowBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'baseline',\n flexWrap: 'wrap',\n columnGap: 4,\n rowGap: 2,\n marginBottom: 6,\n };\n\n const labelStyle = mergeCss(\n { color: '#1a1a1a', fontSize: 11, fontWeight: 700 },\n ts?.label\n );\n const valueStyle = mergeCss(\n { color: '#757575', fontSize: 11, fontWeight: 400 },\n ts?.value\n );\n\n return (\n <div\n style={mergeCss(\n {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'stretch',\n },\n ts?.wrapper\n )}\n >\n <div\n style={{\n position: 'absolute',\n left: -6,\n top: 18,\n width: 0,\n height: 0,\n borderTop: '6px solid transparent',\n borderBottom: '6px solid transparent',\n borderRight: '7px solid #fff',\n zIndex: 1,\n filter: 'drop-shadow(-1px 0 0 #E8E8E8)',\n }}\n aria-hidden\n />\n <div\n style={mergeCss(\n {\n position: 'relative',\n zIndex: 2,\n backgroundColor: '#fff',\n borderRadius: 8,\n padding: '10px 12px 10px',\n width: 'max-content',\n maxWidth: 200,\n minWidth: 0,\n boxSizing: 'border-box',\n boxShadow: '0 2px 12px rgba(0, 0, 0, 0.12)',\n border: '1px solid #E8E8E8',\n },\n ts?.container\n )}\n >\n <div\n style={mergeCss(\n {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n marginBottom: 8,\n },\n ts?.header\n )}\n >\n <span\n style={mergeCss(\n {\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: accentColor,\n flexShrink: 0,\n },\n ts?.headerDot\n )}\n />\n <span\n style={mergeCss(\n {\n color: '#1a1a1a',\n fontSize: 12,\n fontWeight: 700,\n lineHeight: 1.25,\n },\n ts?.headerTitle\n )}\n >\n {tooltipTitle}\n </span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{timeLabel}:</span>\n <span style={valueStyle}>{timeDisplay}</span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{currentYearLabel}:</span>\n <span style={valueStyle}>\n {Number.isFinite(walk) ? walk.toLocaleString() : '—'}\n </span>\n </div>\n {showTrendLine && Number.isFinite(trend) ? (\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{lastYearLabel}:</span>\n <span style={valueStyle}>{trend.toLocaleString()}</span>\n </div>\n ) : null}\n {showGrowthRow ? (\n <div\n style={mergeCss(\n {\n ...rowBase,\n alignItems: 'center',\n marginBottom: showFooter ? 8 : 0,\n },\n ts?.row\n )}\n >\n <span style={labelStyle}>{growthLabel}:</span>\n <span style={valueStyle}>\n {`${Number.isInteger(growth) ? String(growth) : growth.toFixed(1)}%`}\n </span>\n {growthDirection ? (\n <GrowthDirectionIcon direction={growthDirection} />\n ) : null}\n </div>\n ) : null}\n {showFooter ? (\n <p\n style={mergeCss(\n {\n margin: 0,\n paddingTop: 8,\n borderTop: '1px solid #ECECEC',\n color: '#8A8A8A',\n fontSize: 9,\n fontStyle: 'italic',\n lineHeight: 1.4,\n },\n ts?.footer\n )}\n >\n {footerText}\n </p>\n ) : null}\n </div>\n </div>\n );\n}\n\nconst defaultMinWidthPerCategory = 52;\nconst defaultMaxBarThickness = 36;\nconst chartWidthAxisGutter = 72;\n\nconst defaultChartMargin = {\n top: 28,\n right: 20,\n left: 12,\n bottom: 52,\n} as const;\n\nconst topReserveForBarLabels = 52;\nconst topReserveNoBarLabels = 22;\n\nconst defaultChartColors = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n barFill: '#0086A9',\n lineStroke: '#4B5563',\n barValueLabelFill: '#374151',\n} as const;\n\nexport function WalkinTraffic({\n title,\n data,\n chartHeight = 430,\n barSeriesName = 'Walk-ins',\n lineSeriesName = 'Trend',\n lineType = 'natural',\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendRowSx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n emptyStateTextSx,\n headerActions,\n tooltipTitle = 'Overall Walk-in Traffic',\n tooltipTimeLabel,\n tooltipCurrentYearLabel = 'This year',\n tooltipLastYearLabel = 'Last year',\n tooltipGrowthLabel = 'FF Growth%',\n tooltipFooterNote: tooltipFooterNoteProp,\n tooltipHourLabel,\n tooltipStyles,\n showLegend = true,\n showTrendLine: showTrendLineProp,\n showLineInLegend = false,\n showBarValueLabels = true,\n chartMargin: chartMarginProp,\n chartColors: chartColorsProp,\n yAxisTickFormatter,\n emptyStateText = 'No data',\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n scrollChartToEndOnDataChange = true,\n}: WalkinTrafficProps) {\n const tooltipFooterNote =\n tooltipFooterNoteProp === undefined\n ? defaultFfGrowthTooltipFooterNote\n : tooltipFooterNoteProp;\n\n const processedData = React.useMemo(\n () => data.map(row => ({ ...row })),\n [data]\n );\n\n const hasTrendData = React.useMemo(\n () =>\n processedData.some(\n r => typeof r.trend === 'number' && Number.isFinite(r.trend)\n ),\n [processedData]\n );\n\n const showTrendLine =\n showTrendLineProp !== undefined ? showTrendLineProp : hasTrendData;\n\n const resolvedMaxBarSize = React.useMemo(() => {\n if (maxBarSizeProp !== undefined) {\n return maxBarSizeProp;\n }\n const categoryCap =\n minWidthPerCategory > 0\n ? minWidthPerCategory\n : defaultMinWidthPerCategory;\n return Math.min(categoryCap, defaultMaxBarThickness);\n }, [maxBarSizeProp, minWidthPerCategory]);\n\n const categoryScrollActive = React.useMemo(() => {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScrollProp === 'off') {\n return false;\n }\n if (horizontalScrollProp === 'on') {\n return true;\n }\n return processedData.length > 1;\n }, [horizontalScrollProp, minWidthPerCategory, processedData.length]);\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n useChartPlotScrollToEnd(scrollRef, {\n enabled: scrollChartToEndOnDataChange,\n categoryScrollActive,\n dataLength: processedData.length,\n dataVersion: processedData,\n });\n\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n const chartMargin = React.useMemo(() => {\n const top = showBarValueLabels\n ? topReserveForBarLabels\n : topReserveNoBarLabels;\n return {\n ...defaultChartMargin,\n top,\n ...chartMarginProp,\n };\n }, [showBarValueLabels, chartMarginProp]);\n\n const chartColors = React.useMemo(\n () => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n const yTick = yAxisTickFormatter ?? formatYAxisTickDefault;\n\n const resolvedTooltipTimeLabel =\n tooltipTimeLabel ?? tooltipHourLabel ?? 'Time';\n\n const legendItems = React.useMemo(() => {\n const items: {\n key: string;\n label: string;\n color: string;\n isLine?: boolean;\n }[] = [\n {\n key: 'bar',\n label: barSeriesName,\n color: chartColors.barFill,\n },\n ];\n if (showTrendLine && showLineInLegend) {\n items.push({\n key: 'line',\n label: lineSeriesName,\n color: chartColors.lineStroke,\n isLine: true,\n });\n }\n return items;\n }, [\n barSeriesName,\n chartColors.barFill,\n chartColors.lineStroke,\n lineSeriesName,\n showLineInLegend,\n showTrendLine,\n ]);\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n },\n titleRowSx\n )}\n >\n {headerActions ? (\n <Box\n sx={{\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 1,\n }}\n >\n {headerActions}\n </Box>\n ) : null}\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'center',\n width: '100%',\n px: headerActions ? 5 : 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n {showLegend && legendItems.length > 0 ? (\n <Box\n sx={sxChain(\n {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'center',\n alignItems: 'center',\n columnGap: { xs: 2, sm: 3 },\n rowGap: 1,\n py: 0.5,\n px: { xs: 0, sm: 1 },\n },\n legendRowSx\n )}\n >\n {legendItems.map(item => (\n <Stack\n key={item.key}\n direction=\"row\"\n alignItems=\"center\"\n sx={sxChain({ gap: 1 }, legendItemSx)}\n >\n {item.isLine ? (\n <Box\n sx={sxChain(\n {\n width: 16,\n height: 3,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: 0.5,\n alignSelf: 'center',\n },\n legendSwatchSx\n )}\n />\n ) : (\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: '2px',\n },\n legendSwatchSx\n )}\n />\n )}\n <Typography\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {item.label}\n </Typography>\n </Stack>\n ))}\n </Box>\n ) : null}\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {processedData.length > 0 ? (\n <ComposedChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n maxBarSize={resolvedMaxBarSize}\n style={{ overflow: 'visible' }}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n angle={-42}\n textAnchor=\"end\"\n interval={0}\n height={64}\n tickMargin={8}\n dy={4}\n tick={{ fontSize: 12 }}\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400 }}\n tickFormatter={yTick}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <Tooltip\n cursor={false}\n wrapperStyle={{ outline: 'none', zIndex: 10 }}\n content={(tooltipProps: TooltipContentProps) => (\n <TrafficTooltip\n {...tooltipProps}\n tooltipTitle={tooltipTitle}\n timeLabel={resolvedTooltipTimeLabel}\n currentYearLabel={tooltipCurrentYearLabel}\n lastYearLabel={tooltipLastYearLabel}\n growthLabel={tooltipGrowthLabel}\n footerNote={tooltipFooterNote}\n showTrendLine={showTrendLine}\n accentColor={chartColors.barFill}\n tooltipStyles={tooltipStyles}\n />\n )}\n />\n <Bar\n dataKey={BAR_KEY}\n name={barSeriesName}\n fill={chartColors.barFill}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n radius={[2, 2, 0, 0]}\n >\n {showBarValueLabels ? (\n <LabelList\n content={props => (\n <BarTopLabel\n {...(props as RechartsBarLabelListProps)}\n fill={chartColors.barValueLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n {showTrendLine ? (\n <Line\n type={lineType}\n dataKey={TREND_KEY}\n name={lineSeriesName}\n stroke={chartColors.lineStroke}\n strokeWidth={2}\n dot={false}\n connectNulls={false}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n />\n ) : null}\n </ComposedChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={emptyStateTextSx}\n >\n {emptyStateText}\n </Typography>\n </Box>\n )}\n </Box>\n </Stack>\n </Box>\n );\n}\n","'use client';\n\nimport { Icon } from '@iconify/react';\nimport {\n Box,\n Button,\n IconButton,\n Paper,\n Skeleton,\n Stack,\n Tooltip,\n Typography,\n} from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { ResponsiveContainer, Treemap } from 'recharts';\nimport type {\n FootFallHeatMapIconColor,\n FootFallHeatMapIconSize,\n FootFallHeatMapIconSizeContext,\n FootFallHeatMapKpiStripPresentation,\n FootFallHeatMapTileIconRole,\n FootFallHeatMapViewProps,\n} from './FootFallHeatMapView.types';\nimport { DEFAULT_FOOTFALL_TILE_ICONS } from './FootFallHeatMapView.types';\nimport {\n deriveFootfallHeatMapKpiStrip,\n type FootfallHeatMapDerivedStrip,\n} from './footfallHeatMapDerivedStrip';\nimport {\n buildTreemapNodes,\n getNestedList,\n hashColor,\n parseMinutes,\n parseZoneKpiStripFromRaw,\n preprocessData,\n skipSingleBranchLevels,\n type TreemapNode,\n type ZoneAnalyticsFlatItem,\n type ZoneAnalyticsHierarchy,\n} from './footfallHeatMapTree';\n\nexport type {\n FootFallHeatMapKpiStripPresentation,\n FootFallHeatMapKpiSummaryCardItem,\n FootFallHeatMapSummaryKpis,\n FootFallHeatMapViewProps,\n} from './FootFallHeatMapView.types';\n\ninterface DataShape {\n previous: TreemapNode[][];\n current: TreemapNode[];\n}\n\ntype RankedStripItem =\n FootfallHeatMapDerivedStrip['rankedBarList']['items'][number];\ntype RankedStripSegment = NonNullable<RankedStripItem['segments']>[number];\n\nfunction toDisplayNumber(value: number): string {\n if (!Number.isFinite(value)) return '0';\n return new Intl.NumberFormat('en-IN').format(value);\n}\n\nfunction resolveSegmentFill(\n presentation: FootFallHeatMapKpiStripPresentation | undefined,\n segmentIndex: number,\n dataColor: string | undefined\n): string {\n const palette = presentation?.segmentColors;\n if (palette && palette.length > 0) {\n return palette[segmentIndex % palette.length] ?? dataColor ?? '#90A4AE';\n }\n return dataColor ?? '#90A4AE';\n}\n\nfunction InlineStatCard({\n icon,\n title,\n value,\n sx,\n iconColor = '#1565C0',\n}: {\n icon: string;\n title: string;\n value: number;\n sx?: SxProps<Theme>;\n iconColor?: string;\n}) {\n return (\n <Paper\n elevation={0}\n sx={\n [\n {\n bgcolor: '#fff',\n border: '1px solid #E0E0E0',\n borderRadius: 2,\n p: 1.5,\n minWidth: 180,\n flex: '1 1 240px',\n maxWidth: 340,\n },\n ...(sx ? [sx] : []),\n ] as SxProps<Theme>\n }\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1.5}>\n <Icon\n icon={icon}\n width={28}\n height={28}\n color={iconColor}\n style={{ flexShrink: 0 }}\n />\n <Stack spacing={0.15}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 500, color: 'text.primary' }}\n >\n {title}\n </Typography>\n <Typography\n variant=\"h6\"\n sx={{ lineHeight: 1.1, fontWeight: 700, color: 'text.primary' }}\n >\n {toDisplayNumber(value)}\n </Typography>\n </Stack>\n </Stack>\n </Paper>\n );\n}\n\nfunction InlineSegmentStrip({\n item,\n scaleTotal,\n presentation,\n}: {\n item: RankedStripItem;\n scaleTotal: number;\n presentation?: FootFallHeatMapKpiStripPresentation;\n}) {\n const segments = item.segments ?? [];\n const lastIdx = segments.length - 1;\n const segmentTotal = segments.reduce((sum, seg) => sum + seg.value, 0);\n const total = item.value > 0 ? item.value : segmentTotal;\n const scaleBase = scaleTotal > 0 ? scaleTotal : total;\n const filledPercent = Math.max(\n 0,\n Math.min(100, scaleBase > 0 ? (total / scaleBase) * 100 : 0)\n );\n const barHeight = presentation?.barHeight ?? 12;\n const trackInsetPx = presentation?.trackInsetPx ?? 3;\n const trackBg = presentation?.trackBackgroundColor ?? '#ECEFF3';\n return (\n <Stack spacing={0.75}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={1}\n >\n <Typography\n variant=\"subtitle2\"\n sx={\n [\n { fontWeight: 700 },\n ...(presentation?.segmentTitleSx\n ? [presentation.segmentTitleSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {item.label}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={\n [\n { fontWeight: 700, color: 'text.secondary' },\n ...(presentation?.segmentValueSx\n ? [presentation.segmentValueSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {toDisplayNumber(item.value)}\n </Typography>\n </Stack>\n <Box\n sx={{\n width: '100%',\n height: barHeight,\n borderRadius: 999,\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'stretch',\n backgroundColor: trackBg,\n px: `${trackInsetPx}px`,\n boxSizing: 'border-box',\n }}\n >\n {segments.map((segment, idx) => {\n const widthPercent =\n total > 0 ? (segment.value / total) * filledPercent : 0;\n const isLast = idx === lastIdx;\n const fill = resolveSegmentFill(presentation, idx, segment.color);\n return (\n <Tooltip\n key={segment.id}\n title={\n <InlineSegmentTooltipCard\n segment={segment}\n dotColor={fill}\n cardSx={presentation?.segmentTooltipCardSx}\n />\n }\n enterTouchDelay={0}\n slotProps={{\n tooltip: {\n sx: inlineSegmentTooltipPopperSx,\n },\n }}\n >\n <Box\n sx={{\n width: `${Math.max(0, widthPercent)}%`,\n backgroundColor: fill,\n minWidth: segment.value > 0 ? 3 : 0,\n cursor: 'pointer',\n borderTopLeftRadius: idx === 0 ? 999 : 0,\n borderBottomLeftRadius: idx === 0 ? 999 : 0,\n borderTopRightRadius: isLast ? 999 : 0,\n borderBottomRightRadius: isLast ? 999 : 0,\n }}\n />\n </Tooltip>\n );\n })}\n </Box>\n </Stack>\n );\n}\n\n/** Match the segmented tooltip shell used in RankedBarList. */\nconst inlineSegmentTooltipPopperSx: SxProps<Theme> = {\n p: 0,\n m: 0,\n bgcolor: 'transparent',\n boxShadow: 'none',\n border: 'none',\n maxWidth: 'none',\n};\n\nconst inlineSegmentTooltipCardSx: SxProps<Theme> = {\n maxWidth: 280,\n bgcolor: '#fff',\n borderRadius: 1,\n border: '1px solid #E8E8E8',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n overflow: 'hidden',\n};\n\nfunction InlineSegmentTooltipCard({\n segment,\n dotColor,\n cardSx,\n}: {\n segment: RankedStripSegment;\n dotColor: string;\n cardSx?: SxProps<Theme>;\n}): React.ReactElement {\n const tooltipSurfaceSx = cardSx\n ? ([inlineSegmentTooltipCardSx, cardSx] as SxProps<Theme>)\n : inlineSegmentTooltipCardSx;\n return (\n <Box sx={tooltipSurfaceSx}>\n <Box sx={{ height: 3, bgcolor: 'grey.200', width: '100%' }} />\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 0.5,\n rowGap: 0.5,\n px: 1.5,\n py: 1.25,\n }}\n >\n <Box\n component=\"span\"\n aria-hidden\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: dotColor,\n flexShrink: 0,\n }}\n />\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {segment.label}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {' : '}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 700,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {toDisplayNumber(segment.value)}\n </Typography>\n </Box>\n </Box>\n );\n}\n\nfunction FootfallHeatMapKpiRankedBlock({\n strip,\n stackSx,\n presentation,\n}: {\n strip: FootfallHeatMapDerivedStrip;\n stackSx?: SxProps<Theme>;\n presentation?: FootFallHeatMapKpiStripPresentation;\n}) {\n const { summaryKpis, rankedBarList } = strip;\n const scaleTotal = Math.max(\n summaryKpis.overallVisitors,\n ...rankedBarList.items.map(item => item.value)\n );\n const statIcon = presentation?.statCardIconColor ?? '#1565C0';\n const customSummary = presentation?.summaryCards?.(summaryKpis);\n const useCustomSummary = customSummary !== undefined;\n\n return (\n <Stack\n spacing={2}\n sx={\n [\n { width: '100%' },\n ...(stackSx ? [stackSx] : []),\n ...(presentation?.kpiContainerSx\n ? [presentation.kpiContainerSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {useCustomSummary && customSummary.length === 0 ? null : (\n <Stack direction=\"row\" spacing={1.5} flexWrap=\"wrap\" useFlexGap>\n {useCustomSummary\n ? customSummary.map(card => (\n <InlineStatCard\n key={card.id}\n icon={card.icon ?? 'mdi:chart-box-outline'}\n title={card.title}\n value={card.value}\n sx={\n [presentation?.statCardSx, card.sx].filter(\n Boolean\n ) as SxProps<Theme>\n }\n iconColor={card.iconColor ?? statIcon}\n />\n ))\n : [\n <InlineStatCard\n key=\"default-stores\"\n icon=\"mdi:store-marker-outline\"\n title=\"No. of Stores\"\n value={summaryKpis.storeCount}\n sx={presentation?.statCardSx}\n iconColor={statIcon}\n />,\n <InlineStatCard\n key=\"default-visitors\"\n icon=\"fluent:people-community-16-filled\"\n title=\"Overall Visitors\"\n value={summaryKpis.overallVisitors}\n sx={presentation?.statCardSx}\n iconColor={statIcon}\n />,\n ]}\n </Stack>\n )}\n <Stack spacing={1.25} sx={{ pt: 0.5, pb: 1 }}>\n {rankedBarList.items.map(item => (\n <InlineSegmentStrip\n key={item.id}\n item={item}\n scaleTotal={scaleTotal}\n presentation={presentation}\n />\n ))}\n </Stack>\n </Stack>\n );\n}\n\ntype HierarchyLevel = 'Country' | 'Region' | 'State' | 'City';\nconst HIERARCHY_LEVELS: readonly HierarchyLevel[] = [\n 'Country',\n 'Region',\n 'State',\n 'City',\n] as const;\n\nfunction collectNodesAtDepth(\n nodes: TreemapNode[],\n depth: number\n): TreemapNode[] {\n if (depth <= 0) return nodes;\n return nodes.flatMap(node => collectNodesAtDepth(node.list ?? [], depth - 1));\n}\n\nfunction normalizeNodePercentages(nodes: TreemapNode[]): TreemapNode[] {\n const totalRaw = nodes.reduce((sum, node) => sum + (node._raw ?? 0), 0) || 1;\n return nodes.map(node => {\n const raw = node._raw ?? 0;\n const pct = (raw / totalRaw) * 100;\n return {\n ...node,\n value: pct,\n originalValue: pct,\n };\n });\n}\n\nfunction parseStartPath(path?: string | string[] | null): string[] {\n if (!path) return [];\n const raw = Array.isArray(path) ? path : String(path).split('/');\n return raw.map(segment => String(segment).trim()).filter(Boolean);\n}\n\nfunction scopeNodesByPath(\n rootNodes: TreemapNode[],\n startFromPath?: string | string[] | null,\n mode: 'children' | 'self' = 'children'\n): TreemapNode[] | null {\n const segments = parseStartPath(startFromPath);\n if (segments.length === 0) return null;\n\n let current = rootNodes;\n let matched: TreemapNode | undefined;\n\n for (const segment of segments) {\n const key = segment.toLowerCase();\n matched = current.find(\n node => String(node.name).trim().toLowerCase() === key\n );\n if (!matched) return null;\n current = matched.list ?? [];\n }\n\n if (!matched) return null;\n\n if (mode === 'self') {\n return normalizeNodePercentages([matched]);\n }\n\n if ((matched.list ?? []).length > 0) {\n return normalizeNodePercentages(matched.list);\n }\n\n return normalizeNodePercentages([matched]);\n}\n\nfunction buildRootNodesFromInitial(\n initialData: ZoneAnalyticsHierarchy | ZoneAnalyticsFlatItem[],\n sortBy: 'walkins' | 'dwell',\n startFromLevel: HierarchyLevel,\n startFromPath?: string | string[],\n startFromPathMode: 'children' | 'self' = 'children'\n): TreemapNode[] {\n if (Array.isArray(initialData)) {\n const items = initialData as ZoneAnalyticsFlatItem[];\n const total =\n items.reduce(\n (sum, it) =>\n sum +\n (sortBy === 'walkins'\n ? it.visitor_count\n : parseMinutes(it.avg_dwell_time)),\n 0\n ) || 1;\n\n return items.map(it => {\n const raw =\n sortBy === 'walkins'\n ? it.visitor_count\n : parseMinutes(it.avg_dwell_time);\n const percentage = (raw / total) * 100;\n\n return {\n name: it.category_name,\n value: percentage,\n originalValue: percentage,\n color: hashColor(`flat/${it.category_id}`),\n overallData: { count: it.visitor_count, dwell: it.avg_dwell_time },\n list: [],\n leafMetrics: undefined,\n zoneKpiStrip: parseZoneKpiStripFromRaw(\n it as unknown as Record<string, unknown>\n ),\n _raw: raw,\n };\n });\n }\n\n const hierarchical = initialData as ZoneAnalyticsHierarchy;\n const topContainer =\n (hierarchical?.Country && {\n key: 'Country' as const,\n container: hierarchical.Country,\n }) ||\n (hierarchical?.Region && {\n key: 'Region' as const,\n container: hierarchical.Region,\n }) ||\n (hierarchical?.State && {\n key: 'State' as const,\n container: hierarchical.State,\n }) ||\n (hierarchical?.City && {\n key: 'City' as const,\n container: hierarchical.City,\n }) ||\n null;\n\n if (!topContainer) return [];\n\n const builtRoot = buildTreemapNodes({\n container: topContainer.container as Record<string, unknown>,\n sortBy,\n pathKey: topContainer.key,\n });\n\n const scopedNodes = scopeNodesByPath(\n builtRoot,\n startFromPath,\n startFromPathMode\n );\n if (scopedNodes) return scopedNodes;\n\n const topIdx = HIERARCHY_LEVELS.indexOf(topContainer.key);\n const startIdx = HIERARCHY_LEVELS.indexOf(startFromLevel);\n if (topIdx === -1 || startIdx === -1 || startIdx <= topIdx) {\n return builtRoot;\n }\n\n const depthDelta = startIdx - topIdx;\n const collected = collectNodesAtDepth(builtRoot, depthDelta);\n return normalizeNodePercentages(collected);\n}\n\nfunction resolveIconSize(\n prop: FootFallHeatMapIconSize | undefined,\n ctx: FootFallHeatMapIconSizeContext\n): number {\n if (prop === undefined || prop === 'auto') {\n return Math.max(8, ctx.baseIconSize);\n }\n if (typeof prop === 'number') {\n return Math.max(8, prop);\n }\n return Math.max(8, prop(ctx));\n}\n\nfunction resolveIconColor(\n prop: FootFallHeatMapIconColor | undefined,\n tileColor: string,\n role: FootFallHeatMapTileIconRole\n): string {\n const p = prop ?? 'tile';\n if (p === 'tile') {\n if (role === 'header') return '#757575';\n return tileColor;\n }\n if (typeof p === 'string') return p;\n return p({ tileColor, role });\n}\n\n/**\n * In-store zone treemap with drill-down and leaf KPIs. Pass `initialData` from your API or mocks.\n */\nexport function FootFallHeatMapView({\n initialData,\n isLoading = false,\n isFetching = false,\n error,\n title = 'In-Store Zone Performance',\n infoTooltip = 'How different sections or product zones perform by traffic share. Block size = share of activity.',\n brandLabel = 'Reliance Digital',\n icons: iconsProp,\n iconSize: iconSizeProp,\n iconColor: iconColorProp,\n headerInfoIconSize = 22,\n treemap: treemapProp,\n tree: treeProp,\n kpiStrip: kpiStripPresentation,\n}: FootFallHeatMapViewProps) {\n const sortBy = treeProp?.sortBy ?? 'walkins';\n const startFromLevel = treeProp?.startFromLevel ?? 'Region';\n const startFromPath = treeProp?.startFromPath;\n const startFromPathMode = treeProp?.startFromPathMode ?? 'children';\n const terminalNodeView = treeProp?.terminalNodeView ?? 'details';\n const collapseSingleChildLevels =\n treeProp?.collapseSingleChildLevels ?? false;\n const customBuildNodes = treeProp?.buildNodes;\n const icons = { ...DEFAULT_FOOTFALL_TILE_ICONS, ...iconsProp };\n const treemapLayout = {\n heightWithBreadcrumb: treemapProp?.heightWithBreadcrumb ?? 400,\n heightWithoutBreadcrumb: treemapProp?.heightWithoutBreadcrumb ?? 450,\n terminalSingleCardHeight: treemapProp?.terminalSingleCardHeight,\n leafDetailsBodyHeight: treemapProp?.leafDetailsBodyHeight,\n leafDetailsBodySx: treemapProp?.leafDetailsBodySx,\n aspectRatio: treemapProp?.aspectRatio ?? 4 / 3,\n stroke: treemapProp?.stroke ?? '#ffffff',\n fill: treemapProp?.fill ?? '#ffffff',\n };\n const [data, setData] = useState<DataShape>({\n previous: [],\n current: [],\n });\n const [showLeaf, setShowLeaf] = useState(false);\n const [trackingDetails, setTrackingDetails] = useState<TreemapNode[]>([]);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!initialData) {\n setData({ previous: [], current: [] });\n setShowLeaf(false);\n setTrackingDetails([]);\n return;\n }\n\n setLoading(true);\n const built = customBuildNodes\n ? customBuildNodes(initialData, { sortBy })\n : buildRootNodesFromInitial(\n initialData,\n sortBy,\n startFromLevel,\n startFromPath,\n startFromPathMode\n );\n const rootNodes = collapseSingleChildLevels\n ? skipSingleBranchLevels(built)\n : preprocessData(built);\n setData({ previous: [], current: rootNodes });\n setShowLeaf(false);\n setTrackingDetails([]);\n setLoading(false);\n }, [\n initialData,\n sortBy,\n customBuildNodes,\n collapseSingleChildLevels,\n startFromLevel,\n startFromPath,\n startFromPathMode,\n ]);\n\n const derivedKpiStrip = useMemo(() => {\n if (isLoading || loading || !initialData) return null;\n const activeZoneForStrip: TreemapNode | undefined =\n trackingDetails.length > 0\n ? trackingDetails[trackingDetails.length - 1]\n : undefined;\n return deriveFootfallHeatMapKpiStrip(\n activeZoneForStrip,\n data.current ?? []\n );\n }, [isLoading, loading, initialData, trackingDetails, data]);\n\n const formatPercentage = (value: number) => {\n if (typeof value !== 'number') return '0%';\n const formatted = value.toFixed(2);\n const trimmed = formatted.replace(/\\.?0+$/, '');\n return `${trimmed}%`;\n };\n\n const renderCustomizedContent = (\n props: Record<string, unknown>\n ): React.ReactElement => {\n const x = props.x as number;\n const y = props.y as number;\n const width = props.width as number;\n const height = props.height as number;\n const name = props.name as string;\n const index = props.index as number;\n const payload =\n (props?.payload as TreemapNode & { payload?: TreemapNode }) ?? props;\n const inner = (payload as { payload?: TreemapNode }).payload ?? payload;\n const originalValue =\n (inner as TreemapNode)?.originalValue ??\n data?.current[index]?.originalValue;\n const tileColor =\n (inner as TreemapNode)?.color ??\n (props?.color as string) ??\n (props?.fill as string) ??\n hashColor(String(name ?? index ?? ''));\n\n const handleClick = () => {\n const p = inner as TreemapNode;\n setTrackingDetails(pre => {\n const expectedDepth = data.previous.length;\n const normalizedPath = pre.slice(0, expectedDepth);\n return [...normalizedPath, p];\n });\n\n const nested = getNestedList(p);\n const hasNestedChildren = Boolean(nested?.length);\n const isStoresLevel = p?._childContainerKey === 'Stores';\n const shouldShowDetails =\n terminalNodeView === 'details' && (!hasNestedChildren || isStoresLevel);\n const shouldDrillDeeper = hasNestedChildren && !shouldShowDetails;\n\n if (shouldDrillDeeper) {\n setShowLeaf(false);\n setData({\n previous: [[...data.current], ...data.previous],\n current: collapseSingleChildLevels\n ? skipSingleBranchLevels(nested ?? [])\n : preprocessData(nested ?? []),\n });\n return;\n }\n\n if (shouldShowDetails) {\n setShowLeaf(true);\n setData({\n previous: [[...data.current], ...data.previous],\n current: [],\n });\n return;\n }\n\n const alreadyFocusedTerminalTile =\n !hasNestedChildren &&\n data.current.length === 1 &&\n String(data.current[0]?.name ?? '') === String(p?.name ?? '');\n if (alreadyFocusedTerminalTile) return;\n\n setShowLeaf(false);\n setData({\n previous: [[...data.current], ...data.previous],\n current: preprocessData([p]),\n });\n };\n\n const minDim = Math.min(width, height);\n const effectiveDim = Math.sqrt(width * height);\n const isLarge = minDim > 200;\n const isSmall = minDim <= 120;\n\n const fontSize = Math.max(11, Math.min(24, Math.floor(effectiveDim * 0.1)));\n const baseIconSize = Math.max(10, fontSize - 2);\n const padding = Math.max(0.5, Math.min(3, minDim * 0.015));\n\n const sizeCtx = (\n role: FootFallHeatMapTileIconRole\n ): FootFallHeatMapIconSizeContext => ({\n baseIconSize,\n role,\n fontSize,\n minDim,\n effectiveDim,\n });\n\n const visitorsIconPx = resolveIconSize(iconSizeProp, sizeCtx('visitors'));\n const dwellIconPx = resolveIconSize(iconSizeProp, sizeCtx('dwell'));\n const visitorsIconColor = resolveIconColor(\n iconColorProp,\n tileColor,\n 'visitors'\n );\n const dwellIconColor = resolveIconColor(iconColorProp, tileColor, 'dwell');\n\n const p = inner as TreemapNode;\n\n return (\n <foreignObject\n x={x}\n y={y}\n width={width}\n height={height}\n style={{ borderRadius: '12px', overflow: 'hidden' }}\n >\n <Stack\n onClick={handleClick}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') handleClick();\n }}\n role=\"button\"\n tabIndex={0}\n sx={{\n backgroundColor: tileColor,\n color: '#FFFFFF',\n p: padding,\n textAlign: 'center',\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: isSmall\n ? width > height\n ? 'row'\n : 'column'\n : 'column',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n overflow: 'hidden',\n border: '1px solid #FFFFFF',\n gap: isSmall ? 1 : 2,\n borderRadius: '12px',\n transition: 'transform 0.5s ease-in-out',\n '&:hover': {\n transform: 'scale(1.10)',\n },\n }}\n >\n <Stack\n direction={isSmall ? 'row' : 'column'}\n justifyContent=\"center\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n gap={1}\n sx={{\n mb: isSmall ? 0.5 : 1,\n }}\n >\n <Typography\n sx={{\n fontSize: `${fontSize}px!important`,\n fontWeight: 500,\n fontFamily: 'Noto Sans, sans-serif',\n color: '#fff',\n maxWidth: '100%',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n lineHeight: 1.2,\n textAlign: 'center',\n }}\n title={name}\n >\n {name}\n </Typography>\n <Typography\n sx={{\n fontSize: `${fontSize}px!important`,\n fontWeight: '700',\n textAlign: 'center',\n color: '#fff',\n }}\n >\n {formatPercentage(Number(originalValue))}\n </Typography>\n </Stack>\n\n <Stack\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n sx={{\n gap: isSmall ? 0.5 : 1,\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.5}\n sx={{\n backgroundColor: '#f4f4f4',\n color: '#333',\n px: isLarge ? 2 : 1,\n py: isLarge ? 1 : 0.3,\n borderRadius: 10,\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.1)',\n }}\n >\n <Box\n sx={{\n backgroundColor: '#ffff',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Icon\n icon={icons.visitors}\n color={visitorsIconColor}\n fontSize={visitorsIconPx}\n />\n </Box>\n <Typography\n sx={{\n fontSize: `${Math.max(8, fontSize * 0.6)}px !important`,\n fontWeight: 600,\n fontFamily: 'Noto Sans, sans-serif',\n whiteSpace: 'nowrap',\n }}\n >\n {p?.overallData ? p?.overallData.count : ''}\n </Typography>\n </Stack>\n\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.5}\n sx={{\n backgroundColor: '#f4f4f4',\n color: '#333',\n px: isLarge ? 2 : 1,\n py: isLarge ? 1 : 0.3,\n borderRadius: 10,\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.1)',\n }}\n >\n <Box\n sx={{\n backgroundColor: '#ffff',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Icon\n icon={icons.dwell}\n color={dwellIconColor}\n fontSize={dwellIconPx}\n />\n </Box>\n <Typography\n sx={{\n fontSize: `${Math.max(8, fontSize * 0.6)}px !important`,\n fontWeight: 600,\n fontFamily: 'Noto Sans, sans-serif',\n whiteSpace: 'nowrap',\n }}\n >\n {p?.overallData ? p?.overallData.dwell : ''}\n </Typography>\n </Stack>\n </Stack>\n </Stack>\n </foreignObject>\n );\n };\n\n const handleClose = () => {\n setShowLeaf(false);\n const history = trackingDetails.slice(0, -1);\n setTrackingDetails(history);\n const obj1 = {\n current: data.previous[0] ?? [],\n previous: data.previous.slice(1),\n };\n setData(obj1);\n };\n\n const LabelTag = ({ textColor = '#f0f0f0' }: { textColor?: string }) => {\n const pathSegments = trackingDetails\n .map(t => String(t?.name ?? '').trim())\n .filter(Boolean);\n const breadcrumbSegments = Array.from(new Set([...pathSegments].reverse()));\n\n return (\n <Stack direction=\"row\" alignItems=\"baseline\" flexWrap=\"wrap\" gap={1.5}>\n {breadcrumbSegments.length === 0 ? (\n <Typography\n component=\"span\"\n sx={{\n '@media (max-width:500px)': {\n fontSize: '12px !important',\n },\n }}\n fontSize={'26px !important'}\n fontWeight={600}\n color={textColor}\n >\n {brandLabel}\n </Typography>\n ) : (\n <>\n {breadcrumbSegments.map((seg, i) => (\n <React.Fragment key={`${seg}-${i}`}>\n {i > 0 ? (\n <Typography\n component=\"span\"\n fontSize={'15px !important'}\n fontWeight={400}\n color={textColor}\n sx={{ px: 0.25 }}\n >\n /\n </Typography>\n ) : null}\n <Typography\n component=\"span\"\n sx={{\n '@media (max-width:500px)': {\n fontSize: i === 0 ? '12px !important' : '11px !important',\n },\n }}\n fontSize={i === 0 ? '26px !important' : '15px !important'}\n fontWeight={i === 0 ? 600 : 500}\n color={textColor}\n >\n {seg}\n </Typography>\n </React.Fragment>\n ))}\n {brandLabel ? (\n <>\n <Typography\n component=\"span\"\n fontSize={'15px !important'}\n fontWeight={400}\n color={textColor}\n >\n /\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n '@media (max-width:500px)': {\n fontSize: '11px !important',\n },\n }}\n fontSize={'15px !important'}\n fontWeight={500}\n color={textColor}\n >\n {brandLabel}\n </Typography>\n </>\n ) : null}\n </>\n )}\n </Stack>\n );\n };\n\n const is500Error =\n error !== null &&\n error !== undefined &&\n typeof error === 'object' &&\n 'status' in error &&\n (error as { status: number }).status === 500;\n\n if (is500Error) {\n return (\n <Box sx={{ p: 4, textAlign: 'center' }}>\n <Typography color=\"error\">\n Something went wrong (500). Try again later.\n </Typography>\n </Box>\n );\n }\n\n if (isLoading || loading) {\n return (\n <Skeleton\n variant=\"rectangular\"\n width=\"100%\"\n height={400}\n sx={{ borderRadius: '10px' }}\n />\n );\n }\n\n const showChart = !isLoading && initialData && !loading;\n\n const headerDataForBreadcrumb =\n trackingDetails.length > 0 ? trackingDetails.at(-1) : undefined;\n const headerData = headerDataForBreadcrumb;\n const isDrilledIntoZone = Boolean(\n showChart &&\n data?.previous &&\n data.previous.length > 0 &&\n headerDataForBreadcrumb\n );\n\n const zoneBarColor = headerData?.color ?? '#0A4FCB';\n /** Breadcrumb + % always white on the zone-colored drill bar (design). */\n const zoneBarHeaderFg = '#fff';\n\n const isTerminalSingleCardView = Boolean(\n showChart &&\n !showLeaf &&\n trackingDetails.length > 0 &&\n data.current.length === 1 &&\n !(getNestedList(data.current[0])?.length ?? 0)\n );\n /**\n * `terminalNodeView: \"card\"` keeps a single treemap tile at the leaf — but the zone KPI strip above\n * already shows the same zone name, share %, and breakdown. Omit the treemap to avoid a duplicate\n * “full chart” block (Story: Hierarchical (Terminal card reduced height)).\n */\n const hideTreemapForTerminalCardWithKpi =\n terminalNodeView === 'card' &&\n isTerminalSingleCardView &&\n derivedKpiStrip !== null;\n /** KPI + ranked list: visible for terminal nodes (card/details). Hidden for intermediate drill levels. */\n const showKpiStrip = Boolean(\n showChart && derivedKpiStrip && (showLeaf || isTerminalSingleCardView)\n );\n const showLeafDetailsBody = Boolean(showChart && showLeaf);\n const leafDetailsBodyHeight =\n treemapLayout.leafDetailsBodyHeight ??\n Math.max(180, treemapLayout.heightWithBreadcrumb - 140);\n const treemapHeight = isTerminalSingleCardView\n ? (treemapLayout.terminalSingleCardHeight ??\n treemapLayout.heightWithBreadcrumb)\n : data?.previous?.length > 0\n ? treemapLayout.heightWithBreadcrumb\n : treemapLayout.heightWithoutBreadcrumb;\n\n const headerIconPx = resolveIconSize(iconSizeProp, {\n baseIconSize: headerInfoIconSize,\n role: 'header',\n fontSize: 14,\n minDim: 24,\n effectiveDim: headerInfoIconSize,\n });\n const headerIconColorResolved = resolveIconColor(\n iconColorProp,\n '#888888',\n 'header'\n );\n\n return (\n <Stack width=\"100%\">\n <Box\n sx={{\n width: '100%',\n mb: 2,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1,\n }}\n >\n <Typography variant=\"h6\" fontWeight={700}>\n {title}\n </Typography>\n <Stack direction=\"row\" alignItems=\"center\" gap={1}>\n {isFetching ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n Updating…\n </Typography>\n ) : null}\n <Tooltip title={infoTooltip} arrow>\n <IconButton\n size=\"small\"\n aria-label=\"Zone performance info\"\n edge=\"end\"\n >\n <Icon\n icon={icons.headerInfo}\n width={headerIconPx}\n height={headerIconPx}\n color={headerIconColorResolved}\n />\n </IconButton>\n </Tooltip>\n </Stack>\n </Box>\n\n {data?.previous?.length > 0 && headerData ? (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{\n px: 1.25,\n py: 1,\n mb: 0,\n borderRadius: '10px 10px 0 0',\n color: zoneBarHeaderFg,\n backgroundColor: zoneBarColor,\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <Button\n size=\"small\"\n onClick={handleClose}\n startIcon={\n <Icon\n icon=\"mdi:chevron-left\"\n width={16}\n height={16}\n color={zoneBarColor}\n />\n }\n sx={{\n minWidth: 0,\n color: zoneBarColor,\n bgcolor: '#fff',\n px: 1,\n borderRadius: 999,\n '&:hover': { bgcolor: '#F5F5F5' },\n }}\n >\n Back\n </Button>\n <LabelTag textColor={zoneBarHeaderFg} />\n </Stack>\n <Typography\n variant=\"h6\"\n sx={{ color: zoneBarHeaderFg, fontWeight: 700 }}\n >\n ({formatPercentage(Number(headerData?.originalValue ?? 0))})\n </Typography>\n </Stack>\n ) : null}\n\n {/* KPI + ranked list only in drilled zone (below zone-colored header, above treemap) */}\n {isDrilledIntoZone && showKpiStrip && derivedKpiStrip ? (\n <FootfallHeatMapKpiRankedBlock\n strip={derivedKpiStrip}\n presentation={kpiStripPresentation}\n stackSx={{\n mb: showLeafDetailsBody ? 0 : 2,\n px: 2,\n pt: 2,\n bgcolor: '#fff',\n border: '1px solid #E8E8E8',\n borderTop: 'none',\n borderBottom: showLeafDetailsBody ? 'none' : undefined,\n borderRadius: showLeafDetailsBody ? 0 : '0 0 8px 8px',\n }}\n />\n ) : null}\n\n {showLeafDetailsBody ? (\n <Box\n sx={\n [\n {\n mb: 2,\n bgcolor: '#fff',\n border: '1px solid #E8E8E8',\n borderTop: 'none',\n borderRadius: '0 0 8px 8px',\n minHeight: leafDetailsBodyHeight,\n },\n ...(treemapLayout.leafDetailsBodySx\n ? [treemapLayout.leafDetailsBodySx]\n : []),\n ] as SxProps<Theme>\n }\n />\n ) : null}\n\n {showLeaf ? null : showChart ? (\n hideTreemapForTerminalCardWithKpi ? null : (\n <ResponsiveContainer width=\"100%\" height={treemapHeight}>\n <Treemap\n data={data?.current ?? []}\n dataKey=\"value\"\n stroke={treemapLayout.stroke}\n fill={treemapLayout.fill}\n content={renderCustomizedContent as never}\n isAnimationActive={false}\n aspectRatio={treemapLayout.aspectRatio}\n animationDuration={0}\n style={{ borderRadius: '12px' }}\n />\n </ResponsiveContainer>\n )\n ) : (\n <Skeleton\n variant=\"rectangular\"\n width=\"100%\"\n height={400}\n sx={{ borderRadius: '10px' }}\n />\n )}\n </Stack>\n );\n}\n\nexport default FootFallHeatMapView;\n","import type { SxProps, Theme } from '@mui/material/styles';\nimport type {\n TreemapNode,\n ZoneAnalyticsFlatItem,\n ZoneAnalyticsHierarchy,\n} from './footfallHeatMapTree';\n\nexport const DEFAULT_FOOTFALL_TILE_ICONS = {\n visitors: 'fluent:people-community-16-filled',\n dwell: 'clarity:clock-solid',\n headerInfo: 'mdi:information-outline',\n} as const;\n\nexport type FootFallHeatMapTileIconRole = 'visitors' | 'dwell' | 'header';\n\nexport type FootFallHeatMapIconSizeContext = {\n /** Auto baseline from tile geometry (px). */\n baseIconSize: number;\n role: FootFallHeatMapTileIconRole;\n fontSize: number;\n minDim: number;\n effectiveDim: number;\n};\n\n/** Pixel size or scale from `baseIconSize` / geometry. */\nexport type FootFallHeatMapIconSize =\n | 'auto'\n | number\n | ((ctx: FootFallHeatMapIconSizeContext) => number);\n\n/** `tile` = match tile fill color; otherwise CSS color string or resolver. */\nexport type FootFallHeatMapIconColor =\n | 'tile'\n | string\n | ((ctx: { tileColor: string; role: FootFallHeatMapTileIconRole }) => string);\n\nexport type FootFallHeatMapIcons = {\n /** Iconify id for the visitor count chip in each tile. */\n visitors?: string;\n /** Iconify id for the dwell time chip. */\n dwell?: string;\n /** Iconify id for the title-row info button. */\n headerInfo?: string;\n};\n\nexport type FootFallHeatMapTreemapLayout = {\n /** Pixel height when a breadcrumb strip is visible above the chart. */\n heightWithBreadcrumb?: number;\n /** Pixel height when there is no breadcrumb. */\n heightWithoutBreadcrumb?: number;\n /** Optional pixel height for terminal single-card view (default falls back to `heightWithBreadcrumb`). */\n terminalSingleCardHeight?: number;\n /** Optional pixel height for the blank body below terminal details strip (default: derived from treemap height). */\n leafDetailsBodyHeight?: number;\n /** Recharts treemap aspect ratio (width/height per sector logic). */\n aspectRatio?: number;\n stroke?: string;\n fill?: string;\n /** MUI `sx` merged onto the blank terminal-details body below the KPI strip. */\n leafDetailsBodySx?: SxProps<Theme>;\n};\n\nexport type FootFallHeatMapTreeOptions = {\n /** Starting hierarchy level shown in treemap for hierarchical payloads. */\n startFromLevel?: 'Country' | 'Region' | 'State' | 'City';\n /**\n * Optional path to a specific hierarchy node to render first.\n * Example: `'India/North'` or `['India', 'North']`.\n * When provided, this takes precedence over `startFromLevel`.\n */\n startFromPath?: string | string[];\n /**\n * `children` (default): render selected node's immediate children.\n * `self`: render only the selected node tile.\n */\n startFromPathMode?: 'children' | 'self';\n /**\n * Behavior at terminal node (no deeper hierarchy, or final Stores level).\n * - `details` (default): compact KPI + segmented detail view (treemap cleared; optional details body below).\n * - `card`: keep drilling into a single treemap tile when there is no zone KPI strip; when a KPI strip is\n * derived for the terminal zone, the duplicate treemap is omitted so only breadcrumb + KPI strip remain.\n */\n terminalNodeView?: 'card' | 'details';\n /** Sort metric when building node weights from API payloads. */\n sortBy?: 'walkins' | 'dwell';\n /**\n * When true, if the root (or a drill level) has exactly one child, the treemap jumps into that child automatically.\n * Default **false** so **Region → State → City** (and other levels) stay visible instead of skipping straight to cities.\n */\n collapseSingleChildLevels?: boolean;\n /**\n * Replace default hierarchy/flat parsing. Return root-level `TreemapNode[]`\n * (each node may nest `list` children).\n */\n buildNodes?: (\n initialData: ZoneAnalyticsHierarchy | ZoneAnalyticsFlatItem[] | null,\n options: { sortBy: 'walkins' | 'dwell' }\n ) => TreemapNode[];\n};\n\n/** KPI numbers used for the summary row and passed to `summaryCards`. */\nexport type FootFallHeatMapSummaryKpis = {\n storeCount: number;\n overallVisitors: number;\n};\n\n/** One summary KPI card above the segmented bar (Iconify icon + title + value). */\nexport type FootFallHeatMapKpiSummaryCardItem = {\n id: string;\n title: string;\n value: number;\n /** Iconify id. Default `mdi:chart-box-outline`. */\n icon?: string;\n /** Merged after shared `statCardSx`. */\n sx?: SxProps<Theme>;\n /** Per-card icon color; falls back to `statCardIconColor`. */\n iconColor?: string;\n};\n\n/**\n * Optional styling for the zone KPI block: summary stat cards, outer panel, segmented bar, and tooltips.\n * Segment colors cycle by index when the palette is shorter than the number of segments.\n */\nexport type FootFallHeatMapKpiStripPresentation = {\n /** Override segment fills; cycles when fewer entries than segments. */\n segmentColors?: readonly string[];\n /** Bar height in px. */\n barHeight?: number;\n /** Horizontal padding inside the track in px (inset from rounded caps). */\n trackInsetPx?: number;\n /** Track background behind segments. */\n trackBackgroundColor?: string;\n\n /** Merged onto the outer KPI panel (container under the breadcrumb). Applied after built-in layout styles. */\n kpiContainerSx?: SxProps<Theme>;\n /** Merged onto each summary stat card (`Paper`). */\n statCardSx?: SxProps<Theme>;\n /** Icon color for both stat cards. Default `#1565C0`. */\n statCardIconColor?: string;\n /** Zone / row title next to the segmented bar. */\n segmentTitleSx?: SxProps<Theme>;\n /** Total value on the right of the segment row. */\n segmentValueSx?: SxProps<Theme>;\n /** Merged onto the segment tooltip card (popover). */\n segmentTooltipCardSx?: SxProps<Theme>;\n\n /**\n * Build any number of summary KPI cards from live zone metrics. When the returned array is **non-empty**,\n * it replaces the default “No. of Stores” / “Overall Visitors” pair. Return `[]` to hide all summary cards.\n */\n summaryCards?: (\n kpi: FootFallHeatMapSummaryKpis\n ) => readonly FootFallHeatMapKpiSummaryCardItem[];\n};\n\nexport type FootFallHeatMapViewProps = {\n initialData: ZoneAnalyticsHierarchy | ZoneAnalyticsFlatItem[] | null;\n isLoading?: boolean;\n isFetching?: boolean;\n error?: unknown;\n title?: string;\n /** Tooltip on the header info icon. */\n infoTooltip?: string;\n /** Shown in the drill breadcrumb after `/` (e.g. store name). */\n brandLabel?: string;\n\n icons?: FootFallHeatMapIcons;\n iconSize?: FootFallHeatMapIconSize;\n iconColor?: FootFallHeatMapIconColor;\n /** Info button icon width/height in px when `iconSize` is `auto` (header role). */\n headerInfoIconSize?: number;\n\n treemap?: FootFallHeatMapTreemapLayout;\n tree?: FootFallHeatMapTreeOptions;\n /**\n * KPI zone UI: optional **`summaryCards(kpi)`** for any number of summary stat cards; segmented bar; outer\n * panel; `statCardSx` / `statCardIconColor`; segment row + tooltip styling.\n */\n kpiStrip?: FootFallHeatMapKpiStripPresentation;\n};\n","/**\n * Internal: KPI strip + single segmented bar for the **active zone** (same layout at every drill level).\n * Not part of the public footfall-heat-map API.\n */\n\nimport type {\n RankedBarListItem,\n RankedBarListSegment,\n} from '../RankedBarList/RankedBarList.types';\n\nimport type { TreemapNode, ZoneKpiStripPayload } from './footfallHeatMapTree';\n\nconst ZONE_SEGMENT_COLORS = [\n '#E5735F',\n '#7EB0C2',\n '#F4C20D',\n '#6D6ED7',\n] as const;\nconst DEFAULT_SEGMENT_LABELS: [string, string, string, string] = [\n 'Walk-by',\n 'Browsing',\n 'Engaged',\n 'Converted',\n];\n\nfunction parseVisitorCount(raw: string | number | undefined): number {\n if (typeof raw === 'number' && Number.isFinite(raw)) return raw;\n if (typeof raw === 'string') {\n const n = Number(String(raw).replace(/[^\\d.]/g, ''));\n return Number.isFinite(n) ? n : 0;\n }\n return 0;\n}\n\nfunction defaultFourParts(total: number): [number, number, number, number] {\n if (total <= 0) return [0, 0, 0, 0];\n const a = Math.round(total * 0.38);\n const b = Math.round(total * 0.32);\n const c = Math.round(total * 0.2);\n const d = total - a - b - c;\n return [a, b, c, d];\n}\n\nfunction rowFromExplicitStrip(\n zoneName: string,\n strip: ZoneKpiStripPayload\n): RankedBarListItem {\n const id = `zone-strip-${encodeURIComponent(zoneName)}`;\n const segments: RankedBarListSegment[] = strip.segments.map((s, i) => ({\n id: `${id}-seg-${i}`,\n label: s.label,\n value: s.value,\n color: ZONE_SEGMENT_COLORS[i],\n }));\n const value = strip.segments.reduce((sum, s) => sum + s.value, 0);\n return { id, label: zoneName, value, segments };\n}\n\nfunction rowFromHeuristicLabel(\n zoneName: string,\n total: number\n): RankedBarListItem {\n const [a, b, c, d] = defaultFourParts(total);\n const id = `zone-heuristic-${encodeURIComponent(zoneName)}`;\n const segments: RankedBarListSegment[] = [a, b, c, d].map((value, i) => ({\n id: `${id}-seg-${i}`,\n label: DEFAULT_SEGMENT_LABELS[i],\n value,\n color: ZONE_SEGMENT_COLORS[i],\n }));\n return { id, label: zoneName, value: a + b + c + d, segments };\n}\n\nexport type FootfallHeatMapDerivedStrip = {\n summaryKpis: { storeCount: number; overallVisitors: number };\n rankedBarList: {\n title: string;\n items: RankedBarListItem[];\n listHeaderLabel: string;\n valueColumnHeader: string;\n };\n};\n\n/**\n * @param activeZone — Last node in the drill path (the zone you are inside). `undefined` at root.\n * @param childTiles — Sibling tiles shown in the treemap (`data.current`).\n */\nexport function deriveFootfallHeatMapKpiStrip(\n activeZone: TreemapNode | undefined,\n childTiles: TreemapNode[]\n): FootfallHeatMapDerivedStrip | null {\n if (activeZone) {\n const childRowsSource = (activeZone.list ?? []).filter(\n n => parseVisitorCount(n.overallData?.count) > 0\n );\n if (childRowsSource.length > 0) {\n const items = childRowsSource.map(node =>\n rowFromHeuristicLabel(\n node.name,\n parseVisitorCount(node.overallData?.count)\n )\n );\n const overallVisitorsFromChildren = childRowsSource.reduce(\n (sum, node) => sum + parseVisitorCount(node.overallData?.count),\n 0\n );\n const fallbackVisitors = parseVisitorCount(activeZone.overallData?.count);\n const overallVisitors =\n overallVisitorsFromChildren > 0\n ? overallVisitorsFromChildren\n : fallbackVisitors;\n const fromExplicitStoreCount = activeZone.zoneKpiStrip?.storeCount;\n const storeCount =\n fromExplicitStoreCount && fromExplicitStoreCount > 0\n ? fromExplicitStoreCount\n : childRowsSource.length;\n\n return {\n summaryKpis: {\n storeCount,\n overallVisitors:\n activeZone.zoneKpiStrip?.overallVisitors ?? overallVisitors,\n },\n rankedBarList: {\n title: `${activeZone.name} store performance`,\n items,\n listHeaderLabel: 'Store',\n valueColumnHeader: 'Visitors',\n },\n };\n }\n\n if (activeZone.zoneKpiStrip) {\n const zs = activeZone.zoneKpiStrip;\n return {\n summaryKpis: {\n storeCount: zs.storeCount,\n overallVisitors: zs.overallVisitors,\n },\n rankedBarList: {\n title: 'Zone breakdown',\n items: [rowFromExplicitStrip(activeZone.name, zs)],\n listHeaderLabel: 'Zone',\n valueColumnHeader: 'Visitors',\n },\n };\n }\n\n const fromNode = parseVisitorCount(activeZone.overallData?.count);\n const fromChildren = childTiles.reduce(\n (s, n) => s + parseVisitorCount(n.overallData?.count),\n 0\n );\n const overallVisitors = fromNode > 0 ? fromNode : fromChildren;\n const storeCount = childTiles.length;\n\n return {\n summaryKpis: { storeCount, overallVisitors },\n rankedBarList: {\n title: 'Zone breakdown',\n items: [rowFromHeuristicLabel(activeZone.name, overallVisitors)],\n listHeaderLabel: 'Zone',\n valueColumnHeader: 'Visitors',\n },\n };\n }\n\n if (!childTiles.length) return null;\n\n const overallVisitors = childTiles.reduce(\n (s, n) => s + parseVisitorCount(n.overallData?.count),\n 0\n );\n const storeCount = childTiles.length;\n\n return {\n summaryKpis: { storeCount, overallVisitors },\n rankedBarList: {\n title: 'Footfall overview',\n items: [rowFromHeuristicLabel('Overview', overallVisitors)],\n listHeaderLabel: 'Scope',\n valueColumnHeader: 'Visitors',\n },\n };\n}\n","/**\n * Treemap data helpers for FootFallHeatMap.\n * Recharts expects nested `children`; our tree uses `list` internally.\n */\n\nexport type ZoneAnalyticsHierarchy = {\n Country?: Record<string, unknown>;\n Region?: Record<string, unknown>;\n State?: Record<string, unknown>;\n City?: Record<string, unknown>;\n};\n\nexport type ZoneAnalyticsFlatItem = {\n category_id: number;\n category_name: string;\n percentage: number;\n visitor_count: number;\n avg_dwell_time: string;\n /** Optional; same shape as hierarchy `zone_kpi_strip` when this row should drive the strip alone. */\n zone_kpi_strip?: Record<string, unknown>;\n};\n\nexport type ZoneAnalyticsMetrics = {\n overall_visits?: number;\n trend?: { direction?: 'up' | 'down'; percentage?: number };\n unique_customer_walkins?: number;\n walkins_trend?: { direction?: 'up' | 'down'; percentage?: number };\n first_visit_count?: number;\n first_visit_trend?: { direction?: 'up' | 'down'; percentage?: number };\n avg_wait_time_per_visitor?: string;\n wait_time_trend?: { direction?: 'up' | 'down'; percentage?: number };\n attended_customers?: number;\n attended_trend?: { direction?: 'up' | 'down'; percentage?: number };\n unattended_customers?: number;\n unattended_trend?: { direction?: 'up' | 'down'; percentage?: number };\n avg_dwell_time?: string;\n dwell_time_trend?: { direction?: 'up' | 'down'; percentage?: number };\n};\n\n/** Optional per-zone KPI + 3-segment bar from API (`zone_kpi_strip` on hierarchy nodes). Same layout at every level; values vary by zone. */\nexport type ZoneKpiStripPayload = {\n storeCount: number;\n overallVisitors: number;\n segments: [\n { label: string; value: number },\n { label: string; value: number },\n { label: string; value: number },\n ];\n};\n\nexport type TreemapNode = {\n name: string;\n value: number;\n originalValue: number;\n color: string;\n overallData: {\n count: number | string;\n dwell: string;\n };\n list: TreemapNode[];\n /** Set when passing to Recharts Treemap (uses `children` for nesting). */\n children?: TreemapNode[];\n leafMetrics?: ZoneAnalyticsMetrics;\n /** When set, KPI strip + single segmented row use these values for this zone (when it is the active drill context). */\n zoneKpiStrip?: ZoneKpiStripPayload;\n _childContainerKey?: string;\n _raw?: number;\n};\n\n/** Recharts Treemap reads `children`, not `list`. */\nexport function toRechartsTreemapData(nodes: TreemapNode[]): TreemapNode[] {\n return nodes.map(n => ({\n ...n,\n children: n.list?.length ? toRechartsTreemapData(n.list) : undefined,\n })) as TreemapNode[];\n}\n\nexport function preprocessData(data: TreemapNode[]): TreemapNode[] {\n if (!data || !Array.isArray(data)) return [];\n\n const processedData = [...data];\n\n const totalValue = processedData.reduce((sum, item) => sum + item.value, 0);\n const threshold = totalValue * 0.05;\n\n return processedData.map(item => ({\n ...item,\n originalValue: item.value,\n value: Math.max(item.value, threshold),\n }));\n}\n\nexport function skipSingleBranchLevels(nodes: TreemapNode[]): TreemapNode[] {\n let currentNodes = preprocessData(nodes);\n let safetyCounter = 0;\n\n while (\n currentNodes.length === 1 &&\n Array.isArray(currentNodes[0]?.list) &&\n currentNodes[0].list.length > 0 &&\n safetyCounter < 10\n ) {\n currentNodes = preprocessData(currentNodes[0].list);\n safetyCounter += 1;\n }\n\n return currentNodes;\n}\n\nexport function parseMinutes(avgDwellTime?: string): number {\n if (!avgDwellTime) return 0;\n\n const m = String(avgDwellTime)\n .trim()\n .match(/([\\d.]+)/);\n\n return m ? Number(m[1]) : 0;\n}\n\nexport function isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nexport function getChildContainer(\n node: unknown\n): { key: string; container: Record<string, unknown> } | null {\n if (!isPlainObject(node)) return null;\n\n /** Prefer geographic / org levels in order so Region → State → City stay distinct in the treemap. */\n const preferred = ['Region', 'State', 'City', 'Stores', 'Zones'];\n for (const k of preferred) {\n if (isPlainObject(node[k]))\n return { key: k, container: node[k] as Record<string, unknown> };\n }\n\n for (const [k, v] of Object.entries(node)) {\n if (\n [\n 'total_footfall',\n 'avg_dwell_time',\n 'data',\n 'zone_kpi_strip',\n 'zoneKpiStrip',\n ].includes(k)\n )\n continue;\n if (isPlainObject(v)) return { key: k, container: v };\n }\n\n return null;\n}\n\nexport function metricForNode(\n node: unknown,\n sortBy: 'walkins' | 'dwell'\n): number {\n if (!node) return 0;\n const n = node as Record<string, unknown>;\n const data = n.data as Record<string, unknown> | undefined;\n if (data?.overall_visits != null) {\n return sortBy === 'walkins'\n ? Number(data.overall_visits)\n : parseMinutes(data.avg_dwell_time as string);\n }\n\n if (n.total_footfall != null) {\n return sortBy === 'walkins'\n ? Number(n.total_footfall)\n : parseMinutes(n.avg_dwell_time as string);\n }\n\n if (n.visitor_count != null) {\n return sortBy === 'walkins'\n ? Number(n.visitor_count)\n : parseMinutes(n.avg_dwell_time as string);\n }\n\n return 0;\n}\n\n/** Read optional `zone_kpi_strip` / `zoneKpiStrip` from a hierarchy or flat API node. */\nexport function parseZoneKpiStripFromRaw(\n node: Record<string, unknown>\n): ZoneKpiStripPayload | undefined {\n const raw = node.zone_kpi_strip ?? node.zoneKpiStrip;\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;\n const r = raw as Record<string, unknown>;\n const storeCount = Number(r.store_count ?? r.storeCount);\n const overallVisitors = Number(r.overall_visitors ?? r.overallVisitors);\n const segRaw = r.segments;\n if (!Array.isArray(segRaw) || segRaw.length !== 3) return undefined;\n const triple = segRaw.map((item, i) => {\n const o = item as Record<string, unknown>;\n return {\n label: String(o.label ?? `Segment ${i + 1}`),\n value: Number(o.value ?? 0),\n };\n });\n if (\n !Number.isFinite(storeCount) ||\n !Number.isFinite(overallVisitors) ||\n triple.some(t => !Number.isFinite(t.value))\n ) {\n return undefined;\n }\n return {\n storeCount,\n overallVisitors,\n segments: [triple[0], triple[1], triple[2]],\n };\n}\n\nexport function hashColor(seed: string): string {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h * 31 + seed.charCodeAt(i)) >>> 0;\n\n const r = 80 + (h & 0x7f);\n const g = 80 + ((h >> 7) & 0x7f);\n const b = 80 + ((h >> 14) & 0x7f);\n\n const toHex = (x: number) => x.toString(16).padStart(2, '0');\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nexport function buildTreemapNodes({\n container,\n sortBy,\n pathKey,\n}: {\n container: Record<string, unknown>;\n sortBy: 'walkins' | 'dwell';\n pathKey: string;\n}): TreemapNode[] {\n const entries = Object.entries(container);\n const total =\n entries.reduce((sum, [, v]) => sum + metricForNode(v, sortBy), 0) || 1;\n\n return entries.map(([name, node]): TreemapNode => {\n const raw = metricForNode(node, sortBy);\n const percentage = (raw / total) * 100;\n const color = hashColor(`${pathKey}/${name}`);\n\n const childContainer = getChildContainer(node);\n const n = node as Record<string, unknown>;\n const leafMetrics: ZoneAnalyticsMetrics | undefined = n?.data\n ? (n.data as ZoneAnalyticsMetrics)\n : undefined;\n const dataMetrics = n?.data as ZoneAnalyticsMetrics | undefined;\n const countRaw =\n n?.total_footfall ?? n?.visitor_count ?? dataMetrics?.overall_visits ?? 0;\n const zoneKpiStrip = parseZoneKpiStripFromRaw(n);\n\n return {\n name,\n value: percentage,\n originalValue: percentage,\n color,\n overallData: {\n count:\n typeof countRaw === 'number' || typeof countRaw === 'string'\n ? countRaw\n : 0,\n dwell:\n (n?.avg_dwell_time as string) ?? dataMetrics?.avg_dwell_time ?? '0m',\n },\n list: childContainer\n ? buildTreemapNodes({\n container: childContainer.container,\n sortBy,\n pathKey: `${pathKey}/${name}`,\n })\n : [],\n leafMetrics,\n zoneKpiStrip,\n _childContainerKey: childContainer?.key,\n _raw: raw,\n };\n });\n}\n\nexport function getNestedList(\n payload: TreemapNode & { children?: TreemapNode[] }\n): TreemapNode[] | undefined {\n if (payload.list?.length) return payload.list;\n if (payload.children?.length) return payload.children;\n return undefined;\n}\n","import Grid from '@mui/material/Grid';\nimport Paper from '@mui/material/Paper';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { ZoneAnalyticsMetrics } from './footfallHeatMapTree';\n\ntype KpiRow = {\n id: number;\n title: string;\n value: string | number;\n};\n\nfunction metricsToRows(metrics: ZoneAnalyticsMetrics): KpiRow[] {\n return [\n { id: 1, title: 'Overall Visits', value: metrics.overall_visits ?? 0 },\n {\n id: 2,\n title: 'Unique Visitors',\n value: metrics.unique_customer_walkins ?? 0,\n },\n {\n id: 3,\n title: 'First Visit Count',\n value: metrics.first_visit_count ?? 0,\n },\n {\n id: 4,\n title: 'Average Wait Time',\n value: metrics.avg_wait_time_per_visitor ?? '0m',\n },\n {\n id: 5,\n title: 'Attended Customers',\n value: metrics.attended_customers ?? 0,\n },\n {\n id: 6,\n title: 'Unattended Customers',\n value: metrics.unattended_customers ?? 0,\n },\n {\n id: 7,\n title: 'Avg. Dwell Time (Mins)',\n value: metrics.avg_dwell_time ?? '0m',\n },\n ];\n}\n\n/** Zone KPI grid using MUI layout. */\nconst ZoneWiseKpiCards = ({ metrics }: { metrics: ZoneAnalyticsMetrics }) => {\n const rows = metricsToRows(metrics);\n\n return (\n <Grid container spacing={3} sx={{ marginTop: '10px', paddingX: '6px' }}>\n {rows.map(item => (\n <Grid\n key={item.id}\n size={{\n xs: 12,\n sm: 6,\n md: 3,\n }}\n >\n <Paper\n elevation={0}\n sx={{\n p: 2,\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#FAFAFA',\n height: '100%',\n }}\n >\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n fontWeight={600}\n >\n {item.title}\n </Typography>\n <Stack mt={1}>\n <Typography variant=\"h6\" fontWeight={700}>\n {item.value}\n </Typography>\n </Stack>\n </Paper>\n </Grid>\n ))}\n </Grid>\n );\n};\n\nexport default ZoneWiseKpiCards;\n","/**\n * Shared queue-time visualization palette (stacked bar, donut, area).\n * Four violet shades, light → dark (segment index order) — pill bar / donut / area.\n */\nexport const QUEUE_CHART_COLORS = [\n '#E9E5FF',\n '#C4B5FD',\n '#8B5CF6',\n '#6D28D9',\n] as const;\n\n/** Thin horizontal stacked bar height (px); pill radius uses half of this. */\nexport const QUEUE_STACKED_BAR_THICKNESS_PX = 8;\n","import Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Grid from '@mui/material/Grid';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport * as React from 'react';\nimport QueueTimeBreakdownArea, {\n getQueueTimeBreakdownAreaSeriesData,\n getQueueTimeBreakdownAreaXAxisData,\n} from './QueueTimeBreakdownArea';\nimport { QueueTimeBreakdownDonut } from './QueueTimeBreakdownDonut';\nimport { QueueTimeBreakdownStackedBar } from './QueueTimeBreakdownStackedBar';\nimport type {\n QueueTimeBreakdownProps,\n QueueTimeChartFilter,\n} from './QueueTimeBreakdown.types';\nimport { QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC } from './QueueTimeBreakdown.types';\nimport { QueueTimeBreakdownCustomizationProvider } from './QueueTimeBreakdownCustomizationContext';\nimport { QUEUE_CHART_COLORS } from './queueTimeBreakdown.chartTokens';\nimport { TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN } from '../filters/timePeriodFilter.infoPopover';\nimport { TimePeriodFilter } from '../filters/TimePeriodFilter';\nimport { mergeSx } from './queueTimeBreakdownCustomization.merge';\n\nfunction defaultBucketLegendFromPalette(palette: readonly string[]) {\n return [\n { percent: '22%', label: '1-15 min', color: palette[0 % palette.length] },\n { percent: '12%', label: '1-15 min', color: palette[1 % palette.length] },\n { percent: '20%', label: '1-15 min', color: palette[2 % palette.length] },\n { percent: '32%', label: '1-15 min', color: palette[3 % palette.length] },\n ] as const;\n}\n\n/**\n * Queue time breakdown dashboard widget: stacked bars, queue buckets, donut comparison, area chart (Recharts).\n */\nexport function QueueTimeBreakdown({\n data,\n Donut_data,\n donutYesterdayData,\n headerImageSrc,\n headlineTotal = '14,123',\n headlineSubtitle = 'Queue Time Breakdown Of All Visitors',\n dataComparisonTitle = 'Data Comparison:',\n queueBucketLegend,\n title = 'Queue Time Breakdown',\n infoPopover,\n customization,\n}: QueueTimeBreakdownProps): React.ReactElement {\n const isSmallScreen = useMediaQuery('(max-width:600px)');\n const [filter, setFilter] = React.useState<QueueTimeChartFilter>('Day');\n const yesterdayDonut = donutYesterdayData ?? Donut_data;\n const palette =\n customization?.chartPalette && customization.chartPalette.length > 0\n ? customization.chartPalette\n : QUEUE_CHART_COLORS;\n const legend = queueBucketLegend ?? defaultBucketLegendFromPalette(palette);\n const resolvedHeaderImageSrc =\n headerImageSrc === undefined\n ? QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC\n : headerImageSrc;\n\n const rootSx = mergeSx(\n {\n bgcolor: '#FFFFFF',\n borderRadius: 2,\n boxShadow: '0 1px 3px rgba(15, 23, 42, 0.08)',\n },\n customization?.rootCard?.sx\n );\n\n const periodTitleSx = mergeSx(\n { fontWeight: 700, color: '#0f172a' },\n customization?.periodFilter?.titleSx\n );\n\n return (\n <QueueTimeBreakdownCustomizationProvider value={customization ?? {}}>\n <Card elevation={customization?.rootCard?.elevation ?? 0} sx={rootSx}>\n <CardContent>\n <Stack width=\"100%\" direction=\"column\" gap={3} mb={4}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n flexWrap=\"wrap\"\n gap={2}\n width=\"100%\"\n >\n <Typography\n variant={isSmallScreen ? 'subtitle2' : 'body1'}\n sx={periodTitleSx}\n >\n {title}\n </Typography>\n <TimePeriodFilter\n selectedFilter={filter}\n onFilterChange={setFilter}\n infoPopover={\n infoPopover === undefined\n ? TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN\n : infoPopover\n }\n />\n </Stack>\n <Box>\n <Grid container spacing={3}>\n <Grid size={{ md: 6, xs: 12 }}>\n <Stack gap={1}>\n <Stack>\n <Stack\n direction=\"row\"\n gap={4}\n justifyContent=\"start\"\n alignItems=\"center\"\n >\n {resolvedHeaderImageSrc ? (\n <Box\n component=\"img\"\n src={resolvedHeaderImageSrc}\n alt=\"\"\n width={52}\n height={52}\n sx={{ objectFit: 'contain' }}\n />\n ) : null}\n <Stack>\n <Typography\n sx={mergeSx(\n {\n fontSize: '20px',\n fontWeight: 600,\n color: '#222222',\n },\n customization?.header?.headlineSx\n )}\n >\n {headlineTotal}\n </Typography>\n <Typography\n sx={mergeSx(\n {\n fontSize: '11px',\n fontWeight: 400,\n color: '#222222',\n },\n customization?.header?.subtitleSx\n )}\n >\n {headlineSubtitle}\n </Typography>\n </Stack>\n </Stack>\n </Stack>\n <Stack>\n {data.map(item => (\n <QueueTimeBreakdownStackedBar\n key={item.name}\n row={item}\n legendRows={legend}\n />\n ))}\n </Stack>\n </Stack>\n <Typography\n sx={{\n marginTop: '10px',\n fontSize: '14px',\n fontWeight: 500,\n color: '#222222',\n }}\n >\n {dataComparisonTitle}\n </Typography>\n <Card\n elevation={0}\n sx={mergeSx(\n {\n cursor: 'pointer',\n marginTop: '10px',\n bgcolor: '#FFFFFF',\n border: '1px solid #E5E7EB',\n borderRadius: 2,\n },\n customization?.dataComparison?.cardSx\n )}\n >\n <CardContent sx={{ padding: '4px 8px' }}>\n <Stack\n direction=\"row\"\n justifyContent=\"space-evenly\"\n alignItems=\"center\"\n >\n <Stack width=\"50%\">\n <QueueTimeBreakdownDonut\n averageData={Donut_data}\n chartFilter={filter}\n LabelName=\"Today\"\n />\n </Stack>\n <Box\n component=\"span\"\n sx={mergeSx(\n {\n height: '180px',\n width: '2px',\n backgroundColor: '#D8D9E4',\n display: 'inline-block',\n },\n customization?.dataComparison?.dividerSx\n )}\n />\n <Stack width=\"50%\">\n <QueueTimeBreakdownDonut\n averageData={yesterdayDonut}\n chartFilter={filter}\n LabelName=\"Yesterday\"\n />\n </Stack>\n </Stack>\n </CardContent>\n </Card>\n </Grid>\n\n <Grid size={{ md: 6, xs: 12 }}>\n <Card\n elevation={0}\n sx={mergeSx(\n {\n cursor: 'pointer',\n borderRadius: '8px',\n border: '1px solid #E5E7EB',\n bgcolor: '#FFFFFF',\n height: '100%',\n },\n customization?.areaChart?.cardSx\n )}\n >\n <CardContent\n sx={mergeSx(\n { padding: '10px 8px' },\n customization?.areaChart?.cardContentSx\n )}\n >\n <QueueTimeBreakdownArea\n series={getQueueTimeBreakdownAreaSeriesData(filter)}\n xAxis={getQueueTimeBreakdownAreaXAxisData(filter)}\n />\n </CardContent>\n </Card>\n </Grid>\n </Grid>\n </Box>\n </Stack>\n </CardContent>\n </Card>\n </QueueTimeBreakdownCustomizationProvider>\n );\n}\n\nexport default QueueTimeBreakdown;\n\nexport { generateMockPerformanceData } from './queueTimeBreakdown.mock';\n","import { Stack } from '@mui/material';\nimport { useTheme } from '@mui/material/styles';\nimport * as React from 'react';\nimport {\n Area,\n AreaChart,\n CartesianGrid,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { useQueueTimeBreakdownCustomization } from './QueueTimeBreakdownCustomizationContext';\nimport type { QueueTimeChartFilter } from './QueueTimeBreakdown.types';\nimport {\n QueueTimeBreakdownAreaTooltip,\n type QueueTimeBreakdownAreaTooltipProps,\n} from './QueueTimeBreakdownAreaTooltip';\nimport { QUEUE_CHART_COLORS } from './queueTimeBreakdown.chartTokens';\n\nexport type QueueTimeAreaSeriesPoint = {\n name: string;\n data: number[];\n};\n\nexport type QueueTimeBreakdownAreaProps = {\n series: QueueTimeAreaSeriesPoint[];\n xAxis: string[];\n};\n\nfunction mergeAreaData(\n seriesList: QueueTimeAreaSeriesPoint[],\n categories: string[]\n): Record<string, string | number>[] {\n return categories.map((cat, i) => {\n const row: Record<string, string | number> = { name: cat };\n seriesList.forEach(s => {\n row[s.name] = s.data[i] ?? 0;\n });\n return row;\n });\n}\n\nconst defaultMargin = { top: 8, right: 8, bottom: 8, left: 8 };\n\nconst QueueTimeBreakdownArea = ({\n series,\n xAxis,\n}: QueueTimeBreakdownAreaProps): React.ReactElement => {\n const theme = useTheme();\n const { chartPalette, areaChart: ac } = useQueueTimeBreakdownCustomization();\n const palette =\n chartPalette && chartPalette.length > 0 ? chartPalette : QUEUE_CHART_COLORS;\n const chartData = React.useMemo(\n () => mergeAreaData(series, xAxis),\n [series, xAxis]\n );\n const stackH = ac?.stackHeightPx ?? 330;\n const chartH = ac?.chartHeightPx ?? 350;\n const margin = React.useMemo(\n () => ({ ...defaultMargin, ...ac?.margin }),\n [ac?.margin]\n );\n const gridStroke = ac?.gridStroke ?? theme.palette.divider;\n const yLabel = ac?.yAxisLabel ?? 'No of Visitors';\n\n return (\n <Stack justifyContent=\"center\" height={stackH}>\n <ResponsiveContainer width=\"100%\" height={chartH}>\n <AreaChart data={chartData} margin={margin}>\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke={gridStroke}\n vertical={false}\n />\n <XAxis\n dataKey=\"name\"\n tick={{ fill: theme.palette.text.secondary, fontSize: 11 }}\n axisLine={false}\n tickLine={false}\n />\n <YAxis\n tick={{ fill: theme.palette.text.secondary, fontSize: 11 }}\n axisLine={false}\n tickLine={false}\n tickFormatter={v => {\n const n = typeof v === 'number' ? v : Number(v);\n const safe = Number.isFinite(n) ? n : 0;\n return safe > 1000 ? `${Math.ceil(safe / 1000)}k` : String(safe);\n }}\n label={{\n value: yLabel,\n angle: -90,\n position: 'insideLeft',\n style: { fill: theme.palette.text.secondary, fontSize: 11 },\n }}\n />\n <Tooltip\n content={({ active, payload, label }) => (\n <QueueTimeBreakdownAreaTooltip\n active={active}\n label={label}\n payload={\n payload as QueueTimeBreakdownAreaTooltipProps['payload']\n }\n styleOverrides={ac?.areaTooltip}\n />\n )}\n cursor={{\n stroke: ac?.cursorStroke ?? '#D4D4D8',\n strokeWidth: ac?.cursorStrokeWidth ?? 1,\n }}\n wrapperStyle={{ outline: 'none' }}\n />\n {series.map((s, i) => (\n <Area\n key={s.name}\n type=\"monotone\"\n dataKey={s.name}\n stackId=\"queueArea\"\n stroke={palette[i % palette.length]}\n fill={palette[i % palette.length]}\n fillOpacity={1}\n strokeWidth={0}\n />\n ))}\n </AreaChart>\n </ResponsiveContainer>\n </Stack>\n );\n};\n\nexport default QueueTimeBreakdownArea;\n\nconst xDays = [\n 'April 1',\n 'April 2',\n 'April 3',\n 'April 4',\n 'April 5',\n 'April 6',\n 'Today',\n];\nconst xWeeks = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\nconst xMonths = ['Jan', 'Feb', 'Mar', 'Apr'];\nconst xYears = ['2018', '2019', '2020', '2021', '2022', '2023', '2024'];\n\nexport function getQueueTimeBreakdownAreaXAxisData(\n type: QueueTimeChartFilter\n): string[] {\n switch (type) {\n case 'Day':\n return xDays;\n case 'Week':\n return xWeeks;\n case 'Month':\n return xMonths;\n case 'Year':\n return xYears;\n default:\n return xDays;\n }\n}\n\nexport function getQueueTimeBreakdownAreaSeriesData(\n type: QueueTimeChartFilter\n): QueueTimeAreaSeriesPoint[] {\n const axis = getQueueTimeBreakdownAreaXAxisData(type);\n const areas = ['1-15 mins', '16-30 mins', '30-45 mins', '> 45 mins'] as const;\n const out: QueueTimeAreaSeriesPoint[] = [];\n\n areas.forEach(area => {\n const data: number[] = [];\n const range =\n area === '1-15 mins'\n ? 500\n : area === '16-30 mins'\n ? 1000\n : area === '30-45 mins'\n ? 2000\n : 1500;\n for (let i = 0; i < axis.length; i += 1) {\n data.push(range + i * 100 * Math.floor(Math.random() * 10));\n }\n out.push({ name: area, data });\n });\n\n return out;\n}\n","import * as React from 'react';\nimport type { QueueTimeAreaTooltipTheme } from './queueTimeBreakdown.customization.types';\nimport { mergeAreaTooltipStyles } from './queueTimeBreakdownCustomization.merge';\n\n/** Normalized row after Recharts payload cast. */\ntype TooltipRow = {\n value?: unknown;\n name?: unknown;\n color?: string;\n dataKey?: unknown;\n};\n\nexport type QueueTimeBreakdownAreaTooltipProps = {\n active?: boolean;\n payload?: ReadonlyArray<TooltipRow>;\n label?: unknown;\n /** Merged with built-in defaults; set via `QueueTimeBreakdown` `customization.areaChart.areaTooltip`. */\n styleOverrides?: QueueTimeAreaTooltipTheme;\n};\n\nfunction numberFromTooltipValue(v: unknown): number {\n if (typeof v === 'number' && Number.isFinite(v)) {\n return v;\n }\n if (typeof v === 'string') {\n const n = Number(v);\n return Number.isFinite(n) ? n : 0;\n }\n if (Array.isArray(v) && v.length > 0) {\n const first = v[0];\n if (typeof first === 'number' && Number.isFinite(first)) {\n return first;\n }\n }\n return 0;\n}\n\nfunction formatVisitorValue(n: number): string {\n if (!Number.isFinite(n)) {\n return '';\n }\n if (Math.abs(n) >= 1000) {\n return `${(n / 1000).toFixed(1)}k`;\n }\n return String(Math.round(n));\n}\n\n/**\n * Area chart tooltip — header strip + rows: dot · label : value.\n * Styles are customizable via `styleOverrides` (see `QueueTimeAreaTooltipTheme`).\n */\nexport function QueueTimeBreakdownAreaTooltip({\n active,\n payload,\n label,\n styleOverrides,\n}: QueueTimeBreakdownAreaTooltipProps): React.ReactElement | null {\n const s = React.useMemo(\n () => mergeAreaTooltipStyles(styleOverrides),\n [styleOverrides]\n );\n\n if (!active || payload == null || payload.length === 0) {\n return null;\n }\n\n return (\n <div style={s.container}>\n <div style={s.header}>{label != null ? String(label) : ''}</div>\n <div style={s.body}>\n {payload.map((entry, i) => {\n const name =\n typeof entry.name === 'string'\n ? entry.name\n : entry.name != null\n ? String(entry.name)\n : '';\n const safe = numberFromTooltipValue(entry.value);\n const color =\n typeof entry.color === 'string' ? entry.color : '#8B5CF6';\n const key =\n entry.dataKey != null ? String(entry.dataKey) : `row-${i}`;\n return (\n <div key={key} style={s.row}>\n <span\n style={{\n ...s.dot,\n backgroundColor: color,\n }}\n />\n <span style={s.label}>{`${name} :`}</span>\n <span style={s.value}>{formatVisitorValue(safe)}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport * as React from 'react';\nimport { Cell, Pie, PieChart, ResponsiveContainer, Tooltip } from 'recharts';\nimport { useQueueTimeBreakdownCustomization } from './QueueTimeBreakdownCustomizationContext';\nimport type { QueueTimeChartFilter } from './QueueTimeBreakdown.types';\nimport { QUEUE_CHART_COLORS } from './queueTimeBreakdown.chartTokens';\nimport {\n mergeRechartsTooltipStyles,\n mergeSx,\n} from './queueTimeBreakdownCustomization.merge';\n\nconst RADIAN = Math.PI / 180;\n\n/** Recharts `Pie` label payload (subset we need). */\ntype PieSectorLabelPayload = {\n cx?: number;\n cy?: number;\n midAngle?: number;\n innerRadius?: number;\n outerRadius?: number;\n percent?: number;\n index?: number;\n};\n\ntype DonutInnerLabelExtra = {\n lightSliceFill?: string;\n darkSliceFill?: string;\n};\n\n/** Percent text at mid-annulus so it reads inside the donut ring (not outside). */\nfunction DonutInnerPercentLabel(\n props: Readonly<PieSectorLabelPayload & DonutInnerLabelExtra>\n): React.ReactElement | null {\n const {\n cx,\n cy,\n midAngle,\n innerRadius,\n outerRadius,\n percent,\n index = 0,\n lightSliceFill = '#5B21B6',\n darkSliceFill = '#FFFFFF',\n } = props;\n if (\n cx == null ||\n cy == null ||\n midAngle == null ||\n innerRadius == null ||\n outerRadius == null ||\n percent == null\n ) {\n return null;\n }\n const p = percent;\n if (p < 0.025) {\n return null;\n }\n const midR = innerRadius + (outerRadius - innerRadius) / 2;\n const x = cx + midR * Math.cos(-midAngle * RADIAN);\n const y = cy + midR * Math.sin(-midAngle * RADIAN);\n const text = `${(p * 100).toFixed(0)}%`;\n const lightSlice = index < 2;\n const fill = lightSlice ? lightSliceFill : darkSliceFill;\n\n return (\n <text\n x={x}\n y={y}\n fill={fill}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontSize={11}\n fontWeight={600}\n style={{\n pointerEvents: 'none',\n textShadow: lightSlice ? 'none' : '0 1px 2px rgba(0,0,0,0.45)',\n }}\n >\n {text}\n </text>\n );\n}\n\nconst DEFAULT_LABELS = [\n '0-20 years old (male)',\n '21-45 years old (male)',\n '46-60 years old (male)',\n '60+ years old (male)',\n] as const;\n\nexport type QueueTimeBreakdownDonutProps = {\n chartFilter: QueueTimeChartFilter;\n averageData: number[];\n LabelName: string;\n labels?: readonly string[];\n};\n\ntype PieDatum = { name: string; value: number };\n\nexport function QueueTimeBreakdownDonut({\n chartFilter,\n averageData,\n LabelName,\n labels = DEFAULT_LABELS,\n}: QueueTimeBreakdownDonutProps): React.ReactElement {\n const { chartPalette, donut: dn } = useQueueTimeBreakdownCustomization();\n const palette =\n chartPalette && chartPalette.length > 0 ? chartPalette : QUEUE_CHART_COLORS;\n const tt = React.useMemo(\n () => mergeRechartsTooltipStyles(dn?.tooltip),\n [dn?.tooltip]\n );\n const innerR = dn?.innerRadius ?? 58;\n const outerR = dn?.outerRadius ?? 88;\n const padAngle = dn?.paddingAngle ?? 2;\n const chartH = dn?.chartHeightPx ?? 220;\n\n const pieData: PieDatum[] = React.useMemo(() => {\n return labels.map((name, i) => ({\n name,\n value: Math.max(0, averageData[i] ?? 0),\n }));\n }, [averageData, labels]);\n\n const total = pieData.reduce((s, d) => s + d.value, 0) || 1;\n\n return (\n <Box\n sx={mergeSx(\n { position: 'relative', width: '100%', minHeight: 200 },\n dn?.containerSx\n )}\n >\n <ResponsiveContainer width=\"100%\" height={chartH}>\n <PieChart key={chartFilter}>\n <Pie\n data={pieData}\n dataKey=\"value\"\n nameKey=\"name\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={innerR}\n outerRadius={outerR}\n paddingAngle={padAngle}\n labelLine={false}\n label={(props: PieSectorLabelPayload) => (\n <DonutInnerPercentLabel\n {...props}\n lightSliceFill={dn?.innerPercentOnLightSliceFill}\n darkSliceFill={dn?.innerPercentOnDarkSliceFill}\n />\n )}\n >\n {pieData.map((_, index) => (\n <Cell\n key={`cell-${index}`}\n fill={palette[index % palette.length]}\n />\n ))}\n </Pie>\n <Tooltip\n contentStyle={tt.contentStyle}\n itemStyle={tt.itemStyle}\n labelStyle={tt.labelStyle}\n wrapperStyle={tt.wrapperStyle}\n formatter={(value, name) => {\n const v =\n value == null\n ? 0\n : typeof value === 'number'\n ? value\n : Number(value);\n const safe = Number.isFinite(v) ? v : 0;\n const label =\n typeof name === 'string' ? name : String(name ?? '');\n return [`${((safe / total) * 100).toFixed(0)}%`, label];\n }}\n />\n </PieChart>\n </ResponsiveContainer>\n <Box\n sx={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n textAlign: 'center',\n }}\n >\n <Typography\n sx={mergeSx(\n { fontSize: '13px', fontWeight: 600, color: '#373d3f' },\n dn?.centerLabelSx\n )}\n >\n {LabelName}\n </Typography>\n </Box>\n </Box>\n );\n}\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport * as React from 'react';\nimport {\n Bar,\n BarChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { useQueueTimeBreakdownCustomization } from './QueueTimeBreakdownCustomizationContext';\nimport type {\n QueueBucketLegendItem,\n QueueTimeBreakdownBarRow,\n} from './QueueTimeBreakdown.types';\nimport {\n QUEUE_CHART_COLORS,\n QUEUE_STACKED_BAR_THICKNESS_PX,\n} from './queueTimeBreakdown.chartTokens';\nimport {\n mergeRechartsTooltipStyles,\n mergeSx,\n} from './queueTimeBreakdownCustomization.merge';\n\nfunction computePercents(row: QueueTimeBreakdownBarRow): number[] {\n const raw = row.data.map(seg => Math.max(0, seg.data[0] ?? 0));\n const sum = raw.reduce((a, b) => a + b, 0) || 1;\n return raw.map(v => (v / sum) * 100);\n}\n\nfunction rowToPercentStackData(\n row: QueueTimeBreakdownBarRow\n): Record<string, string | number>[] {\n const raw = row.data.map(seg => Math.max(0, seg.data[0] ?? 0));\n const sum = raw.reduce((a, b) => a + b, 0) || 1;\n const out: Record<string, string | number> = { row: row.name };\n raw.forEach((v, i) => {\n out[`s${i}`] = (v / sum) * 100;\n });\n return [out];\n}\n\nfunction pillRadius(\n i: number,\n n: number,\n cornerR: number\n): [number, number, number, number] {\n if (n === 1) {\n return [cornerR, cornerR, cornerR, cornerR];\n }\n if (i === 0) {\n return [cornerR, 0, 0, cornerR];\n }\n if (i === n - 1) {\n return [0, cornerR, cornerR, 0];\n }\n return [0, 0, 0, 0];\n}\n\nexport type QueueTimeBreakdownStackedBarProps = {\n row: QueueTimeBreakdownBarRow;\n /** One entry per segment: percent line + range line (aligned under each slice). */\n legendRows: readonly QueueBucketLegendItem[];\n};\n\n/**\n * Horizontal 100% stacked bar (Recharts) — slim pill, framed by two rules; labels use the same flex widths as data.\n */\nexport function QueueTimeBreakdownStackedBar({\n row,\n legendRows,\n}: QueueTimeBreakdownStackedBarProps): React.ReactElement {\n const { chartPalette, stackedBar: sb } = useQueueTimeBreakdownCustomization();\n const palette =\n chartPalette && chartPalette.length > 0 ? chartPalette : QUEUE_CHART_COLORS;\n const pcts = React.useMemo(() => computePercents(row), [row]);\n const chartData = React.useMemo(() => rowToPercentStackData(row), [row]);\n const n = row.data.length;\n const h = sb?.barThicknessPx ?? QUEUE_STACKED_BAR_THICKNESS_PX;\n const cornerR = Math.max(2, h / 2);\n const ruleColor = sb?.ruleColor ?? '#E5E7EB';\n const tt = React.useMemo(\n () => mergeRechartsTooltipStyles(sb?.tooltip),\n [sb?.tooltip]\n );\n\n const cells = React.useMemo(() => {\n return pcts.map((_, i) => {\n const leg = legendRows[i];\n const percentText = leg?.percent ?? `${pcts[i].toFixed(0)}%`;\n const labelText = leg?.label ?? row.data[i]?.name ?? '';\n return { percentText, labelText };\n });\n }, [legendRows, pcts, row.data]);\n\n return (\n <Stack spacing={0} sx={{ width: '100%' }}>\n <Box sx={{ borderTop: `1px solid ${ruleColor}`, width: '100%' }} />\n <Box sx={{ width: '100%', height: h }}>\n <ResponsiveContainer width=\"100%\" height={h}>\n <BarChart\n layout=\"vertical\"\n data={chartData}\n margin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n barCategoryGap={0}\n >\n <XAxis type=\"number\" domain={[0, 100]} hide />\n <YAxis type=\"category\" dataKey=\"row\" width={0} hide />\n <Tooltip\n contentStyle={tt.contentStyle}\n itemStyle={tt.itemStyle}\n labelStyle={tt.labelStyle}\n wrapperStyle={tt.wrapperStyle}\n formatter={(value, name) => {\n const v =\n value == null\n ? 0\n : typeof value === 'number'\n ? value\n : Number(value);\n const safe = Number.isFinite(v) ? v : 0;\n const key =\n typeof name === 'string' ? name : String(name ?? '');\n const idx = /^s\\d+$/.test(key)\n ? Number.parseInt(key.slice(1), 10)\n : NaN;\n const segName =\n Number.isFinite(idx) && row.data[idx] != null\n ? row.data[idx].name\n : key;\n return [`${safe.toFixed(1)}%`, segName];\n }}\n />\n {Array.from({ length: n }, (_, i) => (\n <Bar\n key={`s-${row.name}-${i}`}\n dataKey={`s${i}`}\n stackId=\"queue\"\n barSize={h}\n fill={palette[i % palette.length]}\n radius={pillRadius(i, n, cornerR)}\n isAnimationActive={false}\n />\n ))}\n </BarChart>\n </ResponsiveContainer>\n </Box>\n <Box sx={{ borderBottom: `1px solid ${ruleColor}`, width: '100%' }} />\n\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'row',\n width: '100%',\n mt: 0.75,\n alignItems: 'flex-start',\n }}\n >\n {pcts.map((p, i) => {\n const pct = cells[i]?.percentText ?? '';\n const rng = cells[i]?.labelText ?? '';\n return (\n <Box\n key={`lbl-${row.name}-${i}`}\n title={`${pct} ${rng}`.trim()}\n sx={{\n flex: `0 0 ${p}%`,\n minWidth: 0,\n maxWidth: `${p}%`,\n px: 0.25,\n textAlign: 'center',\n overflow: 'hidden',\n }}\n >\n <Typography\n sx={mergeSx(\n {\n fontSize: '11px',\n fontWeight: 600,\n color: '#64748B',\n lineHeight: 1.25,\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n sb?.labelPercentSx\n )}\n >\n {pct}\n </Typography>\n <Typography\n sx={mergeSx(\n {\n fontSize: '10px',\n fontWeight: 500,\n color: '#64748B',\n lineHeight: 1.25,\n mt: 0.125,\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n sb?.labelRangeSx\n )}\n >\n {rng}\n </Typography>\n </Box>\n );\n })}\n </Box>\n </Stack>\n );\n}\n","import type { ChartWidgetInfoPopoverContent } from '../ChartWidgetInfoButton/ChartWidgetInfoButton.types';\nimport type { QueueTimeBreakdownCustomization } from './queueTimeBreakdown.customization.types';\n\nexport type { QueueTimeBreakdownCustomization };\n\n/**\n * Header illustration for the queue breakdown card.\n * Default GIF path (place under app **`public`** or override with **`headerImageSrc`**).\n */\nexport const QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC =\n '/images/icon/DwellBreakdownIcon.gif' as const;\n\n/** One series slice for Apex stacked horizontal bars. */\nexport type QueueTimeStackedSeriesItem = {\n name: string;\n data: number[];\n};\n\n/** One row of stacked-bar data (e.g. per store). */\nexport type QueueTimeBreakdownBarRow = {\n name: string;\n data: QueueTimeStackedSeriesItem[];\n total: number;\n};\n\nexport type QueueTimeChartFilter = 'Day' | 'Week' | 'Month' | 'Year';\n\n/** Optional legend chip under the stacked bars (percent + label + color). */\nexport type QueueBucketLegendItem = {\n percent: string;\n label: string;\n color: string;\n};\n\nexport type QueueTimeBreakdownProps = {\n /** Stacked horizontal bar rows. */\n data: QueueTimeBreakdownBarRow[];\n /** Donut slice values (e.g. today). */\n Donut_data: number[];\n /** Optional second donut; defaults to Donut_data for both sides. */\n donutYesterdayData?: number[];\n total_visitor_today?: number;\n overall_visitor_per_hour?: number;\n overall_visitor_per_min?: number;\n top_store?: string;\n /**\n * Header illustration URL. Defaults to {@link QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC}\n * (same asset as the queue-time dashboard widget). Pass `''` to hide the icon.\n */\n headerImageSrc?: string;\n /** Main KPI number shown next to the icon. */\n headlineTotal?: string;\n /** Subtitle under the headline. */\n headlineSubtitle?: string;\n /** Row title above the donut comparison card. */\n dataComparisonTitle?: string;\n /** Legend under the stacked bars; defaults to four queue buckets. */\n queueBucketLegend?: QueueBucketLegendItem[];\n /** Card / widget title. */\n title?: string;\n /**\n * Header info popover (next to D/W/M/Y). When omitted, the widget uses\n * **`TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN`**. Pass **`null`** to hide the separator and\n * **`ChartWidgetInfoButton`**. Standalone **`TimePeriodFilter`** does not inject popover copy implicitly.\n */\n infoPopover?: ChartWidgetInfoPopoverContent | null;\n /** Visual / layout overrides for all sub-widgets (tooltips, palette, D/W/M/Y control, etc.). */\n customization?: QueueTimeBreakdownCustomization;\n};\n","import type { QueueTimeBreakdownBarRow } from './QueueTimeBreakdown.types';\n\nconst ageGroups = [\n '0-20 years old (male)',\n '21-45 years old (male)',\n '46-60 years old (male)',\n '60+ years old (male)',\n] as const;\n\nconst storeList = ['Max Indonesia'] as const;\n\n/** Demo data for Storybook / prototyping. */\nexport function generateMockPerformanceData(): QueueTimeBreakdownBarRow[] {\n const data: QueueTimeBreakdownBarRow[] = [];\n\n storeList.forEach(store => {\n data.push({\n name: store,\n data: ageGroups.map(age => ({\n name: age,\n data: [Math.floor(Math.random() * 1000)],\n })),\n total: Math.floor(Math.random() * 10000),\n });\n });\n\n return data;\n}\n","/** Primary line + tooltip fill (violet). */\nexport const BILLING_COUNTER_LINE_PRIMARY = '#7C3AED' as const;\n\n/** Default pill track behind segmented tabs. */\nexport const BILLING_COUNTER_TABS_TRACK_BG = '#E8E8E8' as const;\n","import type { ChartWidgetInfoPopoverContent } from '../ChartWidgetInfoButton/ChartWidgetInfoButton.types';\n\nexport const DEFAULT_BILLING_COUNTER_ANALYTICS_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n {\n title: 'Billing Counter Analytics',\n description:\n 'Trend lines for billing-counter visits, average queue time, and alerts. Switch tabs to compare metrics over the same date range.',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'Track daily load at billing counters and spot spikes.',\n 'Monitor queue-time trends to adjust staffing.',\n 'See when alert volume rises relative to traffic.',\n ],\n };\n","import type { ChartWidgetSegmentedTab } from '../tabs/ChartWidgetSegmentedTabs';\nimport type { BillingCounterAnalyticsPoint } from './BillingCounterAnalytics.types';\n\nexport const billingCounterDefaultTabs: ChartWidgetSegmentedTab[] = [\n { id: 'visits', label: 'Billing Counter Visits' },\n { id: 'queue', label: 'Avg. Queue Time' },\n { id: 'alerts', label: 'Alerts Generated' },\n];\n\nconst X_LABELS = [\n 'Jan 12',\n 'Jan 13',\n 'Jan 14',\n 'Jan 15',\n 'Jan 16',\n 'Jan 17',\n 'Jan 18',\n 'Jan 19',\n 'Jan 20',\n 'Jan 21',\n 'Jan 22',\n 'Jan 23',\n 'Today',\n] as const;\n\nfunction clamp(n: number, lo: number, hi: number): number {\n return Math.min(hi, Math.max(lo, n));\n}\n\nfunction seriesForTab(\n phase: number,\n scale: number,\n bias: number\n): BillingCounterAnalyticsPoint[] {\n return X_LABELS.map((label, i) => {\n const wobble = Math.sin((i + phase) * 0.55) * scale;\n const ramp = i * 2.2;\n const raw = 52 + wobble + ramp * 0.15 + bias;\n return {\n label,\n value: clamp(Math.round(raw), 18, 98),\n };\n });\n}\n\n/** Demo datasets aligned with **billingCounterDefaultTabs** ids. */\nexport const billingCounterMockSeriesByTabId: Record<\n string,\n BillingCounterAnalyticsPoint[]\n> = {\n visits: seriesForTab(0, 22, 0),\n queue: seriesForTab(2.1, 18, -8),\n alerts: seriesForTab(4.2, 28, -18),\n};\n","import Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport * as React from 'react';\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport { ChartWidgetHeaderSeparator } from '../utils/ChartWidgetHeaderSeparator';\nimport { ChartWidgetInfoButton } from '../ChartWidgetInfoButton';\nimport { ChartWidgetSegmentedTabs } from '../tabs/ChartWidgetSegmentedTabs';\nimport {\n BILLING_COUNTER_LINE_PRIMARY,\n BILLING_COUNTER_TABS_TRACK_BG,\n} from './billingCounterAnalytics.chartTokens';\nimport { DEFAULT_BILLING_COUNTER_ANALYTICS_INFO_POPOVER } from './billingCounterAnalytics.defaultInfoPopover';\nimport { mergeSx } from './billingCounterAnalyticsCustomization.merge';\nimport {\n BillingCounterAnalyticsCustomizationProvider,\n useBillingCounterAnalyticsCustomization,\n} from './BillingCounterAnalyticsCustomizationContext';\nimport type { BillingCounterAnalyticsProps } from './BillingCounterAnalytics.types';\nimport { BillingCounterAnalyticsTooltip } from './BillingCounterAnalyticsTooltip';\n\nfunction LinePlot({\n data,\n yAxisDomain,\n yAxisTicks,\n}: {\n data: { label: string; value: number }[];\n yAxisDomain: [number, number];\n yAxisTicks: number[];\n}): React.ReactElement {\n const { lineChart: lc } = useBillingCounterAnalyticsCustomization();\n const height = lc?.heightPx ?? 300;\n const lineColor = lc?.lineColor ?? BILLING_COUNTER_LINE_PRIMARY;\n const strokeW = lc?.lineStrokeWidth ?? 2;\n const gridStroke = lc?.gridStroke ?? '#E5E7EB';\n const dash = lc?.gridStrokeDasharray ?? '3 3';\n const m = {\n top: lc?.margin?.top ?? 12,\n right: lc?.margin?.right ?? 16,\n bottom: lc?.margin?.bottom ?? 8,\n left: lc?.margin?.left ?? 4,\n };\n const xFill = lc?.xAxisTickFill ?? '#64748B';\n const yFill = lc?.yAxisTickFill ?? '#64748B';\n const yWidth = lc?.yAxisWidth ?? 36;\n const cursorStroke = lc?.cursorStroke ?? '#9CA3AF';\n const cursorDash = lc?.cursorStrokeDasharray ?? '4 4';\n const lineType = lc?.lineType ?? 'linear';\n\n return (\n <Box sx={{ width: '100%', height, mt: 0.5 }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart data={data} margin={m}>\n <CartesianGrid\n strokeDasharray={dash}\n vertical={false}\n stroke={gridStroke}\n />\n <XAxis\n dataKey=\"label\"\n tick={{ fill: xFill, fontSize: 11 }}\n tickLine={false}\n axisLine={{ stroke: '#E5E7EB' }}\n interval={0}\n height={40}\n />\n <YAxis\n domain={yAxisDomain}\n ticks={yAxisTicks}\n tick={{ fill: yFill, fontSize: 11 }}\n tickLine={false}\n axisLine={false}\n width={yWidth}\n />\n <Tooltip\n content={(p: TooltipContentProps) => (\n <BillingCounterAnalyticsTooltip {...p} />\n )}\n cursor={{ stroke: cursorStroke, strokeDasharray: cursorDash }}\n allowEscapeViewBox={{ x: false, y: true }}\n />\n <Line\n type={lineType}\n dataKey=\"value\"\n stroke={lineColor}\n strokeWidth={strokeW}\n strokeLinejoin=\"miter\"\n strokeLinecap=\"butt\"\n dot={false}\n activeDot={{\n r: 5,\n fill: lineColor,\n stroke: '#ffffff',\n strokeWidth: 2,\n }}\n isAnimationActive={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </Box>\n );\n}\n\n/**\n * Billing counter analytics card: title row (optional info), pill tabs, Recharts line chart with violet styling.\n */\nexport function BillingCounterAnalytics({\n title = 'Billing Counter Analytics',\n tabs,\n activeTabId,\n onTabChange,\n data,\n seriesByTabId,\n yAxisDomain = [0, 100],\n yAxisTicks = [20, 40, 60, 80, 100],\n infoPopover,\n customization,\n}: BillingCounterAnalyticsProps): React.ReactElement {\n const chartData = React.useMemo(() => {\n if (seriesByTabId) {\n return seriesByTabId[activeTabId] ?? [];\n }\n return data ?? [];\n }, [seriesByTabId, data, activeTabId]);\n\n const resolvedInfo =\n infoPopover === undefined\n ? DEFAULT_BILLING_COUNTER_ANALYTICS_INFO_POPOVER\n : infoPopover;\n\n const rootSx = mergeSx(\n {\n bgcolor: '#FFFFFF',\n borderRadius: 2,\n boxShadow: '0 1px 3px rgba(15, 23, 42, 0.08)',\n },\n customization?.rootCard?.sx\n );\n\n const st = customization?.segmentedTabs;\n const titleSx = mergeSx(\n {\n fontWeight: 700,\n fontSize: { xs: '1rem', sm: '1.05rem' },\n color: '#0f172a',\n },\n customization?.header?.titleSx\n );\n\n return (\n <BillingCounterAnalyticsCustomizationProvider value={customization ?? {}}>\n <Card elevation={customization?.rootCard?.elevation ?? 0} sx={rootSx}>\n <CardContent>\n <Stack spacing={1.75} sx={{ width: '100%' }}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={2}\n flexWrap=\"wrap\"\n >\n <Typography sx={titleSx}>{title}</Typography>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.5}\n sx={{ flexShrink: 0 }}\n >\n {resolvedInfo ? (\n <>\n <ChartWidgetHeaderSeparator />\n <ChartWidgetInfoButton\n popover={resolvedInfo}\n ariaLabel=\"Billing counter analytics information\"\n />\n </>\n ) : null}\n </Stack>\n </Stack>\n\n <ChartWidgetSegmentedTabs\n tabs={tabs}\n activeTabId={activeTabId}\n onTabChange={onTabChange}\n ariaLabel=\"Billing counter metric\"\n trackBackgroundColor={\n st?.trackBackgroundColor ?? BILLING_COUNTER_TABS_TRACK_BG\n }\n activeTabBackground={\n st?.activeTabBackground ?? BILLING_COUNTER_LINE_PRIMARY\n }\n activeTabColor={st?.activeTabColor ?? '#ffffff'}\n inactiveTabColor={st?.inactiveTabColor ?? '#525252'}\n activeTabBoxShadow={st?.activeTabBoxShadow ?? 'none'}\n fullWidth={st?.fullWidth ?? true}\n tabFontSize={st?.tabFontSize ?? 14}\n rootSx={st?.rootSx}\n tabLayout={st?.tabLayout ?? 'equalWidth'}\n activeTabFontWeight={st?.activeTabFontWeight ?? 700}\n inactiveTabFontWeight={st?.inactiveTabFontWeight ?? 600}\n />\n\n <LinePlot\n data={chartData}\n yAxisDomain={yAxisDomain}\n yAxisTicks={yAxisTicks}\n />\n </Stack>\n </CardContent>\n </Card>\n </BillingCounterAnalyticsCustomizationProvider>\n );\n}\n\nexport default BillingCounterAnalytics;\n","import type { CSSProperties } from 'react';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport function mergeCss(a: CSSProperties, b?: CSSProperties): CSSProperties {\n if (!b) {\n return { ...a };\n }\n return { ...a, ...b };\n}\n\nexport function mergeSx(\n ...parts: Array<SxProps<Theme> | undefined>\n): SxProps<Theme> | undefined {\n const flat = parts.filter(Boolean) as SxProps<Theme>[];\n if (flat.length === 0) {\n return undefined;\n }\n if (flat.length === 1) {\n return flat[0];\n }\n return flat.flat() as SxProps<Theme>;\n}\n","import * as React from 'react';\nimport type { BillingCounterAnalyticsCustomization } from './billingCounterAnalytics.customization.types';\n\nconst BillingCounterAnalyticsCustomizationContext =\n React.createContext<BillingCounterAnalyticsCustomization>({});\n\nexport type BillingCounterAnalyticsCustomizationProviderProps = {\n value: BillingCounterAnalyticsCustomization;\n children: React.ReactNode;\n};\n\nexport function BillingCounterAnalyticsCustomizationProvider({\n value,\n children,\n}: BillingCounterAnalyticsCustomizationProviderProps): React.ReactElement {\n const memo = React.useMemo(() => value, [value]);\n return (\n <BillingCounterAnalyticsCustomizationContext.Provider value={memo}>\n {children}\n </BillingCounterAnalyticsCustomizationContext.Provider>\n );\n}\n\nexport function useBillingCounterAnalyticsCustomization(): BillingCounterAnalyticsCustomization {\n return React.useContext(BillingCounterAnalyticsCustomizationContext);\n}\n","import * as React from 'react';\nimport type { TooltipContentProps } from 'recharts';\nimport { mergeCss } from './billingCounterAnalyticsCustomization.merge';\nimport { useBillingCounterAnalyticsCustomization } from './BillingCounterAnalyticsCustomizationContext';\n\nfunction formatTooltipValue(n: number): string {\n return new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }).format(\n Math.round(n)\n );\n}\n\nexport function BillingCounterAnalyticsTooltip(\n props: TooltipContentProps\n): React.ReactElement | null {\n const { active, payload, label } = props;\n const { lineChart: lc } = useBillingCounterAnalyticsCustomization();\n const tt = lc?.tooltip;\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const raw = payload[0]?.value;\n const num =\n typeof raw === 'number' ? raw : typeof raw === 'string' ? Number(raw) : NaN;\n if (!Number.isFinite(num)) {\n return null;\n }\n\n const labelText = label !== undefined && label !== null ? String(label) : '—';\n\n const borderColor = tt?.borderColor ?? '#E5E7EB';\n const radius = tt?.borderRadiusPx ?? 6;\n const shadow = tt?.boxShadow ?? '0 4px 14px rgba(15, 23, 42, 0.12)';\n const topBg = tt?.topBarBackground ?? '#E5E7EB';\n const topH = tt?.topBarHeightPx ?? 8;\n const bodyBg = tt?.bodyBackground ?? '#FFFFFF';\n const fs = tt?.fontSizePx ?? 13;\n const gap = tt?.lineGapPx ?? 6;\n const dateP = tt?.dateLabelPrefix ?? 'Date: ';\n const totalP = tt?.totalLabelPrefix ?? 'Total: ';\n const prefixFw = tt?.prefixFontWeight ?? 400;\n const valueFw = tt?.valueFontWeight ?? 700;\n\n const uniformText =\n tt?.textColor != null &&\n tt?.prefixColor === undefined &&\n tt?.valueColor === undefined;\n const prefixCol = uniformText ? tt.textColor : (tt?.prefixColor ?? '#6B7280');\n const valueCol = uniformText ? tt.textColor : (tt?.valueColor ?? '#111827');\n\n const rowStyle: React.CSSProperties = {\n fontSize: fs,\n lineHeight: 1.35,\n margin: 0,\n };\n\n const bodyStyle = mergeCss(\n {\n boxSizing: 'border-box',\n backgroundColor: bodyBg,\n padding: '10px 12px',\n },\n tt?.bodyStyle\n );\n\n return (\n <div\n style={{\n pointerEvents: 'none',\n minWidth: 160,\n maxWidth: 280,\n }}\n >\n <div\n style={{\n border: `1px solid ${borderColor}`,\n borderRadius: radius,\n overflow: 'hidden',\n backgroundColor: bodyBg,\n boxShadow: shadow,\n }}\n >\n <div\n style={{\n height: topH,\n backgroundColor: topBg,\n flexShrink: 0,\n }}\n aria-hidden\n />\n <div style={bodyStyle}>\n <div style={rowStyle}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {dateP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {labelText}\n </span>\n </div>\n <div style={{ ...rowStyle, marginTop: gap }}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {totalP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {formatTooltipValue(num)}\n </span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import type { ChartWidgetInfoPopoverContent } from '../../ChartWidgetInfoButton/ChartWidgetInfoButton.types';\n\nexport const DEFAULT_PEAK_BILLING_HOURS_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n {\n title: 'Peak Billing Hours',\n description:\n 'Hourly billing-counter volume for the selected window. Switch tabs to compare visits, average queue time, or alerts.',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'See which hours drive the most counter traffic.',\n 'Align staffing with peaks and quiet periods.',\n 'Compare metrics across the segmented views.',\n ],\n };\n","import type { ChartWidgetSegmentedTab } from '../../tabs/ChartWidgetSegmentedTabs';\nimport type { PeakBillingHoursPoint } from './PeakBillingHours.types';\n\nexport const peakBillingHoursDefaultTabs: ChartWidgetSegmentedTab[] = [\n { id: 'visits', label: 'Billing Counter Visits' },\n { id: 'queue', label: 'Avg. Queue Time' },\n { id: 'alerts', label: 'Alerts Generated' },\n];\n\n/** Matches the **Billing Counter Visits** demo (last 7 days style). */\nexport const peakBillingHoursVisitsMock: PeakBillingHoursPoint[] = [\n { label: '12pm', value: 42 },\n { label: '10am', value: 32 },\n { label: '1pm', value: 29 },\n { label: '11am', value: 25 },\n { label: '8am', value: 23 },\n { label: '7am', value: 19 },\n { label: '9am', value: 12 },\n { label: '2pm', value: 0 },\n { label: '3pm', value: 0 },\n { label: '4pm', value: 0 },\n { label: '5pm', value: 0 },\n { label: '6pm', value: 0 },\n { label: '7pm', value: 0 },\n { label: '8pm', value: 0 },\n];\n\nfunction scaledRow(\n row: PeakBillingHoursPoint,\n factor: number,\n bias: number\n): PeakBillingHoursPoint {\n const v = Math.max(0, Math.round(row.value * factor + bias));\n return { label: row.label, value: v };\n}\n\nexport const peakBillingHoursMockSeriesByTabId: Record<\n string,\n PeakBillingHoursPoint[]\n> = {\n visits: peakBillingHoursVisitsMock,\n queue: peakBillingHoursVisitsMock.map(r =>\n scaledRow(r, 0.35, r.value > 0 ? 2 : 0)\n ),\n alerts: peakBillingHoursVisitsMock.map(r =>\n scaledRow(r, 0.12, r.value > 0 ? 1 : 0)\n ),\n};\n","import Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport * as React from 'react';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n LabelList,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport {\n BILLING_COUNTER_LINE_PRIMARY,\n BILLING_COUNTER_TABS_TRACK_BG,\n} from '../../BillingCounterAnalytics/billingCounterAnalytics.chartTokens';\nimport { mergeSx } from '../../BillingCounterAnalytics/billingCounterAnalyticsCustomization.merge';\nimport { ChartWidgetHeaderSeparator } from '../../utils/ChartWidgetHeaderSeparator';\nimport { ChartWidgetInfoButton } from '../../ChartWidgetInfoButton';\nimport { ChartWidgetSegmentedTabs } from '../../tabs/ChartWidgetSegmentedTabs';\nimport { DEFAULT_PEAK_BILLING_HOURS_INFO_POPOVER } from './peakBillingHours.defaultInfoPopover';\nimport {\n PeakBillingHoursCustomizationProvider,\n usePeakBillingHoursCustomization,\n} from './PeakBillingHoursCustomizationContext';\nimport type { PeakBillingHoursProps } from './PeakBillingHours.types';\nimport { PeakBillingHoursTooltip } from './PeakBillingHoursTooltip';\n\ninterface BarValueLabelProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n value?: number | string | null;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction PeakBarTopLabel(\n props: BarValueLabelProps & {\n fill: string;\n fontSize: number;\n fontWeight: number;\n }\n): React.ReactElement | null {\n const { x, y, width, value, fill, fontSize, fontWeight } = props;\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n if (nx === undefined || ny === undefined || nw === undefined) {\n return null;\n }\n const n =\n value === null || value === undefined\n ? NaN\n : typeof value === 'number'\n ? value\n : Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n return null;\n }\n const cx = nx + nw / 2;\n const cy = ny - 6;\n return (\n <text\n x={cx}\n y={cy}\n fill={fill}\n fontSize={fontSize}\n fontWeight={fontWeight}\n textAnchor=\"middle\"\n >\n {String(Math.round(n))}\n </text>\n );\n}\n\nfunction BarPlot({\n data,\n yAxisDomain,\n yAxisTicks,\n}: {\n data: { label: string; value: number }[];\n yAxisDomain: [number, number];\n yAxisTicks: number[];\n}): React.ReactElement {\n const { barChart: bc } = usePeakBillingHoursCustomization();\n const height = bc?.heightPx ?? 320;\n const barColor = bc?.barColor ?? BILLING_COUNTER_LINE_PRIMARY;\n const barRadius = bc?.barRadius ?? 0;\n const gridStroke = bc?.gridStroke ?? '#E5E7EB';\n const dash = bc?.gridStrokeDasharray ?? '3 3';\n const m = {\n top: bc?.margin?.top ?? 28,\n right: bc?.margin?.right ?? 12,\n bottom: bc?.margin?.bottom ?? 8,\n left: bc?.margin?.left ?? 4,\n };\n const xFill = bc?.xAxisTickFill ?? '#64748B';\n const yFill = bc?.yAxisTickFill ?? '#64748B';\n const yWidth = bc?.yAxisWidth ?? 32;\n const labelFill = bc?.barValueLabelFill ?? '#374151';\n const labelFs = bc?.barValueLabelFontSizePx ?? 12;\n const hoverBandFill = bc?.hoverBandFill ?? 'rgba(226, 232, 240, 0.75)';\n const categoryGap = bc?.barCategoryGap ?? '18%';\n const barGap = bc?.barGap ?? 4;\n\n const radiusTuple: [number, number, number, number] = [\n barRadius,\n barRadius,\n barRadius,\n barRadius,\n ];\n\n return (\n <Box sx={{ width: '100%', height, mt: 0.5 }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart\n data={data}\n margin={m}\n barCategoryGap={categoryGap}\n barGap={barGap}\n >\n <CartesianGrid\n strokeDasharray={dash}\n vertical={false}\n stroke={gridStroke}\n />\n <XAxis\n dataKey=\"label\"\n tick={{ fill: xFill, fontSize: 11 }}\n tickLine={false}\n axisLine={{ stroke: '#E5E7EB' }}\n interval={0}\n height={36}\n />\n <YAxis\n domain={yAxisDomain}\n ticks={yAxisTicks}\n tick={{ fill: yFill, fontSize: 11 }}\n tickLine={false}\n axisLine={false}\n width={yWidth}\n />\n <Tooltip\n content={(p: TooltipContentProps) => (\n <PeakBillingHoursTooltip {...p} />\n )}\n cursor={{\n fill: hoverBandFill,\n stroke: 'transparent',\n strokeWidth: 0,\n }}\n allowEscapeViewBox={{ x: false, y: true }}\n />\n <Bar\n dataKey=\"value\"\n name=\"Visits\"\n fill={barColor}\n radius={radiusTuple}\n isAnimationActive={false}\n maxBarSize={48}\n >\n <LabelList\n dataKey=\"value\"\n content={(props: unknown) => (\n <PeakBarTopLabel\n {...(props as BarValueLabelProps)}\n fill={labelFill}\n fontSize={labelFs}\n fontWeight={500}\n />\n )}\n />\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n </Box>\n );\n}\n\n/**\n * Peak billing hours card: title + subtitle, info control, violet segmented tabs (intrinsic),\n * vertical bar chart with square tops, value labels, and panel tooltip.\n */\nexport function PeakBillingHours({\n title = 'Peak Billing Hours',\n subtitle = '(Last 7 days)',\n tabs,\n activeTabId,\n onTabChange,\n data,\n seriesByTabId,\n yAxisDomain = [0, 50],\n yAxisTicks = [0, 10, 20, 30, 40, 50],\n infoPopover,\n customization,\n}: PeakBillingHoursProps): React.ReactElement {\n const chartData = React.useMemo(() => {\n if (seriesByTabId) {\n return seriesByTabId[activeTabId] ?? [];\n }\n return data ?? [];\n }, [seriesByTabId, data, activeTabId]);\n\n const resolvedInfo =\n infoPopover === undefined\n ? DEFAULT_PEAK_BILLING_HOURS_INFO_POPOVER\n : infoPopover;\n\n const rootSx = mergeSx(\n {\n bgcolor: '#FFFFFF',\n borderRadius: 2,\n boxShadow: '0 1px 3px rgba(15, 23, 42, 0.08)',\n },\n customization?.rootCard?.sx\n );\n\n const st = customization?.segmentedTabs;\n const titleSx = mergeSx(\n {\n fontWeight: 700,\n fontSize: { xs: '1rem', sm: '1.05rem' },\n color: '#0f172a',\n display: 'inline',\n },\n customization?.header?.titleSx\n );\n const subtitleSx = mergeSx(\n {\n display: 'inline',\n ml: 0.75,\n color: '#6B7280',\n fontSize: '0.9375rem',\n fontWeight: 400,\n },\n customization?.header?.subtitleSx\n );\n\n return (\n <PeakBillingHoursCustomizationProvider value={customization ?? {}}>\n <Card elevation={customization?.rootCard?.elevation ?? 0} sx={rootSx}>\n <CardContent>\n <Stack spacing={1.75} sx={{ width: '100%' }}>\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n gap={2}\n flexWrap=\"wrap\"\n >\n <Box component=\"div\" sx={{ minWidth: 0 }}>\n <Typography component=\"span\" sx={titleSx}>\n {title}\n </Typography>\n <Typography component=\"span\" sx={subtitleSx}>\n {subtitle}\n </Typography>\n </Box>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.5}\n sx={{ flexShrink: 0 }}\n >\n {resolvedInfo ? (\n <>\n <ChartWidgetHeaderSeparator />\n <ChartWidgetInfoButton\n popover={resolvedInfo}\n ariaLabel=\"Peak billing hours information\"\n />\n </>\n ) : null}\n </Stack>\n </Stack>\n\n <ChartWidgetSegmentedTabs\n tabs={tabs}\n activeTabId={activeTabId}\n onTabChange={onTabChange}\n ariaLabel=\"Peak billing metric\"\n trackBackgroundColor={\n st?.trackBackgroundColor ?? BILLING_COUNTER_TABS_TRACK_BG\n }\n activeTabBackground={\n st?.activeTabBackground ?? BILLING_COUNTER_LINE_PRIMARY\n }\n activeTabColor={st?.activeTabColor ?? '#ffffff'}\n inactiveTabColor={st?.inactiveTabColor ?? '#525252'}\n activeTabBoxShadow={st?.activeTabBoxShadow ?? 'none'}\n fullWidth={st?.fullWidth ?? true}\n tabFontSize={st?.tabFontSize ?? 14}\n rootSx={st?.rootSx}\n tabLayout={st?.tabLayout ?? 'equalWidth'}\n activeTabFontWeight={st?.activeTabFontWeight ?? 700}\n inactiveTabFontWeight={st?.inactiveTabFontWeight ?? 600}\n />\n\n <BarPlot\n data={chartData}\n yAxisDomain={yAxisDomain}\n yAxisTicks={yAxisTicks}\n />\n </Stack>\n </CardContent>\n </Card>\n </PeakBillingHoursCustomizationProvider>\n );\n}\n\nexport default PeakBillingHours;\n","import * as React from 'react';\nimport type { PeakBillingHoursCustomization } from './peakBillingHours.customization.types';\n\nconst PeakBillingHoursCustomizationContext =\n React.createContext<PeakBillingHoursCustomization>({});\n\nexport type PeakBillingHoursCustomizationProviderProps = {\n value: PeakBillingHoursCustomization;\n children: React.ReactNode;\n};\n\nexport function PeakBillingHoursCustomizationProvider({\n value,\n children,\n}: PeakBillingHoursCustomizationProviderProps): React.ReactElement {\n const memo = React.useMemo(() => value, [value]);\n return (\n <PeakBillingHoursCustomizationContext.Provider value={memo}>\n {children}\n </PeakBillingHoursCustomizationContext.Provider>\n );\n}\n\nexport function usePeakBillingHoursCustomization(): PeakBillingHoursCustomization {\n return React.useContext(PeakBillingHoursCustomizationContext);\n}\n","import * as React from 'react';\nimport type { TooltipContentProps } from 'recharts';\nimport { mergeCss } from '../../BillingCounterAnalytics/billingCounterAnalyticsCustomization.merge';\nimport { usePeakBillingHoursCustomization } from './PeakBillingHoursCustomizationContext';\n\nfunction formatTooltipValue(n: number): string {\n return new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }).format(\n Math.round(n)\n );\n}\n\nexport function PeakBillingHoursTooltip(\n props: TooltipContentProps\n): React.ReactElement | null {\n const { active, payload, label } = props;\n const { barChart: bc } = usePeakBillingHoursCustomization();\n const tt = bc?.tooltip;\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const raw = payload[0]?.value;\n const num =\n typeof raw === 'number' ? raw : typeof raw === 'string' ? Number(raw) : NaN;\n if (!Number.isFinite(num)) {\n return null;\n }\n\n const labelText = label !== undefined && label !== null ? String(label) : '—';\n\n const borderColor = tt?.borderColor ?? '#E5E7EB';\n const radius = tt?.borderRadiusPx ?? 0;\n const shadow = tt?.boxShadow ?? '0 4px 14px rgba(15, 23, 42, 0.12)';\n const topBg = tt?.topBarBackground ?? '#E5E7EB';\n const topH = tt?.topBarHeightPx ?? 8;\n const bodyBg = tt?.bodyBackground ?? '#FFFFFF';\n const fs = tt?.fontSizePx ?? 13;\n const gap = tt?.lineGapPx ?? 6;\n const dateP = tt?.dateLabelPrefix ?? 'Date: ';\n const totalP = tt?.totalLabelPrefix ?? 'Total: ';\n const prefixFw = tt?.prefixFontWeight ?? 400;\n const valueFw = tt?.valueFontWeight ?? 700;\n\n const uniformText =\n tt?.textColor != null &&\n tt?.prefixColor === undefined &&\n tt?.valueColor === undefined;\n const prefixCol = uniformText ? tt.textColor : (tt?.prefixColor ?? '#6B7280');\n const valueCol = uniformText ? tt.textColor : (tt?.valueColor ?? '#111827');\n\n const rowStyle: React.CSSProperties = {\n fontSize: fs,\n lineHeight: 1.35,\n margin: 0,\n };\n\n const bodyStyle = mergeCss(\n {\n boxSizing: 'border-box',\n backgroundColor: bodyBg,\n padding: '10px 12px',\n },\n tt?.bodyStyle\n );\n\n return (\n <div\n style={{\n pointerEvents: 'none',\n minWidth: 160,\n maxWidth: 280,\n }}\n >\n <div\n style={{\n border: `1px solid ${borderColor}`,\n borderRadius: radius,\n overflow: 'hidden',\n backgroundColor: bodyBg,\n boxShadow: shadow,\n }}\n >\n <div\n style={{\n height: topH,\n backgroundColor: topBg,\n flexShrink: 0,\n }}\n aria-hidden\n />\n <div style={bodyStyle}>\n <div style={rowStyle}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {dateP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {labelText}\n </span>\n </div>\n <div style={{ ...rowStyle, marginTop: gap }}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {totalP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {formatTooltipValue(num)}\n </span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import CssBaseline from '@mui/material/CssBaseline';\nimport {\n ThemeProvider,\n createTheme,\n responsiveFontSizes,\n} from '@mui/material/styles';\nimport React from 'react';\nimport type {\n FalconThemeMode,\n FalconThemeProviderProps,\n} from './FalconThemeProvider.types';\n\n// ─── Brand palette ────────────────────────────────────────────────────────────\n\nconst lightColor = '51, 48, 60';\nconst darkColor = '228, 230, 244';\nconst darkPaperBg = '#2F3349';\n\nfunction buildPalette(mode: FalconThemeMode) {\n const mainColor = mode === 'light' ? lightColor : darkColor;\n\n return {\n mode,\n primary: {\n light: 'rgba(103, 80, 164, 0.02)',\n main: '#d8c5f9',\n dark: '#8710D8',\n contrastText: '#FFF',\n },\n secondary: {\n light: '#EFEFEF',\n main: '#1D192B',\n dark: '#949699',\n contrastText: '#FFF',\n },\n error: {\n light: '#ED6F70',\n main: '#EA5455',\n dark: '#CE4A4B',\n contrastText: '#FFF',\n },\n warning: {\n light: '#FFAB5A',\n main: '#FF9F43',\n dark: '#E08C3B',\n contrastText: '#FFF',\n },\n info: {\n light: '#1FD5EB',\n main: '#00CFE8',\n dark: '#00B6CC',\n contrastText: '#FFF',\n },\n success: {\n light: '#42CE80',\n main: '#28C76F',\n dark: '#23AF62',\n contrastText: '#FFF',\n },\n text: {\n primary: `rgba(${mainColor}, 0.87)`,\n secondary: `rgba(${mainColor}, 0.6)`,\n disabled: `rgba(${mainColor}, 0.38)`,\n },\n divider: `rgba(${mainColor}, 0.12)`,\n background: {\n paper: mode === 'light' ? '#F2EBFF' : darkPaperBg,\n default: mode === 'light' ? '#F8F7FA' : '#25293C',\n },\n action: {\n active: `rgba(${mainColor}, 0.54)`,\n hover: `rgba(${mainColor}, 0.04)`,\n selected: `rgba(${mainColor}, 0.08)`,\n disabled: `rgba(${mainColor}, 0.26)`,\n disabledBackground: `rgba(${mainColor}, 0.12)`,\n focus: `rgba(${mainColor}, 0.12)`,\n },\n };\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport const FalconThemeProvider = ({\n children,\n mode: modeProp,\n settings,\n}: FalconThemeProviderProps) => {\n const mode: FalconThemeMode = settings?.mode ?? modeProp ?? 'light';\n const direction = settings?.direction ?? 'ltr';\n\n const theme = responsiveFontSizes(\n createTheme({\n direction,\n palette: buildPalette(mode),\n shape: { borderRadius: 6 },\n typography: { fontFamily: '\"Inter\", \"Public Sans\", sans-serif' },\n mixins: { toolbar: { minHeight: 64 } },\n })\n );\n\n return (\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,sBAAkD;AA2BtC;AAvBL,IAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAChB,MAA4B;AAC1B,QAAM,eAAe,CAAC,UAAyC;AAC7D,aAAS,MAAM,OAAO,KAAK;AAAA,EAC7B;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,WAAS;AAAA,MACT,IAAI,EAAE,OAAO,SAAS,UAAU,OAAO;AAAA,MACvC;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,MAAK;AAAA,MACL,YAAY;AAAA,QACV,cACE,4CAAC,kCAAe,UAAS,OACvB;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,IAAI;AAAA,cACF,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,UAAU;AAAA,cACV,OAAO;AAAA,cACP,KAAK;AAAA,cACL,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,cAAc;AAAA,YAChB;AAAA,YACA,SAAS;AAAA,YACT,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,YAEpC;AAAA;AAAA,QACH,GACF;AAAA,MAEJ;AAAA;AAAA,EACF;AAEJ;;;ACjDA,4BAAmC;AACnC,IAAAA,mBASO;;;ACVP,mBAAqB;AACrB,IAAAC,mBAAkC;AAClC,0BAGO;AACP,iBAAgB;AAChB,wBAAuB;AACvB,sBAAqB;AACrB,+BAA8B;AAC9B,oBAAmB;AACnB,uBAAsB;AACtB,oBAAuB;AACvB,YAAuB;AAyFjB,IAAAC,sBAAA;AA+DU,IAAAC,gBAAA;AAlJT,IAAM,oBAAoB,CAAC;AAAA;AAAA,EAEhC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA,YAAY;AAAA,EACZ;AAAA,EACA,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB;AAAA;AAAA,EAEA,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,WAAW;AAAA,EACX,eAAe;AAAA,EACf,cAAc;AAAA,EACd,kBAAkB;AAAA;AAAA,EAElB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,uBAAuB;AAAA;AAAA,EAEvB,cAAc;AAAA,EACd,kBAAkB;AAAA;AAAA,EAElB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AACf,MAA8B;AAC5B,QAAM,CAAC,SAAS,UAAU,IAAU;AAAA,IAClC,QAAQ,CAAC;AAAA,EACX;AACA,QAAM,CAAC,UAAU,WAAW,IAAU,eAA6B,IAAI;AACvE,QAAM,CAAC,cAAc,eAAe,IAAU,eAE5C,CAAC,CAAC;AAEJ,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,KAAK,OAAO,uBAAuB;AAEzC,QAAM,cAAc,CAAC,UAAyC;AAC5D,oBAAgB,OAAO;AACvB,gBAAY,MAAM,aAAa;AAAA,EACjC;AAEA,QAAM,cAAc,MAAM;AACxB,QAAI,SAAU,UAAS,MAAM;AAC7B,gBAAY,IAAI;AAAA,EAClB;AAEA,QAAM,cAAc,MAAM;AACxB,YAAQ,OAAO;AACf,gBAAY;AAAA,EACd;AAEA,QAAM,cAAc,MAAM;AACxB,eAAW,CAAC,CAAC;AACb,YAAQ,CAAC,CAAC;AACV,gBAAY;AAAA,EACd;AAEA,QAAM,eAAe,CAAC,WAAoC;AACxD,eAAW,UAAQ;AACjB,YAAM,SAAS,KAAK,KAAK,OAAK,EAAE,OAAO,OAAO,EAAE;AAChD,aAAO,SAAS,KAAK,OAAO,OAAK,EAAE,OAAO,OAAO,EAAE,IAAI,CAAC,GAAG,MAAM,MAAM;AAAA,IACzE,CAAC;AAAA,EACH;AAEA,QAAM,eACJ,QAAQ,WAAW,IACf,aAAa,KAAK,KAClB,QAAQ,WAAW,IACjB,QAAQ,CAAC,EAAE,OACX,GAAG,QAAQ,CAAC,EAAE,IAAI,KAAK,QAAQ,CAAC,EAAE,IAAI,GAAG,QAAQ,SAAS,IAAI,WAAM,EAAE;AAE9E,SACE,8CAAO,gBAAN,EACC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,YAAW;AAAA,QACX,gBAAe;AAAA,QACf,KAAK;AAAA,QACL,SAAS;AAAA,QACT,IAAI;AAAA,UACF,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,GAAI,eAAe,EAAE,OAAO,aAAa,IAAI,CAAC;AAAA,UAC9C,GAAG;AAAA,QACL;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,IAAI,eAAe,EAAE,OAAO,aAAa,IAAI;AAAA,cAE5C;AAAA;AAAA,UACH;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,OAAO,sBAAsB;AAAA,cACnC,OAAO;AAAA;AAAA,UACT;AAAA;AAAA;AAAA,IACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAU;AAAA,QACV,YAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QAEA,uDAAC,yBAAAC,SAAA,EAAkB,aAAa,aAC9B,wDAAC,SACC;AAAA;AAAA,YAAC,oBAAAC;AAAA,YAAA;AAAA,cACC,MAAI;AAAA,cACJ,UAAQ;AAAA,cACR,SAAS,CACP,GACA,WACG;AACH,oBAAI,WAAW,SAAU,aAAY;AAAA,cACvC;AAAA,cACA,OAAO;AAAA,cACP,UAAU,CAAC,GAAG,aAAa,gBAAgB,QAAQ;AAAA,cACnD,sBAAoB;AAAA,cACpB,OAAO,EAAE,QAAQ,gBAAgB;AAAA,cACjC,eAAc;AAAA,cACd,SAAS;AAAA,cACT,gBAAgB,YAAU,OAAO;AAAA,cACjC,sBAAsB,CAAC,QAAQ,QAAQ,OAAO,OAAO,IAAI;AAAA,cACzD,cAAc,CAAC,OAAO,WACpB;AAAA,gBAAC;AAAA;AAAA,kBACE,GAAG;AAAA,kBACJ,KAAK,OAAO;AAAA,kBACZ,OAAO;AAAA,oBACL,QAAQ;AAAA,oBACR,QAAQ,aAAa,iBAAiB;AAAA,oBACtC,QAAQ;AAAA,oBACR,YAAY;AAAA,oBACZ,cAAc;AAAA,oBACd,gBAAgB;AAAA,oBAChB,YAAY;AAAA,kBACd;AAAA;AAAA,gBAEA;AAAA,kBAAC,WAAAC;AAAA,kBAAA;AAAA,oBACC,IAAI;AAAA,sBACF,UAAU;AAAA,sBACV,cAAc;AAAA,sBACd,IAAI;AAAA,sBACJ,IAAI;AAAA,sBACJ,gBAAgB;AAAA,sBAChB,YAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,UAAU;AAAA,oBACZ;AAAA,oBAEC,iBAAO;AAAA;AAAA,gBACV;AAAA,gBACA;AAAA,kBAAC,WAAAA;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,IAAI;AAAA,sBACF,YAAY;AAAA,sBACZ,cAAc;AAAA,sBACd,IAAI;AAAA,sBACJ,IAAI;AAAA,sBACJ,UAAU;AAAA,sBACV,gBAAgB;AAAA,sBAChB,OAAO;AAAA,sBACP,YAAY;AAAA,oBACd;AAAA,oBAEA;AAAA,sBAAC,gBAAAC;AAAA,sBAAA;AAAA,wBACC,WAAW,EAAE,OAAO,EAAE,cAAc,OAAO,KAAK,EAAE;AAAA,wBAClD,SAAS,QAAQ,KAAK,OAAK,EAAE,OAAO,OAAO,EAAE;AAAA,wBAC7C,UAAU,MAAM,aAAa,MAAM;AAAA,wBACnC,IAAI;AAAA,0BACF,OAAO;AAAA,0BACP,iBAAiB,EAAE,OAAO,qBAAqB;AAAA,wBACjD;AAAA;AAAA,oBACF;AAAA;AAAA,gBACF;AAAA,cACF;AAAA,cAEF,aAAa,YACX;AAAA,gBAAC,WAAAD;AAAA,gBAAA;AAAA,kBACC,IAAI;AAAA,oBACF,UAAU;AAAA,oBACV,mBAAmB,EAAE,OAAO,OAAO;AAAA,kBACrC;AAAA,kBAEA;AAAA;AAAA,sBAAC,iBAAAE;AAAA,sBAAA;AAAA,wBACC,OAAO;AAAA,wBACP,SAAQ;AAAA,wBACR,IAAI;AAAA,0BACF,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,mBAAmB,EAAE,OAAO,MAAM;AAAA,wBACpC;AAAA,wBACA,KAAK,OAAO,WAAW;AAAA,wBACvB,WAAW,EAAE,WAAW,OAAO,WAAW;AAAA;AAAA,oBAC5C;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAM;AAAA,wBACN,OAAO,EAAE,UAAU,YAAY,MAAM,KAAK,KAAK,GAAG;AAAA,wBAClD,OAAM;AAAA,wBACN,QAAO;AAAA,wBACP,SAAQ;AAAA,wBACR,MAAK;AAAA,wBAEL;AAAA,0BAAC;AAAA;AAAA,4BACC,UAAS;AAAA,4BACT,UAAS;AAAA,4BACT,GAAE;AAAA,4BACF,MAAM;AAAA;AAAA,wBACR;AAAA;AAAA,oBACF;AAAA;AAAA;AAAA,cACF;AAAA;AAAA,UAEJ;AAAA,UAEA;AAAA,YAAC,WAAAF;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,GAAG;AAAA,gBACH,QAAQ;AAAA,cACV;AAAA,cAEA;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS;AAAA,oBACT,IAAI;AAAA,sBACF,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,YAAY;AAAA,sBACZ,QAAQ;AAAA,sBACR,OAAO;AAAA,oBACT;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS;AAAA,oBACT,IAAI;AAAA,sBACF,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,IAAI;AAAA,sBACJ,OAAO;AAAA,oBACT;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA;AAAA;AAAA,UACF;AAAA,WACF,GACF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAsBA,IAAM,+BAA2B,sBAAO,KAAK,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EAC7D,CAAC,MAAM,wCAAoB,KAAK,EAAE,GAAG;AAAA,IACnC,WAAW;AAAA,IACX,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA,CAAC,MAAM,wCAAoB,OAAO,EAAE,GAAG;AAAA,IACrC,iBAAiB,MAAM,QAAQ,SAAS,UAAU,SAAS;AAAA,IAC3D,SAAS;AAAA,IACT,CAAC,MAAM,wCAAoB,MAAM,EAAE,GAAG;AAAA,MACpC,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,cAAc,aAAa,MAAM,QAAQ,SAAS,UAAU,YAAY,SAAS;AAAA,MACjF,2BAA2B,EAAE,iBAAiB,cAAc;AAAA,MAC5D,CAAC,KAAK,wCAAoB,OAAO,OAAO,wCAAoB,OAAO,wBAAwB,GACzF;AAAA,QACE,iBAAiB,MAAM,QAAQ,OAAO;AAAA,MACxC;AAAA,IACJ;AAAA,EACF;AAAA,EACA,CAAC,KAAK,wCAAoB,mBAAmB,EAAE,GAAG,EAAE,UAAU,WAAW;AAC3E,EAAE;AAEF,SAAS,gBAAgB;AAAA,EACvB,eAAe;AAAA,EACf,UAAU;AAAA,EACV,MAAM;AAAA,EACN,GAAG;AACL,GAAyB;AACvB,SAAO,6CAAC,4BAA0B,GAAG,OAAO;AAC9C;AAEA,IAAM,mBAAe,sBAAO,cAAAG,SAAQ;AAAA,EAClC,mBAAmB,UAAQ,SAAS;AACtC,CAAC,EAA0C,CAAC,EAAE,OAAO,WAAW,OAAO;AAAA,EACrE,QAAQ,aAAa,MAAM,QAAQ,SAAS,UAAU,WAAW,oBAAoB,WAAW,qBAAqB;AAAA,EACrH,WAAW,cAAc,MAAM,QAAQ,SAAS,UAAU,6BAA6B,cAAc;AAAA,EACrG,cAAc;AAAA,EACd,OAAO,WAAW;AAAA,EAClB,QAAQ,MAAM,OAAO;AAAA,EACrB,UAAU;AAAA,EACV,OACE,MAAM,QAAQ,SAAS,UACnB,WAAW,cACX,WAAW;AAAA,EACjB,iBACE,MAAM,QAAQ,SAAS,UACnB,WAAW,WACX,WAAW;AACnB,EAAE;AAEF,IAAM,mBAAe,sBAAO,kBAAAC,OAAU,EAAE,OAAO;AAAA,EAC7C,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,UAAU,EAAE,OAAO,OAAO;AAAA,EAC1B,SAAS,EAAE,OAAO,IAAI,QAAQ,GAAG;AACnC,EAAE;;;AD9TE,IAAAC,sBAAA;AAzCJ,IAAM,yBAAyB;AAAA,EAC9B,EAAE,IAAI,GAAG,OAAO,aAAa;AAAA,EAC7B,EAAE,IAAI,GAAG,OAAO,aAAa;AAC9B;AAEA,IAAM,6BAA6B;AAAA,EAClC,EAAE,IAAI,GAAG,OAAO,SAAS;AAAA,EACzB,EAAE,IAAI,GAAG,OAAO,aAAa;AAC9B;AAEO,IAAM,wBAAwB,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA,kBAAkB,uBAAuB,IAAI,CAAC,YAAY;AAAA,IACzD,IAAI,OAAO;AAAA,IACX,MAAM,OAAO;AAAA,EACd,EAAE;AAAA,EACF,sBAAsB,2BAA2B,IAAI,CAAC,YAAY;AAAA,IACjE,IAAI,OAAO;AAAA,IACX,MAAM,OAAO;AAAA,EACd,EAAE;AAAA,EACF,oBAAoB,CAAC;AAAA,EACrB,wBAAwB,CAAC;AAAA,EACzB,oBAAoB,MAAM;AAAA,EAAE;AAAA,EAC5B,wBAAwB,MAAM;AAAA,EAAE;AAAA,EAChC;AAAA,EACA;AACD,MAAkC;AACjC,QAAM,cAAc,MAAM;AACzB,cAAU;AACV,YAAQ;AAAA,EACT;AAEA,QAAM,eAAe,MAAM;AAC1B,eAAW;AACX,YAAQ;AAAA,EACT;AAEA,SACC,8CAAC,2BAAO,MAAY,SAAkB,UAAS,MAAK,WAAS,MAC5D;AAAA,iDAAC,gCACA,wDAAC,wBAAI,SAAQ,QAAO,YAAW,UAAS,gBAAe,iBACtD;AAAA,mDAAC,+BAAW,SAAQ,MAAK,8BAAgB;AAAA,MACzC,6CAAC,+BAAW,SAAS,SAAS,MAAK,SAAQ,cAAW,SACrD,uDAAC,sBAAAC,OAAA,EAAU,GACZ;AAAA,OACD,GACD;AAAA,IACA,6CAAC,kCACA,wDAAC,wBAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,GAAG,IAAI,EAAE,GAClE;AAAA;AAAA,QAAC;AAAA;AAAA,UACA,OAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA;AAAA,MACV;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACA,OAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA;AAAA,MACV;AAAA,OACD,GACD;AAAA,IACA,8CAAC,kCACA;AAAA,mDAAC,2BAAO,SAAS,cAAc,oBAAM;AAAA,MACrC,6CAAC,2BAAO,SAAQ,aAAY,SAAS,aAAa,mBAElD;AAAA,OACD;AAAA,KACD;AAEF;;;AEtFA,IAAAC,mBAAwC;AAiBpC,IAAAC,sBAAA;AAdG,IAAM,iBAAiB,CAAC;AAAA,EAC7B,OAAO;AAAA,EACP,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,GAAG;AACL,MACE;AAAA,EAAC;AAAA;AAAA,IACC,WAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,IAAI,EAAE,UAAU,SAAS,UAAU,SAAS,iBAAiB,SAAS,OAAO,QAAQ;AAAA,IACpF,GAAG;AAAA,IAEJ,wDAAC,wBAAI,SAAQ,QAAO,KAAK,GAAG,gBAAe,iBAAgB,YAAW,UACpE;AAAA,mDAAC,+BAAW,SAAQ,WAAW,UAAS;AAAA,MACvC,QACC,6CAAC,wBAAI,IAAI,MAAM,IAAI,KAChB,gBACH;AAAA,OAEJ;AAAA;AACF;;;ACzBF,IAAAC,gBAAqB;AACrB,IAAAC,cAAgB;AAChB,IAAAC,4BAA8B;AAC9B,kBAAiB;AACjB,4BAA2B;AAC3B,0BAAyB;AACzB,mBAAkB;AAClB,IAAAC,iBAAmB;AACnB,mBAAkB;AAClB,wBAAuB;AACvB,IAAAC,iBAAyB;AACzB,IAAAC,SAAuB;AAiHf,IAAAC,sBAAA;AA9GR,IAAM,mBAAmB;AAEzB,IAAM,yBAAyB;AAC/B,IAAM,6BAA6B;AAEnC,IAAM,0BAA0B;AAGhC,IAAM,0CAEF;AAAA,EACF,EAAE,MAAM,UAAU,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE;AAAA,EAC9C;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU,CAAC,eAAe;AAAA,IAC1B,GAAG,EAAE,MAAM,GAAG;AACZ,YAAM,OAAO,OAAO,QAAQ,GAAG,MAAM,MAAM,UAAU,KAAK;AAAA,IAC5D;AAAA,IACA,OAAO,EAAE,MAAM,GAAG;AAChB,YAAM,EAAE,WAAW,OAAO,IAAI,MAAM;AACpC,UAAI,qBAAqB,aAAa;AACpC,eAAO,MAAM,QAAQ,GAAG,UAAU,sBAAsB,EAAE,KAAK;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,wCAEF,CAAC,EAAE,MAAM,UAAU,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;AAIpD,SAAS,iBAAiB,UAAkC;AAC1D,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,MAAI,SAAS,WAAW,EAAG,QAAO,SAAS,CAAC,EAAE;AAC9C,SAAO,GAAG,SAAS,CAAC,EAAE,IAAI,KAAK,SAAS,CAAC,EAAE,IAAI,GAAG,SAAS,SAAS,IAAI,WAAM,EAAE;AAClF;AAMO,IAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB;AAAA,EACA,qBAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,WAAW;AAAA,EACX,eAAe;AAAA,EACf,cAAc;AAAA,EACd,kBAAkB;AACpB,MAA+B;AAC7B,QAAM,YAAQ,yBAAS;AACvB,QAAM,SAAS,MAAM,QAAQ,SAAS;AACtC,QAAM,CAAC,UAAU,WAAW,IAAU,gBAA6B,IAAI;AAEvE,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,oBAAoB;AAC1B,QAAM,mBAAmB,eAAe;AAExC,QAAM,YAAY,iBAAiB,IAAI;AACvC,QAAM,mBAAmB,gBAAgB;AACzC,QAAM,sBAAsB,gBAAgB;AAE5C,QAAM,aAAa,CAAC,UAAyC;AAC3D,gBAAY,MAAM,aAAa;AAAA,EACjC;AAEA,QAAM,cAAc,MAAM;AACxB,gBAAY,IAAI;AAAA,EAClB;AAEA,QAAM,eAAe,CAAC,WAAyB;AAC7C,YAAQ,CAAC,MAAM,CAAC;AAChB,gBAAY;AAAA,EACd;AAEA,SACE,8CAAC,YAAAC,SAAA,EAAI,IAAI,EAAE,YAAY,GAAG,UAAU,WAAW,GAC7C;AAAA;AAAA,MAAC,aAAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,YAAW;AAAA,QACX,gBAAe;AAAA,QACf,SAAS;AAAA,QACT,SAAS;AAAA,QACT,IAAI;AAAA,UACF,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,GAAG;AAAA,QACL;AAAA,QAEA;AAAA,wDAAC,aAAAA,SAAA,EAAM,SAAS,OAAO,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,OAAO,GACnE;AAAA;AAAA,cAAC,kBAAAC;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,IAAI,EAAE,YAAY,KAAK,UAAU,IAAI,YAAY,IAAI;AAAA,gBAEpD;AAAA;AAAA,YACH;AAAA,YACA;AAAA,cAAC,kBAAAA;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,IAAI,EAAE,YAAY,KAAK,UAAU,IAAI,YAAY,IAAI;AAAA,gBAEpD;AAAA;AAAA,YACH;AAAA,aACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,OAAO,sBAAsB;AAAA,cACnC,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,OAAO,EAAE,YAAY,EAAE;AAAA;AAAA,UACzB;AAAA;AAAA;AAAA,IACF;AAAA,IAEA;AAAA,MAAC,eAAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,WAAU;AAAA,QACV,IAAI,EAAE,QAAQ,MAAM,OAAO,MAAM;AAAA,QACjC,WACE,oBACI,0CACA;AAAA,QAGN,uDAAC,0BAAAC,SAAA,EAAkB,aAAa,aAC9B;AAAA,UAAC,aAAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,YACX,IAAI;AAAA,cACF,OAAO,oBAAoB,SAAS;AAAA,cACpC,QAAQ,aAAa,SAAS,wBAAwB,iBAAiB;AAAA,cACvE,cAAc;AAAA,cACd,SAAS,SAAS,eAAe;AAAA,cACjC,OAAO,SAAS,kBAAkB;AAAA,cAClC,UAAU;AAAA,cACV,WACE,MAAM,QAAQ,SAAS,UACnB,uCACA;AAAA,cACN,GAAG;AAAA,YACL;AAAA,YAEA,uDAAC,YAAAC,SAAA,EAAK,gBAAc,MACjB,eAAK,IAAI,YACR;AAAA,cAAC,sBAAAC;AAAA,cAAA;AAAA,gBAEC,SAAS,MAAM,aAAa,MAAM;AAAA,gBAClC,OAAK;AAAA,gBACL,IAAI;AAAA,kBACF,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,WAAW;AAAA,kBACX,cAAc;AAAA,kBACd,kBAAkB,EAAE,cAAc,OAAO;AAAA,kBACzC,WAAW,EAAE,SAAS,mBAAmB;AAAA,gBAC3C;AAAA,gBAEA;AAAA,kBAAC,oBAAAC;AAAA,kBAAA;AAAA,oBACC,SAAS,OAAO;AAAA,oBAChB,WAAW;AAAA,sBACT,SAAS;AAAA,wBACP,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,YAAY;AAAA,sBACd;AAAA,oBACF;AAAA;AAAA,gBACF;AAAA;AAAA,cArBK,OAAO;AAAA,YAsBd,CACD,GACH;AAAA;AAAA,QACF,GACF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AChNA,qBAAoB;AAGlB,IAAAC,sBAAA;AADK,IAAM,6BAA6B,MACxC;AAAA,EAAC,eAAAC;AAAA,EAAA;AAAA,IACC,aAAY;AAAA,IACZ,UAAQ;AAAA,IACR,IAAI;AAAA,MACF,WAAW;AAAA,MACX,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,IAAI;AAAA,IACN;AAAA;AACF;;;ACZF,IAAAC,gBAAqB;AACrB,IAAAC,cAAgB;AAChB,IAAAC,4BAA8B;AAC9B,wBAAuB;AACvB,IAAAC,iBAAiD;AACjD,IAAAC,gBAAkB;AAClB,IAAAC,qBAAuB;AACvB,IAAAC,iBAAyB;AACzB,IAAAC,SAAuB;AA2GjB,IAAAC,sBAAA;AArGN,IAAM,mBAAmB;AACzB,IAAMC,oBAAmB;AACzB,IAAM,wBAAwB;AAC9B,IAAM,oBAAoB;AAC1B,IAAM,kBAAkB;AACxB,IAAM,sBAAsB;AAC5B,IAAM,oBAAoB;AAC1B,IAAM,kBAAkB;AACxB,IAAM,sBAAsB;AAC5B,IAAM,eAAe;AACrB,IAAM,mBAAmB;AAGzB,SAAS,oBAAoB,cAO3B;AACA,QAAM,UAAU,gBAAgB;AAChC,QAAM,YAAY,UAAU,IAAI;AAChC,QAAM,YAAY,YAAY;AAC9B,QAAM,OAAO,UAAU,IAAI;AAC3B,QAAM,SAAS;AACf,QAAM,WAAW,YAAY,IAAI;AACjC,QAAM,SAAS,KAAK,IAAI,cAAc,QAAQ;AAE9C,QAAM,aAAa,KAAK,IAAI,IAAI,eAAe,UAAU,CAAC;AAC1D,SAAO,EAAE,YAAY,QAAQ,WAAW,WAAW,MAAM,OAAO;AAClE;AAGA,SAAS,uBAAuB,WAAyC;AACvE,SAAO,UAAU,WAAW,KAAK;AACnC;AAMA,SAAS,oBACP,WAC4B;AAC5B,MAAI,cAAc,YAAY,cAAc,OAAO;AACjD,WAAO;AAAA,EACT;AACA,MAAI,UAAU,SAAS,QAAQ,GAAG;AAChC,WAAO;AAAA,EACT;AACA,MAAI,UAAU,SAAS,MAAM,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,WAAW,MAAM,KAAK,UAAU,WAAW,OAAO,GAAG;AACjE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,EAAE,YAAY,QAAQ,WAAW,WAAW,MAAM,OAAO,IAAI;AACnE,QAAM,aAAa,oBAAoB,SAAS;AAEhD,QAAM,kBACJ,eAAe,WACX;AAAA,IACE,kBAAkB;AAAA,IAClB,mBAAmB,GAAG,CAAC,SAAS,CAAC;AAAA,IACjC,OAAO;AAAA,EACT,IACA,eAAe,UACb,EAAE,kBAAkB,YAAY,OAAO,OAAO,IAC9C,EAAE,gBAAgB,YAAY,OAAO,OAAO;AAEpD,SACE;AAAA,IAAC,YAAAC;AAAA,IAAA;AAAA,MACC,eAAW;AAAA,MACX,IAAI;AAAA,QACF,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB;AAAA,MAEA;AAAA,QAAC,YAAAA;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,YACF,UAAU;AAAA,YACV,GAAG;AAAA,YACH,GAAI,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE;AAAA,YAC1C,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,GAAI,aACA;AAAA,cACE,aAAa;AAAA,gBACX,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,KAAK;AAAA,gBACL,WAAW;AAAA,gBACX,YAAY,GAAG,SAAS;AAAA,gBACxB,aAAa,GAAG,SAAS;AAAA,gBACzB,WAAW,GAAG,IAAI,YAAY,MAAM;AAAA,cACtC;AAAA,cACA,YAAY;AAAA,gBACV,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,KAAK;AAAA,gBACL,WAAW;AAAA,gBACX,YAAY,GAAG,SAAS;AAAA,gBACxB,aAAa,GAAG,SAAS;AAAA,gBACzB,WAAW,GAAG,IAAI,YAAY,OAAO;AAAA,cACvC;AAAA,YACF,IACA;AAAA,cACE,aAAa;AAAA,gBACX,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,YAAY,GAAG,SAAS;AAAA,gBACxB,aAAa,GAAG,SAAS;AAAA,gBACzB,cAAc,GAAG,IAAI,YAAY,MAAM;AAAA,cACzC;AAAA,cACA,YAAY;AAAA,gBACV,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,YAAY,GAAG,SAAS;AAAA,gBACxB,aAAa,GAAG,SAAS;AAAA,gBACzB,cAAc,GAAG,IAAI,YAAY,OAAO;AAAA,cAC1C;AAAA,YACF;AAAA,UACN;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUG;AACD,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,SAAS,SAAS,mBAAmB;AAC3C,QAAM,UAAU,SAAS,YAAY;AACrC,QAAM,cAAc,SAAS,YAAY;AACzC,QAAM,gBAAgB,SAAS,YAAY;AAE3C,QAAM,cAAc,SAChB,6BACA;AAEJ,QAAM,UAAU,oBAAoB,YAAY;AAChD,QAAM,YAAY,uBAAuB,SAAS;AAElD,QAAM,UAAU,UAAU,KAAK;AAC/B,QAAM,SAAS,UAAU,KAAK;AAC9B,QAAM,SAAS,UAAU,KAAK;AAC9B,QAAM,eAAe,UAAU,IAAI;AACnC,QAAM,eAAe,UAAU,MAAM;AAErC,QAAM,QACJ;AAAA,IAAC,YAAAA;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,GAAI,YAAY,EAAE,IAAI,OAAO,IAAI,EAAE,IAAI,OAAO;AAAA,QAC9C,QAAQ,aAAa,MAAM;AAAA,QAC3B,cAAc,UAAU,MAAM;AAAA,QAC9B,SAAS;AAAA,QACT,GAAG;AAAA,QACH,WAAW;AAAA,MACb;AAAA,MAEA,wDAAC,cAAAC,SAAA,EAAM,SAAS,cAAc,IAAI,EAAE,UAAU,YAAY,QAAQ,EAAE,GAClE;AAAA;AAAA,UAAC,mBAAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,IAAI;AAAA,cACF,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,OAAO;AAAA,YACT;AAAA,YAEC,kBAAQ;AAAA;AAAA,QACX;AAAA,QACA;AAAA,UAAC,mBAAAA;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,OAAO;AAAA,YACT;AAAA,YAEC,kBAAQ;AAAA;AAAA,QACX;AAAA,QACA;AAAA,UAAC,mBAAAA;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,IAAI,UAAU,IAAI;AAAA,YACpB;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QACA;AAAA,UAAC,YAAAF;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,IAAI;AAAA,cACF,GAAG;AAAA,cACH,IAAI,UAAU,IAAI;AAAA,cAClB,OAAO;AAAA,cACP,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,eAAe;AAAA,cACf,mBAAmB;AAAA,cACnB,QAAQ;AAAA,gBACN,SAAS;AAAA,gBACT,IAAI,UAAU,MAAM;AAAA,gBACpB,kBAAkB,EAAE,IAAI,EAAE;AAAA,cAC5B;AAAA,YACF;AAAA,YAEC,kBAAQ,YAAY,IAAI,UACvB;AAAA,cAAC,mBAAAE;AAAA,cAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,IAAI;AAAA,kBACF,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,SAAS;AAAA,gBACX;AAAA,gBAEC;AAAA;AAAA,cARI;AAAA,YASP,CACD;AAAA;AAAA,QACH;AAAA,SACF;AAAA;AAAA,EACF;AAGF,QAAM,QACJ;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ;AAAA;AAAA,EACF;AAGF,SACE,6CAAC,YAAAF,SAAA,EAAI,IAAI,EAAE,UAAU,YAAY,MAAM,GACpC,sBACC,8EACG;AAAA;AAAA,IACA;AAAA,KACH,IAEA,8EACG;AAAA;AAAA,IACA;AAAA,KACH,GAEJ;AAEJ;AAEA,IAAM,oBAAoB;AAEnB,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,YAAY;AAAA,EACZ,WAAWD;AAAA,EACX,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ;AAAA,EACA,cAAc;AAAA,EACd,UAAU;AACZ,MAAkC;AAChC,QAAM,YAAY,YAAY;AAC9B,QAAM,aACJ,mBAAmB,YAAY,oBAAoB;AACrD,QAAM,WACJ,iBAAiB,YAAY,kBAAkB;AACjD,QAAM,eACJ,qBAAqB,YAAY,sBAAsB;AACzD,QAAM,YAAQ,yBAAS;AACvB,QAAM,SAAS,MAAM,QAAQ,SAAS;AACtC,QAAM,CAAC,UAAU,WAAW,IAAU,gBAA6B,IAAI;AACvE,QAAM,gBAAsB;AAAA,IAC1B;AAAA,EACF;AACA,QAAM,OAAO,QAAQ,QAAQ,KAAK,QAAQ,OAAO;AAEjD,QAAM,kBAAwB,mBAAY,MAAM;AAC9C,QAAI,cAAc,YAAY,MAAM;AAClC,mBAAa,cAAc,OAAO;AAClC,oBAAc,UAAU;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAM,iBAAU,MAAM,MAAM,gBAAgB,GAAG,CAAC,eAAe,CAAC;AAEhE,QAAM,gBAAsB,mBAAY,MAAM;AAC5C,oBAAgB;AAChB,kBAAc,UAAU,WAAW,MAAM;AACvC,kBAAY,IAAI;AAChB,oBAAc,UAAU;AAAA,IAC1B,GAAG,iBAAiB;AAAA,EACtB,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,yBAAyB,CAC7B,UACG;AACH,QAAI,CAAC,QAAS;AACd,oBAAgB;AAChB,gBAAY,MAAM,aAAa;AAAA,EACjC;AAEA,QAAM,yBAAyB,MAAM;AACnC,QAAI,CAAC,QAAS;AACd,kBAAc;AAAA,EAChB;AAEA,QAAM,yBAAyB,MAAM;AACnC,oBAAgB;AAAA,EAClB;AAEA,QAAM,yBAAyB,MAAM;AACnC,kBAAc;AAAA,EAChB;AAEA,QAAM,eAAe,CAAC,UAA+C;AACnE,cAAU;AACV,QAAI,CAAC,QAAS;AACd,oBAAgB;AAChB,gBAAY,UAAS,OAAO,OAAO,MAAM,aAAc;AAAA,EACzD;AAEA,QAAM,cAAc,MAAM;AACxB,oBAAgB;AAChB,gBAAY,IAAI;AAAA,EAClB;AAEA,SACE,8CAAC,YAAAC,SAAA,EAAI,IAAI,EAAE,YAAY,GAAG,UAAU,YAAY,SAAS,cAAc,GACrE;AAAA;AAAA,MAAC,kBAAAG;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAS;AAAA,QACT,cAAc;AAAA,QACd,cAAc;AAAA,QACd,cAAY;AAAA,QACZ,iBAAe;AAAA,QACf,iBAAe,UAAU,WAAW;AAAA,QACpC,IAAI;AAAA,UACF,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,WAAW,EAAE,SAAS,cAAc;AAAA,UACpC,GAAG;AAAA,QACL;AAAA,QAEA;AAAA,UAAC,YAAAH;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,IAAI;AAAA,cACF,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,eAAe;AAAA,YACjB;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,OAAO;AAAA;AAAA,YACT;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEC,UACC;AAAA,MAAC,eAAAI;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,WAAU;AAAA,QACV,IAAI,EAAE,QAAQ,MAAM,OAAO,MAAM;AAAA,QACjC,WAAW;AAAA,UACT;AAAA,YACE,MAAM;AAAA,YACN,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;AAAA,UAC5B;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,oBAAoB;AAAA,gBAClB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,SAAS;AAAA,cACT,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,QAEC,WAAC,EAAE,UAAU,MACZ,6CAAC,0BAAAC,SAAA,EAAkB,aAAa,aAC9B;AAAA,UAAC,YAAAL;AAAA,UAAA;AAAA,YACC,cAAc;AAAA,YACd,cAAc;AAAA,YAEd;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,OAAO;AAAA,gBACP;AAAA,gBACA,cAAc;AAAA,gBACd,WAAW,aAAa;AAAA,gBACxB,SAAS;AAAA;AAAA,YACX;AAAA;AAAA,QACF,GACF;AAAA;AAAA,IAEJ,IACE;AAAA,KACN;AAEJ;;;AC5eA,IAAAM,gBAAqB;AACrB,IAAAC,cAAgB;AAChB,IAAAC,qBAAuB;AACvB,IAAAC,gBAAkB;AAClB,qBAAoB;AACpB,IAAAC,qBAAuB;AAEvB,IAAAC,SAAuB;AA4DjB,IAAAC,sBAAA;AArDN,IAAM,kBAAkB;AACxB,IAAM,oBAAoB;AAE1B,SAAS,4BACP,SACA,MACQ;AACR,SAAO,GAAG,QAAQ,KAAK,MAAM,QAAQ,KAAK;AAC5C;AAGA,IAAM,yBAAyC;AAAA,EAC7C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AACZ;AAEA,IAAM,8BAA8C;AAAA,EAClD,UAAU;AAAA,EACV,SAAS;AAAA,EACT,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AACZ;AAEA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQuB;AACrB,QAAM,aAAa,qBAAqB,SAAS,GAAG;AACpD,QAAM,iBAAiB,GAAG,QAAQ,KAAK,MAAM,QAAQ,KAAK;AAC1D,QAAM,gBAAgB,eAAe;AAErC,QAAM,SAAS,mBACV,CAAC,6BAA6B,gBAAgB,IAC/C;AAEJ,SACE,8CAAC,YAAAC,SAAA,EAAI,IAAI,QACP;AAAA,iDAAC,YAAAA,SAAA,EAAI,IAAI,EAAE,QAAQ,GAAG,SAAS,YAAY,OAAO,OAAO,GAAG;AAAA,IAC5D;AAAA,MAAC,YAAAA;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,UACF,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,IAAI;AAAA,QACN;AAAA,QAEA;AAAA;AAAA,YAAC,YAAAA;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAW;AAAA,cACX,IAAI;AAAA,gBACF,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,SAAS,QAAQ;AAAA,gBACjB,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA,UACC,gBACC,8EACE;AAAA;AAAA,cAAC,mBAAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,IAAI;AAAA,kBACF,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,OAAO;AAAA,gBACT;AAAA,gBAEC,kBAAQ;AAAA;AAAA,YACX;AAAA,YACA;AAAA,cAAC,mBAAAA;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,IAAI;AAAA,kBACF,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,OAAO;AAAA,gBACT;AAAA,gBAEC;AAAA;AAAA,YACH;AAAA,YACA;AAAA,cAAC,mBAAAA;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,IAAI;AAAA,kBACF,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,OAAO;AAAA,gBACT;AAAA,gBAEC,kBAAQ;AAAA;AAAA,YACX;AAAA,aACF,IAEA;AAAA,YAAC,mBAAAA;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,IAAI;AAAA,gBACF,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,OAAO;AAAA,cACT;AAAA,cAEC;AAAA;AAAA,UACH;AAAA;AAAA;AAAA,IAEJ;AAAA,KACF;AAEJ;AAEA,SAAS,oBACP,cACA,WAIuE;AACvE,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,QAAW;AAC9B,WAAO,EAAE,IAAI,QAAQ,IAAI,IAAI;AAAA,EAC/B;AACA,MAAI,OAAO,iBAAiB,UAAU;AACpC,WAAO,GAAG,YAAY;AAAA,EACxB;AACA,MAAI,OAAO,iBAAiB,UAAU;AACpC,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,IACE,aAAa,OAAO,SAChB,OAAO,aAAa,OAAO,WACzB,GAAG,aAAa,EAAE,OAClB,aAAa,KACf;AAAA,IACN,IACE,aAAa,OAAO,SAChB,OAAO,aAAa,OAAO,WACzB,GAAG,aAAa,EAAE,OAClB,aAAa,KACf;AAAA,IACN,GAAI,aAAa,OAAO,SACpB;AAAA,MACE,IACE,OAAO,aAAa,OAAO,WACvB,GAAG,aAAa,EAAE,OAClB,aAAa;AAAA,IACrB,IACA,CAAC;AAAA,EACP;AACF;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAYuB;AACrB,QAAM,WAAW,IAAI;AACrB,QAAM,SAAS,UAAU,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC,KAAK;AACjE,QAAM,WAAW,QAAQ,UAAU,MAAM,KAAK,SAAS;AAEvD,QAAM,kBAAkB,4BACpB,CAAC,UACC,MAAM,YAAY,OAAO,SAAS;AAAA,IAChC,UAAU,MAAM,YAAY,SAAS;AAAA,EACvC,CAAC,IACH;AAGJ,QAAM,eAAe,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,CAAC,CAAC,CAAC;AAE9D,SACE;AAAA,IAAC,YAAAD;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,MACT;AAAA,MAEC,sBAAY,WACX;AAAA,QAAC,YAAAA;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,YACF,QAAQ;AAAA,YACR,OAAO,GAAG,GAAG;AAAA,YACb,SAAS;AAAA,YACT,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,cAAc;AAAA,YACd,UAAU;AAAA,YACV,YAAY;AAAA,UACd;AAAA,UAEC,mBAAS,IAAI,CAAC,KAAK,MAClB;AAAA,YAAC,eAAAE;AAAA,YAAA;AAAA,cAEC,OACE;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS;AAAA,kBACT;AAAA,kBACA;AAAA,kBACA;AAAA;AAAA,cACF;AAAA,cAEF,iBAAiB;AAAA,cACjB,WAAW;AAAA,gBACT,SAAS;AAAA,kBACP,IAAI;AAAA,gBACN;AAAA,cACF;AAAA,cAEA;AAAA,gBAAC,YAAAF;AAAA,gBAAA;AAAA,kBACC,IAAI;AAAA,oBACF,UAAU,IAAI;AAAA,oBACd,YAAY;AAAA,oBACZ,WAAW;AAAA,oBACX,UAAU;AAAA,oBACV,QAAQ;AAAA,oBACR,WAAW;AAAA,oBACX,WAAW;AAAA,oBACX,WAAW;AAAA,oBACX,YAAY;AAAA,oBACZ,SAAS,IAAI;AAAA,oBACb,QAAQ;AAAA,oBACR,GAAI,MAAM,IACN;AAAA,sBACE,qBAAqB;AAAA,sBACrB,wBAAwB;AAAA,oBAC1B,IACA,CAAC;AAAA,oBACL,GAAI,MAAM,SAAS,SAAS,IACxB;AAAA,sBACE,sBAAsB;AAAA,sBACtB,yBAAyB;AAAA,oBAC3B,IACA,CAAC;AAAA,kBACP;AAAA;AAAA,cACF;AAAA;AAAA,YA1CK,IAAI;AAAA,UA2CX,CACD;AAAA;AAAA,MACH,IAEA;AAAA,QAAC,YAAAA;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,YACF,QAAQ;AAAA,YACR,OAAO,GAAG,GAAG;AAAA,YACb,cAAc;AAAA,YACd,SAAS;AAAA,YACT,YAAY;AAAA,UACd;AAAA;AAAA,MACF;AAAA;AAAA,EAEJ;AAEJ;AAMO,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,wBAAwB;AAAA,EACxB,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,uBAAuB;AAAA,EACvB;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,4BAA4B;AAAA,EAC5B,+BAA+B;AACjC,MAA0B;AACxB,QAAM,gBAAsB,cAAuB,IAAI;AAEvD,QAAM,iBAAuB;AAAA,IAC3B,MACE,MACG,IAAI,OAAK;AACR,YAAM,MACJ,EAAE,UAAU,IAAI,OAAK,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,GAAG,KAAK;AAC1D,aAAO,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,IAAI,GAAG;AAAA,IAClC,CAAC,EACA,KAAK,IAAI;AAAA,IACd,CAAC,KAAK;AAAA,EACR;AAEA,EAAM,uBAAgB,MAAM;AAC1B,QAAI,CAAC,8BAA8B;AACjC;AAAA,IACF;AACA,UAAM,KAAK,cAAc;AACzB,QAAI,CAAC,IAAI;AACP;AAAA,IACF;AACA,OAAG,YAAY;AAAA,EACjB,GAAG,CAAC,gBAAgB,4BAA4B,CAAC;AAEjD,QAAM,OAAa,eAAQ,MAAM;AAC/B,UAAM,OAAO,CAAC,GAAG,KAAK;AACtB,QAAI,uBAAuB;AACzB,WAAK,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,IACvC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,qBAAqB,CAAC;AAEjC,QAAM,WAAiB,eAAQ,MAAM;AACnC,QAAI,iBAAiB,UAAa,eAAe,GAAG;AAClD,aAAO;AAAA,IACT;AACA,UAAM,IAAI,KAAK,OAAO,CAAC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,KAAK,GAAG,CAAC;AAC3D,WAAO,IAAI,IAAI,IAAI;AAAA,EACrB,GAAG,CAAC,cAAc,IAAI,CAAC;AAEvB,SACE;AAAA,IAAC,YAAAA;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,QAClB,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU,oBAAoB,cAAc,SAAS;AAAA,QACrD,WAAW;AAAA,QACX,GAAI,aACA;AAAA,UACE,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,eAAe;AAAA,UACf,WAAW;AAAA,QACb,IACA,CAAC;AAAA,QACL,GAAG;AAAA,MACL;AAAA,MAEA;AAAA,QAAC,cAAAG;AAAA,QAAA;AAAA,UACC,SAAS;AAAA,UACT,IACE,aAAa,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,SAAS,IAAI;AAAA,UAG/D;AAAA;AAAA,cAAC,cAAAA;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,YAAW;AAAA,gBACX,gBAAe;AAAA,gBACf,KAAK;AAAA,gBACL,IAAI,aAAa,EAAE,YAAY,EAAE,IAAI;AAAA,gBAErC;AAAA;AAAA,oBAAC,mBAAAF;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,SAAQ;AAAA,sBACR,IAAI;AAAA,wBACF,YAAY;AAAA,wBACZ,OAAO;AAAA,wBACP,IAAI;AAAA,wBACJ,UAAU,EAAE,IAAI,IAAI,IAAI,GAAG;AAAA,sBAC7B;AAAA,sBAEC;AAAA;AAAA,kBACH;AAAA,kBACC,gBACC,6CAAC,YAAAD,SAAA,EAAI,IAAI,EAAE,YAAY,EAAE,GAAI,yBAAc,IACzC;AAAA;AAAA;AAAA,YACN;AAAA,YAEA;AAAA,cAAC,YAAAA;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,kBACF,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,SAAS;AAAA,kBACT,UAAU;AAAA,kBACV,GAAI,aACA;AAAA,oBACE,MAAM;AAAA,oBACN,WAAW;AAAA,oBACX,SAAS;AAAA,oBACT,eAAe;AAAA,kBACjB,IACA,CAAC;AAAA,gBACP;AAAA,gBAEA;AAAA;AAAA,oBAAC,cAAAG;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,YAAW;AAAA,sBACX,gBAAe;AAAA,sBACf,IAAI;AAAA,wBACF,IAAI;AAAA,wBACJ,IAAI;AAAA,wBACJ,cAAc;AAAA,wBACd,SAAS;AAAA,wBACT,YAAY;AAAA,sBACd;AAAA,sBAEA;AAAA,sEAAC,cAAAA,SAAA,EAAM,WAAU,OAAM,YAAW,UAAS,SAAS,KAClD;AAAA;AAAA,4BAAC,mBAAAF;AAAA,4BAAA;AAAA,8BACC,SAAQ;AAAA,8BACR,IAAI,EAAE,YAAY,KAAK,OAAO,gBAAgB,UAAU,GAAG;AAAA,8BAE1D;AAAA;AAAA,0BACH;AAAA,0BACC,kBACC;AAAA,4BAAC,mBAAAG;AAAA,4BAAA;AAAA,8BACC,MAAK;AAAA,8BACL,cAAW;AAAA,8BACX,SAAS;AAAA,8BACT,IAAI,EAAE,GAAG,MAAM,OAAO,iBAAiB;AAAA,8BAEvC,uDAAC,sBAAK,MAAK,sBAAqB,OAAO,IAAI,QAAQ,IAAI;AAAA;AAAA,0BACzD,IACE;AAAA,2BACN;AAAA,wBACA;AAAA,0BAAC,mBAAAH;AAAA,0BAAA;AAAA,4BACC,SAAQ;AAAA,4BACR,IAAI,EAAE,YAAY,KAAK,OAAO,kBAAkB,UAAU,GAAG;AAAA,4BAE5D;AAAA;AAAA,wBACH;AAAA;AAAA;AAAA,kBACF;AAAA,kBAEA;AAAA,oBAAC,YAAAD;AAAA,oBAAA;AAAA,sBACC,KAAK;AAAA,sBACL,IAAI;AAAA,wBACF,GAAI,aACA;AAAA,0BACE,MAAM;AAAA,0BACN,WAAW;AAAA,0BACX,WAAW;AAAA,wBACb,IACA,EAAE,WAAW,cAAc;AAAA,wBAC/B,WAAW;AAAA,wBACX,SAAS;AAAA,sBACX;AAAA,sBAEC,eAAK,WAAW,IACf,6CAAC,YAAAA,SAAA,EAAI,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,WAAW,SAAS,GAC3C,uDAAC,mBAAAC,SAAA,EAAW,SAAQ,SAAQ,OAAM,kBAC/B,0BACH,GACF,IAEA,KAAK,IAAI,CAAC,KAAK,UAAU;AACvB,8BAAM,MAAM,KAAK;AAAA,0BACf;AAAA,0BACA,KAAK,IAAI,GAAI,IAAI,QAAQ,WAAY,GAAG;AAAA,wBAC1C;AACA,+BACE;AAAA,0BAAC,YAAAD;AAAA,0BAAA;AAAA,4BAEC,IAAI;AAAA,8BACF,IAAI;AAAA,8BACJ,IAAI;AAAA,8BACJ,cACE,QAAQ,KAAK,SAAS,IAClB,+BACA;AAAA,4BACR;AAAA,4BAEA;AAAA;AAAA,gCAAC,cAAAG;AAAA,gCAAA;AAAA,kCACC,WAAU;AAAA,kCACV,YAAW;AAAA,kCACX,gBAAe;AAAA,kCACf,IAAI,EAAE,IAAI,KAAK;AAAA,kCAEf;AAAA;AAAA,sCAAC,mBAAAF;AAAA,sCAAA;AAAA,wCACC,SAAQ;AAAA,wCACR,IAAI;AAAA,0CACF,OAAO;AAAA,0CACP,YAAY;AAAA,0CACZ,UAAU;AAAA,wCACZ;AAAA,wCAEC,cAAI;AAAA;AAAA,oCACP;AAAA,oCACA;AAAA,sCAAC,mBAAAA;AAAA,sCAAA;AAAA,wCACC,SAAQ;AAAA,wCACR,IAAI;AAAA,0CACF,OAAO;AAAA,0CACP,YAAY;AAAA,0CACZ,UAAU;AAAA,0CACV,UAAU;AAAA,0CACV,WAAW;AAAA,wCACb;AAAA,wCAEC,cAAI;AAAA;AAAA,oCACP;AAAA;AAAA;AAAA,8BACF;AAAA,8BACA;AAAA,gCAAC;AAAA;AAAA,kCACC;AAAA,kCACA;AAAA,kCACA;AAAA,kCACA;AAAA,kCACA;AAAA,kCACA;AAAA,kCACA;AAAA,kCACA;AAAA;AAAA,8BACF;AAAA;AAAA;AAAA,0BAhDK,IAAI;AAAA,wBAiDX;AAAA,sBAEJ,CAAC;AAAA;AAAA,kBAEL;AAAA;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AC1jBA,IAAAI,cAAgB;AAChB,IAAAC,SAAuB;AA4FnB,IAAAC,sBAAA;AAlFJ,IAAM,mBAAkC;AAAA,EACtC,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AACV;AAcO,IAAM,2BAA2B,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,cAAc;AAAA,EACd;AAAA,EACA,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,2BAA2B;AAC7B,MAAqC;AACnC,QAAM,WAAiB,cAAuB,IAAI;AAClD,QAAM,UAAgB,cAAkC,CAAC,CAAC;AAC1D,QAAM,CAAC,WAAW,YAAY,IACtB,gBAAwB,gBAAgB;AAEhD,QAAM,cAAoB,eAAQ,MAAM;AACtC,UAAM,IAAI,KAAK,UAAU,OAAK,EAAE,OAAO,WAAW;AAClD,WAAO,KAAK,IAAI,IAAI;AAAA,EACtB,GAAG,CAAC,MAAM,WAAW,CAAC;AAEtB,QAAM,kBAAwB,mBAAY,MAAM;AAC9C,UAAM,QAAQ,SAAS;AACvB,UAAM,QAAQ,QAAQ,QAAQ,WAAW;AACzC,QAAI,CAAC,SAAS,CAAC,OAAO;AACpB;AAAA,IACF;AACA,UAAM,YAAY,MAAM,sBAAsB;AAC9C,UAAM,UAAU,MAAM,sBAAsB;AAC5C,iBAAa;AAAA,MACX,MAAM,QAAQ,OAAO,UAAU;AAAA,MAC/B,KAAK,QAAQ,MAAM,UAAU;AAAA,MAC7B,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH,GAAG,CAAC,WAAW,CAAC;AAEhB,EAAM,uBAAgB,MAAM;AAC1B,oBAAgB;AAAA,EAClB,GAAG,CAAC,iBAAiB,MAAM,aAAa,WAAW,SAAS,CAAC;AAE7D,EAAM,uBAAgB,MAAM;AAC1B,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,UAAM,KAAK,IAAI,eAAe,MAAM;AAClC,sBAAgB;AAAA,IAClB,CAAC;AACD,OAAG,QAAQ,KAAK;AAChB,WAAO,MAAM;AACX,SAAG,WAAW;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAEpB,SACE;AAAA,IAAC,YAAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,IAAI;AAAA,QACF,UAAU;AAAA,QACV,SAAS;AAAA,QACT,GAAG;AAAA,QACH,cAAc;AAAA,QACd,SAAS;AAAA,QACT,KAAK;AAAA,QACL,UAAU,cAAc,eAAe,WAAW;AAAA,QAClD,WAAW;AAAA,QACX,GAAI,YACA,EAAE,WAAW,WAAW,OAAO,OAAO,IACtC;AAAA,UACE,WAAW;AAAA,UACX,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AAAA,QACJ,GAAG;AAAA,MACL;AAAA,MACA,MAAK;AAAA,MACL,cAAY;AAAA,MAEX;AAAA,kBAAU,QAAQ,IACjB;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,eAAW;AAAA,YACX,IAAI;AAAA,cACF,UAAU;AAAA,cACV,MAAM,UAAU;AAAA,cAChB,KAAK,UAAU;AAAA,cACf,OAAO,UAAU;AAAA,cACjB,QAAQ,UAAU;AAAA,cAClB,cAAc;AAAA,cACd,SAAS;AAAA,cACT,WAAW;AAAA,cACX,YAAY,QAAQ,wBAAwB,wCAAwC,wBAAwB,0CAA0C,wBAAwB,2CAA2C,wBAAwB;AAAA,cACjP,eAAe;AAAA,cACf,QAAQ;AAAA,YACV;AAAA;AAAA,QACF,IACE;AAAA,QACH,KAAK,IAAI,CAAC,KAAK,UAAU;AACxB,gBAAM,WAAW,IAAI,OAAO;AAC5B,iBACE;AAAA,YAAC,YAAAA;AAAA,YAAA;AAAA,cAEC,KAAK,CAAC,OAA8B;AAClC,wBAAQ,QAAQ,KAAK,IAAI;AAAA,cAC3B;AAAA,cACA,MAAK;AAAA,cACL,iBAAe;AAAA,cACf,UAAU,WAAW,IAAI;AAAA,cACzB,SAAS,MAAM,YAAY,IAAI,EAAE;AAAA,cACjC,WAAW,OAAK;AACd,oBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,oBAAE,eAAe;AACjB,8BAAY,IAAI,EAAE;AAAA,gBACpB;AAAA,cACF;AAAA,cACA,IAAI;AAAA,gBACF,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,IAAI;AAAA,gBACJ,IAAI;AAAA,gBACJ,cAAc;AAAA,gBACd,QAAQ;AAAA,gBACR,YAAY;AAAA,gBACZ,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,WAAW;AAAA,gBACX,SAAS;AAAA,gBACT,YAAY,WACR,sBACA;AAAA,gBACJ,UAAU;AAAA,gBACV,OAAO,WAAW,iBAAiB;AAAA,gBACnC,YAAY,WACV,MAAM,YAAY,OAAO,CAAC,OAAO,GAAG;AAAA,kBAClC,UAAU,MAAM,YAAY,SAAS;AAAA,gBACvC,CAAC;AAAA,gBACH,GAAI,cAAc,eACd;AAAA,kBACE,MAAM;AAAA,kBACN,UAAU;AAAA,gBACZ,IACA,CAAC;AAAA,cACP;AAAA,cAEC,wBAAc,eACb;AAAA,gBAAC,YAAAA;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,IAAI;AAAA,oBACF,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,cAAc;AAAA,oBACd,YAAY;AAAA,oBACZ,OAAO;AAAA,kBACT;AAAA,kBAEC,cAAI;AAAA;AAAA,cACP,IAEA,IAAI;AAAA;AAAA,YA1DD,IAAI;AAAA,UA4DX;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,EACH;AAEJ;;;AC3MA,IAAAC,cAAgB;AAChB,IAAAC,gBAAkB;AAClB,0BAAyB;AACzB,+BAA8B;AAE9B,IAAAC,SAAuB;;;ACLvB,IAAAC,SAAuB;AAiBnB,IAAAC,uBAAA;AAdJ,IAAM,yCACE,qBAA+C,CAAC,CAAC;AAOlD,SAAS,wCAAwC;AAAA,EACtD;AAAA,EACA;AACF,GAAqE;AACnE,QAAM,OAAa,eAAQ,MAAM,OAAO,CAAC,KAAK,CAAC;AAC/C,SACE,8CAAC,uCAAuC,UAAvC,EAAgD,OAAO,MACrD,UACH;AAEJ;AAEO,SAAS,qCAAsE;AACpF,SAAa,kBAAW,sCAAsC;AAChE;;;ACnBO,IAAM,mCAAkD;AAAA,EAC7D,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW;AACb;AAEO,IAAM,gCAA+C;AAAA,EAC1D,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AACX;AAYO,IAAM,sCAAqD;AAAA,EAChE,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AACd;;;ACxBO,SAAS,SAAS,GAAkB,GAAkC;AAC3E,MAAI,CAAC,GAAG;AACN,WAAO,EAAE,GAAG,EAAE;AAAA,EAChB;AACA,SAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AACtB;AAEO,SAAS,WACX,OACyB;AAC5B,QAAM,OAAO,MAAM,OAAO,OAAO;AACjC,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,KAAK,CAAC;AAAA,EACf;AACA,SAAO,KAAK,KAAK;AACnB;AAEO,SAAS,2BACd,WAMA;AACA,SAAO;AAAA,IACL,cAAc;AAAA,MACZ;AAAA,MACA,WAAW;AAAA,IACb;AAAA,IACA,WAAW,SAAS,+BAA+B,WAAW,SAAS;AAAA,IACvE,YAAY;AAAA,MACV;AAAA,MACA,WAAW;AAAA,IACb;AAAA,IACA,cAAc,SAAS,EAAE,SAAS,OAAO,GAAG,WAAW,YAAY;AAAA,EACrE;AACF;AAEA,IAAM,yBAA8D;AAAA,EAClE,WAAW;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AAAA,EACA,MAAM,EAAE,SAAS,UAAU;AAAA,EAC3B,KAAK;AAAA,IACH,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,YAAY;AAAA,EACd;AAAA,EACA,OAAO,EAAE,OAAO,UAAU;AAAA,EAC1B,OAAO,EAAE,YAAY,KAAK,OAAO,UAAU;AAC7C;AAEO,SAAS,uBACd,WACqC;AACrC,SAAO;AAAA,IACL,WAAW,SAAS,uBAAuB,WAAW,WAAW,SAAS;AAAA,IAC1E,QAAQ,SAAS,uBAAuB,QAAQ,WAAW,MAAM;AAAA,IACjE,MAAM,SAAS,uBAAuB,MAAM,WAAW,IAAI;AAAA,IAC3D,KAAK,SAAS,uBAAuB,KAAK,WAAW,GAAG;AAAA,IACxD,KAAK,SAAS,uBAAuB,KAAK,WAAW,GAAG;AAAA,IACxD,OAAO,SAAS,uBAAuB,OAAO,WAAW,KAAK;AAAA,IAC9D,OAAO,SAAS,uBAAuB,OAAO,WAAW,KAAK;AAAA,EAChE;AACF;;;AH6EU,IAAAC,uBAAA;AApKV,SAAS,4BACP,WACA,WACsD;AACtD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI,QAAQ,WAAW,IAAI,WAAW,EAAE;AAAA,EAC1C;AACF;AAsBA,IAAM,UAAU,CAAC,OAAO,QAAQ,SAAS,MAAM;AAE/C,SAAS,aAAa,QAA0C;AAC9D,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAWO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8C;AAC5C,QAAM,EAAE,cAAc,GAAG,IAAI,mCAAmC;AAChE,QAAM,aAAa,IAAI,iBAAiB;AACxC,QAAM,eAAe,IAAI,kBAAkB;AAC3C,QAAM,WAAW,IAAI,cAAc;AACnC,QAAM,YAAY,IAAI,eAAe;AACrC,QAAM,UAAU,IAAI,mBAAmB;AACvC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,gBAAgB,IAAI,iBAAiB;AAC3C,QAAM,WAAW,IAAI,oBAAoB;AACzC,QAAM,cAAc,IAAI,eAAe;AACvC,QAAM,UAAU,IAAI,2BAA2B;AAE/C,QAAM,eAAe,CACnB,QACA,SACS;AACT,QAAI,SAAS,MAAM;AACjB,qBAAe,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,sBACJ,eAAe;AAEjB,QAAM,mBAAyB;AAAA,IAC7B,MACE,4BAA4B,IAAI,iBAAiB,mBAAmB,CAAC,CAAC;AAAA,IACxE,CAAC,IAAI,iBAAiB,eAAe;AAAA,EACvC;AAEA,SACE;AAAA,IAAC,YAAAC;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF;AAAA,UACE,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,QAAQ;AAAA,QACV;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,MACF;AAAA,MAEA;AAAA;AAAA,UAAC,yBAAAC;AAAA,UAAA;AAAA,YACC,WAAS;AAAA,YACT,OAAO;AAAA,YACP,UAAU;AAAA,YACV,cAAW;AAAA,YACX,IAAI;AAAA,cACF;AAAA,gBACE,SAAS;AAAA,gBACT,OAAO;AAAA,gBACP,QAAQ,aAAa,SAAS;AAAA,gBAC9B,cAAc,GAAG,YAAY;AAAA,gBAC7B,UAAU;AAAA,gBACV,SAAS;AAAA,gBACT,mCAAmC;AAAA,kBACjC,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,QAAQ;AAAA,gBACV;AAAA,gBACA,2BAA2B;AAAA,kBACzB,WAAW;AAAA,kBACX,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,UAAU;AAAA,kBACV,UAAU;AAAA,kBACV,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,MAAM;AAAA,kBACN,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,YAAY;AAAA,kBACZ,UAAU,GAAG,QAAQ;AAAA,kBACrB,YAAY;AAAA,kBACZ,eAAe;AAAA,kBACf,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,yBAAyB;AAAA,oBACvB,YAAY,aAAa,UAAU;AAAA,kBACrC;AAAA,kBACA,WAAW;AAAA,oBACT,SAAS;AAAA,kBACX;AAAA,kBACA,kBAAkB;AAAA,oBAChB,SAAS;AAAA,oBACT,OAAO;AAAA,oBACP,WAAW;AAAA,sBACT,SAAS;AAAA,oBACX;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,cACA,IAAI;AAAA,YACN;AAAA,YAEC,kBAAQ,IAAI,YACX;AAAA,cAAC,oBAAAC;AAAA,cAAA;AAAA,gBAEC,OAAO;AAAA,gBACP,eAAa;AAAA,gBACb,IAAI,QAAQ,IAAI,cAAc;AAAA,gBAE7B,uBAAa,MAAM;AAAA;AAAA,cALf;AAAA,YAMP,CACD;AAAA;AAAA,QACH;AAAA,QACC,sBACC;AAAA,UAAC,cAAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,YAAW;AAAA,YACX,SAAS;AAAA,YACT,IAAI,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,WAAW;AAAA,YAE9C;AAAA,4DAAC,8BAA2B;AAAA,cAC5B;AAAA,gBAAC;AAAA;AAAA,kBACE,GAAG;AAAA,kBACJ,SAAS;AAAA,kBACT,WAAW,iBAAiB,aAAa;AAAA;AAAA,cAC3C;AAAA;AAAA;AAAA,QACF,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;;;AI7LO,IAAM,kCAAiE;AAAA,EAC5E,OAAO;AAAA,EACP,aACE;AAAA,EACF,WAAW;AAAA,EACX,aAAa;AAAA,IACX;AAAA,IACA;AAAA,EACF;AACF;AAOO,IAAM,4CACX;AAAA,EACE,OAAO;AAAA,EACP,aACE;AAAA,EACF,WAAW;AAAA,EACX,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGK,IAAM,mCACX;AAGK,IAAM,oCACX;AAKK,IAAM,4CACX;;;AC3DF,IAAAC,mBAAsD;AAuBvC,IAAAC,uBAAA;AApBR,IAAM,eAAe,CAAC;AAAA,EAC3B,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,GAAG;AACL,MACE;AAAA,EAAC,iBAAAC;AAAA,EAAA;AAAA,IACC,UAAU,YAAY;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACC,GAAG;AAAA,IAEH,oBAAU,8CAAC,qCAAiB,MAAM,IAAI,OAAM,WAAU,IAAK;AAAA;AAC9D;;;ACxBF,IAAAC,mBAAwC;AAoBlC,IAAAC,uBAAA;AAhBC,IAAM,uBAAuB,CAAC;AAAA,EACnC,QAAQ;AAAA,EACR,UAAU,CAAC;AAAA,EACX,QAAQ,CAAC;AAAA,EACT;AACF,MACE;AAAA,EAAC;AAAA;AAAA,IACC,UAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,UAAU,CAAC,GAAG,aAAa,WAAW,QAAQ;AAAA,IAC9C,gBAAgB,CAAC,QACf,OAAO,QAAQ,YAAY,QAAQ,OAAO,IAAI,QAAQ;AAAA,IAExD,sBAAsB,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE;AAAA,IAC3C,aAAa,CAAC,WACZ,8CAAC,8BAAW,GAAG,QAAQ,OAAc,aAAY,oBAAmB;AAAA;AAExE;;;ACtBF,IAAAC,mBAAiD;AAoB3C,IAAAC,uBAAA;AAjBC,IAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA,MAAAC;AAAA,EACA;AACF,MAA6B;AAC3B,QAAM,YAAQ,2BAAS;AACvB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,QACF,QAAQ,UAAU,YAAY;AAAA,QAC9B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY,MAAM,QAAQ,WAAW,SAAS;AAAA,MAChD;AAAA,MACA;AAAA,MACA,MAAM,UAAU,WAAW;AAAA,MAE3B,yDAAC,0BAAM,WAAU,OAAM,gBAAe,UAAS,KAAK,GAAG,YAAW,UAC/D;AAAA,QAAAA;AAAA,QACD,8CAAC,+BAAW,UAAU,IAAI,OAAM,UAAS,YAAW,QACjD,gBACH;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AC5BA,IAAAC,mBAAoC;AAkDxB,IAAAC,uBAAA;AA/CZ,IAAM,cAAc;AAAA,EAClB,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AACX;AAEA,IAAM,cAAc,EAAE,SAAS,WAAW;AAE1C,IAAM,WAAW;AAAA,EACf,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AACX;AAEO,IAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB,CAAC,IAAI,IAAI,EAAE;AAC9B,MAA6B;AAC3B,QAAM,YAAY,KAAK,KAAK,aAAa,OAAO,KAAK;AAErD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,YAAW;AAAA,MACX,WAAU;AAAA,MACV,OAAM;AAAA,MACN,SAAQ;AAAA,MAER;AAAA,sDAAC,wBACC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,WAAW,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,YAClD,cAAW;AAAA,YAEV,yBAAe,IAAI,CAAC,MACnB,8CAAC,YAAe,OAAO,aAAa,OAAO,GACxC,eADU,CAEb,CACD;AAAA;AAAA,QACH,GACF;AAAA,QACA,8CAAC,4BAAQ,aAAY,YAAW,UAAQ,MAAC;AAAA,QAEzC,8CAAC,wBAAI,IAAI,EAAE,MAAM,EAAE,GACjB,yDAAC,wBAAI,IAAI,EAAE,OAAO,WAAW,YAAY,SAAS,GAC/C;AAAA,qBAAW,SAAS,KAAK;AAAA,UAAE;AAAA,UAAI,KAAK,IAAI,UAAU,QAAQ,UAAU;AAAA,UAAG;AAAA,UAAI;AAAA,UACxE;AAAA,UAAW;AAAA,WACjB,GACF;AAAA,QACA,8CAAC,4BAAQ,aAAY,YAAW,UAAQ,MAAC;AAAA,QAEzC,+CAAC,0BAAM,YAAW,UAAS,WAAU,OAAM,KAAK,GAC9C;AAAA,wDAAC,wBACC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,UAAU,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,cACjD,cAAW;AAAA,cAEV,gBAAM,KAAK,EAAE,QAAQ,UAAU,GAAG,CAAC,GAAG,MACrC,8CAAC,YAAe,OAAO,aAAa,OAAO,IAAI,GAC5C,cAAI,KADM,CAEb,CACD;AAAA;AAAA,UACH,GACF;AAAA,UACA,+CAAC,wBAAI,IAAI,EAAE,OAAO,WAAW,YAAY,SAAS,GAAG;AAAA;AAAA,YAC/C;AAAA,YAAU;AAAA,aAChB;AAAA,WACF;AAAA,QAEA,8CAAC,4BAAQ,aAAY,YAAW,UAAQ,MAAC;AAAA,QAEzC,+CAAC,0BAAM,WAAU,OAAM,KAAK,GAC1B;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU,WAAW;AAAA,cACrB,SAAS,MAAM,UAAU,SAAS,CAAC;AAAA,cACnC,OAAO;AAAA,cACP,cAAW;AAAA,cAEX;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAM;AAAA,kBACN,OAAM;AAAA,kBACN,QAAO;AAAA,kBACP,SAAQ;AAAA,kBACR,MAAK;AAAA,kBAEL,wDAAC,UAAK,GAAE,uBAAsB,MAAK,WAAU;AAAA;AAAA,cAC/C;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU,WAAW;AAAA,cACrB,SAAS,MAAM,UAAU,SAAS,CAAC;AAAA,cACnC,OAAO;AAAA,cACP,cAAW;AAAA,cAEX;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAM;AAAA,kBACN,OAAM;AAAA,kBACN,QAAO;AAAA,kBACP,SAAQ;AAAA,kBACR,MAAK;AAAA,kBAEL,wDAAC,UAAK,GAAE,qBAAoB,MAAK,WAAU;AAAA;AAAA,cAC7C;AAAA;AAAA,UACF;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC9HA,IAAAC,mBAMO;AA2BD,IAAAC,uBAAA;AAxBN,SAAS,iBACP,SACoC;AACpC,SAAO,QAAQ;AAAA,IAAI,CAAC,QAClB,OAAO,QAAQ,WAAW,EAAE,OAAO,IAAI,YAAY,GAAG,OAAO,IAAI,IAAI;AAAA,EACvE;AACF;AAEO,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AACd,MAAyB;AACvB,QAAM,QAAQ,iBAAiB,OAAO;AACtC,QAAM,eAAe,CAAC,UAAqC;AACzD,UAAM,IAAI,MAAM,OAAO;AACvB,aAAS,MAAM,KAAK,IAAI,EAAE;AAAA,EAC5B;AAEA,SACE,+CAAC,gCAAY,SAAQ,UAAS,WAAS,MAAC,OAAM,WAC5C;AAAA,mDAAC,+BAAW,IAAI,iBAAiB,KAAK,UAAU;AAAA;AAAA,MACtC;AAAA,MAAM;AAAA,OAChB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO,OAAO,YAAY,KAAK;AAAA,QAC/B,OAAO,UAAU,KAAK;AAAA,QACtB,UAAU;AAAA,QACV,SAAS,iBAAiB,KAAK;AAAA,QAC/B,IAAI,iBAAiB,KAAK;AAAA,QAEzB;AAAA,uBACC,8CAAC,6BAAS,OAAM,IACd,wDAAC,QAAG,uBAAS,GACf;AAAA,UAED,MAAM,IAAI,CAAC,MAAM,MAChB,8CAAC,6BAAiB,OAAO,KAAK,OAC3B,eAAK,SADO,CAEf,CACD;AAAA;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;;;ACzDA,IAAAC,gBAAkB;AAClB,oBAAmB;AACnB,IAAAC,iBAAuB;AA+CjB,IAAAC,uBAAA;AA5CN,IAAM,gBAAY,uBAAO,cAAAC,OAAM,EAAE,OAAO;AAAA,EACtC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,YAAY;AAAA,IACV,sBAAsB,EAAE,OAAO,GAAG;AAAA,IAClC,uCAAuC,EAAE,WAAW,kBAAkB;AAAA,EACxE;AAAA,EACA,2BAA2B;AAAA,IACzB,SAAS;AAAA,IACT,iBAAiB;AAAA,MACf,WAAW;AAAA,MACX,OAAO;AAAA,MACP,wBAAwB,EAAE,SAAS,EAAE;AAAA,IACvC;AAAA,EACF;AAAA,EACA,sBAAsB;AAAA,IACpB,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAAA,EACA,sBAAsB;AAAA,IACpB,cAAc;AAAA,IACd,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,WAAW;AAAA,EACb;AACF,EAAE;AAEK,IAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AACF,MAA+B;AAC7B,QAAM,eAAe,CAAC,OAA4C,YAAqB;AACrF,gBAAY,OAAO;AACnB,eAAW,OAAO,OAAO;AAAA,EAC3B;AAEA,SACE,8CAAC,cAAAC,SAAA,EAAM,WAAU,OAAM,QAAQ,GAAG,SAAS,GAAG,YAAW,UACvD;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,UAAU;AAAA,MACV;AAAA,MACA,MAAK;AAAA,MACL,YAAY,EAAE,cAAc,SAAS;AAAA;AAAA,EACvC,GACF;AAEJ;;;AC1DA,IAAAC,oBAAoB;AACpB,yBAAyB;AACzB,IAAAC,gBAAyB;AAsBnB,IAAAC,uBAAA;AAnBC,IAAM,cAAc,CAAoC;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB,CAAC,GAAG,IAAI,IAAI,EAAE;AAClC,MAA2B;AACzB,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAAS;AAAA,IACrD,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,QACF,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,YAAU;AAAA,UACV,IAAI;AAAA,YACF,WAAW;AAAA,YACX,gCAAgC;AAAA,cAC9B,cAAc;AAAA,cACd,cAAc;AAAA,YAChB;AAAA,YACA,oCAAoC;AAAA,cAClC,OAAO;AAAA,YACT;AAAA,UACF;AAAA,UACA,MAAM,QAAQ,CAAC;AAAA,UACf;AAAA,UACA;AAAA,UACA,4BAA0B;AAAA,UAC1B;AAAA,UACA;AAAA,UACA,yBAAyB;AAAA;AAAA,MAC3B;AAAA;AAAA,EACF;AAEJ;;;AC9CA,IAAAC,oBAAgC;AAU5B,IAAAC,uBAAA;AANG,IAAM,2BAA2B,CAAC;AAAA,EACvC,UAAU,CAAC;AAAA,EACX,WAAW,CAAC;AAAA,EACZ;AACF,MACE,+CAAC,yBAAI,IAAI,EAAE,GAAG,GAAG,UAAU,IAAI,GAC7B;AAAA,gDAAC,gCAAW,SAAQ,aAAY,cAAY,MAAC,4BAE7C;AAAA,EACC,QAAQ,WAAW,IAClB,8CAAC,gCAAW,SAAQ,SAAQ,OAAM,kBAAiB,uDAEnD,IAEA,+CAAC,gCAAW,SAAQ,SACjB;AAAA,aAAS;AAAA,IAAO;AAAA,IAAK,QAAQ;AAAA,IAAO;AAAA,KACvC;AAAA,EAED,qBACC,8CAAC,gCAAW,SAAQ,WAAU,SAAQ,SAAQ,IAAI,EAAE,IAAI,EAAE,GAAG,sDAE7D;AAAA,GAEJ;;;AC3BF,IAAAC,oBAAgC;AAChC,IAAAC,gBAAyB;AA0BrB,IAAAC,uBAAA;AAvBG,IAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA,QAAQ;AAAA,EACR,MAAM;AAAA,EACN;AACF,MAA+B;AAC7B,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,KAAK;AACtD,QAAM,OAAO,kBAAkB;AAC/B,QAAM,UAAU,gBAAgB;AAEhC,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAmC,IAAI;AAEvE,QAAM,cAAc,CAAC,UAA+C;AAClE,gBAAY,MAAM,aAAa;AAC/B,YAAQ,IAAI;AAAA,EACd;AAEA,QAAM,cAAc,MAAM;AACxB,gBAAY,IAAI;AAChB,YAAQ,KAAK;AAAA,EACf;AAEA,SACE,gFACE;AAAA,kDAAC,4BAAO,SAAS,aAAa,SAAQ,YAAW,MAAK,UACnD,iBACH;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,cAAc,EAAE,UAAU,UAAU,YAAY,OAAO;AAAA,QAEvD,wDAAC,SAAI,OAAO,EAAE,SAAS,IAAI,UAAU,IAAI,GAAI,UAAS;AAAA;AAAA,IACxD;AAAA,KACF;AAEJ;;;ACzCA,IAAAC,cAAgB;AAChB,IAAAC,kBAAoB;AACpB,IAAAC,gBAAkB;AAClB,IAAAC,qBAAuB;AAEvB,IAAAC,SAAuB;AAEvB,sBASO;;;ACNA,SAAS,yBACd,cAIuE;AACvE,MAAI,iBAAiB,QAAW;AAC9B,WAAO,EAAE,IAAI,QAAQ,IAAI,IAAI;AAAA,EAC/B;AACA,MAAI,OAAO,iBAAiB,UAAU;AACpC,WAAO,GAAG,YAAY;AAAA,EACxB;AACA,MAAI,OAAO,iBAAiB,UAAU;AACpC,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,IACE,aAAa,OAAO,SAChB,OAAO,aAAa,OAAO,WACzB,GAAG,aAAa,EAAE,OAClB,aAAa,KACf;AAAA,IACN,IACE,aAAa,OAAO,SAChB,OAAO,aAAa,OAAO,WACzB,GAAG,aAAa,EAAE,OAClB,aAAa,KACf;AAAA,IACN,GAAI,aAAa,OAAO,SACpB;AAAA,MACE,IACE,OAAO,aAAa,OAAO,WACvB,GAAG,aAAa,EAAE,OAClB,aAAa;AAAA,IACrB,IACA,CAAC;AAAA,EACP;AACF;;;ADqEQ,IAAAC,uBAAA;AA3FR,SAASC,UACP,MACA,UACqB;AACrB,SAAO,WAAW,EAAE,GAAG,MAAM,GAAG,SAAS,IAAI;AAC/C;AAGA,SAAS,QACP,SACG,OACa;AAChB,QAAM,OAAO,MACV,OAAO,CAAC,MAA2B,MAAM,MAAS,EAClD,QAAQ,OAAM,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,CAAE;AAC5C,SAAO,CAAC,MAAM,GAAG,IAAI;AACvB;AAEA,SAAS,SACP,KACA,QACQ;AACR,SAAO,OAAO,OAAO,CAAC,KAAK,MAAM;AAC/B,UAAM,IAAI,IAAI,EAAE,OAAO;AACvB,WAAO,OAAO,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC,KAAK;AAAA,EACzD,GAAG,CAAC;AACN;AAEA,SAAS,eAAe,OAAuB;AAC7C,MAAI,QAAQ,KAAM;AAChB,WAAO,IAAI,QAAQ,KAAM,QAAQ,CAAC,CAAC;AAAA,EACrC;AACA,SAAO,OAAO,KAAK;AACrB;AAUA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuD;AACrD,MAAI,CAAC,UAAU,CAAC,SAAS,UAAU,CAAC,gBAAgB,UAAU,QAAW;AACvE,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,QAAQ,OAAO,CAAC,KAAa,UAA+B;AACxE,UAAM,IAAI,MAAM;AAChB,UAAM,IAAI,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC;AAC9C,WAAO,OAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,EACzC,GAAG,CAAC;AAEJ,QAAM,KAAK;AACX,QAAM,cAAmC;AAAA,IACvC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,cAAc;AAAA,EAChB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAOA;AAAA,QACL;AAAA,UACE,iBAAiB;AAAA,UACjB,cAAc;AAAA,UACd,SAAS;AAAA,UACT,UAAU;AAAA,UACV,UAAU;AAAA,UACV,WAAW;AAAA,QACb;AAAA,QACA,IAAI;AAAA,MACN;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAOA;AAAA,cACL,EAAE,GAAG,aAAa,cAAc,MAAM;AAAA,cACtC,IAAI;AAAA,YACN;AAAA,YAEA;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAOA;AAAA,oBACL;AAAA,sBACE,OAAO;AAAA,sBACP,UAAU;AAAA,sBACV,YAAY;AAAA,oBACd;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,kBAEC;AAAA;AAAA,oBAAc;AAAA,oBAAE;AAAA;AAAA;AAAA,cACnB;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAOA;AAAA,oBACL,EAAE,OAAO,WAAW,UAAU,QAAQ,YAAY,IAAI;AAAA,oBACtD,IAAI;AAAA,kBACN;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA;AAAA;AAAA,QACF;AAAA,QACA,+CAAC,SAAI,OAAOA,UAAS,aAAa,IAAI,UAAU,GAC9C;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA;AAAA,gBACL;AAAA,kBACE,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,YAAY;AAAA,gBACd;AAAA,gBACA,IAAI;AAAA,cACN;AAAA,cAEC;AAAA;AAAA,gBAAa;AAAA,gBAAE;AAAA;AAAA;AAAA,UAClB;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA;AAAA,gBACL,EAAE,OAAO,WAAW,UAAU,QAAQ,YAAY,IAAI;AAAA,gBACtD,IAAI;AAAA,cACN;AAAA,cAEC,gBAAM,eAAe;AAAA;AAAA,UACxB;AAAA,WACF;AAAA,QACC,OAAO,IAAI,CAAC,MAAiC;AAC5C,gBAAM,QAAQ,QAAQ;AAAA,YACpB,CAAC,MAA2B,OAAO,EAAE,OAAO,MAAM,EAAE;AAAA,UACtD;AACA,gBAAM,MAAM,OAAO;AACnB,gBAAM,QAAQ,OAAO,QAAQ,WAAW,MAAM,OAAO,OAAO,CAAC;AAC7D,iBACE,+CAAC,SAAI,OAAOA,UAAS,aAAa,IAAI,UAAU,GAC9C;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAOA;AAAA,kBACL;AAAA,oBACE,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,iBAAiB,EAAE;AAAA,kBACrB;AAAA,kBACA,IAAI;AAAA,gBACN;AAAA;AAAA,YACF;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAOA;AAAA,kBACL;AAAA,oBACE,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,YAAY;AAAA,kBACd;AAAA,kBACA,IAAI;AAAA,gBACN;AAAA,gBAEC;AAAA,oBAAE;AAAA,kBAAM;AAAA,kBAAE;AAAA;AAAA;AAAA,YACb;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAOA;AAAA,kBACL,EAAE,OAAO,WAAW,UAAU,QAAQ,YAAY,IAAI;AAAA,kBACtD,IAAI;AAAA,gBACN;AAAA,gBAEC,gBAAM,eAAe;AAAA;AAAA,YACxB;AAAA,eA/BsD,EAAE,OAgC1D;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,EACH;AAEJ;AAWA,SAAS,MAAM,GAAoD;AACjE,MAAI,MAAM,OAAW,QAAO;AAC5B,SAAO,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC;AAC7C;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,KAAK,MAAM,CAAC;AAClB,QAAM,KAAK,MAAM,CAAC;AAClB,QAAM,KAAK,MAAM,KAAK;AACtB,QAAM,KAAK,MAAM,MAAM;AACvB,MACE,UAAU,UACV,OAAO,UACP,OAAO,UACP,OAAO,UACP,OAAO,QACP;AACA,WAAO;AAAA,EACT;AACA,QAAM,MAAM,KAAK,KAAK;AACtB,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,SAAS,KAAK,MAAM;AAClC,QAAM,KAAK,KAAK,KAAK;AACrB,QAAM,KAAK,KAAK;AAChB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,GAAG;AAAA,MACH,GAAG;AAAA,MACH,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,YAAW;AAAA,MAEV,yBAAe,KAAK;AAAA;AAAA,EACvB;AAEJ;AAKA,IAAM,6BAA6B;AAEnC,IAAM,yBAAyB;AAE/B,IAAM,uBAAuB;AAE7B,IAAM,qBAAqB;AAAA,EACzB,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AACV;AAEA,IAAM,qBAAqB;AAAA,EACzB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,qBAAqB;AACvB;AAEO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,kBAAkB,uBAAuB;AAAA,EACzC,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB;AAAA,EACA,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,iBAAiB;AACnB,GAA6B;AAC3B,QAAM,CAAC,aAAa,cAAc,IAAU,gBAAwB,IAAI;AACxE,QAAM,CAAC,YAAY,aAAa,IAAU,gBAAS,KAAK;AAExD,QAAM,mBAAyB,mBAAY,CAAC,GAAY,UAAkB;AACxE,kBAAc,IAAI;AAClB,mBAAe,KAAK;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAyB,mBAAY,MAAM;AAC/C,kBAAc,KAAK;AACnB,mBAAe,IAAI;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAsB;AAAA,IAC1B,MAAM,KAAK,IAAI,UAAQ,EAAE,GAAG,IAAI,EAAE;AAAA,IAClC,CAAC,IAAI;AAAA,EACP;AAEA,QAAM,qBAA2B,eAAQ,MAAM;AAC7C,QAAI,mBAAmB,QAAW;AAChC,aAAO;AAAA,IACT;AACA,UAAM,cACJ,sBAAsB,IAClB,sBACA;AACN,WAAO,KAAK,IAAI,aAAa,sBAAsB;AAAA,EACrD,GAAG,CAAC,gBAAgB,mBAAmB,CAAC;AAExC,QAAM,uBAA6B,eAAQ,MAAM;AAC/C,QAAI,uBAAuB,GAAG;AAC5B,aAAO;AAAA,IACT;AACA,QAAI,yBAAyB,OAAO;AAClC,aAAO;AAAA,IACT;AACA,QAAI,yBAAyB,MAAM;AACjC,aAAO;AAAA,IACT;AACA,WAAO,cAAc,SAAS;AAAA,EAChC,GAAG,CAAC,sBAAsB,qBAAqB,cAAc,MAAM,CAAC;AAEpE,QAAM,uBAA6B,eAAQ,MAAM;AAC/C,QAAI,CAAC,sBAAsB;AACzB,aAAO;AAAA,IACT;AACA,UAAM,IAAI,KAAK,IAAI,cAAc,QAAQ,CAAC;AAC1C,WAAO,uBAAuB,IAAI;AAAA,EACpC,GAAG,CAAC,sBAAsB,cAAc,QAAQ,mBAAmB,CAAC;AAEpE,QAAM,YAAkB,cAAuB,IAAI;AACnD,QAAM,CAAC,gBAAgB,iBAAiB,IAAU,gBAAS,CAAC;AAE5D,EAAM,uBAAgB,MAAM;AAC1B,UAAM,KAAK,UAAU;AACrB,QAAI,CAAC,GAAI;AACT,UAAM,UAAU,MAAM;AACpB,wBAAkB,GAAG,WAAW;AAAA,IAClC;AACA,YAAQ;AACR,UAAM,KAAK,IAAI,eAAe,OAAO;AACrC,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,CAAC;AAML,QAAM,eAAqB,eAAQ,MAAM;AACvC,QAAI,yBAAyB,QAAW;AACtC,aAAO,iBAAiB,IAAI,iBAAiB;AAAA,IAC/C;AACA,QAAI,mBAAmB,GAAG;AACxB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,IAAI,sBAAsB,cAAc;AAAA,EACtD,GAAG,CAAC,sBAAsB,cAAc,CAAC;AAEzC,QAAM,aAAa,CAAC,UAClB,gBAAgB,QAAQ,gBAAgB,QAAQ,IAAI;AAEtD,QAAM,kBAAkB,OAAO,SAAS;AAExC,QAAM,cAAoB;AAAA,IACxB,OAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,QAAM,cAAoB;AAAA,IACxB,OAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,SACE;AAAA,IAAC,YAAAC;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF;AAAA,UACE,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,UAClB,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,OAAO;AAAA,UACP,UAAU,yBAAyB,YAAY;AAAA,UAC/C,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA,MAEA,yDAAC,cAAAC,SAAA,EAAM,SAAS,GAAG,IAAI,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,GACrD;AAAA;AAAA,UAAC,YAAAD;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF;AAAA,gBACE,UAAU;AAAA,gBACV,OAAO;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEC;AAAA,8BACC;AAAA,gBAAC,YAAAA;AAAA,gBAAA;AAAA,kBACC,IAAI;AAAA,oBACF,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,KAAK;AAAA,oBACL,WAAW;AAAA,oBACX,QAAQ;AAAA,kBACV;AAAA,kBAEC;AAAA;AAAA,cACH,IACE;AAAA,cACJ;AAAA,gBAAC,mBAAAE;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,SAAQ;AAAA,kBACR,IAAI;AAAA,oBACF;AAAA,sBACE,YAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,WAAW;AAAA,sBACX,OAAO;AAAA,sBACP,IAAI,gBAAgB,IAAI;AAAA,oBAC1B;AAAA,oBACA;AAAA,kBACF;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA;AAAA;AAAA,QACF;AAAA,QACA,8CAAC,gBAAAC,SAAA,EAAQ,IAAI,QAAQ,EAAE,aAAa,UAAU,GAAG,SAAS,GAAG;AAAA,QAC5D,cAAc,OAAO,SAAS,IAC7B;AAAA,UAAC,YAAAH;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF;AAAA,gBACE,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,gBAAgB;AAAA,gBAChB,YAAY;AAAA,gBACZ,WAAW,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,gBAC1B,QAAQ;AAAA,gBACR,IAAI;AAAA,gBACJ,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,cACrB;AAAA,cACA;AAAA,YACF;AAAA,YAEC,iBAAO,IAAI,OACV;AAAA,cAAC,cAAAC;AAAA,cAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,YAAW;AAAA,gBACX,IAAI,QAAQ,EAAE,KAAK,EAAE,GAAG,YAAY;AAAA,gBAEpC;AAAA;AAAA,oBAAC,YAAAD;AAAA,oBAAA;AAAA,sBACC,IAAI;AAAA,wBACF;AAAA,0BACE,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,YAAY;AAAA,0BACZ,SAAS,EAAE;AAAA,0BACX,cAAc;AAAA,wBAChB;AAAA,wBACA;AAAA,sBACF;AAAA;AAAA,kBACF;AAAA,kBACA;AAAA,oBAAC,mBAAAE;AAAA,oBAAA;AAAA,sBACC,IAAI;AAAA,wBACF;AAAA,0BACE,UAAU;AAAA,0BACV,YAAY;AAAA,0BACZ,OAAO;AAAA,0BACP,YAAY;AAAA,wBACd;AAAA,wBACA;AAAA,sBACF;AAAA,sBAEC,YAAE,eAAe,EAAE;AAAA;AAAA,kBACtB;AAAA;AAAA;AAAA,cA7BK,EAAE;AAAA,YA8BT,CACD;AAAA;AAAA,QACH,IACE;AAAA,QACJ;AAAA,UAAC,YAAAF;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,IAAI;AAAA,cACF;AAAA,gBACE,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,WAAW,uBAAuB,SAAS;AAAA,gBAC3C,WAAW;AAAA,gBACX,yBAAyB;AAAA,cAC3B;AAAA,cACA;AAAA,YACF;AAAA,YAEC,wBAAc,SAAS,IACtB;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,MAAM;AAAA,gBACN,QAAQ;AAAA,gBACR,YAAY;AAAA,gBACZ,cAAc;AAAA,gBACd,OAAO,EAAE,UAAU,UAAU;AAAA,gBAE7B;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,iBAAgB;AAAA,sBAChB,YAAU;AAAA,sBACV,UAAU;AAAA,sBACV,QAAQ,YAAY;AAAA;AAAA,kBACtB;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,OAAO;AAAA,sBACP,YAAW;AAAA,sBACX,UAAU;AAAA,sBACV,QAAQ;AAAA,sBACR,IAAI;AAAA,sBACJ,MAAM,EAAE,UAAU,GAAG;AAAA,sBACrB,UAAU,EAAE,QAAQ,YAAY,gBAAgB;AAAA,sBAChD,UAAU,EAAE,QAAQ,YAAY,mBAAmB;AAAA;AAAA,kBACrD;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,UAAU;AAAA,sBACV,MAAM,EAAE,UAAU,IAAI,YAAY,IAAI;AAAA,sBACtC,UAAU,EAAE,QAAQ,YAAY,mBAAmB;AAAA,sBACnD,UAAU,EAAE,QAAQ,YAAY,mBAAmB;AAAA;AAAA,kBACrD;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,QAAQ;AAAA,sBACR,SAAS,CAAC,iBACR;AAAA,wBAAC;AAAA;AAAA,0BACE,GAAG;AAAA,0BACJ,cAAc;AAAA,0BACd;AAAA,0BACA,eAAe;AAAA,0BACf,cAAc;AAAA,0BACd;AAAA;AAAA,sBACF;AAAA;AAAA,kBAEJ;AAAA,kBACC,OAAO,IAAI,CAAC,GAAG,MACd;AAAA,oBAAC;AAAA;AAAA,sBAEC,SAAS,EAAE;AAAA,sBACX,MAAM,EAAE;AAAA,sBACR,SAAS;AAAA,sBACT,MAAM,EAAE;AAAA,sBACR,cAAc;AAAA,sBACd,cAAc;AAAA,sBAEb;AAAA,sCAAc,IAAI,CAAC,KAAK,UACvB;AAAA,0BAAC;AAAA;AAAA,4BAEC,aAAa,WAAW,KAAK;AAAA;AAAA,0BADxB,GAAG,EAAE,OAAO,IAAI,IAAI,IAAI,IAAI,KAAK;AAAA,wBAExC,CACD;AAAA,wBACA,MAAM,kBACL;AAAA,0BAAC;AAAA;AAAA,4BACC,SAAS,CAAC,eACR;AAAA,8BAAC;AAAA;AAAA,gCACE,GAAG;AAAA,gCACJ;AAAA,gCACA,MAAM;AAAA,gCACN,gBAAgB,YAAY;AAAA;AAAA,4BAC9B;AAAA;AAAA,wBAEJ,IACE;AAAA;AAAA;AAAA,oBAzBC,EAAE;AAAA,kBA0BT,CACD;AAAA;AAAA;AAAA,YACH,IAEA;AAAA,cAAC,YAAAA;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,kBACF;AAAA,oBACE,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,kBAClB;AAAA,kBACA;AAAA,gBACF;AAAA,gBAEA;AAAA,kBAAC,mBAAAE;AAAA,kBAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,OAAM;AAAA,oBACN,IAAI;AAAA,oBAEH;AAAA;AAAA,gBACH;AAAA;AAAA,YACF;AAAA;AAAA,QAEJ;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AEtnBI,IAAAE,uBAAA;AAfG,IAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,KAAK;AAAA,MACL,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,IAEA;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU;AAAA,YACV,WAAW;AAAA,UACb;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,MAAM;AAAA,YACN,UAAU;AAAA,UACZ;AAAA,UAEA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,QAAO;AAAA,gBACP,OAAO,EAAE,QAAQ,4CAA4C;AAAA,gBAE7D;AAAA,gEAAC,UACC;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAI;AAAA,sBACJ,IAAG;AAAA,sBACH,IAAG;AAAA,sBACH,IAAG;AAAA,sBACH,IAAG;AAAA,sBAEF,wBAAc,IAAI,CAAC,MAAM,UACxB;AAAA,wBAAC;AAAA;AAAA,0BAEC,QAAQ,KAAK;AAAA,0BACb,WAAW,KAAK;AAAA,0BAChB,aAAY;AAAA;AAAA,wBAHP;AAAA,sBAIP,CACD;AAAA;AAAA,kBACH,GACF;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAM;AAAA,sBACN,QAAO;AAAA,sBACP,MAAM,QAAQ,UAAU;AAAA;AAAA,kBAC1B;AAAA;AAAA;AAAA,YACF;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,KAAK;AAAA,kBACL,MAAM;AAAA,kBACN,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,aAAa;AAAA,kBACb,cAAc;AAAA,gBAChB;AAAA,gBAEC,gBAAM,IAAI,CAAC,MAAM,UAChB;AAAA,kBAAC;AAAA;AAAA,oBAEC,OAAO;AAAA,sBACL,UAAU;AAAA,sBACV,YAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,YAAY;AAAA,sBACZ,eAAe;AAAA,oBACjB;AAAA,oBAEC,eAAK;AAAA;AAAA,kBATD;AAAA,gBAUP,CACD;AAAA;AAAA,YACH;AAAA;AAAA;AAAA,MACF;AAAA;AAAA;AACF;;;AChGF,IAAAC,gBAAqB;AACrB,IAAAC,cAAgB;AAChB,IAAAC,gBAAkB;AAClB,IAAAC,gBAAkB;AAClB,IAAAC,kBAAoB;AACpB,IAAAC,qBAAuB;AAEvB,IAAAL,iBAAkD;;;ACPlD,IAAAM,gBAA4C;AAK5C,SAAS,aAAa,GAAmB;AACvC,SAAO,KAAK,IAAI,MAAM;AACxB;AAMO,SAAS,kBACd,QACA,SACA,YACQ;AACR,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,MAAM;AAC7C,QAAM,iBAAa,sBAAO,MAAM;AAChC,QAAM,kBAAc,sBAAO,KAAK;AAChC,QAAM,aAAS,sBAAO,CAAC;AAEvB,+BAAU,MAAM;AACd,UAAM,YAAY,MAAM;AACtB,UAAI,OAAO,YAAY,GAAG;AACxB,6BAAqB,OAAO,OAAO;AACnC,eAAO,UAAU;AAAA,MACnB;AAAA,IACF;AAEA,QAAI,CAAC,WAAW,CAAC,OAAO,SAAS,MAAM,GAAG;AACxC,gBAAU;AACV,iBAAW,UAAU;AACrB,iBAAW,MAAM;AACjB;AAAA,IACF;AAEA,QAAI,CAAC,YAAY,SAAS;AACxB,kBAAY,UAAU;AACtB,iBAAW,UAAU;AACrB,iBAAW,MAAM;AACjB;AAAA,IACF;AAEA,UAAM,OAAO,WAAW;AACxB,QAAI,SAAS,QAAQ;AACnB;AAAA,IACF;AAEA,cAAU;AACV,UAAM,QAAQ,YAAY,IAAI;AAC9B,QAAI,YAAY;AAEhB,UAAM,OAAO,CAAC,QAAgB;AAC5B,UAAI,WAAW;AACb;AAAA,MACF;AACA,YAAM,UAAU,MAAM;AACtB,YAAM,IAAI,KAAK,IAAI,GAAG,UAAU,UAAU;AAC1C,YAAM,QAAQ,aAAa,CAAC;AAC5B,YAAM,OAAO,QAAQ,SAAS,QAAQ;AACtC,iBAAW,UAAU;AACrB,iBAAW,IAAI;AACf,UAAI,IAAI,GAAG;AACT,eAAO,UAAU,sBAAsB,IAAI;AAAA,MAC7C,OAAO;AACL,mBAAW,UAAU;AACrB,mBAAW,MAAM;AACjB,eAAO,UAAU;AAAA,MACnB;AAAA,IACF;AAEA,WAAO,UAAU,sBAAsB,IAAI;AAE3C,WAAO,MAAM;AACX,kBAAY;AACZ,gBAAU;AAAA,IACZ;AAAA,EACF,GAAG,CAAC,QAAQ,SAAS,UAAU,CAAC;AAEhC,SAAO;AACT;;;ADLM,IAAAC,uBAAA;AAjEN,IAAM,wBAAwB;AAE9B,IAAM,0BAA0B;AAEhC,IAAM,0BAA0B;AAChC,IAAMC,oBAAmB;AAGzB,IAAM,qBAAqB;AAG3B,IAAM,qBAAqB;AAC3B,IAAM,uBAAuB;AAC7B,IAAM,oBAAoB;AAC1B,IAAM,+BAA+B;AACrC,IAAM,iCAAiC;AAGvC,IAAM,4BAA4B;AAClC,IAAM,4BAA4B;AAElC,SAAS,YAAY,OAAgC;AACnD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,eAAe;AAAA,EAC9B;AACA,SAAO;AACT;AAYA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+B;AAC7B,QAAM,YAAY,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AACpE,QAAM,WAAW;AAAA,IACf,YAAY,QAAQ;AAAA,IACpB,aAAa;AAAA,IACb;AAAA,EACF;AAEA,QAAM,cACJ,aAAa,eACT,KAAK,MAAM,QAAQ,EAAE,eAAe,sBAAsB;AAAA,IACxD,aAAa;AAAA,EACf,CAAC,IACD,YAAY,KAAK;AAEvB,QAAM,cAAc,YAAY,KAAK;AAErC,MAAI,WAAW,UAAU;AACvB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,SAAQ;AAAA,QACR,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,IAAI,EAAE,OAAO,aAAa,OAAO,OAAO;AAAA,QAEvC;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,SAAQ;AAAA,MACR,YAAY;AAAA,MACZ,IAAI;AAAA,QACF,OAAO;AAAA,QACP,UAAU,EAAE,IAAI,IAAI,IAAI,GAAG;AAAA,QAC3B,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAOA,SAAS,0BAA0B;AAAA,EACjC;AAAA,EACA,GAAG;AACL,GAAmC;AACjC,QAAM,UAAM,uBAAoB,IAAI;AACpC,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,KAAK;AAEpD,sCAAgB,MAAM;AACpB,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,IAAI;AACP;AAAA,IACF;AACA,UAAM,SAAS,MAAM;AACnB,qBAAe,GAAG,cAAc,GAAG,cAAc,GAAG;AAAA,IACtD;AACA,WAAO;AACP,UAAM,KAAK,IAAI,eAAe,MAAM;AACpC,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM;AACX,SAAG,WAAW;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,SAAS,gBAAgB,QAAQ,CAAC;AAEtC,SACE;AAAA,IAAC,gBAAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,MACP,sBAAsB,CAAC;AAAA,MACvB,WAAU;AAAA,MACV,YAAY;AAAA,MAEZ,wDAAC,mBAAAC,SAAA,EAAW,KAAU,QAAM,MAAE,GAAG,iBAAiB;AAAA;AAAA,EACpD;AAEJ;AAEO,IAAM,cAAc,CAAC,UAA4B;AACtD,QAAM,EAAE,OAAO,OAAO,MAAM,YAAYF,mBAAkB,GAAG,IAAI;AACjE,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,eAAe,MAAM,gBAAgB;AAC3C,QAAM,2BAA2B,MAAM,4BAA4B;AACnE,QAAM,4BAA4B,MAAM,6BAA6B;AACrE,QAAM,EAAE,qBAAqB,IAAI;AACjC,QAAM,WACJ,MAAM,aACL,MAAM,YAAY,WACf,wBACA;AAEN,MAAI,MAAM,YAAY,UAAU;AAC9B,UAAM,EAAE,iBAAAG,mBAAkB,8BAA8B,iBAAAC,iBAAgB,IACtE;AACF,WACE;AAAA,MAAC,cAAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,QACX,IAAI;AAAA,UACF,GAAG;AAAA,UACH,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,WAAWF;AAAA,UACX,GAAIC,oBAAmB,OACnB,EAAE,WAAWA,kBAAiB,UAAU,OAAgB,IACxD,CAAC;AAAA,UACL,GAAG;AAAA,QACL;AAAA,QAEA;AAAA;AAAA,YAAC,YAAAE;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,YAAY;AAAA,gBACZ,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,cAClB;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,QAAQ;AAAA;AAAA,cACV;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC,cAAAC;AAAA,YAAA;AAAA,cACC,SAAS;AAAA,cACT,YAAW;AAAA,cACX,gBAAe;AAAA,cACf,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE;AAAA,cAE3B;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS;AAAA,oBACT,SAAQ;AAAA,oBACR,YAAY;AAAA,oBACZ,OAAM;AAAA,oBACN,IAAI,EAAE,OAAO,OAAO;AAAA,oBAEnB;AAAA;AAAA,gBACH;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,QAAO;AAAA;AAAA,gBACT;AAAA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB;AAAA,IACA,aAAa;AAAA,IACb,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB;AAAA,IACA,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB;AAAA,EACF,IAAI;AAEJ,QAAM,qBACJ,eAAe,MAAM,cAAc,SAAS,YAAY;AAC1D,QAAM,cAAc,MAAM,UAAU;AACpC,QAAM,wBAAwB,MAAM,mBAAmB;AACvD,QAAM,qBAAqB,MAAM,yBAAyB;AAC1D,QAAM,qBAAqB,2BAA2B;AACtD,QAAM,eACJ,gBAAgB,aAChB,OAAO,MAAM,qBAAqB,YAClC,MAAM,iBAAiB,SAAS,KAChC,OAAO,MAAM,wBAAwB,YACrC,MAAM,oBAAoB,SAAS;AAErC,QAAM,aAAa,cACjB;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,SAAS;AAAA,MACT,WAAW,GAAG,KAAK;AAAA,MACnB,IAAI,EAAE,YAAY,EAAE;AAAA;AAAA,EACtB,IACE;AAEJ,SACE;AAAA,IAAC,cAAAF;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,MACX,IAAI;AAAA,QACF,SAAS;AAAA,QACT,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,OAAO;AAAA,QACP,UAAU;AAAA,QACV,GAAG,GAAG,aAAa;AAAA,QACnB,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,QACX,UAAU;AAAA,QACV,UAAU,mBAAmB,OAAO,SAAS;AAAA,QAC7C,WAAW;AAAA,QACX,GAAI,mBAAmB,OAAO,EAAE,WAAW,gBAAgB,IAAI,CAAC;AAAA,QAChE,GAAG;AAAA,MACL;AAAA,MAEA;AAAA;AAAA,UAAC,cAAAE;AAAA,UAAA;AAAA,YACC,SAAS,GAAG,UAAU;AAAA,YACtB,YAAW;AAAA,YACX,IAAI,EAAE,OAAO,QAAQ,UAAU,EAAE;AAAA,YAEhC;AAAA,oBAAM,aACL,8CAAC,YAAAD,SAAA,EAAI,IAAI,EAAE,OAAO,OAAO,GAAI,gBAAM,YAAW,IAC5C;AAAA,cAEJ;AAAA,gBAAC,cAAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,YAAW;AAAA,kBACX,gBAAe;AAAA,kBACf,IAAI,EAAE,OAAO,QAAQ,UAAU,EAAE;AAAA,kBAEjC;AAAA,oBAAC,cAAAA;AAAA,oBAAA;AAAA,sBACC,SAAS,GAAG,UAAU;AAAA,sBACtB,YAAW;AAAA,sBACX,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,EAAE;AAAA,sBAElC;AAAA;AAAA,0BAAC,cAAAA;AAAA,0BAAA;AAAA,4BACC,WAAU;AAAA,4BACV,YAAW;AAAA,4BACX,SAAS;AAAA,4BACT,YAAU;AAAA,4BACV,IAAI,EAAE,UAAU,GAAG,WAAW,WAAW,UAAU,OAAO;AAAA,4BAE1D;AAAA;AAAA,gCAAC;AAAA;AAAA,kCACC,SAAS;AAAA,kCACT,SAAQ;AAAA,kCACR,YAAY;AAAA,kCACZ,IAAI;AAAA,oCACF,OAAO;AAAA,oCACP,UAAU;AAAA,oCACV,MAAM;AAAA,kCACR;AAAA,kCAEC;AAAA;AAAA,8BACH;AAAA,8BACC,kBAAkB,UAAU,aAAa;AAAA;AAAA;AAAA,wBAC5C;AAAA,wBAEA;AAAA,0BAAC,cAAAA;AAAA,0BAAA;AAAA,4BACC,WAAU;AAAA,4BACV,YAAW;AAAA,4BACX,SAAS;AAAA,4BACT,YAAU;AAAA,4BACV,IAAI,EAAE,UAAU,GAAG,WAAW,WAAW,UAAU,OAAO;AAAA,4BAE1D;AAAA;AAAA,gCAAC;AAAA;AAAA,kCACC;AAAA,kCACA;AAAA,kCACA;AAAA,kCACA;AAAA,kCACA;AAAA,kCACA;AAAA,kCACA,QAAO;AAAA;AAAA,8BACT;AAAA,8BACC,kBAAkB,UAAU,aAAa;AAAA;AAAA;AAAA,wBAC5C;AAAA,wBAEC,gBAAgB,YACf,eACE;AAAA,0BAAC,mBAAAL;AAAA,0BAAA;AAAA,4BACC,SAAQ;AAAA,4BACR,WAAU;AAAA,4BACV,IAAI;AAAA,8BACF,YAAY;AAAA,8BACZ,YAAY;AAAA,8BACZ,UAAU;AAAA,8BACV,WAAW;AAAA,4BACb;AAAA,4BAEA;AAAA;AAAA,gCAAC,mBAAAA;AAAA,gCAAA;AAAA,kCACC,WAAU;AAAA,kCACV,SAAQ;AAAA,kCACR,IAAI,EAAE,YAAY,KAAK,OAAO,mBAAmB;AAAA,kCAEhD,gBAAM;AAAA;AAAA,8BACT;AAAA,8BACA;AAAA,gCAAC,mBAAAA;AAAA,gCAAA;AAAA,kCACC,WAAU;AAAA,kCACV,SAAQ;AAAA,kCACR,IAAI,EAAE,YAAY,KAAK,OAAO,sBAAsB;AAAA,kCAEnD,gBAAM;AAAA;AAAA,8BACT;AAAA;AAAA;AAAA,wBACF,IACE,OAAO,MAAM,mBAAmB,WAClC;AAAA,0BAAC,mBAAAA;AAAA,0BAAA;AAAA,4BACC,SAAQ;AAAA,4BACR,IAAI;AAAA,8BACF,OAAO,MAAM,mBAAmB;AAAA,8BAChC,YAAY;AAAA,8BACZ,YAAY;AAAA,8BACZ,UAAU;AAAA,8BACV,WAAW;AAAA,4BACb;AAAA,4BAEC,gBAAM;AAAA;AAAA,wBACT,IACE,MAAM,kBAAkB,OAC1B;AAAA,0BAAC,YAAAI;AAAA,0BAAA;AAAA,4BACC,IAAI;AAAA,8BACF,YAAY;AAAA,8BACZ,OAAO,MAAM,mBAAmB;AAAA,8BAChC,YAAY;AAAA,8BACZ,YAAY;AAAA,8BACZ,UAAU;AAAA,8BACV,WAAW;AAAA,8BACX,YAAY,EAAE,YAAY,IAAI;AAAA,4BAChC;AAAA,4BAEC,gBAAM;AAAA;AAAA,wBACT,IACE,OAEJ;AAAA,0BAAC,cAAAC;AAAA,0BAAA;AAAA,4BACC,WAAU;AAAA,4BACV,YAAW;AAAA,4BACX,SAAS;AAAA,4BACT,UAAS;AAAA,4BACT,YAAU;AAAA,4BACV,IAAI,EAAE,OAAO,QAAQ,UAAU,EAAE;AAAA,4BAEhC;AAAA,oCAAM,eACL;AAAA,gCAAC,mBAAAL;AAAA,gCAAA;AAAA,kCACC,WAAU;AAAA,kCACV,YAAY;AAAA,kCACZ,IAAI;AAAA,oCACF,OAAO;AAAA,oCACP,YAAY;AAAA,oCACZ,UAAU,GAAG,kBAAkB;AAAA,oCAC/B,YAAY;AAAA,kCACd;AAAA,kCAEC,gBAAM;AAAA;AAAA,8BACT,IACE;AAAA,8BACJ,8CAAC,YAAAI,SAAA,EAAI,IAAI,EAAE,YAAY,GAAG,YAAY,GAAG,SAAS,OAAO,GACvD;AAAA,gCAAC;AAAA;AAAA,kCACC,MACE,MAAM,cAAc,SAChB,sBACA;AAAA,kCAEN,OAAO;AAAA,kCACP,QAAQ;AAAA,kCACR,OAAO,EAAE,OAAO,mBAAmB;AAAA;AAAA,8BACrC,GACF;AAAA,8BACC,MAAM,kBAAkB,OACvB,OAAO,MAAM,mBAAmB,WAC9B;AAAA,gCAAC;AAAA;AAAA,kCACC,SAAS,MAAM;AAAA,kCACf,WAAU;AAAA,kCACV,YAAY;AAAA,kCACZ,IAAI;AAAA,oCACF,UAAU,GAAG,kBAAkB;AAAA,oCAC/B,YAAY;AAAA,oCACZ,OAAO;AAAA,oCACP,UAAU;AAAA,oCACV,MAAM;AAAA,kCACR;AAAA,kCAEC,gBAAM;AAAA;AAAA,8BACT,IAEA;AAAA,gCAAC,YAAAA;AAAA,gCAAA;AAAA,kCACC,IAAI;AAAA,oCACF,UAAU,GAAG,kBAAkB;AAAA,oCAC/B,YAAY;AAAA,oCACZ,YAAY;AAAA,oCACZ,OAAO;AAAA,oCACP,UAAU;AAAA,oCACV,MAAM;AAAA,oCACN,UAAU;AAAA,oCACV,cAAc;AAAA,oCACd,YAAY;AAAA,oCACZ,YAAY;AAAA,sCACV,YAAY;AAAA,sCACZ,OAAO;AAAA,sCACP,UAAU;AAAA,oCACZ;AAAA,kCACF;AAAA,kCAEC,gBAAM;AAAA;AAAA,8BACT,IAEA;AAAA;AAAA;AAAA,wBACN;AAAA;AAAA;AAAA,kBAEJ;AAAA;AAAA,cACF;AAAA;AAAA;AAAA,QACF;AAAA,QAEA;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,UAAU;AAAA,cACV,KAAK;AAAA,cACL,OAAO;AAAA,cACP,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc,sBAAsB,UAAU,QAAQ;AAAA,cACtD,SAAS;AAAA,cACT,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,YAAY;AAAA,cACZ,QAAQ;AAAA,YACV;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,OAAO;AAAA,gBACP,OAAO;AAAA,gBACP,QAAQ;AAAA;AAAA,YACV;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AEvfE,IAAAE,uBAAA;AAJF,IAAM,eAAe,CAAC;AAAA,EACpB;AAAA,EACA;AACF,MACE;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IAEL;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,GAAG;AAAA,UACH,MAAK;AAAA,UACL,QAAO;AAAA,UACP,aAAa;AAAA;AAAA,MACf;AAAA,MACA,8CAAC,UAAK,GAAG,IAAI,GAAG,IAAI,UAAU,IAAI,YAAW,UAAS,MAAM,UACzD,kBACH;AAAA;AAAA;AACF;AAGF,IAAM,eAAe,CAAC;AAAA,EACpB;AAAA,EACA;AACF,MACE;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IAEL;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,GAAG;AAAA,UACH,MAAK;AAAA,UACL,QAAO;AAAA,UACP,aAAa;AAAA,UACb,iBAAiB;AAAA,UACjB,kBAAkB;AAAA;AAAA,MACpB;AAAA,MACA,8CAAC,UAAK,GAAG,IAAI,GAAG,IAAI,UAAU,IAAI,YAAW,UAAS,MAAM,UACzD,kBACH;AAAA;AAAA;AACF;AAGF,IAAM,aAAa,CAAC;AAAA,EAClB;AAAA,EACA;AACF,MACE;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IAEL;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,GAAG;AAAA,UACH,MAAK;AAAA,UACL,QAAO;AAAA,UACP,eAAc;AAAA,UACd,aAAY;AAAA;AAAA,MACd;AAAA,MACA,8CAAC,UAAK,GAAG,IAAI,GAAG,IAAI,UAAU,IAAI,YAAW,UAAS,MAAM,UACzD,kBACH;AAAA;AAAA;AACF;AAGK,IAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,MAA8B;AAC5B,MAAI,aAAa,GAAG;AAClB,WAAO,8CAAC,cAAW,QAAgB,UAAoB;AAAA,EACzD;AACA,MAAI,aAAa,IAAI;AACnB,WAAO,8CAAC,gBAAa,QAAgB,UAAoB;AAAA,EAC3D;AACA,MAAI,aAAa,KAAK;AACpB,WAAO,8CAAC,gBAAa,QAAgB,UAAoB;AAAA,EAC3D;AACA,SAAO,8CAAC,SAAI,8BAAgB;AAC9B;;;AC/FA,IAAAC,cAAgB;AAChB,IAAAC,gBAAkB;AAClB,IAAAC,qBAAuB;AACvB,2BAA0B;AAC1B,IAAAC,iBAAyB;AACzB,IAAAC,SAAuB;AACvB,IAAAC,mBAAkE;AA+I5D,IAAAC,uBAAA;AApIN,IAAM,wBAAwB,EAAE,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI;AAE1D,SAAS,GAAG,GAAmB;AAC7B,SAAO,GAAG,CAAC;AACb;AAEA,SAAS,gBACP,OACA,YACiB;AACjB,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO;AACT;AAEA,SAASC,qBACP,cAIuE;AACvE,MAAI,iBAAiB,QAAW;AAC9B,WAAO,EAAE,IAAI,QAAQ,IAAI,IAAI;AAAA,EAC/B;AACA,MAAI,OAAO,iBAAiB,UAAU;AACpC,WAAO,GAAG,YAAY;AAAA,EACxB;AACA,MAAI,OAAO,iBAAiB,UAAU;AACpC,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,IACE,aAAa,OAAO,SAChB,OAAO,aAAa,OAAO,WACzB,GAAG,aAAa,EAAE,IAClB,aAAa,KACf;AAAA,IACN,IACE,aAAa,OAAO,SAChB,OAAO,aAAa,OAAO,WACzB,GAAG,aAAa,EAAE,IAClB,aAAa,KACf;AAAA,IACN,GAAI,aAAa,OAAO,SACpB;AAAA,MACE,IACE,OAAO,aAAa,OAAO,WACvB,GAAG,aAAa,EAAE,IAClB,aAAa;AAAA,IACrB,IACA,CAAC;AAAA,EACP;AACF;AAEA,SAAS,yBACP,SACQ;AACR,QAAM,YAAQ,yBAAS;AACvB,QAAM,WAAO,qBAAAC,SAAc,MAAM,YAAY,GAAG,IAAI,CAAC;AACrD,QAAM,WAAO,qBAAAA,SAAc,MAAM,YAAY,GAAG,IAAI,CAAC;AAErD,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AACA,QAAM,SAAS;AAAA,IACb,IAAI,SAAS,MAAM,sBAAsB;AAAA,IACzC,IAAI,SAAS,MAAM,sBAAsB;AAAA,IACzC,IAAI,SAAS,MAAM,sBAAsB;AAAA,EAC3C;AACA,MAAI,KAAM,QAAO,OAAO;AACxB,MAAI,KAAM,QAAO,OAAO;AACxB,SAAO,OAAO;AAChB;AAEA,IAAM,kBAAkB,IAAI,KAAK,aAAa,QAAW;AAAA,EACvD,uBAAuB;AACzB,CAAC;AAQD,SAAS,sBACP,QACkB;AAClB,SAAO,OACJ,OAAO,OAAK,EAAE,QAAQ,CAAC,EACvB,IAAI,QAAM;AAAA,IACT,IAAI,EAAE;AAAA,IACN,OAAO,EAAE;AAAA,IACT,OAAO,EAAE;AAAA,IACT,OAAO,EAAE;AAAA,IACT,qBAAqB,EAAE;AAAA,EACzB,EAAE;AACN;AAQA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqD;AACnD,MAAI,CAAC,UAAU,CAAC,SAAS,QAAQ;AAC/B,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,QAAQ,CAAC;AACvB,QAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,SAAS,OAAO,MAAM,UAAU,UAAU;AAC7C,WAAO;AAAA,EACT;AACA,QAAM,MAAM,aAAa,IAAI,KAAK,MAAO,MAAM,QAAQ,aAAc,GAAG,IAAI;AAC5E,SACE;AAAA,IAAC,YAAAC;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,SAAS;AAAA,QACT,cAAc;AAAA,QACd,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,MACZ;AAAA,MAEA;AAAA,uDAAC,cAAAC,SAAA,EAAM,WAAU,OAAM,YAAW,UAAS,SAAS,GAAG,IAAI,EAAE,IAAI,KAAK,GACpE;AAAA;AAAA,YAAC,YAAAD;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,SAAS,MAAM;AAAA,gBACf,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC,mBAAAE;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,OAAO;AAAA,gBACP,YAAY;AAAA,cACd;AAAA,cAEC,gBAAM;AAAA;AAAA,UACT;AAAA,WACF;AAAA,QACA;AAAA,UAAC,mBAAAA;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,IAAI,EAAE,OAAO,QAAQ,UAAU,cAAc;AAAA,YAE5C;AAAA,8BAAgB,OAAO,MAAM,KAAK;AAAA,cAAE;AAAA,cAAG;AAAA,cAAI;AAAA;AAAA;AAAA,QAC9C;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,sBAAsB,OASD;AAC5B,QAAM;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,KAAK,UAAU;AACrB,QAAM,KAAK,UAAU;AACrB,QAAM,WAAW,WAAW;AAC5B,QAAM,cAAc,aAAa;AACjC,QAAM,cAAc,aAAa;AACjC,QAAM,UAAU,eAAe;AAC/B,QAAM,UAAU,KAAK,MAAM,UAAU,GAAG;AACxC,MAAI,WAAW,GAAG;AAChB,WAAO;AAAA,EACT;AACA,QAAM,cAAc,eAAe,cAAc,eAAe;AAChE,QAAM,MAAO,CAAC,WAAW,KAAK,KAAM;AACpC,QAAM,IAAI,KAAK,cAAc,KAAK,IAAI,GAAG;AACzC,QAAM,IAAI,KAAK,cAAc,KAAK,IAAI,GAAG;AACzC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,MAAM,SAAS,uBAAuB;AAAA,MACtC;AAAA,MACA,YAAY;AAAA,MACZ,YAAW;AAAA,MACX,kBAAiB;AAAA,MAEhB;AAAA;AAAA,QAAQ;AAAA;AAAA;AAAA,EACX;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,yBAAyB;AAAA,EACzB,yBAAyB;AAC3B,GAMG;AACD,QAAM,QAAQ,OAAO,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;AACxD,QAAM,UAAgB,eAAQ,MAAM,sBAAsB,MAAM,GAAG,CAAC,MAAM,CAAC;AAE3E,QAAM,UACJ,QAAQ,IACJ,OAAO,IAAI,OAAK,GAAG,EAAE,KAAK,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,IACnD;AAEN,QAAM,iBAAiB,gBAAgB,YAAY,YAAY,EAAE;AACjE,QAAM,mBAAmB,gBAAgB,YAAY,cAAc,EAAE;AACrE,QAAM,mBAAmB,gBAAgB,YAAY,cAAc,EAAE;AACrE,QAAM,iBAAiB,YAAY;AAEnC,MAAI,SAAS,GAAG;AACd,WACE;AAAA,MAAC,YAAAF;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,UACF,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,SAAS;AAAA,UACT,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAK;AAAA,QACL,cAAY;AAAA,QAEZ;AAAA,UAAC,mBAAAE;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,IACE,mBAAmB,SACf,EAAE,UAAU,eAAe,IAC3B;AAAA,YAEP;AAAA;AAAA,QAED;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,QAAM,cAAc,OAAO;AAE3B,SACE;AAAA,IAAC,YAAAF;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,IAAI;AAAA,QACF,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,6BAA6B,EAAE,SAAS,OAAO;AAAA,MACjD;AAAA,MAEA,wDAAC,wCAAoB,OAAO,MAAM,QAAQ,MACxC,yDAAC,6BACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,CAAC,UACR;AAAA,cAAC;AAAA;AAAA,gBACE,GAAG;AAAA,gBACJ,YAAY;AAAA,gBACZ,eAAe;AAAA,gBACf,eAAe;AAAA;AAAA,YACjB;AAAA,YAEF,cAAc,EAAE,SAAS,QAAQ,QAAQ,EAAE;AAAA;AAAA,QAC7C;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,SAAQ;AAAA,YACR,SAAQ;AAAA,YACR,IAAG;AAAA,YACH,IAAG;AAAA,YACH,aAAa;AAAA,YACb;AAAA,YACA,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,cAAc;AAAA,YACd,QAAO;AAAA,YACP,WAAW;AAAA,YACX,mBAAmB;AAAA,YACnB,mBAAmB;AAAA,YACnB,OAAO,gBACL;AAAA,cAAC;AAAA;AAAA,gBACE,GAAG;AAAA,gBACJ,UAAU;AAAA;AAAA,YACZ;AAAA,YAGD,kBAAQ,IAAI,WACX,8CAAC,yBAAoB,MAAM,MAAM,OAAO,QAAO,UAApC,MAAM,EAAqC,CACvD;AAAA;AAAA,QACH;AAAA,SACF,GACF;AAAA;AAAA,EACF;AAEJ;AAMO,IAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,yBAAyB;AAAA,EACzB,yBAAyB;AAC3B,MAA2B;AACzB,QAAM,kBAAkB,yBAAyB,OAAO;AACxD,QAAM,QAAQ,OAAO,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;AAExD,SACE;AAAA,IAAC,YAAAA;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,QAClB,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,QACP,UAAUF,qBAAoB,YAAY;AAAA,QAC1C,WAAW;AAAA,QACX,GAAG;AAAA,MACL;AAAA,MAEA,yDAAC,cAAAG,SAAA,EAAM,SAAS,KACd;AAAA;AAAA,UAAC,cAAAA;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,YAAW;AAAA,YACX,gBAAe;AAAA,YACf,KAAK;AAAA,YAEL;AAAA;AAAA,gBAAC,mBAAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,SAAQ;AAAA,kBACR,IAAI;AAAA,oBACF,YAAY;AAAA,oBACZ,OAAO;AAAA,oBACP,IAAI;AAAA,oBACJ,GAAI,YAAY,SAAS,OACrB,EAAE,UAAU,WAAW,MAAM,IAC7B,CAAC;AAAA,kBACP;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA,cACC,gBACC,8CAAC,YAAAF,SAAA,EAAI,IAAI,EAAE,YAAY,EAAE,GAAI,yBAAc,IACzC;AAAA;AAAA;AAAA,QACN;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA,WAAU;AAAA,YACV,WAAW;AAAA,YACX,aAAa,YAAY;AAAA,YACzB,QAAQ;AAAA;AAAA,QACV;AAAA,QAEA;AAAA,UAAC,cAAAC;AAAA,UAAA;AAAA,YACC,WAAW,EAAE,IAAI,UAAU,IAAI,MAAM;AAAA,YACrC,SAAS;AAAA,YACT,YAAW;AAAA,YACX,gBAAe;AAAA,YACf,IAAI,EAAE,OAAO,OAAO;AAAA,YAEpB;AAAA,4DAAC,YAAAD,SAAA,EAAI,IAAI,EAAE,YAAY,GAAG,YAAY,EAAE,GACtC;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,MAAM;AAAA,kBACN;AAAA,kBACA;AAAA,kBACA;AAAA;AAAA,cACF,GACF;AAAA,cACA;AAAA,gBAAC,cAAAC;AAAA,gBAAA;AAAA,kBACC,SAAS;AAAA,kBACT,IAAI;AAAA,oBACF,MAAM;AAAA,oBACN,UAAU;AAAA,oBACV,WAAW,EAAE,IAAI,WAAW,IAAI,OAAO;AAAA,oBACvC,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,kBAClC;AAAA,kBAEC,iBAAO,IAAI,WAAS;AACnB,0BAAM,MACJ,QAAQ,IAAI,KAAK,MAAO,MAAM,QAAQ,QAAS,GAAG,IAAI;AACxD,2BACE,+CAAC,cAAAA,SAAA,EAAqB,SAAS,MAC7B;AAAA;AAAA,wBAAC,mBAAAC;AAAA,wBAAA;AAAA,0BACC,IAAI;AAAA,4BACF,WAAW;AAAA,4BACX,YAAY;AAAA,4BACZ,OAAO,MAAM,oBAAoB;AAAA,4BACjC,UAAU,gBAAgB,YAAY,aAAa,EAAE;AAAA,0BACvD;AAAA,0BAEC,gBAAM;AAAA;AAAA,sBACT;AAAA,sBACA,+CAAC,cAAAD,SAAA,EAAM,WAAU,OAAM,YAAW,UAAS,SAAS,GAClD;AAAA;AAAA,0BAAC,YAAAD;AAAA,0BAAA;AAAA,4BACC,IAAI;AAAA,8BACF,OAAO;AAAA,8BACP,QAAQ;AAAA,8BACR,cAAc;AAAA,8BACd,SAAS,MAAM;AAAA,8BACf,YAAY;AAAA,4BACd;AAAA;AAAA,wBACF;AAAA,wBACA;AAAA,0BAAC,mBAAAE;AAAA,0BAAA;AAAA,4BACC,SAAQ;AAAA,4BACR,IAAI;AAAA,8BACF,OAAO,MAAM,oBAAoB;AAAA,8BACjC,UAAU,gBAAgB,YAAY,aAAa,EAAE;AAAA,4BACvD;AAAA,4BAEC;AAAA,8CAAgB,OAAO,MAAM,KAAK;AAAA,8BAAE;AAAA,8BAAG;AAAA,8BAAI;AAAA;AAAA;AAAA,wBAC9C;AAAA,wBACC,MAAM,aACL,8CAAC,YAAAF,SAAA,EAAI,IAAI,EAAE,SAAS,eAAe,YAAY,EAAE,GAC9C,gBAAM,YACT,IACE;AAAA,yBACN;AAAA,yBAnCU,MAAM,EAoClB;AAAA,kBAEJ,CAAC;AAAA;AAAA,cACH;AAAA;AAAA;AAAA,QACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;ACxeA,IAAAG,eAAgB;AAChB,IAAAC,kBAAoB;AACpB,IAAAC,gBAAkB;AAClB,IAAAC,qBAAuB;AAEvB,IAAAC,UAAuB;AACvB,IAAAC,mBASO;AAqIC,IAAAC,uBAAA;AA1HR,SAASC,UACP,MACA,UACqB;AACrB,SAAO,WAAW,EAAE,GAAG,MAAM,GAAG,SAAS,IAAI;AAC/C;AAEA,SAASC,SACP,SACG,OACa;AAChB,QAAM,OAAO,MACV,OAAO,CAAC,MAA2B,MAAM,MAAS,EAClD,QAAQ,OAAM,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,CAAE;AAC5C,SAAO,CAAC,MAAM,GAAG,IAAI;AACvB;AAEA,IAAM,sBAAsB,EAAE,MAAM,QAAQ,QAAQ,SAAS;AAC7D,IAAM,sBAAsB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAEjE,IAAMC,8BAA6B;AACnC,IAAMC,0BAAyB;AAC/B,IAAMC,wBAAuB;AAE7B,IAAMC,sBAAqB;AAAA,EACzB,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AACV;AAEA,IAAMC,sBAAkD;AAAA,EACtD,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,mBAAmB;AACrB;AAEA,IAAM,yBAAyB;AAC/B,IAAM,wBAAwB;AAE9B,SAASC,gBAAe,OAAuB;AAC7C,MAAI,QAAQ,KAAM;AAChB,WAAO,IAAI,QAAQ,KAAM,QAAQ,CAAC,CAAC;AAAA,EACrC;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,uBAAuB,OAAuB;AACrD,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,MAAI,OAAO,KAAM;AACf,UAAM,IAAI,QAAQ;AAClB,UAAM,OAAO,OAAO,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;AAC1D,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO,OAAO,KAAK;AACrB;AAWA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkD;AAChD,MAAI,CAAC,UAAU,CAAC,SAAS,UAAU,CAAC,gBAAgB,UAAU,QAAW;AACvE,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,QAAQ;AAAA,IACxB,CAAC,MAA2B,OAAO,EAAE,OAAO,MAAM;AAAA,EACpD;AACA,QAAM,cAAc,QAAQ;AAAA,IAC1B,CAAC,MAA2B,OAAO,EAAE,OAAO,MAAM;AAAA,EACpD;AACA,QAAM,OAAO,OAAO,WAAW,SAAS,CAAC;AACzC,QAAM,SAAS,OAAO,aAAa,SAAS,CAAC;AAC7C,QAAM,QAAQ,OAAO;AAErB,QAAM,KAAK;AACX,QAAM,cAAmC;AAAA,IACvC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,cAAc;AAAA,EAChB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAOP;AAAA,QACL;AAAA,UACE,iBAAiB;AAAA,UACjB,cAAc;AAAA,UACd,SAAS;AAAA,UACT,OAAO;AAAA,UACP,WAAW;AAAA,QACb;AAAA,QACA,IAAI;AAAA,MACN;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAOA;AAAA,cACL,EAAE,GAAG,aAAa,cAAc,MAAM;AAAA,cACtC,IAAI;AAAA,YACN;AAAA,YAEA;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAOA;AAAA,oBACL;AAAA,sBACE,OAAO;AAAA,sBACP,UAAU;AAAA,sBACV,YAAY;AAAA,oBACd;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,kBAEC;AAAA;AAAA,oBAAc;AAAA,oBAAE;AAAA;AAAA;AAAA,cACnB;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAOA;AAAA,oBACL,EAAE,OAAO,WAAW,UAAU,QAAQ,YAAY,IAAI;AAAA,oBACtD,IAAI;AAAA,kBACN;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA;AAAA;AAAA,QACF;AAAA,QACA,+CAAC,SAAI,OAAOA,UAAS,aAAa,IAAI,UAAU,GAC9C;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA;AAAA,gBACL;AAAA,kBACE,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,YAAY;AAAA,gBACd;AAAA,gBACA,IAAI;AAAA,cACN;AAAA,cAEC;AAAA;AAAA,gBAAa;AAAA,gBAAE;AAAA;AAAA;AAAA,UAClB;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA;AAAA,gBACL,EAAE,OAAO,WAAW,UAAU,QAAQ,YAAY,IAAI;AAAA,gBACtD,IAAI;AAAA,cACN;AAAA,cAEC,gBAAM,eAAe;AAAA;AAAA,UACxB;AAAA,WACF;AAAA,QACA,+CAAC,SAAI,OAAOA,UAAS,aAAa,IAAI,UAAU,GAC9C;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA;AAAA,gBACL;AAAA,kBACE,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,iBAAiB,aAAa;AAAA,gBAChC;AAAA,gBACA,IAAI;AAAA,cACN;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA;AAAA,gBACL;AAAA,kBACE,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,YAAY;AAAA,gBACd;AAAA,gBACA,IAAI;AAAA,cACN;AAAA,cAEC;AAAA,6BAAa;AAAA,gBAAK;AAAA,gBAAE;AAAA;AAAA;AAAA,UACvB;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA;AAAA,gBACL,EAAE,OAAO,WAAW,UAAU,QAAQ,YAAY,IAAI;AAAA,gBACtD,IAAI;AAAA,cACN;AAAA,cAEC,eAAK,eAAe;AAAA;AAAA,UACvB;AAAA,WACF;AAAA,QACA,+CAAC,SAAI,OAAOA,UAAS,aAAa,IAAI,UAAU,GAC9C;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA;AAAA,gBACL;AAAA,kBACE,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,iBAAiB,aAAa;AAAA,gBAChC;AAAA,gBACA,IAAI;AAAA,cACN;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA;AAAA,gBACL;AAAA,kBACE,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,YAAY;AAAA,gBACd;AAAA,gBACA,IAAI;AAAA,cACN;AAAA,cAEC;AAAA,6BAAa;AAAA,gBAAO;AAAA,gBAAE;AAAA;AAAA;AAAA,UACzB;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA;AAAA,gBACL,EAAE,OAAO,WAAW,UAAU,QAAQ,YAAY,IAAI;AAAA,gBACtD,IAAI;AAAA,cACN;AAAA,cAEC,iBAAO,eAAe;AAAA;AAAA,UACzB;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,sBACP,qBACA,kBACA,eACS;AACT,MAAI,uBAAuB,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,qBAAqB,OAAO;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,qBAAqB,MAAM;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,gBAAgB;AACzB;AAKO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,sBAAsBE;AAAA,EACtB,kBAAkB,uBAAuB;AAAA,EACzC,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB;AAAA,EACA,aAAa;AAAA,EACb,aAAa;AAAA,EACb;AAAA,EACA,iBAAiB;AACnB,GAA0B;AACxB,QAAM,eAAe,EAAE,GAAG,qBAAqB,GAAG,iBAAiB;AACnE,QAAM,eAAe,EAAE,GAAG,qBAAqB,GAAG,iBAAiB;AAEnE,QAAM,CAAC,aAAa,cAAc,IAAU,iBAAwB,IAAI;AACxE,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAS,KAAK;AAExD,QAAM,mBAAyB,oBAAY,CAAC,GAAY,UAAkB;AACxE,kBAAc,IAAI;AAClB,mBAAe,KAAK;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAyB,oBAAY,MAAM;AAC/C,kBAAc,KAAK;AACnB,mBAAe,IAAI;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAsB,gBAAQ,MAA6B;AAC/D,WAAO,KAAK,IAAI,UAAQ,EAAE,GAAG,IAAI,EAAE;AAAA,EACrC,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,uBAA6B;AAAA,IACjC,MACE;AAAA,MACE;AAAA,MACA;AAAA,MACA,cAAc;AAAA,IAChB;AAAA,IACF,CAAC,sBAAsB,qBAAqB,cAAc,MAAM;AAAA,EAClE;AAEA,QAAM,uBAA6B,gBAAQ,MAAM;AAC/C,QAAI,CAAC,sBAAsB;AACzB,aAAO;AAAA,IACT;AACA,UAAM,IAAI,KAAK,IAAI,cAAc,QAAQ,CAAC;AAC1C,WAAOE,wBAAuB,IAAI;AAAA,EACpC,GAAG,CAAC,sBAAsB,cAAc,QAAQ,mBAAmB,CAAC;AAEpE,QAAM,YAAkB,eAAuB,IAAI;AACnD,QAAM,CAAC,gBAAgB,iBAAiB,IAAU,iBAAS,CAAC;AAE5D,EAAM,wBAAgB,MAAM;AAC1B,UAAM,KAAK,UAAU;AACrB,QAAI,CAAC,GAAI;AACT,UAAM,UAAU,MAAM;AACpB,wBAAkB,GAAG,WAAW;AAAA,IAClC;AACA,YAAQ;AACR,UAAM,KAAK,IAAI,eAAe,OAAO;AACrC,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,QAAM,eAAqB,gBAAQ,MAAM;AACvC,QAAI,yBAAyB,QAAW;AACtC,aAAO,iBAAiB,IAAI,iBAAiB;AAAA,IAC/C;AACA,QAAI,mBAAmB,GAAG;AACxB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,IAAI,sBAAsB,cAAc;AAAA,EACtD,GAAG,CAAC,sBAAsB,cAAc,CAAC;AAEzC,QAAM,qBAA2B,gBAAQ,MAAM;AAC7C,QAAI,mBAAmB,QAAW;AAChC,aAAO;AAAA,IACT;AACA,UAAM,cACJ,sBAAsB,IAClB,sBACAF;AACN,WAAO,KAAK,IAAI,aAAaC,uBAAsB;AAAA,EACrD,GAAG,CAAC,gBAAgB,mBAAmB,CAAC;AAExC,QAAM,cAAoB,gBAAQ,MAAM;AACtC,UAAM,MAAM,qBACR,yBACA;AACJ,WAAO;AAAA,MACL,GAAGE;AAAA,MACH;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EACF,GAAG,CAAC,oBAAoB,eAAe,CAAC;AAExC,QAAM,cAAoB;AAAA,IACxB,OAAO;AAAA,MACL,GAAGC;AAAA,MACH,GAAG;AAAA,IACL;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,QAAM,YAAY,sBAAsB;AAExC,QAAM,aAAa,CAAC,UAClB,gBAAgB,QAAQ,gBAAgB,QACpC,oBACA;AAEN,SACE;AAAA,IAAC,aAAAE;AAAA,IAAA;AAAA,MACC,IAAIP;AAAA,QACF;AAAA,UACE,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,UAClB,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,OAAO;AAAA,UACP,UAAU,yBAAyB,YAAY;AAAA,UAC/C,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA,MAEA,yDAAC,cAAAQ,SAAA,EAAM,SAAS,GAAG,IAAIR,SAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,GACrD;AAAA;AAAA,UAAC,aAAAO;AAAA,UAAA;AAAA,YACC,IAAIP;AAAA,cACF;AAAA,gBACE,UAAU;AAAA,gBACV,OAAO;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEC;AAAA,8BACC;AAAA,gBAAC,aAAAO;AAAA,gBAAA;AAAA,kBACC,IAAI;AAAA,oBACF,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,KAAK;AAAA,oBACL,WAAW;AAAA,oBACX,QAAQ;AAAA,kBACV;AAAA,kBAEC;AAAA;AAAA,cACH,IACE;AAAA,cACJ;AAAA,gBAAC,mBAAAE;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,SAAQ;AAAA,kBACR,IAAIT;AAAA,oBACF;AAAA,sBACE,YAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,WAAW;AAAA,sBACX,OAAO;AAAA,sBACP,IAAI,gBAAgB,IAAI;AAAA,oBAC1B;AAAA,oBACA;AAAA,kBACF;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA;AAAA;AAAA,QACF;AAAA,QACA,8CAAC,gBAAAU,SAAA,EAAQ,IAAIV,SAAQ,EAAE,aAAa,UAAU,GAAG,SAAS,GAAG;AAAA,QAC7D;AAAA,UAAC,aAAAO;AAAA,UAAA;AAAA,YACC,IAAIP;AAAA,cACF;AAAA,gBACE,UAAU;AAAA,gBACV,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,WAAW;AAAA,cACb;AAAA,cACA;AAAA,YACF;AAAA,YAEA;AAAA;AAAA,gBAAC,aAAAO;AAAA,gBAAA;AAAA,kBACC,KAAK;AAAA,kBACL,IAAIP;AAAA,oBACF;AAAA,sBACE,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,WAAW,uBAAuB,SAAS;AAAA,sBAC3C,WAAW;AAAA,sBACX,yBAAyB;AAAA,oBAC3B;AAAA,oBACA;AAAA,kBACF;AAAA,kBAEC,wBAAc,SAAS,IACtB;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,MAAM;AAAA,sBACN,QAAQ;AAAA,sBACR;AAAA,sBACA,YAAY;AAAA,sBACZ,cAAc;AAAA,sBACd,OAAO,EAAE,UAAU,UAAU;AAAA,sBAE7B;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,iBAAgB;AAAA,4BAChB,YAAU;AAAA,4BACV,UAAU;AAAA,4BACV,QAAQ,YAAY;AAAA;AAAA,wBACtB;AAAA,wBACA;AAAA,0BAAC;AAAA;AAAA,4BACC,SAAQ;AAAA,4BACR,OAAO;AAAA,4BACP,YAAW;AAAA,4BACX,UAAU;AAAA,4BACV,QAAQ;AAAA,4BACR,YAAY;AAAA,4BACZ,IAAI;AAAA,4BACJ,MAAM,EAAE,UAAU,GAAG;AAAA,4BACrB,UAAU,EAAE,QAAQ,YAAY,gBAAgB;AAAA,4BAChD,UAAU,EAAE,QAAQ,YAAY,mBAAmB;AAAA;AAAA,wBACrD;AAAA,wBACA;AAAA,0BAAC;AAAA;AAAA,4BACC,OAAO;AAAA,4BACP,UAAU;AAAA,4BACV,MAAM,EAAE,UAAU,IAAI,YAAY,IAAI;AAAA,4BACtC,eAAe;AAAA,4BACf,UAAU,EAAE,QAAQ,YAAY,mBAAmB;AAAA,4BACnD,UAAU,EAAE,QAAQ,YAAY,mBAAmB;AAAA;AAAA,wBACrD;AAAA,wBACA;AAAA,0BAAC;AAAA;AAAA,4BACC,QAAQ;AAAA,4BACR,SAAS,CAAC,iBACR;AAAA,8BAAC;AAAA;AAAA,gCACE,GAAG;AAAA,gCACJ,cAAc;AAAA,gCACd,eAAe;AAAA,gCACf,cAAc;AAAA,gCACd;AAAA,gCACA;AAAA,gCACA;AAAA;AAAA,4BACF;AAAA;AAAA,wBAEJ;AAAA,wBACA;AAAA,0BAAC;AAAA;AAAA,4BACC,SAAQ;AAAA,4BACR,MAAM,aAAa;AAAA,4BACnB,MAAM,aAAa;AAAA,4BACnB,cAAc;AAAA,4BACd,cAAc;AAAA,4BAEb;AAAA,4CAAc,IAAI,CAAC,KAAK,UACvB;AAAA,gCAAC;AAAA;AAAA,kCAEC,aAAa,WAAW,KAAK;AAAA;AAAA,gCADxB,KAAK,IAAI,IAAI,IAAI,KAAK;AAAA,8BAE7B,CACD;AAAA,8BACA,qBACC;AAAA,gCAAC;AAAA;AAAA,kCACC,SAAQ;AAAA,kCACR,UAAS;AAAA,kCACT,QAAQ;AAAA,kCACR,MAAM,YAAY;AAAA,kCAClB,UAAU;AAAA,kCACV,OAAO;AAAA,kCACP,WAAW,WAASM,gBAAe,OAAO,KAAK,CAAC;AAAA;AAAA,8BAClD,IACE;AAAA;AAAA;AAAA,wBACN;AAAA,wBACA;AAAA,0BAAC;AAAA;AAAA,4BACC,SAAQ;AAAA,4BACR,MAAM,aAAa;AAAA,4BACnB,MAAM,aAAa;AAAA,4BACnB,cAAc;AAAA,4BACd,cAAc;AAAA,4BAEb;AAAA,4CAAc,IAAI,CAAC,KAAK,UACvB;AAAA,gCAAC;AAAA;AAAA,kCAEC,aAAa,WAAW,KAAK;AAAA;AAAA,gCADxB,KAAK,IAAI,IAAI,IAAI,KAAK;AAAA,8BAE7B,CACD;AAAA,8BACA,qBACC;AAAA,gCAAC;AAAA;AAAA,kCACC,SAAQ;AAAA,kCACR,UAAS;AAAA,kCACT,QAAQ;AAAA,kCACR,MAAM,YAAY;AAAA,kCAClB,UAAU;AAAA,kCACV,OAAO;AAAA,kCACP,WAAW,WAASA,gBAAe,OAAO,KAAK,CAAC;AAAA;AAAA,8BAClD,IACE;AAAA;AAAA;AAAA,wBACN;AAAA;AAAA;AAAA,kBACF,IAEA;AAAA,oBAAC,aAAAC;AAAA,oBAAA;AAAA,sBACC,IAAIP;AAAA,wBACF;AAAA,0BACE,QAAQ;AAAA,0BACR,SAAS;AAAA,0BACT,YAAY;AAAA,0BACZ,gBAAgB;AAAA,wBAClB;AAAA,wBACA;AAAA,sBACF;AAAA,sBAEA;AAAA,wBAAC,mBAAAS;AAAA,wBAAA;AAAA,0BACC,SAAQ;AAAA,0BACR,OAAM;AAAA,0BACN,IAAI;AAAA,0BAEH;AAAA;AAAA,sBACH;AAAA;AAAA,kBACF;AAAA;AAAA,cAEJ;AAAA,cACC,cAAc,cAAc,SAAS,IACpC;AAAA,gBAAC,aAAAF;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,IAAIP;AAAA,oBACF;AAAA,sBACE,UAAU;AAAA,sBACV,KAAK;AAAA,sBACL,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,WAAW;AAAA,sBACX,GAAG;AAAA,sBACH,GAAG;AAAA,sBACH,IAAI;AAAA,sBACJ,SAAS;AAAA,sBACT,eAAe;AAAA,sBACf,UAAU;AAAA,sBACV,YAAY;AAAA,sBACZ,gBAAgB;AAAA,sBAChB,KAAK;AAAA,sBACL,eAAe;AAAA,oBACjB;AAAA,oBACA;AAAA,kBACF;AAAA,kBAEA;AAAA;AAAA,sBAAC,aAAAO;AAAA,sBAAA;AAAA,wBACC,WAAU;AAAA,wBACV,IAAIP;AAAA,0BACF;AAAA,4BACE,SAAS;AAAA,4BACT,YAAY;AAAA,4BACZ,KAAK;AAAA,4BACL,YAAY;AAAA,0BACd;AAAA,0BACA;AAAA,wBACF;AAAA,wBAEA;AAAA;AAAA,4BAAC,aAAAO;AAAA,4BAAA;AAAA,8BACC,IAAIP;AAAA,gCACF;AAAA,kCACE,OAAO;AAAA,kCACP,QAAQ;AAAA,kCACR,cAAc;AAAA,kCACd,SAAS,aAAa;AAAA,kCACtB,YAAY;AAAA,gCACd;AAAA,gCACA;AAAA,8BACF;AAAA;AAAA,0BACF;AAAA,0BACA;AAAA,4BAAC,mBAAAS;AAAA,4BAAA;AAAA,8BACC,WAAU;AAAA,8BACV,IAAIT;AAAA,gCACF;AAAA,kCACE,UAAU;AAAA,kCACV,YAAY;AAAA,kCACZ,OAAO;AAAA,kCACP,YAAY;AAAA,gCACd;AAAA,gCACA;AAAA,8BACF;AAAA,8BAEC,uBAAa;AAAA;AAAA,0BAChB;AAAA;AAAA;AAAA,oBACF;AAAA,oBACA;AAAA,sBAAC,aAAAO;AAAA,sBAAA;AAAA,wBACC,WAAU;AAAA,wBACV,IAAIP;AAAA,0BACF;AAAA,4BACE,SAAS;AAAA,4BACT,YAAY;AAAA,4BACZ,KAAK;AAAA,4BACL,YAAY;AAAA,0BACd;AAAA,0BACA;AAAA,wBACF;AAAA,wBAEA;AAAA;AAAA,4BAAC,aAAAO;AAAA,4BAAA;AAAA,8BACC,IAAIP;AAAA,gCACF;AAAA,kCACE,OAAO;AAAA,kCACP,QAAQ;AAAA,kCACR,cAAc;AAAA,kCACd,SAAS,aAAa;AAAA,kCACtB,YAAY;AAAA,gCACd;AAAA,gCACA;AAAA,8BACF;AAAA;AAAA,0BACF;AAAA,0BACA;AAAA,4BAAC,mBAAAS;AAAA,4BAAA;AAAA,8BACC,WAAU;AAAA,8BACV,IAAIT;AAAA,gCACF;AAAA,kCACE,UAAU;AAAA,kCACV,YAAY;AAAA,kCACZ,OAAO;AAAA,kCACP,YAAY;AAAA,gCACd;AAAA,gCACA;AAAA,8BACF;AAAA,8BAEC,uBAAa;AAAA;AAAA,0BAChB;AAAA;AAAA;AAAA,oBACF;AAAA;AAAA;AAAA,cACF,IACE;AAAA;AAAA;AAAA,QACN;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AC7tBA,IAAAW,eAAgB;AAChB,IAAAC,kBAAoB;AACpB,IAAAC,iBAAkB;AAClB,IAAAC,qBAAuB;AAEvB,IAAAC,UAAuB;AACvB,IAAAC,mBAUO;;;AChBP,IAAAC,UAAuB;AAMhB,SAAS,wBACd,WACA,SAOM;AACN,QAAM,EAAE,SAAS,sBAAsB,YAAY,YAAY,IAAI;AAEnE,EAAM,wBAAgB,MAAM;AAC1B,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,QAAI,CAAC,sBAAsB;AACzB;AAAA,IACF;AACA,QAAI,eAAe,GAAG;AACpB;AAAA,IACF;AACA,UAAM,KAAK,UAAU;AACrB,QAAI,CAAC,IAAI;AACP;AAAA,IACF;AACA,UAAM,cAAc,MAAY;AAC9B,SAAG,aAAa,KAAK,IAAI,GAAG,GAAG,cAAc,GAAG,WAAW;AAAA,IAC7D;AACA,gBAAY;AACZ,0BAAsB,WAAW;AAAA,EACnC,GAAG,CAAC,SAAS,sBAAsB,YAAY,WAAW,CAAC;AAC7D;;;ADoEI,IAAAC,uBAAA;AA/EJ,IAAM,eAAe;AACrB,IAAM,cAAc;AACpB,IAAM,iBAAiB;AAEvB,SAASC,UACP,MACA,UACqB;AACrB,SAAO,WAAW,EAAE,GAAG,MAAM,GAAG,SAAS,IAAI;AAC/C;AAEA,SAASC,SACP,SACG,OACa;AAChB,QAAM,OAAO,MACV,OAAO,CAAC,MAA2B,MAAM,MAAS,EAClD,QAAQ,OAAM,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,CAAE;AAC5C,SAAO,CAAC,MAAM,GAAG,IAAI;AACvB;AAEA,SAASC,gBAAe,OAAuB;AAC7C,MAAI,QAAQ,KAAM;AAChB,WAAO,IAAI,QAAQ,KAAM,QAAQ,CAAC,CAAC;AAAA,EACrC;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAASC,wBAAuB,OAAuB;AACrD,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,MAAI,OAAO,KAAM;AACf,UAAM,IAAI,QAAQ;AAClB,UAAM,OAAO,OAAO,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;AAC1D,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO,OAAO,KAAK;AACrB;AAUA,SAASC,OAAM,GAAoD;AACjE,MAAI,MAAM,OAAW,QAAO;AAC5B,SAAO,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC;AAC7C;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiD;AAC/C,QAAM,KAAKA,OAAM,CAAC;AAClB,QAAM,KAAKA,OAAM,CAAC;AAClB,QAAM,KAAKA,OAAM,KAAK;AACtB,MAAI,OAAO,UAAa,OAAO,UAAa,OAAO,QAAW;AAC5D,WAAO;AAAA,EACT;AACA,QAAM,IACJ,UAAU,QAAQ,UAAU,SACxB,MACA,OAAO,UAAU,WACf,QACA,OAAO,KAAK;AACpB,MAAI,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,GAAG;AACjC,WAAO;AAAA,EACT;AACA,QAAM,KAAK,KAAK,KAAK;AACrB,QAAM,KAAK,KAAK;AAChB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,YAAW;AAAA,MAEV,UAAAF,gBAAe,CAAC;AAAA;AAAA,EACnB;AAEJ;AAEA,SAAS,wBACP,SACmC;AACnC,QAAM,MAAM,UAAU,CAAC,GAAG;AAC1B,MACE,OACA,OAAO,QAAQ,YACf,gBAAgB,OAChB,eAAe,KACf;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAcA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsD;AACpD,MAAI,CAAC,UAAU,CAAC,SAAS,UAAU,UAAU,QAAW;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,wBAAwB,OAAO;AAC7C,QAAM,gBAAgB,QAAQ;AAAA,IAC5B,CAAC,MAA2B,OAAO,EAAE,OAAO,MAAM;AAAA,EACpD;AACA,QAAM,YAAY,QAAQ;AAAA,IACxB,CAAC,MAA2B,OAAO,EAAE,OAAO,MAAM;AAAA,EACpD;AACA,QAAM,WAAW,OAAO,eAAe,SAAS,CAAC;AACjD,QAAM,UAAU,OAAO,WAAW,SAAS,CAAC;AAC5C,QAAM,UAAU,WAAW;AAE3B,QAAM,cACJ,OAAO,kBAAkB,UAAa,MAAM,kBAAkB,KAC1D,MAAM,gBACN,OAAO,KAAK;AAElB,QAAM,UAAU,OAAO;AACvB,QAAM,aACJ,OAAO,YAAY,YAAY,OAAO,SAAS,OAAO,IAAI,UAAU;AACtE,QAAM,WAAW,qBAAqB,OAAO,SAAS,UAAU;AAEhE,QAAM,KAAK;AACX,QAAM,UAA+B;AAAA,IACnC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AACA,QAAM,aAAaF;AAAA,IACjB,EAAE,OAAO,WAAW,UAAU,IAAI,YAAY,IAAI;AAAA,IAClD,IAAI;AAAA,EACN;AACA,QAAM,aAAaA;AAAA,IACjB,EAAE,OAAO,WAAW,UAAU,IAAI,YAAY,IAAI;AAAA,IAClD,IAAI;AAAA,EACN;AACA,QAAM,UAAUA;AAAA,IACd;AAAA,MACE,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,IACA,IAAI;AAAA,EACN;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAOA;AAAA,QACL;AAAA,UACE,iBAAiB;AAAA,UACjB,cAAc;AAAA,UACd,SAAS;AAAA,UACT,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,QAAQ;AAAA,QACV;AAAA,QACA,IAAI;AAAA,MACN;AAAA,MAEA;AAAA,uDAAC,SAAI,OAAOA,UAAS,SAAS,IAAI,GAAG,GACnC;AAAA,yDAAC,UAAK,OAAO,YAAa;AAAA;AAAA,YAAU;AAAA,aAAC;AAAA,UACrC,8CAAC,UAAK,OAAO,YAAa,uBAAY;AAAA,WACxC;AAAA,QACA,+CAAC,SAAI,OAAOA,UAAS,SAAS,IAAI,GAAG,GACnC;AAAA,yDAAC,UAAK,OAAO,YAAa;AAAA;AAAA,YAAa;AAAA,aAAC;AAAA,UACxC,8CAAC,UAAK,OAAO,YAAa,kBAAQ,eAAe,GAAE;AAAA,WACrD;AAAA,QACA,+CAAC,SAAI,OAAOA,UAAS,SAAS,IAAI,GAAG,GACnC;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA,UAAS,EAAE,GAAG,SAAS,iBAAiB,OAAO,QAAQ,CAAC;AAAA;AAAA,UACjE;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA;AAAA,gBACL,EAAE,OAAO,WAAW,UAAU,IAAI,YAAY,IAAI;AAAA,gBAClD,IAAI;AAAA,cACN;AAAA,cAEC;AAAA;AAAA,gBAAa;AAAA;AAAA;AAAA,UAChB;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA;AAAA,gBACL,EAAE,OAAO,WAAW,UAAU,IAAI,YAAY,IAAI;AAAA,gBAClD,IAAI;AAAA,cACN;AAAA,cAEC,kBAAQ,eAAe;AAAA;AAAA,UAC1B;AAAA,WACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAOA;AAAA,cACL,EAAE,GAAG,SAAS,cAAc,WAAW,IAAI,EAAE;AAAA,cAC7C,IAAI;AAAA,YACN;AAAA,YAEA;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAOA,UAAS,EAAE,GAAG,SAAS,iBAAiB,OAAO,SAAS,CAAC;AAAA;AAAA,cAClE;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAOA;AAAA,oBACL,EAAE,OAAO,WAAW,UAAU,IAAI,YAAY,IAAI;AAAA,oBAClD,IAAI;AAAA,kBACN;AAAA,kBAEC;AAAA;AAAA,oBAAc;AAAA;AAAA;AAAA,cACjB;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAOA;AAAA,oBACL,EAAE,OAAO,WAAW,UAAU,IAAI,YAAY,IAAI;AAAA,oBAClD,IAAI;AAAA,kBACN;AAAA,kBAEC,mBAAS,eAAe;AAAA;AAAA,cAC3B;AAAA;AAAA;AAAA,QACF;AAAA,QACC,WACC,+CAAC,SAAI,OAAOA,UAAS,EAAE,GAAG,SAAS,cAAc,EAAE,GAAG,IAAI,GAAG,GAC3D;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA,UAAS,EAAE,GAAG,SAAS,iBAAiB,OAAO,WAAW,CAAC;AAAA;AAAA,UACpE;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA;AAAA,gBACL,EAAE,OAAO,WAAW,UAAU,IAAI,YAAY,IAAI;AAAA,gBAClD,IAAI;AAAA,cACN;AAAA,cAEC;AAAA;AAAA,gBAAgB;AAAA;AAAA;AAAA,UACnB;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA;AAAA,gBACL,EAAE,OAAO,WAAW,UAAU,IAAI,YAAY,IAAI;AAAA,gBAClD,IAAI;AAAA,cACN;AAAA,cAEC,2BAAiB,UAAU;AAAA;AAAA,UAC9B;AAAA,WACF,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;AAEA,IAAMK,8BAA6B;AACnC,IAAMC,0BAAyB;AAC/B,IAAMC,wBAAuB;AAE7B,IAAMC,sBAAqB;AAAA,EACzB,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AACV;AAEA,IAAMC,0BAAyB;AAC/B,IAAMC,yBAAwB;AAE9B,IAAMC,sBAAqB;AAAA,EACzB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,mBAAmB;AACrB;AAEA,SAAS,+BAA+B,OAAuB;AAC7D,SAAO,GAAG,KAAK,MAAM,KAAK,CAAC;AAC7B;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,WAAW;AAAA,EACX,sBAAsBN;AAAA,EACtB,kBAAkB,uBAAuB;AAAA,EACzC,YAAY;AAAA,EACZ,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA,yBAAyB;AAAA,EACzB,0BAA0B;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,+BAA+B;AACjC,GAA4B;AAC1B,QAAM,CAAC,aAAa,cAAc,IAAU,iBAAwB,IAAI;AAExE,QAAM,sBAA4B,oBAAY,CAAC,GAAY,UAAkB;AAC3E,mBAAe,KAAK;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,wBAA8B,oBAAY,MAAM;AACpD,mBAAe,IAAI;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAsB,gBAAQ,MAAM;AACxC,UAAM,QAAQ,KAAK,IAAI,UAAQ,EAAE,GAAG,IAAI,EAAE;AAC1C,QAAI,CAAC,aAAa,CAAC,sBAAsB;AACvC,aAAO;AAAA,IACT;AACA,UAAM,SAAS,IAAI,IAAI,MAAM,IAAI,OAAK,CAAC,EAAE,MAAM,CAAC,CAAU,CAAC;AAC3D,WAAO,UAAU,IAAI,UAAQ;AAC3B,YAAM,WAAW,OAAO,IAAI,KAAK,IAAI;AACrC,UAAI,SAAU,QAAO;AACrB,aAAO;AAAA,QACL,MAAM,KAAK;AAAA,QACX,eAAe,KAAK,iBAAiB,KAAK;AAAA,QAC1C,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,WAAW,oBAAoB,CAAC;AAE1C,QAAM,oBAA0B;AAAA,IAC9B,MACE,cAAc;AAAA,MACZ,OAAK,OAAO,EAAE,eAAe,YAAY,OAAO,SAAS,EAAE,UAAU;AAAA,IACvE;AAAA,IACF,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,qBACJ,2BAA2B,SACvB,yBACA;AAEN,QAAM,qBAA2B,gBAAQ,MAAM;AAC7C,QAAI,mBAAmB,QAAW;AAChC,aAAO;AAAA,IACT;AACA,UAAM,cACJ,sBAAsB,IAClB,sBACAA;AAGN,QAAI,eAAe,IAAIC,yBAAwB;AAC7C,aAAO,KAAK,IAAI,aAAaA,uBAAsB;AAAA,IACrD;AACA,UAAM,cAAc,KAAK,IAAI,GAAG,KAAK,MAAO,cAAc,IAAK,IAAI,CAAC;AACpE,WAAO,KAAK,IAAI,aAAa,WAAW;AAAA,EAC1C,GAAG,CAAC,gBAAgB,mBAAmB,CAAC;AAExC,QAAM,uBAA6B,gBAAQ,MAAM;AAC/C,QAAI,uBAAuB,GAAG;AAC5B,aAAO;AAAA,IACT;AACA,QAAI,yBAAyB,OAAO;AAClC,aAAO;AAAA,IACT;AACA,QAAI,yBAAyB,MAAM;AACjC,aAAO;AAAA,IACT;AACA,WAAO,cAAc,SAAS;AAAA,EAChC,GAAG,CAAC,sBAAsB,qBAAqB,cAAc,MAAM,CAAC;AAEpE,QAAM,uBAA6B,gBAAQ,MAAM;AAC/C,QAAI,CAAC,sBAAsB;AACzB,aAAO;AAAA,IACT;AACA,UAAM,IAAI,KAAK,IAAI,cAAc,QAAQ,CAAC;AAC1C,WAAOC,wBAAuB,IAAI;AAAA,EACpC,GAAG,CAAC,sBAAsB,cAAc,QAAQ,mBAAmB,CAAC;AAEpE,QAAM,YAAkB,eAAuB,IAAI;AACnD,QAAM,CAAC,gBAAgB,iBAAiB,IAAU,iBAAS,CAAC;AAE5D,EAAM,wBAAgB,MAAM;AAC1B,UAAM,KAAK,UAAU;AACrB,QAAI,CAAC,GAAI;AACT,UAAM,UAAU,MAAM;AACpB,wBAAkB,GAAG,WAAW;AAAA,IAClC;AACA,YAAQ;AACR,UAAM,KAAK,IAAI,eAAe,OAAO;AACrC,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,0BAAwB,WAAW;AAAA,IACjC,SAAS;AAAA,IACT;AAAA,IACA,YAAY,cAAc;AAAA,IAC1B,aAAa;AAAA,EACf,CAAC;AAED,QAAM,eAAqB,gBAAQ,MAAM;AACvC,QAAI,yBAAyB,QAAW;AACtC,aAAO,iBAAiB,IAAI,iBAAiB;AAAA,IAC/C;AACA,QAAI,mBAAmB,GAAG;AACxB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,IAAI,sBAAsB,cAAc;AAAA,EACtD,GAAG,CAAC,sBAAsB,cAAc,CAAC;AAEzC,QAAM,cAAoB;AAAA,IACxB,OAAgD;AAAA,MAC9C,GAAGI;AAAA,MACH,GAAG;AAAA,IACL;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,QAAM,cAAoB,gBAAQ,MAAM;AACtC,UAAM,MAAM,qBACRF,0BACAC;AACJ,UAAM,QAAQ,qBAAqB,KAAKF,oBAAmB;AAC3D,WAAO;AAAA,MACL,GAAGA;AAAA,MACH;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EACF,GAAG,CAAC,oBAAoB,oBAAoB,eAAe,CAAC;AAE5D,QAAM,YAAY,sBAAsBL;AACxC,QAAM,aAAa,+BAA+BA;AAElD,QAAM,iBAAuB;AAAA,IAC3B,CAAC,UACC,gBAAgB,QAAQ,gBAAgB,QAAQ,IAAI;AAAA,IACtD,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,8BAA8B,uBAAuB;AAC3D,QAAM,+BACJ,wBAAwB;AAE1B,QAAM,cAAoB,gBAAQ,MAAM;AACtC,UAAM,QAKA;AAAA,MACJ;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO,YAAY;AAAA,MACrB;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO,YAAY;AAAA,MACrB;AAAA,IACF;AACA,QAAI,oBAAoB;AACtB,YAAM,KAAK;AAAA,QACT,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO,YAAY;AAAA,QACnB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC,aAAAS;AAAA,IAAA;AAAA,MACC,IAAIX;AAAA,QACF;AAAA,UACE,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,UAClB,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,OAAO;AAAA,UACP,UAAU,yBAAyB,YAAY;AAAA,UAC/C,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA,MAEA,yDAAC,eAAAY,SAAA,EAAM,SAAS,GAAG,IAAIZ,SAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,GACrD;AAAA;AAAA,UAAC,aAAAW;AAAA,UAAA;AAAA,YACC,IAAIX;AAAA,cACF;AAAA,gBACE,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU;AAAA,cACZ;AAAA,cACA;AAAA,YACF;AAAA,YAEA;AAAA;AAAA,gBAAC,mBAAAa;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,SAAQ;AAAA,kBACR,IAAIb;AAAA,oBACF;AAAA,sBACE,YAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,WAAW;AAAA,sBACX,MAAM;AAAA,sBACN,UAAU;AAAA,oBACZ;AAAA,oBACA;AAAA,kBACF;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA,cACC,gBACC,8CAAC,aAAAW,SAAA,EAAI,IAAI,EAAE,YAAY,GAAG,SAAS,QAAQ,YAAY,SAAS,GAC7D,yBACH,IACE;AAAA;AAAA;AAAA,QACN;AAAA,QACA,8CAAC,gBAAAG,SAAA,EAAQ,IAAId,SAAQ,EAAE,aAAa,UAAU,GAAG,SAAS,GAAG;AAAA,QAC5D,cAAc,YAAY,SAAS,IAClC;AAAA,UAAC,aAAAW;AAAA,UAAA;AAAA,YACC,IAAIX;AAAA,cACF;AAAA,gBACE,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,gBAAgB;AAAA,gBAChB,YAAY;AAAA,gBACZ,WAAW,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,gBAC1B,QAAQ;AAAA,gBACR,IAAI;AAAA,gBACJ,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,cACrB;AAAA,cACA;AAAA,YACF;AAAA,YAEC,sBAAY,IAAI,UACf;AAAA,cAAC,eAAAY;AAAA,cAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,YAAW;AAAA,gBACX,IAAIZ,SAAQ,EAAE,KAAK,EAAE,GAAG,YAAY;AAAA,gBAEnC;AAAA,uBAAK,SACJ;AAAA,oBAAC,aAAAW;AAAA,oBAAA;AAAA,sBACC,IAAIX;AAAA,wBACF;AAAA,0BACE,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,YAAY;AAAA,0BACZ,SAAS,KAAK;AAAA,0BACd,cAAc;AAAA,0BACd,WAAW;AAAA,wBACb;AAAA,wBACA;AAAA,sBACF;AAAA;AAAA,kBACF,IAEA;AAAA,oBAAC,aAAAW;AAAA,oBAAA;AAAA,sBACC,IAAIX;AAAA,wBACF;AAAA,0BACE,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,YAAY;AAAA,0BACZ,SAAS,KAAK;AAAA,0BACd,cAAc;AAAA,wBAChB;AAAA,wBACA;AAAA,sBACF;AAAA;AAAA,kBACF;AAAA,kBAEF;AAAA,oBAAC,mBAAAa;AAAA,oBAAA;AAAA,sBACC,IAAIb;AAAA,wBACF;AAAA,0BACE,UAAU;AAAA,0BACV,YAAY;AAAA,0BACZ,OAAO;AAAA,0BACP,YAAY;AAAA,wBACd;AAAA,wBACA;AAAA,sBACF;AAAA,sBAEC,eAAK;AAAA;AAAA,kBACR;AAAA;AAAA;AAAA,cA7CK,KAAK;AAAA,YA8CZ,CACD;AAAA;AAAA,QACH,IACE;AAAA,QACJ;AAAA,UAAC,aAAAW;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,IAAIX;AAAA,cACF;AAAA,gBACE,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,WAAW,uBAAuB,SAAS;AAAA,gBAC3C,WAAW;AAAA,gBACX,yBAAyB;AAAA,cAC3B;AAAA,cACA;AAAA,YACF;AAAA,YAEC,wBAAc,SAAS,IACtB;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,MAAM;AAAA,gBACN,QAAQ;AAAA,gBACR,YAAY;AAAA,gBACZ;AAAA,gBACA,OAAO,EAAE,UAAU,UAAU;AAAA,gBAC7B,cAAc;AAAA,gBAEd;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,iBAAgB;AAAA,sBAChB,YAAU;AAAA,sBACV,UAAU;AAAA,sBACV,QAAQ,YAAY;AAAA;AAAA,kBACtB;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,SAAQ;AAAA,sBACR,OAAO;AAAA,sBACP,YAAW;AAAA,sBACX,UAAU;AAAA,sBACV,QAAQ;AAAA,sBACR,YAAY;AAAA,sBACZ,IAAI;AAAA,sBACJ,MAAM,EAAE,UAAU,GAAG;AAAA,sBACrB,UAAU,EAAE,QAAQ,YAAY,gBAAgB;AAAA,sBAChD,UAAU,EAAE,QAAQ,YAAY,mBAAmB;AAAA;AAAA,kBACrD;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,UAAU;AAAA,sBACV,MAAM,EAAE,UAAU,IAAI,YAAY,IAAI;AAAA,sBACtC,eAAe;AAAA,sBACf,UAAU,EAAE,QAAQ,YAAY,mBAAmB;AAAA,sBACnD,UAAU,EAAE,QAAQ,YAAY,mBAAmB;AAAA,sBACnD,OAAO;AAAA;AAAA,kBACT;AAAA,kBACC,qBACC;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,aAAY;AAAA,sBACZ,UAAU;AAAA,sBACV,MAAM,EAAE,UAAU,IAAI,YAAY,IAAI;AAAA,sBACtC,eAAe;AAAA,sBACf,UAAU,EAAE,QAAQ,YAAY,mBAAmB;AAAA,sBACnD,UAAU,EAAE,QAAQ,YAAY,mBAAmB;AAAA,sBACnD,OAAO;AAAA,sBACN,GAAI,sBACD;AAAA,wBACE,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,OAAO;AAAA,0BACP,UAAU;AAAA,0BACV,QAAQ;AAAA,0BACR,OAAO;AAAA,4BACL,MAAM;AAAA,4BACN,UAAU;AAAA,4BACV,YAAY;AAAA,4BACZ,YAAY;AAAA,0BACd;AAAA,wBACF;AAAA,sBACF,IACA,CAAC;AAAA;AAAA,kBACP,IACE;AAAA,kBACJ;AAAA,oBAAC;AAAA;AAAA,sBACC,QAAQ;AAAA,sBACR,cAAc,EAAE,SAAS,QAAQ,QAAQ,GAAG;AAAA,sBAC5C,SAAS,CAAC,iBACR;AAAA,wBAAC;AAAA;AAAA,0BACE,GAAG;AAAA,0BACJ,WAAW;AAAA,0BACX,cAAc;AAAA,0BACd,cAAc;AAAA,0BACd,eAAe;AAAA,0BACf,iBAAiB;AAAA,0BACjB,kBAAkB;AAAA,0BAClB,QAAQ;AAAA,4BACN,SAAS,YAAY;AAAA,4BACrB,UAAU,YAAY;AAAA,4BACtB,YAAY,YAAY;AAAA,0BAC1B;AAAA,0BACA,mBAAmB;AAAA,0BACnB;AAAA;AAAA,sBACF;AAAA;AAAA,kBAEJ;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,SAAQ;AAAA,sBACR,SAAS;AAAA,sBACT,MAAM;AAAA,sBACN,MAAM,YAAY;AAAA,sBAClB,mBAAmB;AAAA,sBACnB,mBAAmB;AAAA,sBACnB,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,sBACnB,cAAc;AAAA,sBAEb;AAAA,sCAAc,IAAI,CAAC,GAAG,MACrB;AAAA,0BAAC;AAAA;AAAA,4BAEC,MAAM,YAAY;AAAA,4BAClB,aAAa,eAAe,CAAC;AAAA;AAAA,0BAFxB,MAAM,CAAC;AAAA,wBAGd,CACD;AAAA,wBACA,qBACC;AAAA,0BAAC;AAAA;AAAA,4BACC,SAAS,WACP;AAAA,8BAAC;AAAA;AAAA,gCACE,GAAI;AAAA,gCACL,MAAM,YAAY;AAAA;AAAA,4BACpB;AAAA;AAAA,wBAEJ,IACE;AAAA;AAAA;AAAA,kBACN;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,SAAQ;AAAA,sBACR,SAAS;AAAA,sBACT,MAAM;AAAA,sBACN,MAAM,YAAY;AAAA,sBAClB,mBAAmB;AAAA,sBACnB,mBAAmB;AAAA,sBACnB,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,sBACnB,cAAc;AAAA,sBAEb;AAAA,sCAAc,IAAI,CAAC,GAAG,MACrB;AAAA,0BAAC;AAAA;AAAA,4BAEC,MAAM,YAAY;AAAA,4BAClB,aAAa,eAAe,CAAC;AAAA;AAAA,0BAFxB,MAAM,CAAC;AAAA,wBAGd,CACD;AAAA,wBACA,qBACC;AAAA,0BAAC;AAAA;AAAA,4BACC,SAAS,WACP;AAAA,8BAAC;AAAA;AAAA,gCACE,GAAI;AAAA,gCACL,MAAM,YAAY;AAAA;AAAA,4BACpB;AAAA;AAAA,wBAEJ,IACE;AAAA;AAAA;AAAA,kBACN;AAAA,kBACC,qBACC;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,SAAQ;AAAA,sBACR,MAAM;AAAA,sBACN,SAAS;AAAA,sBACT,MAAM;AAAA,sBACN,QAAQ,YAAY;AAAA,sBACpB,aAAa;AAAA,sBACb,KAAK;AAAA,wBACH,GAAG;AAAA,wBACH,MAAM,YAAY;AAAA,wBAClB,aAAa;AAAA,sBACf;AAAA,sBACA,cAAc;AAAA,sBACd,mBAAmB;AAAA,sBACnB,mBAAmB;AAAA;AAAA,kBACrB,IACE;AAAA;AAAA;AAAA,YACN,IAEA;AAAA,cAAC,aAAAW;AAAA,cAAA;AAAA,gBACC,IAAIX;AAAA,kBACF;AAAA,oBACE,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,kBAClB;AAAA,kBACA;AAAA,gBACF;AAAA,gBAEA;AAAA,kBAAC,mBAAAa;AAAA,kBAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,OAAM;AAAA,oBACN,IAAI;AAAA,oBAEH;AAAA;AAAA,gBACH;AAAA;AAAA,YACF;AAAA;AAAA,QAEJ;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AEn4BA,IAAAE,eAAgB;AAChB,IAAAC,kBAAoB;AACpB,IAAAC,iBAAkB;AAClB,IAAAC,qBAAuB;AAEvB,IAAAC,UAAuB;AACvB,IAAAC,mBASO;AA6CD,IAAAC,uBAAA;AAnCN,IAAM,mCACJ;AAEF,SAAS,cAAc,MAAiD;AACtE,SAAO,OAAO,SAAS,YAAY,KAAK,KAAK,EAAE,SAAS;AAC1D;AAEA,SAASC,yBACP,SAC8B;AAC9B,QAAM,MAAM,UAAU,CAAC,GAAG;AAC1B,MAAI,OAAO,OAAO,QAAQ,YAAY,aAAa,KAAK;AACtD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,EAAE,UAAU,GAAiC;AACxE,QAAM,KAAK,cAAc,OAAO,YAAY;AAC5C,QAAM,QAAQ,cAAc,OAAO,WAAM;AACzC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AAAA,MACA,eAAW;AAAA,MAEX;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,OAAO;AAAA,YACP,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,WAAW,cAAc,OAAO,SAAY;AAAA,UAC9C;AAAA,UAEC;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;AAEA,IAAM,UAAU;AAChB,IAAM,YAAY;AAElB,SAASC,UACP,MACA,UACqB;AACrB,SAAO,WAAW,EAAE,GAAG,MAAM,GAAG,SAAS,IAAI;AAC/C;AAEA,SAASC,SACP,SACG,OACa;AAChB,QAAM,OAAO,MACV,OAAO,CAAC,MAA2B,MAAM,MAAS,EAClD,QAAQ,OAAM,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,CAAE;AAC5C,SAAO,CAAC,MAAM,GAAG,IAAI;AACvB;AAEA,SAASC,gBAAe,OAAuB;AAC7C,MAAI,QAAQ,KAAM;AAChB,WAAO,IAAI,QAAQ,KAAM,QAAQ,CAAC,CAAC;AAAA,EACrC;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAASC,wBAAuB,OAAuB;AACrD,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,MAAI,OAAO,KAAM;AACf,UAAM,IAAI,QAAQ;AAClB,UAAM,OAAO,OAAO,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;AAC1D,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO,OAAO,KAAK;AACrB;AAUA,SAASC,OAAM,GAAoD;AACjE,MAAI,MAAM,OAAW,QAAO;AAC5B,SAAO,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC;AAC7C;AAEA,SAASC,aAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiD;AAC/C,QAAM,KAAKD,OAAM,CAAC;AAClB,QAAM,KAAKA,OAAM,CAAC;AAClB,QAAM,KAAKA,OAAM,KAAK;AACtB,MAAI,OAAO,UAAa,OAAO,UAAa,OAAO,QAAW;AAC5D,WAAO;AAAA,EACT;AACA,QAAM,IACJ,UAAU,QAAQ,UAAU,SACxB,MACA,OAAO,UAAU,WACf,QACA,OAAO,KAAK;AACpB,MAAI,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,GAAG;AACjC,WAAO;AAAA,EACT;AACA,QAAM,KAAK,KAAK,KAAK;AACrB,QAAM,KAAK,KAAK;AAChB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,YAAW;AAAA,MAEV,UAAAF,gBAAe,CAAC;AAAA;AAAA,EACnB;AAEJ;AAcA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmD;AACjD,MAAI,CAAC,UAAU,CAAC,SAAS,UAAU,UAAU,QAAW;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,QAAQH,yBAAwB,OAAO;AAE7C,QAAM,WAAW,QAAQ;AAAA,IACvB,CAAC,MAA2B,OAAO,EAAE,OAAO,MAAM;AAAA,EACpD;AACA,QAAM,YAAY,gBACd,QAAQ,KAAK,CAAC,MAA2B,OAAO,EAAE,OAAO,MAAM,SAAS,IACxE;AAEJ,QAAM,OAAO,OAAO,UAAU,SAAS,CAAC;AACxC,QAAM,WAAW,WAAW;AAC5B,QAAM,QACJ,OAAO,aAAa,WAChB,WACA,aAAa,QAAQ,aAAa,SAChC,MACA,OAAO,QAAQ;AAEvB,QAAM,cACJ,OAAO,kBAAkB,UAAa,MAAM,kBAAkB,KAC1D,MAAM,gBACN,OAAO,KAAK;AAElB,QAAM,YAAY,OAAO;AACzB,QAAM,SACJ,OAAO,cAAc,YAAY,OAAO,SAAS,SAAS,IACtD,YACA;AACN,QAAM,gBAAgB,OAAO,SAAS,MAAM;AAC5C,QAAM,kBAAwC,CAAC,gBAC3C,OACA,SAAS,IACP,OACA,SAAS,IACP,SACA;AAER,QAAM,aAAa,cAAc,UAAU;AAC3C,QAAM,aACJ,cAAc,OAAO,eAAe,WAAW,WAAW,KAAK,IAAI;AAErE,QAAM,KAAK;AACX,QAAM,UAA+B;AAAA,IACnC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAEA,QAAM,aAAaC;AAAA,IACjB,EAAE,OAAO,WAAW,UAAU,IAAI,YAAY,IAAI;AAAA,IAClD,IAAI;AAAA,EACN;AACA,QAAM,aAAaA;AAAA,IACjB,EAAE,OAAO,WAAW,UAAU,IAAI,YAAY,IAAI;AAAA,IAClD,IAAI;AAAA,EACN;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAOA;AAAA,QACL;AAAA,UACE,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,QACd;AAAA,QACA,IAAI;AAAA,MACN;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,MAAM;AAAA,cACN,KAAK;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,cAAc;AAAA,cACd,aAAa;AAAA,cACb,QAAQ;AAAA,cACR,QAAQ;AAAA,YACV;AAAA,YACA,eAAW;AAAA;AAAA,QACb;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAOA;AAAA,cACL;AAAA,gBACE,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,iBAAiB;AAAA,gBACjB,cAAc;AAAA,gBACd,SAAS;AAAA,gBACT,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,WAAW;AAAA,gBACX,QAAQ;AAAA,cACV;AAAA,cACA,IAAI;AAAA,YACN;AAAA,YAEA;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAOA;AAAA,oBACL;AAAA,sBACE,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,KAAK;AAAA,sBACL,cAAc;AAAA,oBAChB;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,kBAEA;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAOA;AAAA,0BACL;AAAA,4BACE,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR,cAAc;AAAA,4BACd,iBAAiB;AAAA,4BACjB,YAAY;AAAA,0BACd;AAAA,0BACA,IAAI;AAAA,wBACN;AAAA;AAAA,oBACF;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAOA;AAAA,0BACL;AAAA,4BACE,OAAO;AAAA,4BACP,UAAU;AAAA,4BACV,YAAY;AAAA,4BACZ,YAAY;AAAA,0BACd;AAAA,0BACA,IAAI;AAAA,wBACN;AAAA,wBAEC;AAAA;AAAA,oBACH;AAAA;AAAA;AAAA,cACF;AAAA,cACA,+CAAC,SAAI,OAAOA,UAAS,SAAS,IAAI,GAAG,GACnC;AAAA,+DAAC,UAAK,OAAO,YAAa;AAAA;AAAA,kBAAU;AAAA,mBAAC;AAAA,gBACrC,8CAAC,UAAK,OAAO,YAAa,uBAAY;AAAA,iBACxC;AAAA,cACA,+CAAC,SAAI,OAAOA,UAAS,SAAS,IAAI,GAAG,GACnC;AAAA,+DAAC,UAAK,OAAO,YAAa;AAAA;AAAA,kBAAiB;AAAA,mBAAC;AAAA,gBAC5C,8CAAC,UAAK,OAAO,YACV,iBAAO,SAAS,IAAI,IAAI,KAAK,eAAe,IAAI,UACnD;AAAA,iBACF;AAAA,cACC,iBAAiB,OAAO,SAAS,KAAK,IACrC,+CAAC,SAAI,OAAOA,UAAS,SAAS,IAAI,GAAG,GACnC;AAAA,+DAAC,UAAK,OAAO,YAAa;AAAA;AAAA,kBAAc;AAAA,mBAAC;AAAA,gBACzC,8CAAC,UAAK,OAAO,YAAa,gBAAM,eAAe,GAAE;AAAA,iBACnD,IACE;AAAA,cACH,gBACC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAOA;AAAA,oBACL;AAAA,sBACE,GAAG;AAAA,sBACH,YAAY;AAAA,sBACZ,cAAc,aAAa,IAAI;AAAA,oBACjC;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,kBAEA;AAAA,mEAAC,UAAK,OAAO,YAAa;AAAA;AAAA,sBAAY;AAAA,uBAAC;AAAA,oBACvC,8CAAC,UAAK,OAAO,YACV,aAAG,OAAO,UAAU,MAAM,IAAI,OAAO,MAAM,IAAI,OAAO,QAAQ,CAAC,CAAC,KACnE;AAAA,oBACC,kBACC,8CAAC,uBAAoB,WAAW,iBAAiB,IAC/C;AAAA;AAAA;AAAA,cACN,IACE;AAAA,cACH,aACC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAOA;AAAA,oBACL;AAAA,sBACE,QAAQ;AAAA,sBACR,YAAY;AAAA,sBACZ,WAAW;AAAA,sBACX,OAAO;AAAA,sBACP,UAAU;AAAA,sBACV,WAAW;AAAA,sBACX,YAAY;AAAA,oBACd;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,kBAEC;AAAA;AAAA,cACH,IACE;AAAA;AAAA;AAAA,QACN;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAMM,8BAA6B;AACnC,IAAMC,0BAAyB;AAC/B,IAAMC,wBAAuB;AAE7B,IAAMC,sBAAqB;AAAA,EACzB,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AACV;AAEA,IAAMC,0BAAyB;AAC/B,IAAMC,yBAAwB;AAE9B,IAAMC,sBAAqB;AAAA,EACzB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,mBAAmB;AACrB;AAEO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,sBAAsBN;AAAA,EACtB,kBAAkB,uBAAuB;AAAA,EACzC,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,aAAa;AAAA,EACb;AAAA,EACA,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,+BAA+B;AACjC,GAAuB;AACrB,QAAM,oBACJ,0BAA0B,SACtB,mCACA;AAEN,QAAM,gBAAsB;AAAA,IAC1B,MAAM,KAAK,IAAI,UAAQ,EAAE,GAAG,IAAI,EAAE;AAAA,IAClC,CAAC,IAAI;AAAA,EACP;AAEA,QAAM,eAAqB;AAAA,IACzB,MACE,cAAc;AAAA,MACZ,OAAK,OAAO,EAAE,UAAU,YAAY,OAAO,SAAS,EAAE,KAAK;AAAA,IAC7D;AAAA,IACF,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,gBACJ,sBAAsB,SAAY,oBAAoB;AAExD,QAAM,qBAA2B,gBAAQ,MAAM;AAC7C,QAAI,mBAAmB,QAAW;AAChC,aAAO;AAAA,IACT;AACA,UAAM,cACJ,sBAAsB,IAClB,sBACAA;AACN,WAAO,KAAK,IAAI,aAAaC,uBAAsB;AAAA,EACrD,GAAG,CAAC,gBAAgB,mBAAmB,CAAC;AAExC,QAAM,uBAA6B,gBAAQ,MAAM;AAC/C,QAAI,uBAAuB,GAAG;AAC5B,aAAO;AAAA,IACT;AACA,QAAI,yBAAyB,OAAO;AAClC,aAAO;AAAA,IACT;AACA,QAAI,yBAAyB,MAAM;AACjC,aAAO;AAAA,IACT;AACA,WAAO,cAAc,SAAS;AAAA,EAChC,GAAG,CAAC,sBAAsB,qBAAqB,cAAc,MAAM,CAAC;AAEpE,QAAM,uBAA6B,gBAAQ,MAAM;AAC/C,QAAI,CAAC,sBAAsB;AACzB,aAAO;AAAA,IACT;AACA,UAAM,IAAI,KAAK,IAAI,cAAc,QAAQ,CAAC;AAC1C,WAAOC,wBAAuB,IAAI;AAAA,EACpC,GAAG,CAAC,sBAAsB,cAAc,QAAQ,mBAAmB,CAAC;AAEpE,QAAM,YAAkB,eAAuB,IAAI;AACnD,QAAM,CAAC,gBAAgB,iBAAiB,IAAU,iBAAS,CAAC;AAE5D,EAAM,wBAAgB,MAAM;AAC1B,UAAM,KAAK,UAAU;AACrB,QAAI,CAAC,GAAI;AACT,UAAM,UAAU,MAAM;AACpB,wBAAkB,GAAG,WAAW;AAAA,IAClC;AACA,YAAQ;AACR,UAAM,KAAK,IAAI,eAAe,OAAO;AACrC,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,0BAAwB,WAAW;AAAA,IACjC,SAAS;AAAA,IACT;AAAA,IACA,YAAY,cAAc;AAAA,IAC1B,aAAa;AAAA,EACf,CAAC;AAED,QAAM,eAAqB,gBAAQ,MAAM;AACvC,QAAI,yBAAyB,QAAW;AACtC,aAAO,iBAAiB,IAAI,iBAAiB;AAAA,IAC/C;AACA,QAAI,mBAAmB,GAAG;AACxB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,IAAI,sBAAsB,cAAc;AAAA,EACtD,GAAG,CAAC,sBAAsB,cAAc,CAAC;AAEzC,QAAM,cAAoB,gBAAQ,MAAM;AACtC,UAAM,MAAM,qBACRE,0BACAC;AACJ,WAAO;AAAA,MACL,GAAGF;AAAA,MACH;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EACF,GAAG,CAAC,oBAAoB,eAAe,CAAC;AAExC,QAAM,cAAoB;AAAA,IACxB,OAAO;AAAA,MACL,GAAGG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,QAAM,QAAQ,sBAAsBT;AAEpC,QAAM,2BACJ,oBAAoB,oBAAoB;AAE1C,QAAM,cAAoB,gBAAQ,MAAM;AACtC,UAAM,QAKA;AAAA,MACJ;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO,YAAY;AAAA,MACrB;AAAA,IACF;AACA,QAAI,iBAAiB,kBAAkB;AACrC,YAAM,KAAK;AAAA,QACT,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO,YAAY;AAAA,QACnB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT,GAAG;AAAA,IACD;AAAA,IACA,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC,aAAAU;AAAA,IAAA;AAAA,MACC,IAAIZ;AAAA,QACF;AAAA,UACE,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,UAClB,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,OAAO;AAAA,UACP,UAAU,yBAAyB,YAAY;AAAA,UAC/C,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA,MAEA,yDAAC,eAAAa,SAAA,EAAM,SAAS,GAAG,IAAIb,SAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,GACrD;AAAA;AAAA,UAAC,aAAAY;AAAA,UAAA;AAAA,YACC,IAAIZ;AAAA,cACF;AAAA,gBACE,UAAU;AAAA,gBACV,OAAO;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEC;AAAA,8BACC;AAAA,gBAAC,aAAAY;AAAA,gBAAA;AAAA,kBACC,IAAI;AAAA,oBACF,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,KAAK;AAAA,oBACL,WAAW;AAAA,oBACX,QAAQ;AAAA,kBACV;AAAA,kBAEC;AAAA;AAAA,cACH,IACE;AAAA,cACJ;AAAA,gBAAC,mBAAAE;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,SAAQ;AAAA,kBACR,IAAId;AAAA,oBACF;AAAA,sBACE,YAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,WAAW;AAAA,sBACX,OAAO;AAAA,sBACP,IAAI,gBAAgB,IAAI;AAAA,oBAC1B;AAAA,oBACA;AAAA,kBACF;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA;AAAA;AAAA,QACF;AAAA,QACA,8CAAC,gBAAAe,SAAA,EAAQ,IAAIf,SAAQ,EAAE,aAAa,UAAU,GAAG,SAAS,GAAG;AAAA,QAC5D,cAAc,YAAY,SAAS,IAClC;AAAA,UAAC,aAAAY;AAAA,UAAA;AAAA,YACC,IAAIZ;AAAA,cACF;AAAA,gBACE,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,gBAAgB;AAAA,gBAChB,YAAY;AAAA,gBACZ,WAAW,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,gBAC1B,QAAQ;AAAA,gBACR,IAAI;AAAA,gBACJ,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,cACrB;AAAA,cACA;AAAA,YACF;AAAA,YAEC,sBAAY,IAAI,UACf;AAAA,cAAC,eAAAa;AAAA,cAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,YAAW;AAAA,gBACX,IAAIb,SAAQ,EAAE,KAAK,EAAE,GAAG,YAAY;AAAA,gBAEnC;AAAA,uBAAK,SACJ;AAAA,oBAAC,aAAAY;AAAA,oBAAA;AAAA,sBACC,IAAIZ;AAAA,wBACF;AAAA,0BACE,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,YAAY;AAAA,0BACZ,SAAS,KAAK;AAAA,0BACd,cAAc;AAAA,0BACd,WAAW;AAAA,wBACb;AAAA,wBACA;AAAA,sBACF;AAAA;AAAA,kBACF,IAEA;AAAA,oBAAC,aAAAY;AAAA,oBAAA;AAAA,sBACC,IAAIZ;AAAA,wBACF;AAAA,0BACE,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,YAAY;AAAA,0BACZ,SAAS,KAAK;AAAA,0BACd,cAAc;AAAA,wBAChB;AAAA,wBACA;AAAA,sBACF;AAAA;AAAA,kBACF;AAAA,kBAEF;AAAA,oBAAC,mBAAAc;AAAA,oBAAA;AAAA,sBACC,IAAId;AAAA,wBACF;AAAA,0BACE,UAAU;AAAA,0BACV,YAAY;AAAA,0BACZ,OAAO;AAAA,0BACP,YAAY;AAAA,wBACd;AAAA,wBACA;AAAA,sBACF;AAAA,sBAEC,eAAK;AAAA;AAAA,kBACR;AAAA;AAAA;AAAA,cA7CK,KAAK;AAAA,YA8CZ,CACD;AAAA;AAAA,QACH,IACE;AAAA,QACJ;AAAA,UAAC,aAAAY;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,IAAIZ;AAAA,cACF;AAAA,gBACE,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,WAAW,uBAAuB,SAAS;AAAA,gBAC3C,WAAW;AAAA,gBACX,yBAAyB;AAAA,cAC3B;AAAA,cACA;AAAA,YACF;AAAA,YAEC,wBAAc,SAAS,IACtB;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,MAAM;AAAA,gBACN,QAAQ;AAAA,gBACR,YAAY;AAAA,gBACZ,OAAO,EAAE,UAAU,UAAU;AAAA,gBAE7B;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,iBAAgB;AAAA,sBAChB,YAAU;AAAA,sBACV,UAAU;AAAA,sBACV,QAAQ,YAAY;AAAA;AAAA,kBACtB;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,OAAO;AAAA,sBACP,YAAW;AAAA,sBACX,UAAU;AAAA,sBACV,QAAQ;AAAA,sBACR,YAAY;AAAA,sBACZ,IAAI;AAAA,sBACJ,MAAM,EAAE,UAAU,GAAG;AAAA,sBACrB,UAAU,EAAE,QAAQ,YAAY,gBAAgB;AAAA,sBAChD,UAAU,EAAE,QAAQ,YAAY,mBAAmB;AAAA;AAAA,kBACrD;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,UAAU;AAAA,sBACV,MAAM,EAAE,UAAU,IAAI,YAAY,IAAI;AAAA,sBACtC,eAAe;AAAA,sBACf,UAAU,EAAE,QAAQ,YAAY,mBAAmB;AAAA,sBACnD,UAAU,EAAE,QAAQ,YAAY,mBAAmB;AAAA;AAAA,kBACrD;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,QAAQ;AAAA,sBACR,cAAc,EAAE,SAAS,QAAQ,QAAQ,GAAG;AAAA,sBAC5C,SAAS,CAAC,iBACR;AAAA,wBAAC;AAAA;AAAA,0BACE,GAAG;AAAA,0BACJ;AAAA,0BACA,WAAW;AAAA,0BACX,kBAAkB;AAAA,0BAClB,eAAe;AAAA,0BACf,aAAa;AAAA,0BACb,YAAY;AAAA,0BACZ;AAAA,0BACA,aAAa,YAAY;AAAA,0BACzB;AAAA;AAAA,sBACF;AAAA;AAAA,kBAEJ;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAS;AAAA,sBACT,MAAM;AAAA,sBACN,MAAM,YAAY;AAAA,sBAClB,mBAAmB;AAAA,sBACnB,mBAAmB;AAAA,sBACnB,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,sBAElB,+BACC;AAAA,wBAAC;AAAA;AAAA,0BACC,SAAS,WACP;AAAA,4BAACI;AAAA,4BAAA;AAAA,8BACE,GAAI;AAAA,8BACL,MAAM,YAAY;AAAA;AAAA,0BACpB;AAAA;AAAA,sBAEJ,IACE;AAAA;AAAA,kBACN;AAAA,kBACC,gBACC;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAM;AAAA,sBACN,SAAS;AAAA,sBACT,MAAM;AAAA,sBACN,QAAQ,YAAY;AAAA,sBACpB,aAAa;AAAA,sBACb,KAAK;AAAA,sBACL,cAAc;AAAA,sBACd,mBAAmB;AAAA,sBACnB,mBAAmB;AAAA;AAAA,kBACrB,IACE;AAAA;AAAA;AAAA,YACN,IAEA;AAAA,cAAC,aAAAQ;AAAA,cAAA;AAAA,gBACC,IAAIZ;AAAA,kBACF;AAAA,oBACE,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,kBAClB;AAAA,kBACA;AAAA,gBACF;AAAA,gBAEA;AAAA,kBAAC,mBAAAc;AAAA,kBAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,OAAM;AAAA,oBACN,IAAI;AAAA,oBAEH;AAAA;AAAA,gBACH;AAAA;AAAA,YACF;AAAA;AAAA,QAEJ;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;ACn1BA,IAAAE,iBAAqB;AACrB,IAAAC,oBASO;AAEP,IAAAC,UAAuB;AACvB,IAAAF,iBAA6C;AAC7C,IAAAG,mBAA6C;;;ACTtC,IAAM,8BAA8B;AAAA,EACzC,UAAU;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AACd;;;ACCA,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,yBAA2D;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,kBAAkB,KAA0C;AACnE,MAAI,OAAO,QAAQ,YAAY,OAAO,SAAS,GAAG,EAAG,QAAO;AAC5D,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,IAAI,OAAO,OAAO,GAAG,EAAE,QAAQ,WAAW,EAAE,CAAC;AACnD,WAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAiD;AACzE,MAAI,SAAS,EAAG,QAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAClC,QAAM,IAAI,KAAK,MAAM,QAAQ,IAAI;AACjC,QAAM,IAAI,KAAK,MAAM,QAAQ,IAAI;AACjC,QAAM,IAAI,KAAK,MAAM,QAAQ,GAAG;AAChC,QAAM,IAAI,QAAQ,IAAI,IAAI;AAC1B,SAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AACpB;AAEA,SAAS,qBACP,UACA,OACmB;AACnB,QAAM,KAAK,cAAc,mBAAmB,QAAQ,CAAC;AACrD,QAAM,WAAmC,MAAM,SAAS,IAAI,CAAC,GAAG,OAAO;AAAA,IACrE,IAAI,GAAG,EAAE,QAAQ,CAAC;AAAA,IAClB,OAAO,EAAE;AAAA,IACT,OAAO,EAAE;AAAA,IACT,OAAO,oBAAoB,CAAC;AAAA,EAC9B,EAAE;AACF,QAAM,QAAQ,MAAM,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;AAChE,SAAO,EAAE,IAAI,OAAO,UAAU,OAAO,SAAS;AAChD;AAEA,SAAS,sBACP,UACA,OACmB;AACnB,QAAM,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,iBAAiB,KAAK;AAC3C,QAAM,KAAK,kBAAkB,mBAAmB,QAAQ,CAAC;AACzD,QAAM,WAAmC,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,OAAO;AAAA,IACvE,IAAI,GAAG,EAAE,QAAQ,CAAC;AAAA,IAClB,OAAO,uBAAuB,CAAC;AAAA,IAC/B;AAAA,IACA,OAAO,oBAAoB,CAAC;AAAA,EAC9B,EAAE;AACF,SAAO,EAAE,IAAI,OAAO,UAAU,OAAO,IAAI,IAAI,IAAI,GAAG,SAAS;AAC/D;AAgBO,SAAS,8BACd,YACA,YACoC;AACpC,MAAI,YAAY;AACd,UAAM,mBAAmB,WAAW,QAAQ,CAAC,GAAG;AAAA,MAC9C,OAAK,kBAAkB,EAAE,aAAa,KAAK,IAAI;AAAA,IACjD;AACA,QAAI,gBAAgB,SAAS,GAAG;AAC9B,YAAM,QAAQ,gBAAgB;AAAA,QAAI,UAChC;AAAA,UACE,KAAK;AAAA,UACL,kBAAkB,KAAK,aAAa,KAAK;AAAA,QAC3C;AAAA,MACF;AACA,YAAM,8BAA8B,gBAAgB;AAAA,QAClD,CAAC,KAAK,SAAS,MAAM,kBAAkB,KAAK,aAAa,KAAK;AAAA,QAC9D;AAAA,MACF;AACA,YAAM,mBAAmB,kBAAkB,WAAW,aAAa,KAAK;AACxE,YAAMC,mBACJ,8BAA8B,IAC1B,8BACA;AACN,YAAM,yBAAyB,WAAW,cAAc;AACxD,YAAMC,cACJ,0BAA0B,yBAAyB,IAC/C,yBACA,gBAAgB;AAEtB,aAAO;AAAA,QACL,aAAa;AAAA,UACX,YAAAA;AAAA,UACA,iBACE,WAAW,cAAc,mBAAmBD;AAAA,QAChD;AAAA,QACA,eAAe;AAAA,UACb,OAAO,GAAG,WAAW,IAAI;AAAA,UACzB;AAAA,UACA,iBAAiB;AAAA,UACjB,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW,cAAc;AAC3B,YAAM,KAAK,WAAW;AACtB,aAAO;AAAA,QACL,aAAa;AAAA,UACX,YAAY,GAAG;AAAA,UACf,iBAAiB,GAAG;AAAA,QACtB;AAAA,QACA,eAAe;AAAA,UACb,OAAO;AAAA,UACP,OAAO,CAAC,qBAAqB,WAAW,MAAM,EAAE,CAAC;AAAA,UACjD,iBAAiB;AAAA,UACjB,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,kBAAkB,WAAW,aAAa,KAAK;AAChE,UAAM,eAAe,WAAW;AAAA,MAC9B,CAAC,GAAG,MAAM,IAAI,kBAAkB,EAAE,aAAa,KAAK;AAAA,MACpD;AAAA,IACF;AACA,UAAMA,mBAAkB,WAAW,IAAI,WAAW;AAClD,UAAMC,cAAa,WAAW;AAE9B,WAAO;AAAA,MACL,aAAa,EAAE,YAAAA,aAAY,iBAAAD,iBAAgB;AAAA,MAC3C,eAAe;AAAA,QACb,OAAO;AAAA,QACP,OAAO,CAAC,sBAAsB,WAAW,MAAMA,gBAAe,CAAC;AAAA,QAC/D,iBAAiB;AAAA,QACjB,mBAAmB;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,WAAW,OAAQ,QAAO;AAE/B,QAAM,kBAAkB,WAAW;AAAA,IACjC,CAAC,GAAG,MAAM,IAAI,kBAAkB,EAAE,aAAa,KAAK;AAAA,IACpD;AAAA,EACF;AACA,QAAM,aAAa,WAAW;AAE9B,SAAO;AAAA,IACL,aAAa,EAAE,YAAY,gBAAgB;AAAA,IAC3C,eAAe;AAAA,MACb,OAAO;AAAA,MACP,OAAO,CAAC,sBAAsB,YAAY,eAAe,CAAC;AAAA,MAC1D,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,IACrB;AAAA,EACF;AACF;;;AClHO,SAAS,sBAAsB,OAAqC;AACzE,SAAO,MAAM,IAAI,QAAM;AAAA,IACrB,GAAG;AAAA,IACH,UAAU,EAAE,MAAM,SAAS,sBAAsB,EAAE,IAAI,IAAI;AAAA,EAC7D,EAAE;AACJ;AAEO,SAAS,eAAe,MAAoC;AACjE,MAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC;AAE3C,QAAM,gBAAgB,CAAC,GAAG,IAAI;AAE9B,QAAM,aAAa,cAAc,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,CAAC;AAC1E,QAAM,YAAY,aAAa;AAE/B,SAAO,cAAc,IAAI,WAAS;AAAA,IAChC,GAAG;AAAA,IACH,eAAe,KAAK;AAAA,IACpB,OAAO,KAAK,IAAI,KAAK,OAAO,SAAS;AAAA,EACvC,EAAE;AACJ;AAEO,SAAS,uBAAuB,OAAqC;AAC1E,MAAI,eAAe,eAAe,KAAK;AACvC,MAAI,gBAAgB;AAEpB,SACE,aAAa,WAAW,KACxB,MAAM,QAAQ,aAAa,CAAC,GAAG,IAAI,KACnC,aAAa,CAAC,EAAE,KAAK,SAAS,KAC9B,gBAAgB,IAChB;AACA,mBAAe,eAAe,aAAa,CAAC,EAAE,IAAI;AAClD,qBAAiB;AAAA,EACnB;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,cAA+B;AAC1D,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,IAAI,OAAO,YAAY,EAC1B,KAAK,EACL,MAAM,UAAU;AAEnB,SAAO,IAAI,OAAO,EAAE,CAAC,CAAC,IAAI;AAC5B;AAEO,SAAS,cAAc,GAA0C;AACtE,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;AAChE;AAEO,SAAS,kBACd,MAC4D;AAC5D,MAAI,CAAC,cAAc,IAAI,EAAG,QAAO;AAGjC,QAAM,YAAY,CAAC,UAAU,SAAS,QAAQ,UAAU,OAAO;AAC/D,aAAW,KAAK,WAAW;AACzB,QAAI,cAAc,KAAK,CAAC,CAAC;AACvB,aAAO,EAAE,KAAK,GAAG,WAAW,KAAK,CAAC,EAA6B;AAAA,EACnE;AAEA,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACzC,QACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,SAAS,CAAC;AAEZ;AACF,QAAI,cAAc,CAAC,EAAG,QAAO,EAAE,KAAK,GAAG,WAAW,EAAE;AAAA,EACtD;AAEA,SAAO;AACT;AAEO,SAAS,cACd,MACA,QACQ;AACR,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,IAAI;AACV,QAAM,OAAO,EAAE;AACf,MAAI,MAAM,kBAAkB,MAAM;AAChC,WAAO,WAAW,YACd,OAAO,KAAK,cAAc,IAC1B,aAAa,KAAK,cAAwB;AAAA,EAChD;AAEA,MAAI,EAAE,kBAAkB,MAAM;AAC5B,WAAO,WAAW,YACd,OAAO,EAAE,cAAc,IACvB,aAAa,EAAE,cAAwB;AAAA,EAC7C;AAEA,MAAI,EAAE,iBAAiB,MAAM;AAC3B,WAAO,WAAW,YACd,OAAO,EAAE,aAAa,IACtB,aAAa,EAAE,cAAwB;AAAA,EAC7C;AAEA,SAAO;AACT;AAGO,SAAS,yBACd,MACiC;AACjC,QAAM,MAAM,KAAK,kBAAkB,KAAK;AACxC,MAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,EAAG,QAAO;AAClE,QAAM,IAAI;AACV,QAAM,aAAa,OAAO,EAAE,eAAe,EAAE,UAAU;AACvD,QAAM,kBAAkB,OAAO,EAAE,oBAAoB,EAAE,eAAe;AACtE,QAAM,SAAS,EAAE;AACjB,MAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,EAAG,QAAO;AAC1D,QAAM,SAAS,OAAO,IAAI,CAAC,MAAM,MAAM;AACrC,UAAM,IAAI;AACV,WAAO;AAAA,MACL,OAAO,OAAO,EAAE,SAAS,WAAW,IAAI,CAAC,EAAE;AAAA,MAC3C,OAAO,OAAO,EAAE,SAAS,CAAC;AAAA,IAC5B;AAAA,EACF,CAAC;AACD,MACE,CAAC,OAAO,SAAS,UAAU,KAC3B,CAAC,OAAO,SAAS,eAAe,KAChC,OAAO,KAAK,OAAK,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,GAC1C;AACA,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,EAC5C;AACF;AAEO,SAAS,UAAU,MAAsB;AAC9C,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,KAAK,IAAI,KAAK,KAAK,WAAW,CAAC,MAAO;AAE5E,QAAM,IAAI,MAAM,IAAI;AACpB,QAAM,IAAI,MAAO,KAAK,IAAK;AAC3B,QAAM,IAAI,MAAO,KAAK,KAAM;AAE5B,QAAM,QAAQ,CAAC,MAAc,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAE3D,SAAO,IAAI,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AAC3C;AAEO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,GAIkB;AAChB,QAAM,UAAU,OAAO,QAAQ,SAAS;AACxC,QAAM,QACJ,QAAQ,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,KAAK;AAEvE,SAAO,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,MAAmB;AAChD,UAAM,MAAM,cAAc,MAAM,MAAM;AACtC,UAAM,aAAc,MAAM,QAAS;AACnC,UAAM,QAAQ,UAAU,GAAG,OAAO,IAAI,IAAI,EAAE;AAE5C,UAAM,iBAAiB,kBAAkB,IAAI;AAC7C,UAAM,IAAI;AACV,UAAM,cAAgD,GAAG,OACpD,EAAE,OACH;AACJ,UAAM,cAAc,GAAG;AACvB,UAAM,WACJ,GAAG,kBAAkB,GAAG,iBAAiB,aAAa,kBAAkB;AAC1E,UAAM,eAAe,yBAAyB,CAAC;AAE/C,WAAO;AAAA,MACL;AAAA,MACA,OAAO;AAAA,MACP,eAAe;AAAA,MACf;AAAA,MACA,aAAa;AAAA,QACX,OACE,OAAO,aAAa,YAAY,OAAO,aAAa,WAChD,WACA;AAAA,QACN,OACG,GAAG,kBAA6B,aAAa,kBAAkB;AAAA,MACpE;AAAA,MACA,MAAM,iBACF,kBAAkB;AAAA,QAChB,WAAW,eAAe;AAAA,QAC1B;AAAA,QACA,SAAS,GAAG,OAAO,IAAI,IAAI;AAAA,MAC7B,CAAC,IACD,CAAC;AAAA,MACL;AAAA,MACA;AAAA,MACA,oBAAoB,gBAAgB;AAAA,MACpC,MAAM;AAAA,IACR;AAAA,EACF,CAAC;AACH;AAEO,SAAS,cACd,SAC2B;AAC3B,MAAI,QAAQ,MAAM,OAAQ,QAAO,QAAQ;AACzC,MAAI,QAAQ,UAAU,OAAQ,QAAO,QAAQ;AAC7C,SAAO;AACT;;;AHnLQ,IAAAE,uBAAA;AAjDR,SAAS,gBAAgB,OAAuB;AAC9C,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,SAAO,IAAI,KAAK,aAAa,OAAO,EAAE,OAAO,KAAK;AACpD;AAEA,SAAS,mBACP,cACA,cACA,WACQ;AACR,QAAM,UAAU,cAAc;AAC9B,MAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,WAAO,QAAQ,eAAe,QAAQ,MAAM,KAAK,aAAa;AAAA,EAChE;AACA,SAAO,aAAa;AACtB;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAMG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,IACE;AAAA,QACE;AAAA,UACE,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,GAAG;AAAA,UACH,UAAU;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,QACZ;AAAA,QACA,GAAI,KAAK,CAAC,EAAE,IAAI,CAAC;AAAA,MACnB;AAAA,MAGF,yDAAC,2BAAM,WAAU,OAAM,YAAW,UAAS,SAAS,KAClD;AAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,YAAY,EAAE;AAAA;AAAA,QACzB;AAAA,QACA,+CAAC,2BAAM,SAAS,MACd;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe;AAAA,cAE5C;AAAA;AAAA,UACH;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,IAAI,EAAE,YAAY,KAAK,YAAY,KAAK,OAAO,eAAe;AAAA,cAE7D,0BAAgB,KAAK;AAAA;AAAA,UACxB;AAAA,WACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,WAAW,KAAK,YAAY,CAAC;AACnC,QAAM,UAAU,SAAS,SAAS;AAClC,QAAM,eAAe,SAAS,OAAO,CAAC,KAAK,QAAQ,MAAM,IAAI,OAAO,CAAC;AACrE,QAAM,QAAQ,KAAK,QAAQ,IAAI,KAAK,QAAQ;AAC5C,QAAM,YAAY,aAAa,IAAI,aAAa;AAChD,QAAM,gBAAgB,KAAK;AAAA,IACzB;AAAA,IACA,KAAK,IAAI,KAAK,YAAY,IAAK,QAAQ,YAAa,MAAM,CAAC;AAAA,EAC7D;AACA,QAAM,YAAY,cAAc,aAAa;AAC7C,QAAM,eAAe,cAAc,gBAAgB;AACnD,QAAM,UAAU,cAAc,wBAAwB;AACtD,SACE,+CAAC,2BAAM,SAAS,MACd;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,YAAW;AAAA,QACX,gBAAe;AAAA,QACf,KAAK;AAAA,QAEL;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,IACE;AAAA,gBACE,EAAE,YAAY,IAAI;AAAA,gBAClB,GAAI,cAAc,iBACd,CAAC,aAAa,cAAc,IAC5B,CAAC;AAAA,cACP;AAAA,cAGD,eAAK;AAAA;AAAA,UACR;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,IACE;AAAA,gBACE,EAAE,YAAY,KAAK,OAAO,iBAAiB;AAAA,gBAC3C,GAAI,cAAc,iBACd,CAAC,aAAa,cAAc,IAC5B,CAAC;AAAA,cACP;AAAA,cAGD,0BAAgB,KAAK,KAAK;AAAA;AAAA,UAC7B;AAAA;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,UACF,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,iBAAiB;AAAA,UACjB,IAAI,GAAG,YAAY;AAAA,UACnB,WAAW;AAAA,QACb;AAAA,QAEC,mBAAS,IAAI,CAAC,SAAS,QAAQ;AAC9B,gBAAM,eACJ,QAAQ,IAAK,QAAQ,QAAQ,QAAS,gBAAgB;AACxD,gBAAM,SAAS,QAAQ;AACvB,gBAAM,OAAO,mBAAmB,cAAc,KAAK,QAAQ,KAAK;AAChE,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OACE;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,UAAU;AAAA,kBACV,QAAQ,cAAc;AAAA;AAAA,cACxB;AAAA,cAEF,iBAAiB;AAAA,cACjB,WAAW;AAAA,gBACT,SAAS;AAAA,kBACP,IAAI;AAAA,gBACN;AAAA,cACF;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAI;AAAA,oBACF,OAAO,GAAG,KAAK,IAAI,GAAG,YAAY,CAAC;AAAA,oBACnC,iBAAiB;AAAA,oBACjB,UAAU,QAAQ,QAAQ,IAAI,IAAI;AAAA,oBAClC,QAAQ;AAAA,oBACR,qBAAqB,QAAQ,IAAI,MAAM;AAAA,oBACvC,wBAAwB,QAAQ,IAAI,MAAM;AAAA,oBAC1C,sBAAsB,SAAS,MAAM;AAAA,oBACrC,yBAAyB,SAAS,MAAM;AAAA,kBAC1C;AAAA;AAAA,cACF;AAAA;AAAA,YA1BK,QAAQ;AAAA,UA2Bf;AAAA,QAEJ,CAAC;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;AAGA,IAAM,+BAA+C;AAAA,EACnD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AACZ;AAEA,IAAM,6BAA6C;AAAA,EACjD,UAAU;AAAA,EACV,SAAS;AAAA,EACT,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AACZ;AAEA,SAAS,yBAAyB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,GAIuB;AACrB,QAAM,mBAAmB,SACpB,CAAC,4BAA4B,MAAM,IACpC;AACJ,SACE,+CAAC,yBAAI,IAAI,kBACP;AAAA,kDAAC,yBAAI,IAAI,EAAE,QAAQ,GAAG,SAAS,YAAY,OAAO,OAAO,GAAG;AAAA,IAC5D;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,UACF,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,IAAI;AAAA,QACN;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAW;AAAA,cACX,IAAI;AAAA,gBACF,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,SAAS;AAAA,gBACT,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,IAAI;AAAA,gBACF,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,OAAO;AAAA,cACT;AAAA,cAEC,kBAAQ;AAAA;AAAA,UACX;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,IAAI;AAAA,gBACF,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,OAAO;AAAA,cACT;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,IAAI;AAAA,gBACF,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,OAAO;AAAA,cACT;AAAA,cAEC,0BAAgB,QAAQ,KAAK;AAAA;AAAA,UAChC;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,SAAS,8BAA8B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,EAAE,aAAa,cAAc,IAAI;AACvC,QAAM,aAAa,KAAK;AAAA,IACtB,YAAY;AAAA,IACZ,GAAG,cAAc,MAAM,IAAI,UAAQ,KAAK,KAAK;AAAA,EAC/C;AACA,QAAM,WAAW,cAAc,qBAAqB;AACpD,QAAM,gBAAgB,cAAc,eAAe,WAAW;AAC9D,QAAM,mBAAmB,kBAAkB;AAE3C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,IACE;AAAA,QACE,EAAE,OAAO,OAAO;AAAA,QAChB,GAAI,UAAU,CAAC,OAAO,IAAI,CAAC;AAAA,QAC3B,GAAI,cAAc,iBACd,CAAC,aAAa,cAAc,IAC5B,CAAC;AAAA,MACP;AAAA,MAGD;AAAA,4BAAoB,cAAc,WAAW,IAAI,OAChD,8CAAC,2BAAM,WAAU,OAAM,SAAS,KAAK,UAAS,QAAO,YAAU,MAC5D,6BACG,cAAc,IAAI,UAChB;AAAA,UAAC;AAAA;AAAA,YAEC,MAAM,KAAK,QAAQ;AAAA,YACnB,OAAO,KAAK;AAAA,YACZ,OAAO,KAAK;AAAA,YACZ,IACE,CAAC,cAAc,YAAY,KAAK,EAAE,EAAE;AAAA,cAClC;AAAA,YACF;AAAA,YAEF,WAAW,KAAK,aAAa;AAAA;AAAA,UATxB,KAAK;AAAA,QAUZ,CACD,IACD;AAAA,UACE;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,OAAM;AAAA,cACN,OAAO,YAAY;AAAA,cACnB,IAAI,cAAc;AAAA,cAClB,WAAW;AAAA;AAAA,YALP;AAAA,UAMN;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,OAAM;AAAA,cACN,OAAO,YAAY;AAAA,cACnB,IAAI,cAAc;AAAA,cAClB,WAAW;AAAA;AAAA,YALP;AAAA,UAMN;AAAA,QACF,GACN;AAAA,QAEF,8CAAC,2BAAM,SAAS,MAAM,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,GACxC,wBAAc,MAAM,IAAI,UACvB;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA;AAAA,YACA;AAAA;AAAA,UAHK,KAAK;AAAA,QAIZ,CACD,GACH;AAAA;AAAA;AAAA,EACF;AAEJ;AAGA,IAAM,mBAA8C;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,oBACP,OACA,OACe;AACf,MAAI,SAAS,EAAG,QAAO;AACvB,SAAO,MAAM,QAAQ,UAAQ,oBAAoB,KAAK,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAC9E;AAEA,SAAS,yBAAyB,OAAqC;AACrE,QAAM,WAAW,MAAM,OAAO,CAAC,KAAK,SAAS,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK;AAC3E,SAAO,MAAM,IAAI,UAAQ;AACvB,UAAM,MAAM,KAAK,QAAQ;AACzB,UAAM,MAAO,MAAM,WAAY;AAC/B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO;AAAA,MACP,eAAe;AAAA,IACjB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAe,MAA2C;AACjE,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,QAAM,MAAM,MAAM,QAAQ,IAAI,IAAI,OAAO,OAAO,IAAI,EAAE,MAAM,GAAG;AAC/D,SAAO,IAAI,IAAI,aAAW,OAAO,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAClE;AAEA,SAAS,iBACP,WACA,eACA,OAA4B,YACN;AACtB,QAAM,WAAW,eAAe,aAAa;AAC7C,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,MAAI,UAAU;AACd,MAAI;AAEJ,aAAW,WAAW,UAAU;AAC9B,UAAM,MAAM,QAAQ,YAAY;AAChC,cAAU,QAAQ;AAAA,MAChB,UAAQ,OAAO,KAAK,IAAI,EAAE,KAAK,EAAE,YAAY,MAAM;AAAA,IACrD;AACA,QAAI,CAAC,QAAS,QAAO;AACrB,cAAU,QAAQ,QAAQ,CAAC;AAAA,EAC7B;AAEA,MAAI,CAAC,QAAS,QAAO;AAErB,MAAI,SAAS,QAAQ;AACnB,WAAO,yBAAyB,CAAC,OAAO,CAAC;AAAA,EAC3C;AAEA,OAAK,QAAQ,QAAQ,CAAC,GAAG,SAAS,GAAG;AACnC,WAAO,yBAAyB,QAAQ,IAAI;AAAA,EAC9C;AAEA,SAAO,yBAAyB,CAAC,OAAO,CAAC;AAC3C;AAEA,SAAS,0BACP,aACA,QACA,gBACA,eACA,oBAAyC,YAC1B;AACf,MAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,UAAM,QAAQ;AACd,UAAM,QACJ,MAAM;AAAA,MACJ,CAAC,KAAK,OACJ,OACC,WAAW,YACR,GAAG,gBACH,aAAa,GAAG,cAAc;AAAA,MACpC;AAAA,IACF,KAAK;AAEP,WAAO,MAAM,IAAI,QAAM;AACrB,YAAM,MACJ,WAAW,YACP,GAAG,gBACH,aAAa,GAAG,cAAc;AACpC,YAAM,aAAc,MAAM,QAAS;AAEnC,aAAO;AAAA,QACL,MAAM,GAAG;AAAA,QACT,OAAO;AAAA,QACP,eAAe;AAAA,QACf,OAAO,UAAU,QAAQ,GAAG,WAAW,EAAE;AAAA,QACzC,aAAa,EAAE,OAAO,GAAG,eAAe,OAAO,GAAG,eAAe;AAAA,QACjE,MAAM,CAAC;AAAA,QACP,aAAa;AAAA,QACb,cAAc;AAAA,UACZ;AAAA,QACF;AAAA,QACA,MAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,eAAe;AACrB,QAAM,eACH,cAAc,WAAW;AAAA,IACxB,KAAK;AAAA,IACL,WAAW,aAAa;AAAA,EAC1B,KACC,cAAc,UAAU;AAAA,IACvB,KAAK;AAAA,IACL,WAAW,aAAa;AAAA,EAC1B,KACC,cAAc,SAAS;AAAA,IACtB,KAAK;AAAA,IACL,WAAW,aAAa;AAAA,EAC1B,KACC,cAAc,QAAQ;AAAA,IACrB,KAAK;AAAA,IACL,WAAW,aAAa;AAAA,EAC1B,KACA;AAEF,MAAI,CAAC,aAAc,QAAO,CAAC;AAE3B,QAAM,YAAY,kBAAkB;AAAA,IAClC,WAAW,aAAa;AAAA,IACxB;AAAA,IACA,SAAS,aAAa;AAAA,EACxB,CAAC;AAED,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,YAAa,QAAO;AAExB,QAAM,SAAS,iBAAiB,QAAQ,aAAa,GAAG;AACxD,QAAM,WAAW,iBAAiB,QAAQ,cAAc;AACxD,MAAI,WAAW,MAAM,aAAa,MAAM,YAAY,QAAQ;AAC1D,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,WAAW;AAC9B,QAAM,YAAY,oBAAoB,WAAW,UAAU;AAC3D,SAAO,yBAAyB,SAAS;AAC3C;AAEA,SAAS,gBACP,MACA,KACQ;AACR,MAAI,SAAS,UAAa,SAAS,QAAQ;AACzC,WAAO,KAAK,IAAI,GAAG,IAAI,YAAY;AAAA,EACrC;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,KAAK,IAAI,GAAG,IAAI;AAAA,EACzB;AACA,SAAO,KAAK,IAAI,GAAG,KAAK,GAAG,CAAC;AAC9B;AAEA,SAAS,iBACP,MACA,WACA,MACQ;AACR,QAAM,IAAI,QAAQ;AAClB,MAAI,MAAM,QAAQ;AAChB,QAAI,SAAS,SAAU,QAAO;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,MAAM,SAAU,QAAO;AAClC,SAAO,EAAE,EAAE,WAAW,KAAK,CAAC;AAC9B;AAKO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA,YAAY;AAAA,EACZ,aAAa;AAAA,EACb;AAAA,EACA,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,aAAa;AAAA,EACb,OAAO;AAAA,EACP,UAAU;AAAA,EACV,WAAW;AAAA,EACX,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AACZ,GAA6B;AAC3B,QAAM,SAAS,UAAU,UAAU;AACnC,QAAM,iBAAiB,UAAU,kBAAkB;AACnD,QAAM,gBAAgB,UAAU;AAChC,QAAM,oBAAoB,UAAU,qBAAqB;AACzD,QAAM,mBAAmB,UAAU,oBAAoB;AACvD,QAAM,4BACJ,UAAU,6BAA6B;AACzC,QAAM,mBAAmB,UAAU;AACnC,QAAM,QAAQ,EAAE,GAAG,6BAA6B,GAAG,UAAU;AAC7D,QAAM,gBAAgB;AAAA,IACpB,sBAAsB,aAAa,wBAAwB;AAAA,IAC3D,yBAAyB,aAAa,2BAA2B;AAAA,IACjE,0BAA0B,aAAa;AAAA,IACvC,uBAAuB,aAAa;AAAA,IACpC,mBAAmB,aAAa;AAAA,IAChC,aAAa,aAAa,eAAe,IAAI;AAAA,IAC7C,QAAQ,aAAa,UAAU;AAAA,IAC/B,MAAM,aAAa,QAAQ;AAAA,EAC7B;AACA,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAoB;AAAA,IAC1C,UAAU,CAAC;AAAA,IACX,SAAS,CAAC;AAAA,EACZ,CAAC;AACD,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,KAAK;AAC9C,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAwB,CAAC,CAAC;AACxE,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAE5C,gCAAU,MAAM;AACd,QAAI,CAAC,aAAa;AAChB,cAAQ,EAAE,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;AACrC,kBAAY,KAAK;AACjB,yBAAmB,CAAC,CAAC;AACrB;AAAA,IACF;AAEA,eAAW,IAAI;AACf,UAAM,QAAQ,mBACV,iBAAiB,aAAa,EAAE,OAAO,CAAC,IACxC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACJ,UAAM,YAAY,4BACd,uBAAuB,KAAK,IAC5B,eAAe,KAAK;AACxB,YAAQ,EAAE,UAAU,CAAC,GAAG,SAAS,UAAU,CAAC;AAC5C,gBAAY,KAAK;AACjB,uBAAmB,CAAC,CAAC;AACrB,eAAW,KAAK;AAAA,EAClB,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,sBAAkB,wBAAQ,MAAM;AACpC,QAAI,aAAa,WAAW,CAAC,YAAa,QAAO;AACjD,UAAM,qBACJ,gBAAgB,SAAS,IACrB,gBAAgB,gBAAgB,SAAS,CAAC,IAC1C;AACN,WAAO;AAAA,MACL;AAAA,MACA,KAAK,WAAW,CAAC;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,WAAW,SAAS,aAAa,iBAAiB,IAAI,CAAC;AAE3D,QAAM,mBAAmB,CAAC,UAAkB;AAC1C,QAAI,OAAO,UAAU,SAAU,QAAO;AACtC,UAAM,YAAY,MAAM,QAAQ,CAAC;AACjC,UAAM,UAAU,UAAU,QAAQ,UAAU,EAAE;AAC9C,WAAO,GAAG,OAAO;AAAA,EACnB;AAEA,QAAM,0BAA0B,CAC9B,UACuB;AACvB,UAAM,IAAI,MAAM;AAChB,UAAM,IAAI,MAAM;AAChB,UAAM,QAAQ,MAAM;AACpB,UAAM,SAAS,MAAM;AACrB,UAAM,OAAO,MAAM;AACnB,UAAM,QAAQ,MAAM;AACpB,UAAM,UACH,OAAO,WAAuD;AACjE,UAAM,QAAS,QAAsC,WAAW;AAChE,UAAM,gBACH,OAAuB,iBACxB,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,YACH,OAAuB,SACvB,OAAO,SACP,OAAO,QACR,UAAU,OAAO,QAAQ,SAAS,EAAE,CAAC;AAEvC,UAAM,cAAc,MAAM;AACxB,YAAMC,KAAI;AACV,yBAAmB,SAAO;AACxB,cAAM,gBAAgB,KAAK,SAAS;AACpC,cAAM,iBAAiB,IAAI,MAAM,GAAG,aAAa;AACjD,eAAO,CAAC,GAAG,gBAAgBA,EAAC;AAAA,MAC9B,CAAC;AAED,YAAM,SAAS,cAAcA,EAAC;AAC9B,YAAM,oBAAoB,QAAQ,QAAQ,MAAM;AAChD,YAAM,gBAAgBA,IAAG,uBAAuB;AAChD,YAAM,oBACJ,qBAAqB,cAAc,CAAC,qBAAqB;AAC3D,YAAM,oBAAoB,qBAAqB,CAAC;AAEhD,UAAI,mBAAmB;AACrB,oBAAY,KAAK;AACjB,gBAAQ;AAAA,UACN,UAAU,CAAC,CAAC,GAAG,KAAK,OAAO,GAAG,GAAG,KAAK,QAAQ;AAAA,UAC9C,SAAS,4BACL,uBAAuB,UAAU,CAAC,CAAC,IACnC,eAAe,UAAU,CAAC,CAAC;AAAA,QACjC,CAAC;AACD;AAAA,MACF;AAEA,UAAI,mBAAmB;AACrB,oBAAY,IAAI;AAChB,gBAAQ;AAAA,UACN,UAAU,CAAC,CAAC,GAAG,KAAK,OAAO,GAAG,GAAG,KAAK,QAAQ;AAAA,UAC9C,SAAS,CAAC;AAAA,QACZ,CAAC;AACD;AAAA,MACF;AAEA,YAAM,6BACJ,CAAC,qBACD,KAAK,QAAQ,WAAW,KACxB,OAAO,KAAK,QAAQ,CAAC,GAAG,QAAQ,EAAE,MAAM,OAAOA,IAAG,QAAQ,EAAE;AAC9D,UAAI,2BAA4B;AAEhC,kBAAY,KAAK;AACjB,cAAQ;AAAA,QACN,UAAU,CAAC,CAAC,GAAG,KAAK,OAAO,GAAG,GAAG,KAAK,QAAQ;AAAA,QAC9C,SAAS,eAAe,CAACA,EAAC,CAAC;AAAA,MAC7B,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,KAAK,IAAI,OAAO,MAAM;AACrC,UAAM,eAAe,KAAK,KAAK,QAAQ,MAAM;AAC7C,UAAM,UAAU,SAAS;AACzB,UAAM,UAAU,UAAU;AAE1B,UAAM,WAAW,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1E,UAAM,eAAe,KAAK,IAAI,IAAI,WAAW,CAAC;AAC9C,UAAM,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,SAAS,KAAK,CAAC;AAEzD,UAAM,UAAU,CACd,UACoC;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,iBAAiB,gBAAgB,cAAc,QAAQ,UAAU,CAAC;AACxE,UAAM,cAAc,gBAAgB,cAAc,QAAQ,OAAO,CAAC;AAClE,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,iBAAiB,iBAAiB,eAAe,WAAW,OAAO;AAEzE,UAAM,IAAI;AAEV,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,EAAE,cAAc,QAAQ,UAAU,SAAS;AAAA,QAElD;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAW,OAAK;AACd,kBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,IAAK,aAAY;AAAA,YACtD;AAAA,YACA,MAAK;AAAA,YACL,UAAU;AAAA,YACV,IAAI;AAAA,cACF,iBAAiB;AAAA,cACjB,OAAO;AAAA,cACP,GAAG;AAAA,cACH,WAAW;AAAA,cACX,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,eAAe,UACX,QAAQ,SACN,QACA,WACF;AAAA,cACJ,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,QAAQ;AAAA,cACR,KAAK,UAAU,IAAI;AAAA,cACnB,cAAc;AAAA,cACd,YAAY;AAAA,cACZ,WAAW;AAAA,gBACT,WAAW;AAAA,cACb;AAAA,YACF;AAAA,YAEA;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,UAAU,QAAQ;AAAA,kBAC7B,gBAAe;AAAA,kBACf,YAAW;AAAA,kBACX,UAAS;AAAA,kBACT,KAAK;AAAA,kBACL,IAAI;AAAA,oBACF,IAAI,UAAU,MAAM;AAAA,kBACtB;AAAA,kBAEA;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,IAAI;AAAA,0BACF,UAAU,GAAG,QAAQ;AAAA,0BACrB,YAAY;AAAA,0BACZ,YAAY;AAAA,0BACZ,OAAO;AAAA,0BACP,UAAU;AAAA,0BACV,YAAY;AAAA,0BACZ,WAAW;AAAA,0BACX,SAAS;AAAA,0BACT,iBAAiB;AAAA,0BACjB,iBAAiB;AAAA,0BACjB,UAAU;AAAA,0BACV,cAAc;AAAA,0BACd,YAAY;AAAA,0BACZ,WAAW;AAAA,wBACb;AAAA,wBACA,OAAO;AAAA,wBAEN;AAAA;AAAA,oBACH;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,IAAI;AAAA,0BACF,UAAU,GAAG,QAAQ;AAAA,0BACrB,YAAY;AAAA,0BACZ,WAAW;AAAA,0BACX,OAAO;AAAA,wBACT;AAAA,wBAEC,2BAAiB,OAAO,aAAa,CAAC;AAAA;AAAA,oBACzC;AAAA;AAAA;AAAA,cACF;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,gBAAe;AAAA,kBACf,YAAW;AAAA,kBACX,UAAS;AAAA,kBACT,IAAI;AAAA,oBACF,KAAK,UAAU,MAAM;AAAA,kBACvB;AAAA,kBAEA;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,WAAU;AAAA,wBACV,YAAW;AAAA,wBACX,SAAS;AAAA,wBACT,IAAI;AAAA,0BACF,iBAAiB;AAAA,0BACjB,OAAO;AAAA,0BACP,IAAI,UAAU,IAAI;AAAA,0BAClB,IAAI,UAAU,IAAI;AAAA,0BAClB,cAAc;AAAA,0BACd,WAAW;AAAA,wBACb;AAAA,wBAEA;AAAA;AAAA,4BAAC;AAAA;AAAA,8BACC,IAAI;AAAA,gCACF,iBAAiB;AAAA,gCACjB,cAAc;AAAA,gCACd,SAAS;AAAA,gCACT,YAAY;AAAA,gCACZ,gBAAgB;AAAA,8BAClB;AAAA,8BAEA;AAAA,gCAAC;AAAA;AAAA,kCACC,MAAM,MAAM;AAAA,kCACZ,OAAO;AAAA,kCACP,UAAU;AAAA;AAAA,8BACZ;AAAA;AAAA,0BACF;AAAA,0BACA;AAAA,4BAAC;AAAA;AAAA,8BACC,IAAI;AAAA,gCACF,UAAU,GAAG,KAAK,IAAI,GAAG,WAAW,GAAG,CAAC;AAAA,gCACxC,YAAY;AAAA,gCACZ,YAAY;AAAA,gCACZ,YAAY;AAAA,8BACd;AAAA,8BAEC,aAAG,cAAc,GAAG,YAAY,QAAQ;AAAA;AAAA,0BAC3C;AAAA;AAAA;AAAA,oBACF;AAAA,oBAEA;AAAA,sBAAC;AAAA;AAAA,wBACC,WAAU;AAAA,wBACV,YAAW;AAAA,wBACX,SAAS;AAAA,wBACT,IAAI;AAAA,0BACF,iBAAiB;AAAA,0BACjB,OAAO;AAAA,0BACP,IAAI,UAAU,IAAI;AAAA,0BAClB,IAAI,UAAU,IAAI;AAAA,0BAClB,cAAc;AAAA,0BACd,WAAW;AAAA,wBACb;AAAA,wBAEA;AAAA;AAAA,4BAAC;AAAA;AAAA,8BACC,IAAI;AAAA,gCACF,iBAAiB;AAAA,gCACjB,cAAc;AAAA,gCACd,SAAS;AAAA,gCACT,YAAY;AAAA,gCACZ,gBAAgB;AAAA,8BAClB;AAAA,8BAEA;AAAA,gCAAC;AAAA;AAAA,kCACC,MAAM,MAAM;AAAA,kCACZ,OAAO;AAAA,kCACP,UAAU;AAAA;AAAA,8BACZ;AAAA;AAAA,0BACF;AAAA,0BACA;AAAA,4BAAC;AAAA;AAAA,8BACC,IAAI;AAAA,gCACF,UAAU,GAAG,KAAK,IAAI,GAAG,WAAW,GAAG,CAAC;AAAA,gCACxC,YAAY;AAAA,gCACZ,YAAY;AAAA,gCACZ,YAAY;AAAA,8BACd;AAAA,8BAEC,aAAG,cAAc,GAAG,YAAY,QAAQ;AAAA;AAAA,0BAC3C;AAAA;AAAA;AAAA,oBACF;AAAA;AAAA;AAAA,cACF;AAAA;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,QAAM,cAAc,MAAM;AACxB,gBAAY,KAAK;AACjB,UAAM,UAAU,gBAAgB,MAAM,GAAG,EAAE;AAC3C,uBAAmB,OAAO;AAC1B,UAAM,OAAO;AAAA,MACX,SAAS,KAAK,SAAS,CAAC,KAAK,CAAC;AAAA,MAC9B,UAAU,KAAK,SAAS,MAAM,CAAC;AAAA,IACjC;AACA,YAAQ,IAAI;AAAA,EACd;AAEA,QAAM,WAAW,CAAC,EAAE,YAAY,UAAU,MAA8B;AACtE,UAAM,eAAe,gBAClB,IAAI,OAAK,OAAO,GAAG,QAAQ,EAAE,EAAE,KAAK,CAAC,EACrC,OAAO,OAAO;AACjB,UAAM,qBAAqB,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,YAAY,EAAE,QAAQ,CAAC,CAAC;AAE1E,WACE,8CAAC,2BAAM,WAAU,OAAM,YAAW,YAAW,UAAS,QAAO,KAAK,KAC/D,6BAAmB,WAAW,IAC7B;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,IAAI;AAAA,UACF,4BAA4B;AAAA,YAC1B,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,QACA,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QAEN;AAAA;AAAA,IACH,IAEA,gFACG;AAAA,yBAAmB,IAAI,CAAC,KAAK,MAC5B,+CAAO,kBAAN,EACE;AAAA,YAAI,IACH;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,OAAO;AAAA,YACP,IAAI,EAAE,IAAI,KAAK;AAAA,YAChB;AAAA;AAAA,QAED,IACE;AAAA,QACJ;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,IAAI;AAAA,cACF,4BAA4B;AAAA,gBAC1B,UAAU,MAAM,IAAI,oBAAoB;AAAA,cAC1C;AAAA,YACF;AAAA,YACA,UAAU,MAAM,IAAI,oBAAoB;AAAA,YACxC,YAAY,MAAM,IAAI,MAAM;AAAA,YAC5B,OAAO;AAAA,YAEN;AAAA;AAAA,QACH;AAAA,WAxBmB,GAAG,GAAG,IAAI,CAAC,EAyBhC,CACD;AAAA,MACA,aACC,gFACE;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,OAAO;AAAA,YACR;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,IAAI;AAAA,cACF,4BAA4B;AAAA,gBAC1B,UAAU;AAAA,cACZ;AAAA,YACF;AAAA,YACA,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,OAAO;AAAA,YAEN;AAAA;AAAA,QACH;AAAA,SACF,IACE;AAAA,OACN,GAEJ;AAAA,EAEJ;AAEA,QAAM,aACJ,UAAU,QACV,UAAU,UACV,OAAO,UAAU,YACjB,YAAY,SACX,MAA6B,WAAW;AAE3C,MAAI,YAAY;AACd,WACE,8CAAC,yBAAI,IAAI,EAAE,GAAG,GAAG,WAAW,SAAS,GACnC,wDAAC,gCAAW,OAAM,SAAQ,0DAE1B,GACF;AAAA,EAEJ;AAEA,MAAI,aAAa,SAAS;AACxB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,OAAM;AAAA,QACN,QAAQ;AAAA,QACR,IAAI,EAAE,cAAc,OAAO;AAAA;AAAA,IAC7B;AAAA,EAEJ;AAEA,QAAM,YAAY,CAAC,aAAa,eAAe,CAAC;AAEhD,QAAM,0BACJ,gBAAgB,SAAS,IAAI,gBAAgB,GAAG,EAAE,IAAI;AACxD,QAAM,aAAa;AACnB,QAAM,oBAAoB;AAAA,IACxB,aACA,MAAM,YACN,KAAK,SAAS,SAAS,KACvB;AAAA,EACF;AAEA,QAAM,eAAe,YAAY,SAAS;AAE1C,QAAM,kBAAkB;AAExB,QAAM,2BAA2B;AAAA,IAC/B,aACA,CAAC,YACD,gBAAgB,SAAS,KACzB,KAAK,QAAQ,WAAW,KACxB,EAAE,cAAc,KAAK,QAAQ,CAAC,CAAC,GAAG,UAAU;AAAA,EAC9C;AAMA,QAAM,oCACJ,qBAAqB,UACrB,4BACA,oBAAoB;AAEtB,QAAM,eAAe;AAAA,IACnB,aAAa,oBAAoB,YAAY;AAAA,EAC/C;AACA,QAAM,sBAAsB,QAAQ,aAAa,QAAQ;AACzD,QAAM,wBACJ,cAAc,yBACd,KAAK,IAAI,KAAK,cAAc,uBAAuB,GAAG;AACxD,QAAM,gBAAgB,2BACjB,cAAc,4BACf,cAAc,uBACd,MAAM,UAAU,SAAS,IACvB,cAAc,uBACd,cAAc;AAEpB,QAAM,eAAe,gBAAgB,cAAc;AAAA,IACjD,cAAc;AAAA,IACd,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,0BAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SACE,+CAAC,2BAAM,OAAM,QACX;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,UACF,OAAO;AAAA,UACP,IAAI;AAAA,UACJ,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,KAAK;AAAA,QACP;AAAA,QAEA;AAAA,wDAAC,gCAAW,SAAQ,MAAK,YAAY,KAClC,iBACH;AAAA,UACA,+CAAC,2BAAM,WAAU,OAAM,YAAW,UAAS,KAAK,GAC7C;AAAA,yBACC,8CAAC,gCAAW,SAAQ,WAAU,OAAM,kBAAiB,4BAErD,IACE;AAAA,YACJ,8CAAC,6BAAQ,OAAO,aAAa,OAAK,MAChC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAW;AAAA,gBACX,MAAK;AAAA,gBAEL;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,MAAM;AAAA,oBACZ,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,OAAO;AAAA;AAAA,gBACT;AAAA;AAAA,YACF,GACF;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,IAEC,MAAM,UAAU,SAAS,KAAK,aAC7B;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,YAAW;AAAA,QACX,gBAAe;AAAA,QACf,IAAI;AAAA,UACF,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,cAAc;AAAA,UACd,OAAO;AAAA,UACP,iBAAiB;AAAA,QACnB;AAAA,QAEA;AAAA,yDAAC,2BAAM,WAAU,OAAM,YAAW,UAAS,SAAS,GAClD;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,WACE;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,OAAO;AAAA;AAAA,gBACT;AAAA,gBAEF,IAAI;AAAA,kBACF,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,IAAI;AAAA,kBACJ,cAAc;AAAA,kBACd,WAAW,EAAE,SAAS,UAAU;AAAA,gBAClC;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YACA,8CAAC,YAAS,WAAW,iBAAiB;AAAA,aACxC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,IAAI,EAAE,OAAO,iBAAiB,YAAY,IAAI;AAAA,cAC/C;AAAA;AAAA,gBACG,iBAAiB,OAAO,YAAY,iBAAiB,CAAC,CAAC;AAAA,gBAAE;AAAA;AAAA;AAAA,UAC7D;AAAA;AAAA;AAAA,IACF,IACE;AAAA,IAGH,qBAAqB,gBAAgB,kBACpC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,cAAc;AAAA,QACd,SAAS;AAAA,UACP,IAAI,sBAAsB,IAAI;AAAA,UAC9B,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,cAAc,sBAAsB,SAAS;AAAA,UAC7C,cAAc,sBAAsB,IAAI;AAAA,QAC1C;AAAA;AAAA,IACF,IACE;AAAA,IAEH,sBACC;AAAA,MAAC;AAAA;AAAA,QACC,IACE;AAAA,UACE;AAAA,YACE,IAAI;AAAA,YACJ,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,cAAc;AAAA,YACd,WAAW;AAAA,UACb;AAAA,UACA,GAAI,cAAc,oBACd,CAAC,cAAc,iBAAiB,IAChC,CAAC;AAAA,QACP;AAAA;AAAA,IAEJ,IACE;AAAA,IAEH,WAAW,OAAO,YACjB,oCAAoC,OAClC,8CAAC,wCAAoB,OAAM,QAAO,QAAQ,eACxC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,MAAM,WAAW,CAAC;AAAA,QACxB,SAAQ;AAAA,QACR,QAAQ,cAAc;AAAA,QACtB,MAAM,cAAc;AAAA,QACpB,SAAS;AAAA,QACT,mBAAmB;AAAA,QACnB,aAAa,cAAc;AAAA,QAC3B,mBAAmB;AAAA,QACnB,OAAO,EAAE,cAAc,OAAO;AAAA;AAAA,IAChC,GACF,IAGF;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,OAAM;AAAA,QACN,QAAQ;AAAA,QACR,IAAI,EAAE,cAAc,OAAO;AAAA;AAAA,IAC7B;AAAA,KAEJ;AAEJ;;;AIjyCA,kBAAiB;AACjB,IAAAC,gBAAkB;AAClB,IAAAC,iBAAkB;AAClB,IAAAC,sBAAuB;AA4Db,IAAAC,uBAAA;AAnDV,SAAS,cAAc,SAAyC;AAC9D,SAAO;AAAA,IACL,EAAE,IAAI,GAAG,OAAO,kBAAkB,OAAO,QAAQ,kBAAkB,EAAE;AAAA,IACrE;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,QAAQ,2BAA2B;AAAA,IAC5C;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,QAAQ,qBAAqB;AAAA,IACtC;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,QAAQ,6BAA6B;AAAA,IAC9C;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,QAAQ,sBAAsB;AAAA,IACvC;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,QAAQ,wBAAwB;AAAA,IACzC;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,QAAQ,kBAAkB;AAAA,IACnC;AAAA,EACF;AACF;AAGA,IAAM,mBAAmB,CAAC,EAAE,QAAQ,MAAyC;AAC3E,QAAM,OAAO,cAAc,OAAO;AAElC,SACE,8CAAC,YAAAC,SAAA,EAAK,WAAS,MAAC,SAAS,GAAG,IAAI,EAAE,WAAW,QAAQ,UAAU,MAAM,GAClE,eAAK,IAAI,UACR;AAAA,IAAC,YAAAA;AAAA,IAAA;AAAA,MAEC,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,MAEA;AAAA,QAAC,cAAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,UACX,IAAI;AAAA,YACF,GAAG;AAAA,YACH,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,QAAQ;AAAA,UACV;AAAA,UAEA;AAAA;AAAA,cAAC,oBAAAC;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,OAAM;AAAA,gBACN,YAAY;AAAA,gBAEX,eAAK;AAAA;AAAA,YACR;AAAA,YACA,8CAAC,eAAAC,SAAA,EAAM,IAAI,GACT,wDAAC,oBAAAD,SAAA,EAAW,SAAQ,MAAK,YAAY,KAClC,eAAK,OACR,GACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,IA7BK,KAAK;AAAA,EA8BZ,CACD,GACH;AAEJ;AAEA,IAAO,2BAAQ;;;ACxFR,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,iCAAiC;;;ACZ9C,IAAAE,eAAgB;AAChB,kBAAiB;AACjB,yBAAwB;AACxB,IAAAC,eAAiB;AACjB,IAAAC,iBAAkB;AAClB,IAAAC,sBAAuB;AACvB,IAAAC,wBAA0B;AAC1B,IAAAC,UAAuB;;;ACPvB,IAAAC,oBAAsB;AACtB,IAAAC,iBAAyB;AACzB,IAAAC,UAAuB;AACvB,IAAAC,mBAQO;;;ACXP,IAAAC,UAAuB;AAoEjB,IAAAC,uBAAA;AAhDN,SAAS,uBAAuB,GAAoB;AAClD,MAAI,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,GAAG;AAC/C,WAAO;AAAA,EACT;AACA,MAAI,OAAO,MAAM,UAAU;AACzB,UAAM,IAAI,OAAO,CAAC;AAClB,WAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,EAClC;AACA,MAAI,MAAM,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG;AACpC,UAAM,QAAQ,EAAE,CAAC;AACjB,QAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,GAAmB;AAC7C,MAAI,CAAC,OAAO,SAAS,CAAC,GAAG;AACvB,WAAO;AAAA,EACT;AACA,MAAI,KAAK,IAAI,CAAC,KAAK,KAAM;AACvB,WAAO,IAAI,IAAI,KAAM,QAAQ,CAAC,CAAC;AAAA,EACjC;AACA,SAAO,OAAO,KAAK,MAAM,CAAC,CAAC;AAC7B;AAMO,SAAS,8BAA8B;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkE;AAChE,QAAM,IAAU;AAAA,IACd,MAAM,uBAAuB,cAAc;AAAA,IAC3C,CAAC,cAAc;AAAA,EACjB;AAEA,MAAI,CAAC,UAAU,WAAW,QAAQ,QAAQ,WAAW,GAAG;AACtD,WAAO;AAAA,EACT;AAEA,SACE,+CAAC,SAAI,OAAO,EAAE,WACZ;AAAA,kDAAC,SAAI,OAAO,EAAE,QAAS,mBAAS,OAAO,OAAO,KAAK,IAAI,IAAG;AAAA,IAC1D,8CAAC,SAAI,OAAO,EAAE,MACX,kBAAQ,IAAI,CAAC,OAAO,MAAM;AACzB,YAAM,OACJ,OAAO,MAAM,SAAS,WAClB,MAAM,OACN,MAAM,QAAQ,OACZ,OAAO,MAAM,IAAI,IACjB;AACR,YAAM,OAAO,uBAAuB,MAAM,KAAK;AAC/C,YAAM,QACJ,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAClD,YAAM,MACJ,MAAM,WAAW,OAAO,OAAO,MAAM,OAAO,IAAI,OAAO,CAAC;AAC1D,aACE,+CAAC,SAAc,OAAO,EAAE,KACtB;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,GAAG,EAAE;AAAA,cACL,iBAAiB;AAAA,YACnB;AAAA;AAAA,QACF;AAAA,QACA,8CAAC,UAAK,OAAO,EAAE,OAAQ,aAAG,IAAI,MAAK;AAAA,QACnC,8CAAC,UAAK,OAAO,EAAE,OAAQ,6BAAmB,IAAI,GAAE;AAAA,WARxC,GASV;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;;;AD7BQ,IAAAC,uBAAA;AAvCR,SAAS,cACP,YACA,YACmC;AACnC,SAAO,WAAW,IAAI,CAAC,KAAK,MAAM;AAChC,UAAM,MAAuC,EAAE,MAAM,IAAI;AACzD,eAAW,QAAQ,OAAK;AACtB,UAAI,EAAE,IAAI,IAAI,EAAE,KAAK,CAAC,KAAK;AAAA,IAC7B,CAAC;AACD,WAAO;AAAA,EACT,CAAC;AACH;AAEA,IAAM,gBAAgB,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAE;AAE7D,IAAM,yBAAyB,CAAC;AAAA,EAC9B;AAAA,EACA;AACF,MAAuD;AACrD,QAAM,YAAQ,yBAAS;AACvB,QAAM,EAAE,cAAc,WAAW,GAAG,IAAI,mCAAmC;AAC3E,QAAM,UACJ,gBAAgB,aAAa,SAAS,IAAI,eAAe;AAC3D,QAAM,YAAkB;AAAA,IACtB,MAAM,cAAc,QAAQ,KAAK;AAAA,IACjC,CAAC,QAAQ,KAAK;AAAA,EAChB;AACA,QAAM,SAAS,IAAI,iBAAiB;AACpC,QAAM,SAAS,IAAI,iBAAiB;AACpC,QAAM,SAAe;AAAA,IACnB,OAAO,EAAE,GAAG,eAAe,GAAG,IAAI,OAAO;AAAA,IACzC,CAAC,IAAI,MAAM;AAAA,EACb;AACA,QAAM,aAAa,IAAI,cAAc,MAAM,QAAQ;AACnD,QAAM,SAAS,IAAI,cAAc;AAEjC,SACE,8CAAC,2BAAM,gBAAe,UAAS,QAAQ,QACrC,wDAAC,wCAAoB,OAAM,QAAO,QAAQ,QACxC,yDAAC,8BAAU,MAAM,WAAW,QAC1B;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,UAAU;AAAA;AAAA,IACZ;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAM,EAAE,MAAM,MAAM,QAAQ,KAAK,WAAW,UAAU,GAAG;AAAA,QACzD,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,IACZ;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,EAAE,MAAM,MAAM,QAAQ,KAAK,WAAW,UAAU,GAAG;AAAA,QACzD,UAAU;AAAA,QACV,UAAU;AAAA,QACV,eAAe,OAAK;AAClB,gBAAM,IAAI,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC;AAC9C,gBAAM,OAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AACtC,iBAAO,OAAO,MAAO,GAAG,KAAK,KAAK,OAAO,GAAI,CAAC,MAAM,OAAO,IAAI;AAAA,QACjE;AAAA,QACA,OAAO;AAAA,UACL,OAAO;AAAA,UACP,OAAO;AAAA,UACP,UAAU;AAAA,UACV,OAAO,EAAE,MAAM,MAAM,QAAQ,KAAK,WAAW,UAAU,GAAG;AAAA,QAC5D;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,CAAC,EAAE,QAAQ,SAAS,MAAM,MACjC;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YAGA,gBAAgB,IAAI;AAAA;AAAA,QACtB;AAAA,QAEF,QAAQ;AAAA,UACN,QAAQ,IAAI,gBAAgB;AAAA,UAC5B,aAAa,IAAI,qBAAqB;AAAA,QACxC;AAAA,QACA,cAAc,EAAE,SAAS,OAAO;AAAA;AAAA,IAClC;AAAA,IACC,OAAO,IAAI,CAAC,GAAG,MACd;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,SAAS,EAAE;AAAA,QACX,SAAQ;AAAA,QACR,QAAQ,QAAQ,IAAI,QAAQ,MAAM;AAAA,QAClC,MAAM,QAAQ,IAAI,QAAQ,MAAM;AAAA,QAChC,aAAa;AAAA,QACb,aAAa;AAAA;AAAA,MAPR,EAAE;AAAA,IAQT,CACD;AAAA,KACH,GACF,GACF;AAEJ;AAEA,IAAO,iCAAQ;AAEf,IAAM,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,SAAS,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAC/D,IAAM,UAAU,CAAC,OAAO,OAAO,OAAO,KAAK;AAC3C,IAAM,SAAS,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;AAE/D,SAAS,mCACd,MACU;AACV,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,oCACd,MAC4B;AAC5B,QAAM,OAAO,mCAAmC,IAAI;AACpD,QAAM,QAAQ,CAAC,aAAa,cAAc,cAAc,WAAW;AACnE,QAAM,MAAkC,CAAC;AAEzC,QAAM,QAAQ,UAAQ;AACpB,UAAM,OAAiB,CAAC;AACxB,UAAM,QACJ,SAAS,cACL,MACA,SAAS,eACP,MACA,SAAS,eACP,MACA;AACV,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,WAAK,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,CAAC;AAAA,IAC5D;AACA,QAAI,KAAK,EAAE,MAAM,MAAM,KAAK,CAAC;AAAA,EAC/B,CAAC;AAED,SAAO;AACT;;;AE5LA,IAAAC,eAAgB;AAChB,IAAAC,sBAAuB;AACvB,IAAAC,UAAuB;AACvB,IAAAC,mBAAkE;AAgE9D,IAAAC,uBAAA;AAvDJ,IAAM,SAAS,KAAK,KAAK;AAmBzB,SAAS,uBACP,OAC2B;AAC3B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,EAClB,IAAI;AACJ,MACE,MAAM,QACN,MAAM,QACN,YAAY,QACZ,eAAe,QACf,eAAe,QACf,WAAW,MACX;AACA,WAAO;AAAA,EACT;AACA,QAAM,IAAI;AACV,MAAI,IAAI,OAAO;AACb,WAAO;AAAA,EACT;AACA,QAAM,OAAO,eAAe,cAAc,eAAe;AACzD,QAAM,IAAI,KAAK,OAAO,KAAK,IAAI,CAAC,WAAW,MAAM;AACjD,QAAM,IAAI,KAAK,OAAO,KAAK,IAAI,CAAC,WAAW,MAAM;AACjD,QAAM,OAAO,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC;AACpC,QAAM,aAAa,QAAQ;AAC3B,QAAM,OAAO,aAAa,iBAAiB;AAE3C,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAW;AAAA,MACX,kBAAiB;AAAA,MACjB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,QACL,eAAe;AAAA,QACf,YAAY,aAAa,SAAS;AAAA,MACpC;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEA,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAWO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AACX,GAAqD;AACnD,QAAM,EAAE,cAAc,OAAO,GAAG,IAAI,mCAAmC;AACvE,QAAM,UACJ,gBAAgB,aAAa,SAAS,IAAI,eAAe;AAC3D,QAAM,KAAW;AAAA,IACf,MAAM,2BAA2B,IAAI,OAAO;AAAA,IAC5C,CAAC,IAAI,OAAO;AAAA,EACd;AACA,QAAM,SAAS,IAAI,eAAe;AAClC,QAAM,SAAS,IAAI,eAAe;AAClC,QAAM,WAAW,IAAI,gBAAgB;AACrC,QAAM,SAAS,IAAI,iBAAiB;AAEpC,QAAM,UAA4B,gBAAQ,MAAM;AAC9C,WAAO,OAAO,IAAI,CAAC,MAAM,OAAO;AAAA,MAC9B;AAAA,MACA,OAAO,KAAK,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC;AAAA,IACxC,EAAE;AAAA,EACJ,GAAG,CAAC,aAAa,MAAM,CAAC;AAExB,QAAM,QAAQ,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,OAAO,CAAC,KAAK;AAE1D,SACE;AAAA,IAAC,aAAAC;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,EAAE,UAAU,YAAY,OAAO,QAAQ,WAAW,IAAI;AAAA,QACtD,IAAI;AAAA,MACN;AAAA,MAEA;AAAA,sDAAC,wCAAoB,OAAM,QAAO,QAAQ,QACxC,yDAAC,6BACC;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM;AAAA,cACN,SAAQ;AAAA,cACR,SAAQ;AAAA,cACR,IAAG;AAAA,cACH,IAAG;AAAA,cACH,aAAa;AAAA,cACb,aAAa;AAAA,cACb,cAAc;AAAA,cACd,WAAW;AAAA,cACX,OAAO,CAAC,UACN;AAAA,gBAAC;AAAA;AAAA,kBACE,GAAG;AAAA,kBACJ,gBAAgB,IAAI;AAAA,kBACpB,eAAe,IAAI;AAAA;AAAA,cACrB;AAAA,cAGD,kBAAQ,IAAI,CAAC,GAAG,UACf;AAAA,gBAAC;AAAA;AAAA,kBAEC,MAAM,QAAQ,QAAQ,QAAQ,MAAM;AAAA;AAAA,gBAD/B,QAAQ,KAAK;AAAA,cAEpB,CACD;AAAA;AAAA,UACH;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,cAAc,GAAG;AAAA,cACjB,WAAW,GAAG;AAAA,cACd,YAAY,GAAG;AAAA,cACf,cAAc,GAAG;AAAA,cACjB,WAAW,CAAC,OAAO,SAAS;AAC1B,sBAAM,IACJ,SAAS,OACL,IACA,OAAO,UAAU,WACf,QACA,OAAO,KAAK;AACpB,sBAAM,OAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AACtC,sBAAM,QACJ,OAAO,SAAS,WAAW,OAAO,OAAO,QAAQ,EAAE;AACrD,uBAAO,CAAC,IAAK,OAAO,QAAS,KAAK,QAAQ,CAAC,CAAC,KAAK,KAAK;AAAA,cACxD;AAAA;AAAA,UACF;AAAA,aA3Ca,WA4Cf,GACF;AAAA,QACA;AAAA,UAAC,aAAAA;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,UAAU;AAAA,cACV,KAAK;AAAA,cACL,MAAM;AAAA,cACN,WAAW;AAAA,cACX,eAAe;AAAA,cACf,WAAW;AAAA,YACb;AAAA,YAEA;AAAA,cAAC,oBAAAC;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,kBACF,EAAE,UAAU,QAAQ,YAAY,KAAK,OAAO,UAAU;AAAA,kBACtD,IAAI;AAAA,gBACN;AAAA,gBAEC;AAAA;AAAA,YACH;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC3MA,IAAAC,eAAgB;AAChB,IAAAC,iBAAkB;AAClB,IAAAC,sBAAuB;AACvB,IAAAC,UAAuB;AACvB,IAAAC,mBAOO;AAwFD,IAAAC,uBAAA;AAzEN,SAAS,gBAAgB,KAAyC;AAChE,QAAM,MAAM,IAAI,KAAK,IAAI,SAAO,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7D,QAAM,MAAM,IAAI,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,KAAK;AAC9C,SAAO,IAAI,IAAI,OAAM,IAAI,MAAO,GAAG;AACrC;AAEA,SAAS,sBACP,KACmC;AACnC,QAAM,MAAM,IAAI,KAAK,IAAI,SAAO,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7D,QAAM,MAAM,IAAI,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,KAAK;AAC9C,QAAM,MAAuC,EAAE,KAAK,IAAI,KAAK;AAC7D,MAAI,QAAQ,CAAC,GAAG,MAAM;AACpB,QAAI,IAAI,CAAC,EAAE,IAAK,IAAI,MAAO;AAAA,EAC7B,CAAC;AACD,SAAO,CAAC,GAAG;AACb;AAEA,SAAS,WACP,GACA,GACA,SACkC;AAClC,MAAI,MAAM,GAAG;AACX,WAAO,CAAC,SAAS,SAAS,SAAS,OAAO;AAAA,EAC5C;AACA,MAAI,MAAM,GAAG;AACX,WAAO,CAAC,SAAS,GAAG,GAAG,OAAO;AAAA,EAChC;AACA,MAAI,MAAM,IAAI,GAAG;AACf,WAAO,CAAC,GAAG,SAAS,SAAS,CAAC;AAAA,EAChC;AACA,SAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AACpB;AAWO,SAAS,6BAA6B;AAAA,EAC3C;AAAA,EACA;AACF,GAA0D;AACxD,QAAM,EAAE,cAAc,YAAY,GAAG,IAAI,mCAAmC;AAC5E,QAAM,UACJ,gBAAgB,aAAa,SAAS,IAAI,eAAe;AAC3D,QAAM,OAAa,gBAAQ,MAAM,gBAAgB,GAAG,GAAG,CAAC,GAAG,CAAC;AAC5D,QAAM,YAAkB,gBAAQ,MAAM,sBAAsB,GAAG,GAAG,CAAC,GAAG,CAAC;AACvE,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,IAAI,IAAI,kBAAkB;AAChC,QAAM,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;AACjC,QAAM,YAAY,IAAI,aAAa;AACnC,QAAM,KAAW;AAAA,IACf,MAAM,2BAA2B,IAAI,OAAO;AAAA,IAC5C,CAAC,IAAI,OAAO;AAAA,EACd;AAEA,QAAM,QAAc,gBAAQ,MAAM;AAChC,WAAO,KAAK,IAAI,CAAC,GAAG,MAAM;AACxB,YAAM,MAAM,WAAW,CAAC;AACxB,YAAM,cAAc,KAAK,WAAW,GAAG,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;AACzD,YAAM,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,QAAQ;AACrD,aAAO,EAAE,aAAa,UAAU;AAAA,IAClC,CAAC;AAAA,EACH,GAAG,CAAC,YAAY,MAAM,IAAI,IAAI,CAAC;AAE/B,SACE,+CAAC,eAAAC,SAAA,EAAM,SAAS,GAAG,IAAI,EAAE,OAAO,OAAO,GACrC;AAAA,kDAAC,aAAAC,SAAA,EAAI,IAAI,EAAE,WAAW,aAAa,SAAS,IAAI,OAAO,OAAO,GAAG;AAAA,IACjE,8CAAC,aAAAA,SAAA,EAAI,IAAI,EAAE,OAAO,QAAQ,QAAQ,EAAE,GAClC,wDAAC,wCAAoB,OAAM,QAAO,QAAQ,GACxC;AAAA,MAAC;AAAA;AAAA,QACC,QAAO;AAAA,QACP,MAAM;AAAA,QACN,QAAQ,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAE;AAAA,QAC/C,gBAAgB;AAAA,QAEhB;AAAA,wDAAC,0BAAM,MAAK,UAAS,QAAQ,CAAC,GAAG,GAAG,GAAG,MAAI,MAAC;AAAA,UAC5C,8CAAC,0BAAM,MAAK,YAAW,SAAQ,OAAM,OAAO,GAAG,MAAI,MAAC;AAAA,UACpD;AAAA,YAAC;AAAA;AAAA,cACC,cAAc,GAAG;AAAA,cACjB,WAAW,GAAG;AAAA,cACd,YAAY,GAAG;AAAA,cACf,cAAc,GAAG;AAAA,cACjB,WAAW,CAAC,OAAO,SAAS;AAC1B,sBAAM,IACJ,SAAS,OACL,IACA,OAAO,UAAU,WACf,QACA,OAAO,KAAK;AACpB,sBAAM,OAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AACtC,sBAAM,MACJ,OAAO,SAAS,WAAW,OAAO,OAAO,QAAQ,EAAE;AACrD,sBAAM,MAAM,SAAS,KAAK,GAAG,IACzB,OAAO,SAAS,IAAI,MAAM,CAAC,GAAG,EAAE,IAChC;AACJ,sBAAM,UACJ,OAAO,SAAS,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK,OACrC,IAAI,KAAK,GAAG,EAAE,OACd;AACN,uBAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,KAAK,OAAO;AAAA,cACxC;AAAA;AAAA,UACF;AAAA,UACC,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAC7B;AAAA,YAAC;AAAA;AAAA,cAEC,SAAS,IAAI,CAAC;AAAA,cACd,SAAQ;AAAA,cACR,SAAS;AAAA,cACT,MAAM,QAAQ,IAAI,QAAQ,MAAM;AAAA,cAChC,QAAQ,WAAW,GAAG,GAAG,OAAO;AAAA,cAChC,mBAAmB;AAAA;AAAA,YANd,KAAK,IAAI,IAAI,IAAI,CAAC;AAAA,UAOzB,CACD;AAAA;AAAA;AAAA,IACH,GACF,GACF;AAAA,IACA,8CAAC,aAAAA,SAAA,EAAI,IAAI,EAAE,cAAc,aAAa,SAAS,IAAI,OAAO,OAAO,GAAG;AAAA,IAEpE;AAAA,MAAC,aAAAA;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,UACF,SAAS;AAAA,UACT,eAAe;AAAA,UACf,OAAO;AAAA,UACP,IAAI;AAAA,UACJ,YAAY;AAAA,QACd;AAAA,QAEC,eAAK,IAAI,CAAC,GAAG,MAAM;AAClB,gBAAM,MAAM,MAAM,CAAC,GAAG,eAAe;AACrC,gBAAM,MAAM,MAAM,CAAC,GAAG,aAAa;AACnC,iBACE;AAAA,YAAC,aAAAA;AAAA,YAAA;AAAA,cAEC,OAAO,GAAG,GAAG,IAAI,GAAG,GAAG,KAAK;AAAA,cAC5B,IAAI;AAAA,gBACF,MAAM,OAAO,CAAC;AAAA,gBACd,UAAU;AAAA,gBACV,UAAU,GAAG,CAAC;AAAA,gBACd,IAAI;AAAA,gBACJ,WAAW;AAAA,gBACX,UAAU;AAAA,cACZ;AAAA,cAEA;AAAA;AAAA,kBAAC,oBAAAC;AAAA,kBAAA;AAAA,oBACC,IAAI;AAAA,sBACF;AAAA,wBACE,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,OAAO;AAAA,wBACP,YAAY;AAAA,wBACZ,OAAO;AAAA,wBACP,UAAU;AAAA,wBACV,cAAc;AAAA,wBACd,YAAY;AAAA,sBACd;AAAA,sBACA,IAAI;AAAA,oBACN;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA,gBACA;AAAA,kBAAC,oBAAAA;AAAA,kBAAA;AAAA,oBACC,IAAI;AAAA,sBACF;AAAA,wBACE,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,OAAO;AAAA,wBACP,YAAY;AAAA,wBACZ,IAAI;AAAA,wBACJ,OAAO;AAAA,wBACP,UAAU;AAAA,wBACV,cAAc;AAAA,wBACd,YAAY;AAAA,sBACd;AAAA,sBACA,IAAI;AAAA,oBACN;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA;AAAA;AAAA,YA7CK,OAAO,IAAI,IAAI,IAAI,CAAC;AAAA,UA8C3B;AAAA,QAEJ,CAAC;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;;;AChNO,IAAM,gDACX;;;ACRF,IAAM,YAAY;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,YAAY,CAAC,eAAe;AAG3B,SAAS,8BAA0D;AACxE,QAAM,OAAmC,CAAC;AAE1C,YAAU,QAAQ,WAAS;AACzB,SAAK,KAAK;AAAA,MACR,MAAM;AAAA,MACN,MAAM,UAAU,IAAI,UAAQ;AAAA,QAC1B,MAAM;AAAA,QACN,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,IAAI,GAAI,CAAC;AAAA,MACzC,EAAE;AAAA,MACF,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,GAAK;AAAA,IACzC,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AACT;;;ANuDY,IAAAC,uBAAA;AAzDZ,SAAS,+BAA+B,SAA4B;AAClE,SAAO;AAAA,IACL,EAAE,SAAS,OAAO,OAAO,YAAY,OAAO,QAAQ,IAAI,QAAQ,MAAM,EAAE;AAAA,IACxE,EAAE,SAAS,OAAO,OAAO,YAAY,OAAO,QAAQ,IAAI,QAAQ,MAAM,EAAE;AAAA,IACxE,EAAE,SAAS,OAAO,OAAO,YAAY,OAAO,QAAQ,IAAI,QAAQ,MAAM,EAAE;AAAA,IACxE,EAAE,SAAS,OAAO,OAAO,YAAY,OAAO,QAAQ,IAAI,QAAQ,MAAM,EAAE;AAAA,EAC1E;AACF;AAKO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACF,GAAgD;AAC9C,QAAM,oBAAgB,sBAAAC,SAAc,mBAAmB;AACvD,QAAM,CAAC,QAAQ,SAAS,IAAU,iBAA+B,KAAK;AACtE,QAAM,iBAAiB,sBAAsB;AAC7C,QAAM,UACJ,eAAe,gBAAgB,cAAc,aAAa,SAAS,IAC/D,cAAc,eACd;AACN,QAAM,SAAS,qBAAqB,+BAA+B,OAAO;AAC1E,QAAM,yBACJ,mBAAmB,SACf,gDACA;AAEN,QAAM,SAAS;AAAA,IACb;AAAA,MACE,SAAS;AAAA,MACT,cAAc;AAAA,MACd,WAAW;AAAA,IACb;AAAA,IACA,eAAe,UAAU;AAAA,EAC3B;AAEA,QAAM,gBAAgB;AAAA,IACpB,EAAE,YAAY,KAAK,OAAO,UAAU;AAAA,IACpC,eAAe,cAAc;AAAA,EAC/B;AAEA,SACE,8CAAC,2CAAwC,OAAO,iBAAiB,CAAC,GAChE,wDAAC,YAAAC,SAAA,EAAK,WAAW,eAAe,UAAU,aAAa,GAAG,IAAI,QAC5D,wDAAC,mBAAAC,SAAA,EACC,yDAAC,eAAAC,SAAA,EAAM,OAAM,QAAO,WAAU,UAAS,KAAK,GAAG,IAAI,GACjD;AAAA;AAAA,MAAC,eAAAA;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,YAAW;AAAA,QACX,gBAAe;AAAA,QACf,UAAS;AAAA,QACT,KAAK;AAAA,QACL,OAAM;AAAA,QAEN;AAAA;AAAA,YAAC,oBAAAC;AAAA,YAAA;AAAA,cACC,SAAS,gBAAgB,cAAc;AAAA,cACvC,IAAI;AAAA,cAEH;AAAA;AAAA,UACH;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,aACE,gBAAgB,SACZ,4CACA;AAAA;AAAA,UAER;AAAA;AAAA;AAAA,IACF;AAAA,IACA,8CAAC,aAAAC,SAAA,EACC,yDAAC,aAAAC,SAAA,EAAK,WAAS,MAAC,SAAS,GACvB;AAAA,qDAAC,aAAAA,SAAA,EAAK,MAAM,EAAE,IAAI,GAAG,IAAI,GAAG,GAC1B;AAAA,uDAAC,eAAAH,SAAA,EAAM,KAAK,GACV;AAAA,wDAAC,eAAAA,SAAA,EACC;AAAA,YAAC,eAAAA;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,KAAK;AAAA,cACL,gBAAe;AAAA,cACf,YAAW;AAAA,cAEV;AAAA,yCACC;AAAA,kBAAC,aAAAE;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,KAAK;AAAA,oBACL,KAAI;AAAA,oBACJ,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,IAAI,EAAE,WAAW,UAAU;AAAA;AAAA,gBAC7B,IACE;AAAA,gBACJ,+CAAC,eAAAF,SAAA,EACC;AAAA;AAAA,oBAAC,oBAAAC;AAAA,oBAAA;AAAA,sBACC,IAAI;AAAA,wBACF;AAAA,0BACE,UAAU;AAAA,0BACV,YAAY;AAAA,0BACZ,OAAO;AAAA,wBACT;AAAA,wBACA,eAAe,QAAQ;AAAA,sBACzB;AAAA,sBAEC;AAAA;AAAA,kBACH;AAAA,kBACA;AAAA,oBAAC,oBAAAA;AAAA,oBAAA;AAAA,sBACC,IAAI;AAAA,wBACF;AAAA,0BACE,UAAU;AAAA,0BACV,YAAY;AAAA,0BACZ,OAAO;AAAA,wBACT;AAAA,wBACA,eAAe,QAAQ;AAAA,sBACzB;AAAA,sBAEC;AAAA;AAAA,kBACH;AAAA,mBACF;AAAA;AAAA;AAAA,UACF,GACF;AAAA,UACA,8CAAC,eAAAD,SAAA,EACE,eAAK,IAAI,UACR;AAAA,YAAC;AAAA;AAAA,cAEC,KAAK;AAAA,cACL,YAAY;AAAA;AAAA,YAFP,KAAK;AAAA,UAGZ,CACD,GACH;AAAA,WACF;AAAA,QACA;AAAA,UAAC,oBAAAC;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,WAAW;AAAA,cACX,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,OAAO;AAAA,YACT;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QACA;AAAA,UAAC,YAAAH;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,YACX,IAAI;AAAA,cACF;AAAA,gBACE,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,SAAS;AAAA,gBACT,QAAQ;AAAA,gBACR,cAAc;AAAA,cAChB;AAAA,cACA,eAAe,gBAAgB;AAAA,YACjC;AAAA,YAEA,wDAAC,mBAAAC,SAAA,EAAY,IAAI,EAAE,SAAS,UAAU,GACpC;AAAA,cAAC,eAAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,gBAAe;AAAA,gBACf,YAAW;AAAA,gBAEX;AAAA,gEAAC,eAAAA,SAAA,EAAM,OAAM,OACX;AAAA,oBAAC;AAAA;AAAA,sBACC,aAAa;AAAA,sBACb,aAAa;AAAA,sBACb,WAAU;AAAA;AAAA,kBACZ,GACF;AAAA,kBACA;AAAA,oBAAC,aAAAE;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,IAAI;AAAA,wBACF;AAAA,0BACE,QAAQ;AAAA,0BACR,OAAO;AAAA,0BACP,iBAAiB;AAAA,0BACjB,SAAS;AAAA,wBACX;AAAA,wBACA,eAAe,gBAAgB;AAAA,sBACjC;AAAA;AAAA,kBACF;AAAA,kBACA,8CAAC,eAAAF,SAAA,EAAM,OAAM,OACX;AAAA,oBAAC;AAAA;AAAA,sBACC,aAAa;AAAA,sBACb,aAAa;AAAA,sBACb,WAAU;AAAA;AAAA,kBACZ,GACF;AAAA;AAAA;AAAA,YACF,GACF;AAAA;AAAA,QACF;AAAA,SACF;AAAA,MAEA,8CAAC,aAAAG,SAAA,EAAK,MAAM,EAAE,IAAI,GAAG,IAAI,GAAG,GAC1B;AAAA,QAAC,YAAAL;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,UACX,IAAI;AAAA,YACF;AAAA,cACE,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,QAAQ;AAAA,YACV;AAAA,YACA,eAAe,WAAW;AAAA,UAC5B;AAAA,UAEA;AAAA,YAAC,mBAAAC;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,EAAE,SAAS,WAAW;AAAA,gBACtB,eAAe,WAAW;AAAA,cAC5B;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,QAAQ,oCAAoC,MAAM;AAAA,kBAClD,OAAO,mCAAmC,MAAM;AAAA;AAAA,cAClD;AAAA;AAAA,UACF;AAAA;AAAA,MACF,GACF;AAAA,OACF,GACF;AAAA,KACF,GACF,GACF,GACF;AAEJ;;;AOlQO,IAAM,+BAA+B;AAGrC,IAAM,gCAAgC;;;ACFtC,IAAM,iDACX;AAAA,EACE,OAAO;AAAA,EACP,aACE;AAAA,EACF,WAAW;AAAA,EACX,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACVK,IAAM,4BAAuD;AAAA,EAClE,EAAE,IAAI,UAAU,OAAO,yBAAyB;AAAA,EAChD,EAAE,IAAI,SAAS,OAAO,kBAAkB;AAAA,EACxC,EAAE,IAAI,UAAU,OAAO,mBAAmB;AAC5C;AAEA,IAAM,WAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,MAAM,GAAW,IAAY,IAAoB;AACxD,SAAO,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC;AACrC;AAEA,SAAS,aACP,OACA,OACA,MACgC;AAChC,SAAO,SAAS,IAAI,CAAC,OAAO,MAAM;AAChC,UAAM,SAAS,KAAK,KAAK,IAAI,SAAS,IAAI,IAAI;AAC9C,UAAM,OAAO,IAAI;AACjB,UAAM,MAAM,KAAK,SAAS,OAAO,OAAO;AACxC,WAAO;AAAA,MACL;AAAA,MACA,OAAO,MAAM,KAAK,MAAM,GAAG,GAAG,IAAI,EAAE;AAAA,IACtC;AAAA,EACF,CAAC;AACH;AAGO,IAAM,kCAGT;AAAA,EACF,QAAQ,aAAa,GAAG,IAAI,CAAC;AAAA,EAC7B,OAAO,aAAa,KAAK,IAAI,EAAE;AAAA,EAC/B,QAAQ,aAAa,KAAK,IAAI,GAAG;AACnC;;;ACrDA,IAAAK,eAAgB;AAChB,IAAAC,eAAiB;AACjB,IAAAC,sBAAwB;AACxB,IAAAC,iBAAkB;AAClB,IAAAC,sBAAuB;AACvB,IAAAC,UAAuB;AACvB,IAAAC,oBAQO;;;ACXA,SAASC,UAAS,GAAkB,GAAkC;AAC3E,MAAI,CAAC,GAAG;AACN,WAAO,EAAE,GAAG,EAAE;AAAA,EAChB;AACA,SAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AACtB;AAEO,SAASC,YACX,OACyB;AAC5B,QAAM,OAAO,MAAM,OAAO,OAAO;AACjC,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,KAAK,CAAC;AAAA,EACf;AACA,SAAO,KAAK,KAAK;AACnB;;;ACrBA,IAAAC,UAAuB;AAiBnB,IAAAC,uBAAA;AAdJ,IAAM,8CACE,sBAAoD,CAAC,CAAC;AAOvD,SAAS,6CAA6C;AAAA,EAC3D;AAAA,EACA;AACF,GAA0E;AACxE,QAAM,OAAa,gBAAQ,MAAM,OAAO,CAAC,KAAK,CAAC;AAC/C,SACE,8CAAC,4CAA4C,UAA5C,EAAqD,OAAO,MAC1D,UACH;AAEJ;AAEO,SAAS,0CAAgF;AAC9F,SAAa,mBAAW,2CAA2C;AACrE;;;AC0DQ,IAAAC,uBAAA;AA9ER,SAAS,mBAAmB,GAAmB;AAC7C,SAAO,IAAI,KAAK,aAAa,QAAW,EAAE,uBAAuB,EAAE,CAAC,EAAE;AAAA,IACpE,KAAK,MAAM,CAAC;AAAA,EACd;AACF;AAEO,SAAS,+BACd,OAC2B;AAC3B,QAAM,EAAE,QAAQ,SAAS,MAAM,IAAI;AACnC,QAAM,EAAE,WAAW,GAAG,IAAI,wCAAwC;AAClE,QAAM,KAAK,IAAI;AAEf,MAAI,CAAC,UAAU,CAAC,SAAS,QAAQ;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,QAAQ,CAAC,GAAG;AACxB,QAAM,MACJ,OAAO,QAAQ,WAAW,MAAM,OAAO,QAAQ,WAAW,OAAO,GAAG,IAAI;AAC1E,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,UAAU,UAAa,UAAU,OAAO,OAAO,KAAK,IAAI;AAE1E,QAAM,cAAc,IAAI,eAAe;AACvC,QAAM,SAAS,IAAI,kBAAkB;AACrC,QAAM,SAAS,IAAI,aAAa;AAChC,QAAM,QAAQ,IAAI,oBAAoB;AACtC,QAAM,OAAO,IAAI,kBAAkB;AACnC,QAAM,SAAS,IAAI,kBAAkB;AACrC,QAAM,KAAK,IAAI,cAAc;AAC7B,QAAM,MAAM,IAAI,aAAa;AAC7B,QAAM,QAAQ,IAAI,mBAAmB;AACrC,QAAM,SAAS,IAAI,oBAAoB;AACvC,QAAM,WAAW,IAAI,oBAAoB;AACzC,QAAM,UAAU,IAAI,mBAAmB;AAEvC,QAAM,cACJ,IAAI,aAAa,QACjB,IAAI,gBAAgB,UACpB,IAAI,eAAe;AACrB,QAAM,YAAY,cAAc,GAAG,YAAa,IAAI,eAAe;AACnE,QAAM,WAAW,cAAc,GAAG,YAAa,IAAI,cAAc;AAEjE,QAAM,WAAgC;AAAA,IACpC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAEA,QAAM,YAAYC;AAAA,IAChB;AAAA,MACE,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,SAAS;AAAA,IACX;AAAA,IACA,IAAI;AAAA,EACN;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,eAAe;AAAA,QACf,UAAU;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,QAAQ,aAAa,WAAW;AAAA,YAChC,cAAc;AAAA,YACd,UAAU;AAAA,YACV,iBAAiB;AAAA,YACjB,WAAW;AAAA,UACb;AAAA,UAEA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,QAAQ;AAAA,kBACR,iBAAiB;AAAA,kBACjB,YAAY;AAAA,gBACd;AAAA,gBACA,eAAW;AAAA;AAAA,YACb;AAAA,YACA,+CAAC,SAAI,OAAO,WACV;AAAA,6DAAC,SAAI,OAAO,UACV;AAAA,8DAAC,UAAK,OAAO,EAAE,OAAO,WAAW,YAAY,SAAS,GACnD,iBACH;AAAA,gBACA,8CAAC,UAAK,OAAO,EAAE,OAAO,UAAU,YAAY,QAAQ,GACjD,qBACH;AAAA,iBACF;AAAA,cACA,+CAAC,SAAI,OAAO,EAAE,GAAG,UAAU,WAAW,IAAI,GACxC;AAAA,8DAAC,UAAK,OAAO,EAAE,OAAO,WAAW,YAAY,SAAS,GACnD,kBACH;AAAA,gBACA,8CAAC,UAAK,OAAO,EAAE,OAAO,UAAU,YAAY,QAAQ,GACjD,6BAAmB,GAAG,GACzB;AAAA,iBACF;AAAA,eACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AHjDQ,IAAAC,uBAAA;AA/BR,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AACF,GAIuB;AACrB,QAAM,EAAE,WAAW,GAAG,IAAI,wCAAwC;AAClE,QAAM,SAAS,IAAI,YAAY;AAC/B,QAAM,YAAY,IAAI,aAAa;AACnC,QAAM,UAAU,IAAI,mBAAmB;AACvC,QAAM,aAAa,IAAI,cAAc;AACrC,QAAM,OAAO,IAAI,uBAAuB;AACxC,QAAM,IAAI;AAAA,IACR,KAAK,IAAI,QAAQ,OAAO;AAAA,IACxB,OAAO,IAAI,QAAQ,SAAS;AAAA,IAC5B,QAAQ,IAAI,QAAQ,UAAU;AAAA,IAC9B,MAAM,IAAI,QAAQ,QAAQ;AAAA,EAC5B;AACA,QAAM,QAAQ,IAAI,iBAAiB;AACnC,QAAM,QAAQ,IAAI,iBAAiB;AACnC,QAAM,SAAS,IAAI,cAAc;AACjC,QAAM,eAAe,IAAI,gBAAgB;AACzC,QAAM,aAAa,IAAI,yBAAyB;AAChD,QAAM,WAAW,IAAI,YAAY;AAEjC,SACE,8CAAC,aAAAC,SAAA,EAAI,IAAI,EAAE,OAAO,QAAQ,QAAQ,IAAI,IAAI,GACxC,wDAAC,yCAAoB,OAAM,QAAO,QAAO,QACvC,yDAAC,+BAAU,MAAY,QAAQ,GAC7B;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAiB;AAAA,QACjB,UAAU;AAAA,QACV,QAAQ;AAAA;AAAA,IACV;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAM,EAAE,MAAM,OAAO,UAAU,GAAG;AAAA,QAClC,UAAU;AAAA,QACV,UAAU,EAAE,QAAQ,UAAU;AAAA,QAC9B,UAAU;AAAA,QACV,QAAQ;AAAA;AAAA,IACV;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,EAAE,MAAM,OAAO,UAAU,GAAG;AAAA,QAClC,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA;AAAA,IACT;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,CAAC,MACR,8CAAC,kCAAgC,GAAG,GAAG;AAAA,QAEzC,QAAQ,EAAE,QAAQ,cAAc,iBAAiB,WAAW;AAAA,QAC5D,oBAAoB,EAAE,GAAG,OAAO,GAAG,KAAK;AAAA;AAAA,IAC1C;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAQ;AAAA,QACR,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,gBAAe;AAAA,QACf,eAAc;AAAA,QACd,KAAK;AAAA,QACL,WAAW;AAAA,UACT,GAAG;AAAA,UACH,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,aAAa;AAAA,QACf;AAAA,QACA,mBAAmB;AAAA;AAAA,IACrB;AAAA,KACF,GACF,GACF;AAEJ;AAKO,SAAS,wBAAwB;AAAA,EACtC,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc,CAAC,GAAG,GAAG;AAAA,EACrB,aAAa,CAAC,IAAI,IAAI,IAAI,IAAI,GAAG;AAAA,EACjC;AAAA,EACA;AACF,GAAqD;AACnD,QAAM,YAAkB,gBAAQ,MAAM;AACpC,QAAI,eAAe;AACjB,aAAO,cAAc,WAAW,KAAK,CAAC;AAAA,IACxC;AACA,WAAO,QAAQ,CAAC;AAAA,EAClB,GAAG,CAAC,eAAe,MAAM,WAAW,CAAC;AAErC,QAAM,eACJ,gBAAgB,SACZ,iDACA;AAEN,QAAM,SAASC;AAAA,IACb;AAAA,MACE,SAAS;AAAA,MACT,cAAc;AAAA,MACd,WAAW;AAAA,IACb;AAAA,IACA,eAAe,UAAU;AAAA,EAC3B;AAEA,QAAM,KAAK,eAAe;AAC1B,QAAM,UAAUA;AAAA,IACd;AAAA,MACE,YAAY;AAAA,MACZ,UAAU,EAAE,IAAI,QAAQ,IAAI,UAAU;AAAA,MACtC,OAAO;AAAA,IACT;AAAA,IACA,eAAe,QAAQ;AAAA,EACzB;AAEA,SACE,8CAAC,gDAA6C,OAAO,iBAAiB,CAAC,GACrE,wDAAC,aAAAC,SAAA,EAAK,WAAW,eAAe,UAAU,aAAa,GAAG,IAAI,QAC5D,wDAAC,oBAAAC,SAAA,EACC,yDAAC,eAAAC,SAAA,EAAM,SAAS,MAAM,IAAI,EAAE,OAAO,OAAO,GACxC;AAAA;AAAA,MAAC,eAAAA;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,YAAW;AAAA,QACX,gBAAe;AAAA,QACf,KAAK;AAAA,QACL,UAAS;AAAA,QAET;AAAA,wDAAC,oBAAAC,SAAA,EAAW,IAAI,SAAU,iBAAM;AAAA,UAChC;AAAA,YAAC,eAAAD;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,YAAW;AAAA,cACX,SAAS;AAAA,cACT,IAAI,EAAE,YAAY,EAAE;AAAA,cAEnB,yBACC,gFACE;AAAA,8DAAC,8BAA2B;AAAA,gBAC5B;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS;AAAA,oBACT,WAAU;AAAA;AAAA,gBACZ;AAAA,iBACF,IACE;AAAA;AAAA,UACN;AAAA;AAAA;AAAA,IACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAU;AAAA,QACV,sBACE,IAAI,wBAAwB;AAAA,QAE9B,qBACE,IAAI,uBAAuB;AAAA,QAE7B,gBAAgB,IAAI,kBAAkB;AAAA,QACtC,kBAAkB,IAAI,oBAAoB;AAAA,QAC1C,oBAAoB,IAAI,sBAAsB;AAAA,QAC9C,WAAW,IAAI,aAAa;AAAA,QAC5B,aAAa,IAAI,eAAe;AAAA,QAChC,QAAQ,IAAI;AAAA,QACZ,WAAW,IAAI,aAAa;AAAA,QAC5B,qBAAqB,IAAI,uBAAuB;AAAA,QAChD,uBAAuB,IAAI,yBAAyB;AAAA;AAAA,IACtD;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KACF,GACF,GACF,GACF;AAEJ;;;AI7NO,IAAM,0CACX;AAAA,EACE,OAAO;AAAA,EACP,aACE;AAAA,EACF,WAAW;AAAA,EACX,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACVK,IAAM,8BAAyD;AAAA,EACpE,EAAE,IAAI,UAAU,OAAO,yBAAyB;AAAA,EAChD,EAAE,IAAI,SAAS,OAAO,kBAAkB;AAAA,EACxC,EAAE,IAAI,UAAU,OAAO,mBAAmB;AAC5C;AAGO,IAAM,6BAAsD;AAAA,EACjE,EAAE,OAAO,QAAQ,OAAO,GAAG;AAAA,EAC3B,EAAE,OAAO,QAAQ,OAAO,GAAG;AAAA,EAC3B,EAAE,OAAO,OAAO,OAAO,GAAG;AAAA,EAC1B,EAAE,OAAO,QAAQ,OAAO,GAAG;AAAA,EAC3B,EAAE,OAAO,OAAO,OAAO,GAAG;AAAA,EAC1B,EAAE,OAAO,OAAO,OAAO,GAAG;AAAA,EAC1B,EAAE,OAAO,OAAO,OAAO,GAAG;AAAA,EAC1B,EAAE,OAAO,OAAO,OAAO,EAAE;AAAA,EACzB,EAAE,OAAO,OAAO,OAAO,EAAE;AAAA,EACzB,EAAE,OAAO,OAAO,OAAO,EAAE;AAAA,EACzB,EAAE,OAAO,OAAO,OAAO,EAAE;AAAA,EACzB,EAAE,OAAO,OAAO,OAAO,EAAE;AAAA,EACzB,EAAE,OAAO,OAAO,OAAO,EAAE;AAAA,EACzB,EAAE,OAAO,OAAO,OAAO,EAAE;AAC3B;AAEA,SAAS,UACP,KACA,QACA,MACuB;AACvB,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,QAAQ,SAAS,IAAI,CAAC;AAC3D,SAAO,EAAE,OAAO,IAAI,OAAO,OAAO,EAAE;AACtC;AAEO,IAAM,oCAGT;AAAA,EACF,QAAQ;AAAA,EACR,OAAO,2BAA2B;AAAA,IAAI,OACpC,UAAU,GAAG,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC;AAAA,EACxC;AAAA,EACA,QAAQ,2BAA2B;AAAA,IAAI,OACrC,UAAU,GAAG,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC;AAAA,EACxC;AACF;;;AC/CA,IAAAE,eAAgB;AAChB,IAAAC,eAAiB;AACjB,IAAAC,sBAAwB;AACxB,IAAAC,iBAAkB;AAClB,IAAAC,sBAAuB;AACvB,IAAAC,UAAuB;AACvB,IAAAC,oBASO;;;ACfP,IAAAC,UAAuB;AAiBnB,IAAAC,uBAAA;AAdJ,IAAM,uCACE,sBAA6C,CAAC,CAAC;AAOhD,SAAS,sCAAsC;AAAA,EACpD;AAAA,EACA;AACF,GAAmE;AACjE,QAAM,OAAa,gBAAQ,MAAM,OAAO,CAAC,KAAK,CAAC;AAC/C,SACE,8CAAC,qCAAqC,UAArC,EAA8C,OAAO,MACnD,UACH;AAEJ;AAEO,SAAS,mCAAkE;AAChF,SAAa,mBAAW,oCAAoC;AAC9D;;;AC0DQ,IAAAC,uBAAA;AA9ER,SAASC,oBAAmB,GAAmB;AAC7C,SAAO,IAAI,KAAK,aAAa,QAAW,EAAE,uBAAuB,EAAE,CAAC,EAAE;AAAA,IACpE,KAAK,MAAM,CAAC;AAAA,EACd;AACF;AAEO,SAAS,wBACd,OAC2B;AAC3B,QAAM,EAAE,QAAQ,SAAS,MAAM,IAAI;AACnC,QAAM,EAAE,UAAU,GAAG,IAAI,iCAAiC;AAC1D,QAAM,KAAK,IAAI;AAEf,MAAI,CAAC,UAAU,CAAC,SAAS,QAAQ;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,QAAQ,CAAC,GAAG;AACxB,QAAM,MACJ,OAAO,QAAQ,WAAW,MAAM,OAAO,QAAQ,WAAW,OAAO,GAAG,IAAI;AAC1E,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,UAAU,UAAa,UAAU,OAAO,OAAO,KAAK,IAAI;AAE1E,QAAM,cAAc,IAAI,eAAe;AACvC,QAAM,SAAS,IAAI,kBAAkB;AACrC,QAAM,SAAS,IAAI,aAAa;AAChC,QAAM,QAAQ,IAAI,oBAAoB;AACtC,QAAM,OAAO,IAAI,kBAAkB;AACnC,QAAM,SAAS,IAAI,kBAAkB;AACrC,QAAM,KAAK,IAAI,cAAc;AAC7B,QAAM,MAAM,IAAI,aAAa;AAC7B,QAAM,QAAQ,IAAI,mBAAmB;AACrC,QAAM,SAAS,IAAI,oBAAoB;AACvC,QAAM,WAAW,IAAI,oBAAoB;AACzC,QAAM,UAAU,IAAI,mBAAmB;AAEvC,QAAM,cACJ,IAAI,aAAa,QACjB,IAAI,gBAAgB,UACpB,IAAI,eAAe;AACrB,QAAM,YAAY,cAAc,GAAG,YAAa,IAAI,eAAe;AACnE,QAAM,WAAW,cAAc,GAAG,YAAa,IAAI,cAAc;AAEjE,QAAM,WAAgC;AAAA,IACpC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAEA,QAAM,YAAYC;AAAA,IAChB;AAAA,MACE,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,SAAS;AAAA,IACX;AAAA,IACA,IAAI;AAAA,EACN;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,eAAe;AAAA,QACf,UAAU;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,QAAQ,aAAa,WAAW;AAAA,YAChC,cAAc;AAAA,YACd,UAAU;AAAA,YACV,iBAAiB;AAAA,YACjB,WAAW;AAAA,UACb;AAAA,UAEA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,QAAQ;AAAA,kBACR,iBAAiB;AAAA,kBACjB,YAAY;AAAA,gBACd;AAAA,gBACA,eAAW;AAAA;AAAA,YACb;AAAA,YACA,+CAAC,SAAI,OAAO,WACV;AAAA,6DAAC,SAAI,OAAO,UACV;AAAA,8DAAC,UAAK,OAAO,EAAE,OAAO,WAAW,YAAY,SAAS,GACnD,iBACH;AAAA,gBACA,8CAAC,UAAK,OAAO,EAAE,OAAO,UAAU,YAAY,QAAQ,GACjD,qBACH;AAAA,iBACF;AAAA,cACA,+CAAC,SAAI,OAAO,EAAE,GAAG,UAAU,WAAW,IAAI,GACxC;AAAA,8DAAC,UAAK,OAAO,EAAE,OAAO,WAAW,YAAY,SAAS,GACnD,kBACH;AAAA,gBACA,8CAAC,UAAK,OAAO,EAAE,OAAO,UAAU,YAAY,QAAQ,GACjD,UAAAD,oBAAmB,GAAG,GACzB;AAAA,iBACF;AAAA,eACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AFxCI,IAAAE,uBAAA;AA/BJ,SAASC,OAAM,GAAoD;AACjE,MAAI,MAAM,OAAW,QAAO;AAC5B,SAAO,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC;AAC7C;AAEA,SAAS,gBACP,OAK2B;AAC3B,QAAM,EAAE,GAAG,GAAG,OAAO,OAAO,MAAM,UAAU,WAAW,IAAI;AAC3D,QAAM,KAAKA,OAAM,CAAC;AAClB,QAAM,KAAKA,OAAM,CAAC;AAClB,QAAM,KAAKA,OAAM,KAAK;AACtB,MAAI,OAAO,UAAa,OAAO,UAAa,OAAO,QAAW;AAC5D,WAAO;AAAA,EACT;AACA,QAAM,IACJ,UAAU,QAAQ,UAAU,SACxB,MACA,OAAO,UAAU,WACf,QACA,OAAO,KAAK;AACpB,MAAI,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,GAAG;AACjC,WAAO;AAAA,EACT;AACA,QAAM,KAAK,KAAK,KAAK;AACrB,QAAM,KAAK,KAAK;AAChB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAW;AAAA,MAEV,iBAAO,KAAK,MAAM,CAAC,CAAC;AAAA;AAAA,EACvB;AAEJ;AAEA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF,GAIuB;AACrB,QAAM,EAAE,UAAU,GAAG,IAAI,iCAAiC;AAC1D,QAAM,SAAS,IAAI,YAAY;AAC/B,QAAM,WAAW,IAAI,YAAY;AACjC,QAAM,YAAY,IAAI,aAAa;AACnC,QAAM,aAAa,IAAI,cAAc;AACrC,QAAM,OAAO,IAAI,uBAAuB;AACxC,QAAM,IAAI;AAAA,IACR,KAAK,IAAI,QAAQ,OAAO;AAAA,IACxB,OAAO,IAAI,QAAQ,SAAS;AAAA,IAC5B,QAAQ,IAAI,QAAQ,UAAU;AAAA,IAC9B,MAAM,IAAI,QAAQ,QAAQ;AAAA,EAC5B;AACA,QAAM,QAAQ,IAAI,iBAAiB;AACnC,QAAM,QAAQ,IAAI,iBAAiB;AACnC,QAAM,SAAS,IAAI,cAAc;AACjC,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,UAAU,IAAI,2BAA2B;AAC/C,QAAM,gBAAgB,IAAI,iBAAiB;AAC3C,QAAM,cAAc,IAAI,kBAAkB;AAC1C,QAAM,SAAS,IAAI,UAAU;AAE7B,QAAM,cAAgD;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SACE,8CAAC,aAAAC,SAAA,EAAI,IAAI,EAAE,OAAO,QAAQ,QAAQ,IAAI,IAAI,GACxC,wDAAC,yCAAoB,OAAM,QAAO,QAAO,QACvC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,iBAAiB;AAAA,YACjB,UAAU;AAAA,YACV,QAAQ;AAAA;AAAA,QACV;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAM,EAAE,MAAM,OAAO,UAAU,GAAG;AAAA,YAClC,UAAU;AAAA,YACV,UAAU,EAAE,QAAQ,UAAU;AAAA,YAC9B,UAAU;AAAA,YACV,QAAQ;AAAA;AAAA,QACV;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,MAAM,EAAE,MAAM,OAAO,UAAU,GAAG;AAAA,YAClC,UAAU;AAAA,YACV,UAAU;AAAA,YACV,OAAO;AAAA;AAAA,QACT;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,CAAC,MACR,8CAAC,2BAAyB,GAAG,GAAG;AAAA,YAElC,QAAQ;AAAA,cACN,MAAM;AAAA,cACN,QAAQ;AAAA,cACR,aAAa;AAAA,YACf;AAAA,YACA,oBAAoB,EAAE,GAAG,OAAO,GAAG,KAAK;AAAA;AAAA,QAC1C;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,mBAAmB;AAAA,YACnB,YAAY;AAAA,YAEZ;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,SAAS,CAAC,UACR;AAAA,kBAAC;AAAA;AAAA,oBACE,GAAI;AAAA,oBACL,MAAM;AAAA,oBACN,UAAU;AAAA,oBACV,YAAY;AAAA;AAAA,gBACd;AAAA;AAAA,YAEJ;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF,GACF,GACF;AAEJ;AAMO,SAAS,iBAAiB;AAAA,EAC/B,QAAQ;AAAA,EACR,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc,CAAC,GAAG,EAAE;AAAA,EACpB,aAAa,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,EACnC;AAAA,EACA;AACF,GAA8C;AAC5C,QAAM,YAAkB,gBAAQ,MAAM;AACpC,QAAI,eAAe;AACjB,aAAO,cAAc,WAAW,KAAK,CAAC;AAAA,IACxC;AACA,WAAO,QAAQ,CAAC;AAAA,EAClB,GAAG,CAAC,eAAe,MAAM,WAAW,CAAC;AAErC,QAAM,eACJ,gBAAgB,SACZ,0CACA;AAEN,QAAM,SAASC;AAAA,IACb;AAAA,MACE,SAAS;AAAA,MACT,cAAc;AAAA,MACd,WAAW;AAAA,IACb;AAAA,IACA,eAAe,UAAU;AAAA,EAC3B;AAEA,QAAM,KAAK,eAAe;AAC1B,QAAM,UAAUA;AAAA,IACd;AAAA,MACE,YAAY;AAAA,MACZ,UAAU,EAAE,IAAI,QAAQ,IAAI,UAAU;AAAA,MACtC,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,IACA,eAAe,QAAQ;AAAA,EACzB;AACA,QAAM,aAAaA;AAAA,IACjB;AAAA,MACE,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,IACA,eAAe,QAAQ;AAAA,EACzB;AAEA,SACE,8CAAC,yCAAsC,OAAO,iBAAiB,CAAC,GAC9D,wDAAC,aAAAC,SAAA,EAAK,WAAW,eAAe,UAAU,aAAa,GAAG,IAAI,QAC5D,wDAAC,oBAAAC,SAAA,EACC,yDAAC,eAAAC,SAAA,EAAM,SAAS,MAAM,IAAI,EAAE,OAAO,OAAO,GACxC;AAAA;AAAA,MAAC,eAAAA;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,YAAW;AAAA,QACX,gBAAe;AAAA,QACf,KAAK;AAAA,QACL,UAAS;AAAA,QAET;AAAA,yDAAC,aAAAJ,SAAA,EAAI,WAAU,OAAM,IAAI,EAAE,UAAU,EAAE,GACrC;AAAA,0DAAC,oBAAAK,SAAA,EAAW,WAAU,QAAO,IAAI,SAC9B,iBACH;AAAA,YACA,8CAAC,oBAAAA,SAAA,EAAW,WAAU,QAAO,IAAI,YAC9B,oBACH;AAAA,aACF;AAAA,UACA;AAAA,YAAC,eAAAD;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,YAAW;AAAA,cACX,SAAS;AAAA,cACT,IAAI,EAAE,YAAY,EAAE;AAAA,cAEnB,yBACC,gFACE;AAAA,8DAAC,8BAA2B;AAAA,gBAC5B;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS;AAAA,oBACT,WAAU;AAAA;AAAA,gBACZ;AAAA,iBACF,IACE;AAAA;AAAA,UACN;AAAA;AAAA;AAAA,IACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAU;AAAA,QACV,sBACE,IAAI,wBAAwB;AAAA,QAE9B,qBACE,IAAI,uBAAuB;AAAA,QAE7B,gBAAgB,IAAI,kBAAkB;AAAA,QACtC,kBAAkB,IAAI,oBAAoB;AAAA,QAC1C,oBAAoB,IAAI,sBAAsB;AAAA,QAC9C,WAAW,IAAI,aAAa;AAAA,QAC5B,aAAa,IAAI,eAAe;AAAA,QAChC,QAAQ,IAAI;AAAA,QACZ,WAAW,IAAI,aAAa;AAAA,QAC5B,qBAAqB,IAAI,uBAAuB;AAAA,QAChD,uBAAuB,IAAI,yBAAyB;AAAA;AAAA,IACtD;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KACF,GACF,GACF,GACF;AAEJ;;;AG9TA,yBAAwB;AACxB,IAAAE,iBAIO;AAgGH,IAAAC,uBAAA;AAvFJ,IAAM,aAAa;AACnB,IAAM,YAAY;AAClB,IAAM,cAAc;AAEpB,SAAS,aAAa,MAAuB;AAC3C,QAAM,YAAY,SAAS,UAAU,aAAa;AAElD,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,MACP,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,IAChB;AAAA,IACA,WAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,IAChB;AAAA,IACA,OAAO;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,IAChB;AAAA,IACA,SAAS;AAAA,MACP,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,IAChB;AAAA,IACA,MAAM;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,IAChB;AAAA,IACA,SAAS;AAAA,MACP,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,IAChB;AAAA,IACA,MAAM;AAAA,MACJ,SAAS,QAAQ,SAAS;AAAA,MAC1B,WAAW,QAAQ,SAAS;AAAA,MAC5B,UAAU,QAAQ,SAAS;AAAA,IAC7B;AAAA,IACA,SAAS,QAAQ,SAAS;AAAA,IAC1B,YAAY;AAAA,MACV,OAAO,SAAS,UAAU,YAAY;AAAA,MACtC,SAAS,SAAS,UAAU,YAAY;AAAA,IAC1C;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ,QAAQ,SAAS;AAAA,MACzB,OAAO,QAAQ,SAAS;AAAA,MACxB,UAAU,QAAQ,SAAS;AAAA,MAC3B,UAAU,QAAQ,SAAS;AAAA,MAC3B,oBAAoB,QAAQ,SAAS;AAAA,MACrC,OAAO,QAAQ,SAAS;AAAA,IAC1B;AAAA,EACF;AACF;AAIO,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA,MAAM;AAAA,EACN;AACF,MAAgC;AAC9B,QAAM,OAAwB,UAAU,QAAQ,YAAY;AAC5D,QAAM,YAAY,UAAU,aAAa;AAEzC,QAAM,YAAQ;AAAA,QACZ,4BAAY;AAAA,MACV;AAAA,MACA,SAAS,aAAa,IAAI;AAAA,MAC1B,OAAO,EAAE,cAAc,EAAE;AAAA,MACzB,YAAY,EAAE,YAAY,qCAAqC;AAAA,MAC/D,QAAQ,EAAE,SAAS,EAAE,WAAW,GAAG,EAAE;AAAA,IACvC,CAAC;AAAA,EACH;AAEA,SACE,+CAAC,gCAAc,OACb;AAAA,kDAAC,mBAAAC,SAAA,EAAY;AAAA,IACZ;AAAA,KACH;AAEJ;","names":["import_material","import_material","import_jsx_runtime","import_react","ClickAwayListener","Autocomplete","Box","Checkbox","TextField","Popper","ButtonBase","import_jsx_runtime","CloseIcon","import_material","import_jsx_runtime","import_react","import_Box","import_ClickAwayListener","import_Popper","import_styles","React","import_jsx_runtime","Box","Stack","Typography","Popper","ClickAwayListener","Paper","List","ListItemButton","ListItemText","import_jsx_runtime","Divider","import_react","import_Box","import_ClickAwayListener","import_Popper","import_Stack","import_Typography","import_styles","React","import_jsx_runtime","defaultTriggerBg","Box","Stack","Typography","IconButton","Popper","ClickAwayListener","import_react","import_Box","import_IconButton","import_Stack","import_Typography","React","import_jsx_runtime","Box","Typography","Tooltip","Stack","IconButton","import_Box","React","import_jsx_runtime","Box","import_Box","import_Stack","React","React","import_jsx_runtime","import_jsx_runtime","Box","ToggleButtonGroup","ToggleButton","Stack","import_material","import_jsx_runtime","MuiButton","import_material","import_jsx_runtime","import_material","import_jsx_runtime","Icon","import_material","import_jsx_runtime","import_material","import_jsx_runtime","import_Stack","import_styles","import_jsx_runtime","Switch","Stack","import_material","import_react","import_jsx_runtime","import_material","import_jsx_runtime","import_material","import_react","import_jsx_runtime","import_Box","import_Divider","import_Stack","import_Typography","React","import_jsx_runtime","mergeCss","Box","Stack","Typography","Divider","import_jsx_runtime","import_react","import_Box","import_Paper","import_Stack","import_Tooltip","import_Typography","import_react","import_jsx_runtime","defaultIconColor","Tooltip","Typography","cardMinHeightPx","cardMaxHeightPx","Paper","Box","Stack","import_jsx_runtime","import_Box","import_Stack","import_Typography","import_styles","React","import_recharts","import_jsx_runtime","resolveCardMaxWidth","useMediaQuery","Box","Stack","Typography","import_Box","import_Divider","import_Stack","import_Typography","React","import_recharts","import_jsx_runtime","mergeCss","sxChain","defaultMinWidthPerCategory","defaultMaxBarThickness","chartWidthAxisGutter","defaultChartMargin","defaultChartColors","formatBarLabel","Box","Stack","Typography","Divider","import_Box","import_Divider","import_Stack","import_Typography","React","import_recharts","React","import_jsx_runtime","mergeCss","sxChain","formatBarLabel","formatYAxisTickDefault","toNum","defaultMinWidthPerCategory","defaultMaxBarThickness","chartWidthAxisGutter","defaultChartMargin","topReserveForBarLabels","topReserveNoBarLabels","defaultChartColors","Box","Stack","Typography","Divider","import_Box","import_Divider","import_Stack","import_Typography","React","import_recharts","import_jsx_runtime","tooltipDatumFromPayload","mergeCss","sxChain","formatBarLabel","formatYAxisTickDefault","toNum","BarTopLabel","defaultMinWidthPerCategory","defaultMaxBarThickness","chartWidthAxisGutter","defaultChartMargin","topReserveForBarLabels","topReserveNoBarLabels","defaultChartColors","Box","Stack","Typography","Divider","import_react","import_material","React","import_recharts","overallVisitors","storeCount","import_jsx_runtime","p","import_Paper","import_Stack","import_Typography","import_jsx_runtime","Grid","Paper","Typography","Stack","import_Box","import_Grid","import_Stack","import_Typography","import_useMediaQuery","React","import_material","import_styles","React","import_recharts","React","import_jsx_runtime","import_jsx_runtime","import_Box","import_Typography","React","import_recharts","import_jsx_runtime","Box","Typography","import_Box","import_Stack","import_Typography","React","import_recharts","import_jsx_runtime","Stack","Box","Typography","import_jsx_runtime","useMediaQuery","Card","CardContent","Stack","Typography","Box","Grid","import_Box","import_Card","import_CardContent","import_Stack","import_Typography","React","import_recharts","mergeCss","mergeSx","React","import_jsx_runtime","import_jsx_runtime","mergeCss","import_jsx_runtime","Box","mergeSx","Card","CardContent","Stack","Typography","import_Box","import_Card","import_CardContent","import_Stack","import_Typography","React","import_recharts","React","import_jsx_runtime","import_jsx_runtime","formatTooltipValue","mergeCss","import_jsx_runtime","toNum","Box","mergeSx","Card","CardContent","Stack","Typography","import_styles","import_jsx_runtime","CssBaseline"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/AddCommentInput/AddCommentInput.tsx","../src/components/AdvancedFiltersDialog/AdvancedFiltersDialog.tsx","../src/components/FalconMultiSelect/FalconMultiSelect.tsx","../src/components/ButtonWithIcon/ButtonWithIcon.tsx","../src/components/ChartWidgetInfoButton/ChartWidgetInfoButton.tsx","../src/components/utils/ChartWidgetHeaderSeparator/ChartWidgetHeaderSeparator.tsx","../src/components/utils/ChartEmptyState/ChartEmptyState.tsx","../src/components/WidgetHeaderFilter/WidgetHeaderFilter.tsx","../src/components/widgets/RankedBarList/RankedBarList.tsx","../src/components/filters/TimePeriodFilter/TimePeriodFilter.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdownCustomizationContext.tsx","../src/components/QueueTimeBreakdown/queueTimeBreakdown.rechartsTooltip.ts","../src/components/QueueTimeBreakdown/queueTimeBreakdownCustomization.merge.ts","../src/components/tabs/ChartWidgetSegmentedTabs/ChartWidgetSegmentedTabs.tsx","../src/components/card/KpiStatCard/KpiStatCard.tsx","../src/components/card/KpiStatCard/useAnimatedMetric.ts","../src/components/FalconButton/FalconButton.tsx","../src/components/FalconDIstrictFilter/FalconDIstrictFilter.tsx","../src/components/FalconGrayButton/FalconGrayButton.tsx","../src/components/FalconPagination/FalconPagination.tsx","../src/components/FalconSelect/FalconSelect.tsx","../src/components/FalconSingleSwitch/FalconSingleSwitch.tsx","../src/components/FalconTable/FalconTable.tsx","../src/components/FalconTicketColumsFilter/FalconTicketColumsFilter.tsx","../src/components/FalconTicketFilter/FalconTicketFilter.tsx","../src/components/filters/timePeriodFilter.infoPopover.ts","../src/components/HeatMapChartLegend/HeatMapChartLegend.tsx","../src/components/ProgressBarNumber/ProgressBarNumber.tsx","../src/components/widgets/FootfallByAgeGroups/FootfallByAgeGroups.tsx","../src/components/_chart/resolveChartCardMaxWidth.ts","../src/components/widgets/FootfallByGender/FootfallByGender.tsx","../src/components/widgets/PasserbyConversion/PasserbyConversion.tsx","../src/components/_chart/useChartPlotScrollToEnd.ts","../src/components/widgets/WalkinAnalysis/WalkinAnalysis.tsx","../src/components/widgets/WalkinTraffic/WalkinTraffic.tsx","../src/components/BillingCounterAnalytics/billingCounterAnalytics.chartTokens.ts","../src/components/BillingCounterAnalytics/billingCounterAnalytics.defaultInfoPopover.ts","../src/components/BillingCounterAnalytics/billingCounterAnalytics.mock.ts","../src/components/BillingCounterAnalytics/BillingCounterAnalytics.tsx","../src/components/BillingCounterAnalytics/billingCounterAnalyticsCustomization.merge.ts","../src/components/BillingCounterAnalytics/BillingCounterAnalyticsCustomizationContext.tsx","../src/components/BillingCounterAnalytics/BillingCounterAnalyticsTooltip.tsx","../src/components/QueueTimeBreakdown/queueTimeBreakdown.chartTokens.ts","../src/components/QueueTimeBreakdown/QueueTimeBreakdown.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdown.types.ts","../src/components/QueueTimeBreakdown/QueueTimeBreakdownArea.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdownAreaTooltip.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdownDonut.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdownStackedBar.tsx","../src/components/QueueTimeBreakdown/queueTimeBreakdown.mock.ts","../src/components/widgets/FootFallHeatMap/FootFallHeatMapView.tsx","../src/components/widgets/FootFallHeatMap/FootFallHeatMapView.types.ts","../src/components/widgets/FootFallHeatMap/footfallHeatMapDerivedStrip.ts","../src/components/widgets/FootFallHeatMap/footfallHeatMapTree.ts","../src/components/widgets/FootFallHeatMap/ZoneWiseKpiCards.tsx","../src/components/widgets/PeakBillingHours/peakBillingHours.defaultInfoPopover.ts","../src/components/widgets/PeakBillingHours/peakBillingHours.mock.ts","../src/components/widgets/PeakBillingHours/PeakBillingHours.tsx","../src/components/widgets/PeakBillingHours/PeakBillingHoursCustomizationContext.tsx","../src/components/widgets/PeakBillingHours/PeakBillingHoursTooltip.tsx","../src/components/FalconThemeProvider/FalconThemeProvider.tsx"],"sourcesContent":["export { AddCommentInput } from './components/AddCommentInput';\nexport type { AddCommentInputProps } from './components/AddCommentInput';\nexport { AdvancedFiltersDialog } from './components/AdvancedFiltersDialog';\nexport type { AdvancedFiltersDialogProps } from './components/AdvancedFiltersDialog';\nexport { ButtonWithIcon } from './components/ButtonWithIcon';\nexport type { ButtonWithIconProps } from './components/ButtonWithIcon';\nexport { ChartWidgetInfoButton } from './components/ChartWidgetInfoButton';\nexport type {\n ChartWidgetInfoButtonProps,\n ChartWidgetInfoPopoverContent,\n} from './components/ChartWidgetInfoButton';\nexport { ChartWidgetHeaderSeparator } from './components/utils/ChartWidgetHeaderSeparator';\nexport { ChartEmptyState } from './components/utils/ChartEmptyState';\nexport type { ChartEmptyStateProps } from './components/utils/ChartEmptyState';\nexport { WidgetHeaderFilter } from './components/WidgetHeaderFilter';\nexport type {\n WidgetHeaderFilterProps,\n WidgetHeaderFilterStyleProps,\n WidgetHeaderMultiSelectConfig,\n} from './components/WidgetHeaderFilter';\nexport { RankedBarList } from './components/widgets/RankedBarList';\nexport type {\n RankedBarListCustomization,\n RankedBarListItem,\n RankedBarListProps,\n RankedBarListSegment,\n RankedBarListSegmentTooltipRenderContext,\n} from './components/widgets/RankedBarList';\n/** @deprecated Use {@link RankedBarList}. */\nexport { RankedBarList as ChartWidgetRankedBarList } from './components/widgets/RankedBarList';\n/** @deprecated Use {@link RankedBarListItem}. */\nexport type { RankedBarListItem as ChartWidgetRankedBarListItem } from './components/widgets/RankedBarList';\n/** @deprecated Use {@link RankedBarListProps}. */\nexport type { RankedBarListProps as ChartWidgetRankedBarListProps } from './components/widgets/RankedBarList';\n/** @deprecated Use {@link RankedBarListSegment}. */\nexport { TimePeriodFilter } from './components/filters/TimePeriodFilter';\nexport type { TimePeriodFilterProps } from './components/filters/TimePeriodFilter';\nexport { ChartWidgetSegmentedTabs } from './components/tabs/ChartWidgetSegmentedTabs';\nexport type {\n ChartWidgetSegmentedTab,\n ChartWidgetSegmentedTabLayout,\n ChartWidgetSegmentedTabsProps,\n} from './components/tabs/ChartWidgetSegmentedTabs';\nexport type { RankedBarListSegment as ChartWidgetRankedBarSegment } from './components/widgets/RankedBarList';\n/** @deprecated Use {@link TimePeriodFilter}. */\nexport { TimePeriodFilter as QueueTimePeriodFilter } from './components/filters/TimePeriodFilter';\n/** @deprecated Use {@link TimePeriodFilterProps}. */\nexport { KpiStatCard } from './components/card/KpiStatCard';\nexport type {\n KpiStatCardCustomization,\n KpiStatCardDetailedProps,\n KpiStatCardIconBackdropShape,\n KpiStatCardInfoPlacement,\n KpiStatCardInlineProps,\n KpiStatCardProps,\n KpiTrend,\n KpiTrendLayout,\n} from './components/card/KpiStatCard';\nexport { FalconButton } from './components/FalconButton';\nexport type { FalconButtonProps } from './components/FalconButton';\nexport { FalconDIstrictFilter } from './components/FalconDIstrictFilter';\nexport type {\n FalconDIstrictFilterOption,\n FalconDIstrictFilterProps,\n} from './components/FalconDIstrictFilter';\nexport { FalconGrayButton } from './components/FalconGrayButton';\nexport type { FalconGrayButtonProps } from './components/FalconGrayButton';\nexport { FalconMultiSelect } from './components/FalconMultiSelect';\nexport type {\n FalconMultiSelectOption,\n FalconMultiSelectProps,\n FalconMultiSelectStyleProps,\n} from './components/FalconMultiSelect';\nexport { FalconPagination } from './components/FalconPagination';\nexport type { FalconPaginationProps } from './components/FalconPagination';\nexport { FalconSelect } from './components/FalconSelect';\nexport type {\n FalconSelectOption,\n FalconSelectProps,\n} from './components/FalconSelect';\nexport { FalconSingleSwitch } from './components/FalconSingleSwitch';\nexport type { FalconSingleSwitchProps } from './components/FalconSingleSwitch';\nexport { FalconTable } from './components/FalconTable';\nexport type { FalconTableProps } from './components/FalconTable';\nexport { FalconTicketColumsFilter } from './components/FalconTicketColumsFilter';\nexport type { FalconTicketColumsFilterProps } from './components/FalconTicketColumsFilter';\nexport { FalconTicketFilter } from './components/FalconTicketFilter';\nexport type { FalconTicketFilterProps } from './components/FalconTicketFilter';\nexport type { TimePeriodFilterProps as QueueTimePeriodFilterProps } from './components/filters/TimePeriodFilter';\nexport {\n CHART_PERIOD_FILTER_INFO_POPOVER,\n DEFAULT_QUEUE_TIME_BREAKDOWN_INFO_POPOVER,\n QUEUE_TIME_BREAKDOWN_INFO_POPOVER,\n TIME_PERIOD_FILTER_INFO_POPOVER,\n TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN,\n} from './components/filters/timePeriodFilter.infoPopover';\nexport { HeatMapChartLegend } from './components/HeatMapChartLegend';\nexport type {\n HeatMapChartLegendProps,\n HeatMapLegendItem,\n} from './components/HeatMapChartLegend';\nexport { ProgressBarNumber } from './components/ProgressBarNumber';\nexport type { ProgressBarNumberProps } from './components/ProgressBarNumber';\nexport { FootfallByAgeGroups } from './components/widgets/FootfallByAgeGroups';\nexport type {\n FootfallByAgeGroupsCardMaxWidth,\n FootfallByAgeGroupsChartColors,\n FootfallByAgeGroupsChartMargin,\n FootfallByAgeGroupsHorizontalScroll,\n FootfallByAgeGroupsProps,\n FootfallByAgeGroupsRow,\n FootfallByAgeGroupsSeries,\n FootfallByAgeGroupsTooltipRenderContext,\n FootfallByAgeGroupsTooltipStyles,\n} from './components/widgets/FootfallByAgeGroups';\nexport { FootfallByGender } from './components/widgets/FootfallByGender';\nexport type {\n FootfallByGenderCardMaxWidth,\n FootfallByGenderChartColors,\n FootfallByGenderChartMargin,\n FootfallByGenderHorizontalScroll,\n FootfallByGenderProps,\n FootfallByGenderRow,\n FootfallByGenderTooltipRenderContext,\n FootfallByGenderTooltipStyles,\n} from './components/widgets/FootfallByGender';\nexport { PasserbyConversion } from './components/widgets/PasserbyConversion';\nexport type {\n PasserbyConversionCardMaxWidth,\n PasserbyConversionChartColors,\n PasserbyConversionChartMargin,\n PasserbyConversionHorizontalScroll,\n PasserbyConversionProps,\n PasserbyConversionRow,\n PasserbyConversionTooltipRenderContext,\n PasserbyConversionTooltipStyles,\n} from './components/widgets/PasserbyConversion';\nexport { WalkinAnalysis } from './components/widgets/WalkinAnalysis';\nexport type {\n WalkinAnalysisCardMaxWidth,\n WalkinAnalysisCustomization,\n WalkinAnalysisPieSize,\n WalkinAnalysisProps,\n WalkinAnalysisSlice,\n WalkinAnalysisTab,\n WalkinAnalysisTooltipRenderContext,\n WalkinAnalysisTypography,\n} from './components/widgets/WalkinAnalysis';\nexport { WalkinTraffic } from './components/widgets/WalkinTraffic';\nexport type {\n WalkinTrafficCardMaxWidth,\n WalkinTrafficChartColors,\n WalkinTrafficChartMargin,\n WalkinTrafficHorizontalScroll,\n WalkinTrafficProps,\n WalkinTrafficRow,\n WalkinTrafficTooltipRenderContext,\n WalkinTrafficTooltipStyles,\n} from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTraffic}. */\nexport { WalkinTraffic as WalkinTrafficByHour } from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTrafficRow}. */\nexport type { WalkinTrafficRow as WalkinTrafficByHourRow } from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTrafficProps}. */\nexport type { WalkinTrafficProps as WalkinTrafficByHourProps } from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTrafficTooltipStyles}. */\nexport type { WalkinTrafficTooltipStyles as WalkinTrafficByHourTooltipStyles } from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTrafficChartMargin}. */\nexport type { WalkinTrafficChartMargin as WalkinTrafficByHourChartMargin } from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTrafficChartColors}. */\nexport type { WalkinTrafficChartColors as WalkinTrafficByHourChartColors } from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTrafficHorizontalScroll}. */\nexport type { WalkinTrafficHorizontalScroll as WalkinTrafficByHourHorizontalScroll } from './components/widgets/WalkinTraffic';\n/** @deprecated Use {@link WalkinTrafficCardMaxWidth}. */\nexport * from './components/BillingCounterAnalytics';\nexport * from './components/QueueTimeBreakdown';\nexport * from './components/widgets/FootFallHeatMap';\nexport * from './components/widgets/PeakBillingHours';\nexport type { WalkinTrafficCardMaxWidth as WalkinTrafficByHourCardMaxWidth } from './components/widgets/WalkinTraffic';\n\n// Theme\nexport { FalconThemeProvider } from './components/FalconThemeProvider';\nexport type {\n FalconThemeDirection,\n FalconThemeMode,\n FalconThemeProviderProps,\n FalconThemeSettings,\n} from './components/FalconThemeProvider';\n","import { Button, InputAdornment, TextField } from '@mui/material';\nimport type { ChangeEvent } from 'react';\nimport type { AddCommentInputProps } from './AddCommentInput.types';\n\nexport const AddCommentInput = ({\n value,\n setValue,\n handleAddComment,\n placeholder = 'Write Comment here',\n buttonLabel = 'Add Comment',\n}: AddCommentInputProps) => {\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n setValue(event.target.value);\n };\n\n return (\n <TextField\n label=\"\"\n fullWidth\n sx={{ width: '550px', maxWidth: '100%' }}\n value={value}\n placeholder={placeholder}\n onChange={handleChange}\n type=\"text\"\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\">\n <Button\n variant=\"contained\"\n sx={{\n background: '#000',\n color: '#fff',\n position: 'absolute',\n right: 0,\n top: 0,\n padding: '16px',\n cursor: 'pointer',\n borderRadius: '0 5px 5px 0',\n }}\n onClick={handleAddComment}\n onMouseDown={(e) => e.preventDefault()}\n >\n {buttonLabel}\n </Button>\n </InputAdornment>\n ),\n }}\n />\n );\n};\n","import { Close as CloseIcon } from '@mui/icons-material';\nimport {\n\tBox,\n\tButton,\n\tDialog,\n\tDialogActions,\n\tDialogContent,\n\tDialogTitle,\n\tIconButton,\n\tTypography,\n} from '@mui/material';\nimport { FalconMultiSelect } from '../FalconMultiSelect';\nimport type { AdvancedFiltersDialogProps } from './AdvancedFiltersDialog.types';\n\nconst defaultLocationOptions = [\n\t{ id: 1, label: 'Location A' },\n\t{ id: 2, label: 'Location B' },\n];\n\nconst defaultBusinessAreaOptions = [\n\t{ id: 1, label: 'Retail' },\n\t{ id: 2, label: 'Healthcare' },\n];\n\nexport const AdvancedFiltersDialog = ({\n\topen,\n\tonClose,\n\tlocationOptions = defaultLocationOptions.map((option) => ({\n\t\tid: option.id,\n\t\tname: option.label,\n\t})),\n\tbusinessAreaOptions = defaultBusinessAreaOptions.map((option) => ({\n\t\tid: option.id,\n\t\tname: option.label,\n\t})),\n\tselectedLocations = [],\n\tselectedBusinessAreas = [],\n\tonLocationsChange = () => { },\n\tonBusinessAreasChange = () => { },\n\tonApply,\n\tonCancel,\n}: AdvancedFiltersDialogProps) => {\n\tconst handleApply = () => {\n\t\tonApply?.();\n\t\tonClose();\n\t};\n\n\tconst handleCancel = () => {\n\t\tonCancel?.();\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Dialog open={open} onClose={onClose} maxWidth=\"sm\" fullWidth>\n\t\t\t<DialogTitle>\n\t\t\t\t<Box display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n\t\t\t\t\t<Typography variant=\"h6\">Advanced Filters</Typography>\n\t\t\t\t\t<IconButton onClick={onClose} size=\"small\" aria-label=\"Close\">\n\t\t\t\t\t\t<CloseIcon />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Box>\n\t\t\t</DialogTitle>\n\t\t\t<DialogContent>\n\t\t\t\t<Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, pt: 1 }}>\n\t\t\t\t\t<FalconMultiSelect\n\t\t\t\t\t\tlabel=\"Locations\"\n\t\t\t\t\t\tlist={locationOptions}\n\t\t\t\t\t\tdata={selectedLocations}\n\t\t\t\t\t\tsetData={onLocationsChange}\n\t\t\t\t\t/>\n\t\t\t\t\t<FalconMultiSelect\n\t\t\t\t\t\tlabel=\"Business Areas\"\n\t\t\t\t\t\tlist={businessAreaOptions}\n\t\t\t\t\t\tdata={selectedBusinessAreas}\n\t\t\t\t\t\tsetData={onBusinessAreasChange}\n\t\t\t\t\t/>\n\t\t\t\t</Box>\n\t\t\t</DialogContent>\n\t\t\t<DialogActions>\n\t\t\t\t<Button onClick={handleCancel}>Cancel</Button>\n\t\t\t\t<Button variant=\"contained\" onClick={handleApply}>\n\t\t\t\t\tApply\n\t\t\t\t</Button>\n\t\t\t</DialogActions>\n\t\t</Dialog>\n\t);\n};\n","import { Icon } from '@iconify/react';\nimport { Stack, Typography } from '@mui/material';\nimport Autocomplete, {\n AutocompleteCloseReason,\n autocompleteClasses,\n} from '@mui/material/Autocomplete';\nimport Box from '@mui/material/Box';\nimport ButtonBase from '@mui/material/ButtonBase';\nimport Checkbox from '@mui/material/Checkbox';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport Popper from '@mui/material/Popper';\nimport TextField from '@mui/material/TextField';\nimport { styled } from '@mui/material/styles';\nimport * as React from 'react';\nimport type {\n FalconMultiSelectOption,\n FalconMultiSelectProps,\n} from './FalconMultiSelect.types';\n\nexport const FalconMultiSelect = ({\n // core\n label,\n data,\n setData,\n list,\n // trigger\n triggerBg = '#EFEFEF',\n triggerColor,\n triggerMinWidth = 250,\n triggerBorderRadius = '6px',\n triggerSx,\n // popper panel\n popperWidth = 300,\n popperBorderColor = '#e1e4e8',\n popperBorderColorDark = '#30363d',\n popperBg = '#fff',\n popperBgDark = '#1c2128',\n popperColor = '#24292e',\n popperColorDark = '#c9d1d9',\n // options\n optionBorderColor = '#D6D6D6',\n optionHeight = 60,\n checkboxColor = 'green',\n checkboxCheckedColor = '#6750A4',\n // search\n searchLabel = 'Search State',\n searchIconColor = '#49454F',\n // buttons\n applyBg = '#333',\n applyColor = 'white',\n applyLabel = 'Apply',\n clearColor = 'black',\n clearLabel = 'Clear',\n}: FalconMultiSelectProps) => {\n const [checked, setChecked] = React.useState<FalconMultiSelectOption[]>(\n data ?? []\n );\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [pendingValue, setPendingValue] = React.useState<\n FalconMultiSelectOption[]\n >([]);\n\n const open = Boolean(anchorEl);\n const id = open ? 'falcon-multiselect' : undefined;\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n setPendingValue(checked);\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n if (anchorEl) anchorEl.focus();\n setAnchorEl(null);\n };\n\n const handleApply = () => {\n setData(checked);\n handleClose();\n };\n\n const handleClear = () => {\n setChecked([]);\n setData([]);\n handleClose();\n };\n\n const handleToggle = (option: FalconMultiSelectOption) => {\n setChecked(prev => {\n const exists = prev.some(x => x.id === option.id);\n return exists ? prev.filter(x => x.id !== option.id) : [...prev, option];\n });\n };\n\n const triggerLabel =\n checked.length === 0\n ? `Filter by ${label}`\n : checked.length === 1\n ? checked[0].name\n : `${checked[0].name}, ${checked[1].name}${checked.length > 2 ? '…' : ''}`;\n\n return (\n <React.Fragment>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={2}\n onClick={handleClick}\n sx={{\n minWidth: triggerMinWidth,\n background: triggerBg,\n borderRadius: triggerBorderRadius,\n cursor: 'pointer',\n padding: '12px',\n ...(triggerColor ? { color: triggerColor } : {}),\n ...triggerSx,\n }}\n >\n <Typography\n variant=\"body2\"\n sx={triggerColor ? { color: triggerColor } : undefined}\n >\n {triggerLabel}\n </Typography>\n <Icon\n icon={open ? 'tabler:chevron-up' : 'tabler:chevron-down'}\n color={triggerColor}\n />\n </Stack>\n\n <StyledPopper\n id={id}\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-start\"\n ownerState={{\n popperWidth,\n popperBorderColor,\n popperBorderColorDark,\n popperBg,\n popperBgDark,\n popperColor,\n popperColorDark,\n }}\n >\n <ClickAwayListener onClickAway={handleClose}>\n <div>\n <Autocomplete\n open\n multiple\n onClose={(\n _: React.SyntheticEvent,\n reason: AutocompleteCloseReason\n ) => {\n if (reason === 'escape') handleClose();\n }}\n value={pendingValue}\n onChange={(_, newValue) => setPendingValue(newValue)}\n disableCloseOnSelect\n slots={{ popper: PopperComponent }}\n noOptionsText=\"No labels\"\n options={list}\n getOptionLabel={option => option.name}\n isOptionEqualToValue={(option, val) => option.id === val.id}\n renderOption={(props, option) => (\n <li\n {...props}\n key={option.id}\n style={{\n height: optionHeight,\n border: `1px solid ${optionBorderColor}`,\n margin: '16px 12px',\n flexShrink: 0,\n borderRadius: 6,\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <Box\n sx={{\n flexGrow: 3,\n borderRadius: '3px',\n ml: 1,\n mt: '1px',\n justifyContent: 'start',\n alignItems: 'center',\n width: '80%',\n fontSize: '13px',\n }}\n >\n {option.name}\n </Box>\n <Box\n component=\"span\"\n sx={{\n flexShrink: 0,\n borderRadius: '3px',\n mr: 1,\n mt: '2px',\n flexGrow: 1,\n justifyContent: 'end',\n width: '20%',\n alignItems: 'center',\n }}\n >\n <Checkbox\n slotProps={{ input: { 'aria-label': option.name } }}\n checked={checked.some(x => x.id === option.id)}\n onChange={() => handleToggle(option)}\n sx={{\n color: checkboxColor,\n '&.Mui-checked': { color: checkboxCheckedColor },\n }}\n />\n </Box>\n </li>\n )}\n renderInput={params => (\n <Box\n sx={{\n position: 'relative',\n '& > :not(style)': { width: '100%' },\n }}\n >\n <TextField\n label={searchLabel}\n variant=\"filled\"\n sx={{\n width: '100%',\n margin: '10px',\n '& > :not(style)': { width: '94%' },\n }}\n ref={params.InputProps.ref}\n slotProps={{ htmlInput: params.inputProps }}\n />\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ position: 'absolute', left: 110, top: 30 }}\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M14.76 13.27L20.49 19L19 20.49L13.27 14.76C12.2 15.53 10.91 16 9.5 16C5.91 16 3 13.09 3 9.5C3 5.91 5.91 3 9.5 3C13.09 3 16 5.91 16 9.5C16 10.91 15.53 12.2 14.76 13.27ZM9.5 5C7.01 5 5 7.01 5 9.5C5 11.99 7.01 14 9.5 14C11.99 14 14 11.99 14 9.5C14 7.01 11.99 5 9.5 5Z\"\n fill={searchIconColor}\n />\n </svg>\n </Box>\n )}\n />\n\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n m: '8px',\n height: 110,\n }}\n >\n <ActionButton\n onClick={handleApply}\n sx={{\n height: '42px',\n borderRadius: '3px',\n background: applyBg,\n margin: '5px 0 10px 0',\n color: applyColor,\n }}\n >\n {applyLabel}\n </ActionButton>\n <ActionButton\n onClick={handleClear}\n sx={{\n height: '42px',\n borderRadius: '3px',\n mb: '8px',\n color: clearColor,\n }}\n >\n {clearLabel}\n </ActionButton>\n </Box>\n </div>\n </ClickAwayListener>\n </StyledPopper>\n </React.Fragment>\n );\n};\n\n// ─── Internal types ──────────────────────────────────────────────────────────\n\ninterface PopperComponentProps {\n anchorEl?: unknown;\n disablePortal?: boolean;\n open: boolean;\n}\n\ninterface StyledPopperOwnerState {\n popperWidth: number | string;\n popperBorderColor: string;\n popperBorderColorDark: string;\n popperBg: string;\n popperBgDark: string;\n popperColor: string;\n popperColorDark: string;\n}\n\n// ─── Styled components ───────────────────────────────────────────────────────\n\nconst StyledAutocompletePopper = styled('div')(({ theme }) => ({\n [`& .${autocompleteClasses.paper}`]: {\n boxShadow: 'none',\n color: 'inherit',\n fontSize: 13,\n },\n [`& .${autocompleteClasses.listbox}`]: {\n backgroundColor: theme.palette.mode === 'light' ? '#fff' : '#1c2128',\n padding: 0,\n [`& .${autocompleteClasses.option}`]: {\n minHeight: 'auto',\n alignItems: 'flex-start',\n padding: 8,\n borderBottom: `1px solid ${theme.palette.mode === 'light' ? '#eaecef' : '#30363d'}`,\n '&[aria-selected=\"true\"]': { backgroundColor: 'transparent' },\n [`&.${autocompleteClasses.focused}, &.${autocompleteClasses.focused}[aria-selected=\"true\"]`]:\n {\n backgroundColor: theme.palette.action.hover,\n },\n },\n },\n [`&.${autocompleteClasses.popperDisablePortal}`]: { position: 'relative' },\n}));\n\nfunction PopperComponent({\n disablePortal: _d,\n anchorEl: _a,\n open: _o,\n ...other\n}: PopperComponentProps) {\n return <StyledAutocompletePopper {...other} />;\n}\n\nconst StyledPopper = styled(Popper, {\n shouldForwardProp: prop => prop !== 'ownerState',\n})<{ ownerState: StyledPopperOwnerState }>(({ theme, ownerState }) => ({\n border: `1px solid ${theme.palette.mode === 'light' ? ownerState.popperBorderColor : ownerState.popperBorderColorDark}`,\n boxShadow: `0 8px 24px ${theme.palette.mode === 'light' ? 'rgba(149, 157, 165, 0.2)' : 'rgb(1, 4, 9)'}`,\n borderRadius: 6,\n width: ownerState.popperWidth,\n zIndex: theme.zIndex.modal,\n fontSize: 13,\n color:\n theme.palette.mode === 'light'\n ? ownerState.popperColor\n : ownerState.popperColorDark,\n backgroundColor:\n theme.palette.mode === 'light'\n ? ownerState.popperBg\n : ownerState.popperBgDark,\n}));\n\nconst ActionButton = styled(ButtonBase)(() => ({\n fontSize: 13,\n width: '100%',\n textAlign: 'left',\n paddingBottom: 8,\n fontWeight: 600,\n '& span': { width: '100%' },\n '& svg': { width: 16, height: 16 },\n}));\n","import { Box, Button, Typography } from '@mui/material';\nimport type { ButtonWithIconProps } from './ButtonWithIcon.types';\n\nexport const ButtonWithIcon = ({\n size = 'large',\n variant = 'contained',\n children,\n icon,\n ...props\n}: ButtonWithIconProps) => (\n <Button\n fullWidth\n size={size}\n variant={variant}\n sx={{ minWidth: '200px', maxWidth: '250px', backgroundColor: 'white', color: 'black' }}\n {...props}\n >\n <Box display=\"flex\" gap={1} justifyContent=\"space-between\" alignItems=\"center\">\n <Typography variant=\"inherit\">{children}</Typography>\n {icon && (\n <Box mt={0.25} ml={0.5}>\n {icon}\n </Box>\n )}\n </Box>\n </Button>\n);\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport IconButton from '@mui/material/IconButton';\nimport Popper, { type PopperPlacementType } from '@mui/material/Popper';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { useTheme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type {\n ChartWidgetInfoButtonProps,\n ChartWidgetInfoPopoverContent,\n} from './ChartWidgetInfoButton.types';\n\nconst defaultIconColor = '#6750A4';\nconst defaultTriggerBg = '#EFEFEF';\nconst defaultTriggerHoverBg = '#E5E5E5';\nconst defaultButtonSize = 30;\nconst defaultIconSize = 22;\nconst defaultPopoverWidth = 320;\nconst compactButtonSize = 22;\nconst compactIconSize = 15;\nconst compactPopoverWidth = 240;\nconst popperBorder = '#e1e4e8';\nconst popperBorderDark = '#30363d';\n\n/** Triangle + track sized from trigger so legend-sized buttons get a smaller, proportional caret. */\nfunction resolveCaretMetrics(triggerWidth: number): {\n caretInset: number;\n trackW: number;\n halfOuter: number;\n halfInner: number;\n triH: number;\n stripH: number;\n} {\n const compact = triggerWidth <= 26;\n const halfOuter = compact ? 6 : 9;\n const halfInner = halfOuter - 1;\n const triH = compact ? 7 : 10;\n const stripH = triH;\n const minTrack = halfOuter * 2 + 4;\n const trackW = Math.max(triggerWidth, minTrack);\n /** Inset of the caret track from the popper’s start/end edge that aligns with the anchor (see `caretHorizontalAxis`). */\n const caretInset = Math.max(0, (triggerWidth - trackW) / 2);\n return { caretInset, trackW, halfOuter, halfInner, triH, stripH };\n}\n\n/** Popper flips to `top-*` when there is no room below; caret must attach on the edge that faces the anchor. */\nfunction popoverCaretPointsDown(placement: PopperPlacementType): boolean {\n return placement.startsWith('top');\n}\n\n/**\n * Maps Popper placement to where the caret sits on the panel width.\n * `bottom-end` / `top-end` → anchor’s end edge; `*-start` → start edge; `top`/`bottom` → centered under anchor.\n */\nfunction caretHorizontalAxis(\n placement: PopperPlacementType\n): 'end' | 'start' | 'center' {\n if (placement === 'bottom' || placement === 'top') {\n return 'center';\n }\n if (placement.endsWith('-start')) {\n return 'start';\n }\n if (placement.endsWith('-end')) {\n return 'end';\n }\n /* `auto`, side placements: keep caret readable */\n if (placement.startsWith('left') || placement.startsWith('right')) {\n return 'center';\n }\n return 'end';\n}\n\nfunction PopoverCaret({\n metrics,\n border,\n paperBg,\n pointsDown,\n placement,\n}: {\n metrics: ReturnType<typeof resolveCaretMetrics>;\n border: string;\n paperBg: string;\n /** `true` when placement is `top-*` (panel above the button; arrow on bottom of panel). */\n pointsDown: boolean;\n placement: PopperPlacementType;\n}) {\n const { caretInset, trackW, halfOuter, halfInner, triH, stripH } = metrics;\n const horizontal = caretHorizontalAxis(placement);\n\n const trackPositionSx =\n horizontal === 'center'\n ? {\n insetInlineStart: '50%',\n marginInlineStart: `${-trackW / 2}px`,\n width: trackW,\n }\n : horizontal === 'start'\n ? { insetInlineStart: caretInset, width: trackW }\n : { insetInlineEnd: caretInset, width: trackW };\n\n return (\n <Box\n aria-hidden\n sx={{\n position: 'relative',\n zIndex: 3,\n height: stripH,\n width: '100%',\n flexShrink: 0,\n pointerEvents: 'none',\n }}\n >\n <Box\n sx={{\n position: 'absolute',\n ...trackPositionSx,\n ...(pointsDown ? { top: 0 } : { bottom: 0 }),\n height: stripH,\n zIndex: 2,\n ...(pointsDown\n ? {\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n top: 0,\n transform: 'translateX(-50%)',\n borderLeft: `${halfOuter}px solid transparent`,\n borderRight: `${halfOuter}px solid transparent`,\n borderTop: `${triH}px solid ${border}`,\n },\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n top: '-2px',\n transform: 'translateX(-50%)',\n borderLeft: `${halfInner}px solid transparent`,\n borderRight: `${halfInner}px solid transparent`,\n borderTop: `${triH}px solid ${paperBg}`,\n },\n }\n : {\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n bottom: 0,\n transform: 'translateX(-50%)',\n borderLeft: `${halfOuter}px solid transparent`,\n borderRight: `${halfOuter}px solid transparent`,\n borderBottom: `${triH}px solid ${border}`,\n },\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n bottom: '-2px',\n transform: 'translateX(-50%)',\n borderLeft: `${halfInner}px solid transparent`,\n borderRight: `${halfInner}px solid transparent`,\n borderBottom: `${triH}px solid ${paperBg}`,\n },\n }),\n }}\n />\n </Box>\n );\n}\n\nfunction InfoPopoverPanel({\n content,\n width,\n isDark,\n triggerWidth,\n placement,\n compact,\n}: {\n content: ChartWidgetInfoPopoverContent;\n width: number;\n isDark: boolean;\n /** Matches the anchor button width so the caret lines up with the icon center (right-aligned popper). */\n triggerWidth: number;\n /** Actual Popper placement (may flip when there is no space below). */\n placement: PopperPlacementType;\n /** Smaller padding and type scale (see `ChartWidgetInfoButton` `density=\"compact\"`). */\n compact: boolean;\n}) {\n const helpTitle = content.helpTitle ?? 'How does it help?';\n const border = isDark ? popperBorderDark : popperBorder;\n const paperBg = isDark ? '#1c2128' : '#fff';\n const textPrimary = isDark ? '#f0f6fc' : '#1a1a1a';\n const textSecondary = isDark ? '#8b949e' : '#424242';\n\n const panelShadow = isDark\n ? '0 10px 24px rgb(1, 4, 9)'\n : '0 10px 24px rgba(15, 23, 42, 0.14)';\n\n const metrics = resolveCaretMetrics(triggerWidth);\n const caretDown = popoverCaretPointsDown(placement);\n\n const titleFs = compact ? 13 : 16;\n const bodyFs = compact ? 12 : 14;\n const helpFs = compact ? 12 : 14;\n const stackSpacing = compact ? 1 : 1.75;\n const paperPadding = compact ? 1.5 : 2.25;\n\n const paper = (\n <Box\n sx={{\n position: 'relative',\n zIndex: 1,\n width: '100%',\n ...(caretDown ? { mb: '-2px' } : { mt: '-2px' }),\n border: `1px solid ${border}`,\n borderRadius: compact ? 1.5 : 2,\n bgcolor: paperBg,\n p: paperPadding,\n boxShadow: panelShadow,\n }}\n >\n <Stack spacing={stackSpacing} sx={{ position: 'relative', zIndex: 1 }}>\n <Typography\n component=\"h3\"\n sx={{\n fontWeight: 700,\n fontSize: titleFs,\n lineHeight: 1.35,\n color: textPrimary,\n }}\n >\n {content.title}\n </Typography>\n <Typography\n sx={{\n fontSize: bodyFs,\n lineHeight: 1.5,\n color: textSecondary,\n }}\n >\n {content.description}\n </Typography>\n <Typography\n sx={{\n fontWeight: 700,\n fontSize: helpFs,\n lineHeight: 1.35,\n color: textPrimary,\n pt: compact ? 0 : 0.25,\n }}\n >\n {helpTitle}\n </Typography>\n <Box\n component=\"ul\"\n sx={{\n m: 0,\n pl: compact ? 2 : 2.5,\n color: textSecondary,\n fontSize: bodyFs,\n lineHeight: 1.55,\n listStyleType: 'disc',\n listStylePosition: 'outside',\n '& li': {\n display: 'list-item',\n mb: compact ? 0.5 : 0.75,\n '&:last-of-type': { mb: 0 },\n },\n }}\n >\n {content.helpBullets.map(item => (\n <Typography\n key={item}\n component=\"li\"\n sx={{\n fontSize: bodyFs,\n lineHeight: 1.55,\n display: 'list-item',\n }}\n >\n {item}\n </Typography>\n ))}\n </Box>\n </Stack>\n </Box>\n );\n\n const caret = (\n <PopoverCaret\n metrics={metrics}\n border={border}\n paperBg={paperBg}\n pointsDown={caretDown}\n placement={placement}\n />\n );\n\n return (\n <Box sx={{ position: 'relative', width }}>\n {caretDown ? (\n <>\n {paper}\n {caret}\n </>\n ) : (\n <>\n {caret}\n {paper}\n </>\n )}\n </Box>\n );\n}\n\nconst hoverCloseDelayMs = 120;\n\nexport const ChartWidgetInfoButton = ({\n onClick,\n ariaLabel = 'More information',\n sx,\n iconColor = defaultIconColor,\n buttonBg = defaultTriggerBg,\n buttonHoverBg = defaultTriggerHoverBg,\n iconSize: iconSizeProp,\n buttonSize: buttonSizeProp,\n popover,\n popoverWidth: popoverWidthProp,\n density = 'default',\n}: ChartWidgetInfoButtonProps) => {\n const isCompact = density === 'compact';\n const buttonSize =\n buttonSizeProp ?? (isCompact ? compactButtonSize : defaultButtonSize);\n const iconSize =\n iconSizeProp ?? (isCompact ? compactIconSize : defaultIconSize);\n const popoverWidth =\n popoverWidthProp ?? (isCompact ? compactPopoverWidth : defaultPopoverWidth);\n const theme = useTheme();\n const isDark = theme.palette.mode === 'dark';\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const closeTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const open = Boolean(anchorEl) && Boolean(popover);\n\n const clearCloseTimer = React.useCallback(() => {\n if (closeTimerRef.current !== null) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n React.useEffect(() => () => clearCloseTimer(), [clearCloseTimer]);\n\n const scheduleClose = React.useCallback(() => {\n clearCloseTimer();\n closeTimerRef.current = setTimeout(() => {\n setAnchorEl(null);\n closeTimerRef.current = null;\n }, hoverCloseDelayMs);\n }, [clearCloseTimer]);\n\n const handleButtonMouseEnter = (\n event: React.MouseEvent<HTMLButtonElement>\n ) => {\n if (!popover) return;\n clearCloseTimer();\n setAnchorEl(event.currentTarget);\n };\n\n const handleButtonMouseLeave = () => {\n if (!popover) return;\n scheduleClose();\n };\n\n const handlePopperMouseEnter = () => {\n clearCloseTimer();\n };\n\n const handlePopperMouseLeave = () => {\n scheduleClose();\n };\n\n const handleToggle = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.();\n if (!popover) return;\n clearCloseTimer();\n setAnchorEl(prev => (prev ? null : event.currentTarget));\n };\n\n const handleClose = () => {\n clearCloseTimer();\n setAnchorEl(null);\n };\n\n return (\n <Box sx={{ flexShrink: 0, position: 'relative', display: 'inline-flex' }}>\n <IconButton\n type=\"button\"\n size=\"small\"\n onClick={handleToggle}\n onMouseEnter={handleButtonMouseEnter}\n onMouseLeave={handleButtonMouseLeave}\n aria-label={ariaLabel}\n aria-expanded={open}\n aria-haspopup={popover ? 'dialog' : undefined}\n sx={{\n flexShrink: 0,\n bgcolor: buttonBg,\n width: buttonSize,\n height: buttonSize,\n minWidth: buttonSize,\n p: 0,\n border: 'none',\n borderRadius: '50%',\n '&:hover': { bgcolor: buttonHoverBg },\n ...sx,\n }}\n >\n <Box\n component=\"span\"\n sx={{\n display: 'inline-flex',\n lineHeight: 0,\n pointerEvents: 'none',\n }}\n >\n <Icon\n icon=\"bi:info\"\n width={iconSize}\n height={iconSize}\n color={iconColor}\n />\n </Box>\n </IconButton>\n\n {popover ? (\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-end\"\n sx={{ zIndex: theme.zIndex.modal }}\n modifiers={[\n {\n name: 'offset',\n options: { offset: [0, 4] },\n },\n {\n name: 'flip',\n options: {\n fallbackPlacements: [\n 'bottom-start',\n 'bottom',\n 'top-end',\n 'top-start',\n 'top',\n ],\n },\n },\n {\n name: 'preventOverflow',\n options: {\n padding: 12,\n altAxis: true,\n },\n },\n ]}\n >\n {({ placement }) => (\n <ClickAwayListener onClickAway={handleClose}>\n <Box\n onMouseEnter={handlePopperMouseEnter}\n onMouseLeave={handlePopperMouseLeave}\n >\n <InfoPopoverPanel\n content={popover}\n width={popoverWidth}\n isDark={isDark}\n triggerWidth={buttonSize}\n placement={placement ?? 'bottom-end'}\n compact={isCompact}\n />\n </Box>\n </ClickAwayListener>\n )}\n </Popper>\n ) : null}\n </Box>\n );\n};\n","import Divider from '@mui/material/Divider';\n\nexport const ChartWidgetHeaderSeparator = () => (\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={{\n alignSelf: 'center',\n borderColor: '#E0E0E0',\n height: 40,\n my: 0.5,\n }}\n />\n);\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { ChartEmptyStateProps } from './ChartEmptyState.types';\n\nfunction mergeSx(\n ...parts: Array<SxProps<Theme> | undefined>\n): SxProps<Theme> | undefined {\n const flat = parts.filter(Boolean) as SxProps<Theme>[];\n if (flat.length === 0) return undefined;\n if (flat.length === 1) return flat[0];\n return flat.flat() as SxProps<Theme>;\n}\n\n/**\n * A reusable empty state / placeholder component specifically for charts.\n */\nexport function ChartEmptyState({\n minHeight = 300,\n icon = 'mdi:chart-box-outline',\n iconSize = 40,\n iconColor = '#9CA3AF',\n title = 'No Data Available',\n subtitle = \"There's no data to display in this chart yet\",\n gap = 1,\n containerSx,\n titleSx,\n subtitleSx,\n titleWeight = 700,\n subtitleWeight = 400,\n direction = 'column',\n}: ChartEmptyStateProps): React.ReactElement {\n return (\n <Box\n sx={mergeSx(\n {\n display: 'flex',\n minHeight,\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: direction,\n gap,\n },\n containerSx\n )}\n >\n {icon && (\n <Icon\n icon={icon}\n width={iconSize}\n height={iconSize}\n color={iconColor}\n />\n )}\n {title && (\n <Typography\n sx={mergeSx(\n {\n fontSize: '18px',\n fontWeight: titleWeight,\n color: '#374151',\n lineHeight: 1.2,\n textAlign: 'center',\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n )}\n {subtitle && (\n <Typography\n sx={mergeSx(\n {\n fontSize: '14px',\n fontWeight: subtitleWeight,\n color: '#6B7280',\n textAlign: 'center',\n },\n subtitleSx\n )}\n >\n {subtitle}\n </Typography>\n )}\n </Box>\n );\n}\n\nexport default ChartEmptyState;\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Checkbox from '@mui/material/Checkbox';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport List from '@mui/material/List';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport ListItemText from '@mui/material/ListItemText';\nimport Paper from '@mui/material/Paper';\nimport Popper from '@mui/material/Popper';\nimport Stack from '@mui/material/Stack';\nimport TextField from '@mui/material/TextField';\nimport Typography from '@mui/material/Typography';\nimport { useTheme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { WidgetHeaderFilterProps } from './WidgetHeaderFilter.types';\n\nconst defaultTriggerBg = '#F3F3F3';\n/** Default trigger width (px). Override with **`triggerMinWidth`** for wider filters or dense layouts. */\nconst defaultTriggerMinWidth = 160;\nconst defaultTriggerBorderRadius = '10px';\n/** Fixed panel width when `popperMatchTrigger={false}` and `popperWidth` is omitted (Falcon multi-select default). */\nconst defaultFixedPopperWidth = 300;\n\n/** When `popperMatchTrigger` is true, the list matches the trigger width (see Popper modifiers below). */\nconst headerFilterPopperModifiersMatchTrigger: NonNullable<\n React.ComponentProps<typeof Popper>['modifiers']\n> = [\n { name: 'offset', options: { offset: [0, 2] } },\n {\n name: 'sameWidth',\n enabled: true,\n phase: 'beforeWrite',\n requires: ['computeStyles'],\n fn({ state }) {\n state.styles.popper.width = `${state.rects.reference.width}px`;\n },\n effect({ state }) {\n const { reference, popper } = state.elements;\n if (reference instanceof HTMLElement) {\n popper.style.width = `${reference.getBoundingClientRect().width}px`;\n }\n },\n },\n];\n\nconst headerFilterPopperModifiersOffsetOnly: NonNullable<\n React.ComponentProps<typeof Popper>['modifiers']\n> = [{ name: 'offset', options: { offset: [0, 2] } }];\n\ntype FilterOption = { id: number; name: string };\n\nfunction selectionSummary(selected: FilterOption[]): string {\n if (selected.length === 0) return 'All';\n if (selected.length === 1) return selected[0].name;\n return `${selected[0].name}, ${selected[1].name}${selected.length > 2 ? '…' : ''}`;\n}\n\nfunction multiSelectionSummary(selected: FilterOption[]): string {\n if (selected.length === 0) return 'All';\n if (selected.length === 1) return selected[0].name;\n return `${selected.length} Stores`;\n}\n\n/**\n * Widget header filter styled like the provided mock:\n * two-line trigger + simple dropdown list.\n */\nexport const WidgetHeaderFilter = ({\n label,\n list,\n groupedList,\n data,\n setData,\n triggerBg = defaultTriggerBg,\n triggerColor,\n triggerMinWidth = defaultTriggerMinWidth,\n triggerBorderRadius = defaultTriggerBorderRadius,\n triggerSx,\n popperMatchTrigger = true,\n popperWidth,\n popperSx,\n popperBorderColor = '#e1e4e8',\n popperBorderColorDark = '#30363d',\n popperBg = '#fff',\n popperBgDark = '#1c2128',\n popperColor = '#24292e',\n popperColorDark = '#c9d1d9',\n multiSelect = false,\n searchPlaceholder = 'Search',\n applyLabel = 'Apply',\n cancelLabel = 'Cancel',\n checkboxColor = '#5B5B69',\n checkboxCheckedColor = '#6750A4',\n groupHeaderBg = 'rgba(0,0,0,0.03)',\n groupHeaderColor = '#111827',\n groupHeaderFontSize = 14,\n optionTextColor = '#111827',\n searchIconColor = '#49454F',\n searchTextColor = '#111827',\n searchPlaceholderColor = '#6B7280',\n applyBg = '#6750A4',\n applyColor = '#FFFFFF',\n cancelBg = 'transparent',\n cancelColor = '#374151',\n cancelBorderColor = '#9CA3AF',\n}: WidgetHeaderFilterProps) => {\n const theme = useTheme();\n const isDark = theme.palette.mode === 'dark';\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [draftSelection, setDraftSelection] =\n React.useState<FilterOption[]>(data);\n const [query, setQuery] = React.useState('');\n\n const open = Boolean(anchorEl);\n const matchTriggerWidth = multiSelect ? true : popperMatchTrigger;\n const fixedPopperWidth = popperWidth ?? defaultFixedPopperWidth;\n\n const valueLine = multiSelect\n ? multiSelectionSummary(data)\n : selectionSummary(data);\n const triggerTextColor = triggerColor ?? '#1a1a1a';\n const triggerChevronColor = triggerColor ?? '#101010';\n\n const handleOpen = (event: React.MouseEvent<HTMLElement>) => {\n if (multiSelect) {\n setDraftSelection(data);\n setQuery('');\n }\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleSelect = (option: FilterOption) => {\n setData([option]);\n handleClose();\n };\n\n const toggleOption = (option: FilterOption) => {\n setDraftSelection(prev => {\n const exists = prev.some(item => item.id === option.id);\n return exists\n ? prev.filter(item => item.id !== option.id)\n : [...prev, option];\n });\n };\n\n const handleApply = () => {\n setData(draftSelection);\n handleClose();\n };\n\n const filteredList = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return list;\n return list.filter(option => option.name.toLowerCase().includes(q));\n }, [list, query]);\n\n const filteredGroupedList = React.useMemo(() => {\n if (!groupedList) return [];\n const q = query.trim().toLowerCase();\n return groupedList\n .map(group => ({\n title: group.title,\n options: q\n ? group.options.filter(option =>\n option.name.toLowerCase().includes(q)\n )\n : group.options,\n }))\n .filter(group => group.options.length > 0);\n }, [groupedList, query]);\n\n return (\n <Box sx={{ flexShrink: 0, position: 'relative' }}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n spacing={1.5}\n onClick={handleOpen}\n sx={{\n minWidth: triggerMinWidth,\n background: triggerBg,\n borderRadius: triggerBorderRadius,\n cursor: 'pointer',\n px: multiSelect ? 1.25 : 1.75,\n py: multiSelect ? 0.5 : 0.65,\n border: '1px solid #D8D8E5',\n color: triggerTextColor,\n ...triggerSx,\n }}\n >\n <Stack spacing={0.125} sx={{ flex: 1, minWidth: 0, textAlign: 'left' }}>\n <Typography\n variant=\"body2\"\n sx={{\n fontWeight: 700,\n fontSize: multiSelect ? 12 : 13,\n lineHeight: 1.2,\n }}\n >\n {label}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{\n fontWeight: 500,\n fontSize: multiSelect ? 13 : 14,\n lineHeight: 1.2,\n }}\n >\n {valueLine}\n </Typography>\n </Stack>\n <Icon\n icon={open ? 'tabler:chevron-up' : 'tabler:chevron-down'}\n width={multiSelect ? 16 : 18}\n height={multiSelect ? 16 : 18}\n color={triggerChevronColor}\n style={{ flexShrink: 0 }}\n />\n </Stack>\n\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-start\"\n sx={{ zIndex: theme.zIndex.modal }}\n modifiers={\n matchTriggerWidth\n ? headerFilterPopperModifiersMatchTrigger\n : headerFilterPopperModifiersOffsetOnly\n }\n >\n <ClickAwayListener onClickAway={handleClose}>\n <Paper\n elevation={8}\n sx={{\n width: matchTriggerWidth ? '100%' : fixedPopperWidth,\n border: `1px solid ${isDark ? popperBorderColorDark : popperBorderColor}`,\n borderRadius: 1.5,\n bgcolor: isDark ? popperBgDark : popperBg,\n color: isDark ? popperColorDark : popperColor,\n overflow: 'hidden',\n boxShadow:\n theme.palette.mode === 'light'\n ? '0 10px 24px rgba(15, 23, 42, 0.14)'\n : '0 10px 24px rgb(1, 4, 9)',\n ...popperSx,\n }}\n >\n <List disablePadding>\n {multiSelect ? (\n <React.Fragment>\n <Box sx={{ px: 1.25, pt: 1.25, pb: 0.75 }}>\n <TextField\n fullWidth\n size=\"small\"\n value={query}\n onChange={event => setQuery(event.target.value)}\n placeholder={searchPlaceholder}\n sx={{\n '& .MuiInputBase-input': {\n color: searchTextColor,\n },\n '& .MuiInputBase-input::placeholder': {\n color: searchPlaceholderColor,\n opacity: 1,\n },\n }}\n slotProps={{\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <Icon\n icon=\"tabler:search\"\n width={18}\n height={18}\n color={searchIconColor}\n />\n </InputAdornment>\n ),\n },\n }}\n />\n </Box>\n <Box sx={{ maxHeight: 220, overflowY: 'auto' }}>\n {filteredGroupedList.length > 0\n ? filteredGroupedList.map(group => (\n <React.Fragment key={`group-${group.title}`}>\n <Box\n sx={{\n px: 1.25,\n py: 0.7,\n bgcolor: groupHeaderBg,\n borderBottom: '1px solid rgba(0,0,0,0.06)',\n }}\n >\n <Typography\n sx={{\n fontSize: groupHeaderFontSize,\n fontWeight: 700,\n color: groupHeaderColor,\n }}\n >\n {group.title}\n </Typography>\n </Box>\n {group.options.map(option => {\n const checked = draftSelection.some(\n item => item.id === option.id\n );\n return (\n <ListItemButton\n key={option.id}\n onClick={() => toggleOption(option)}\n dense\n sx={{\n py: 0.45,\n px: 1.25,\n minHeight: 36,\n borderBottom: '1px solid rgba(0,0,0,0.06)',\n '&:last-of-type': { borderBottom: 'none' },\n '&:hover': { bgcolor: 'rgba(0,0,0,0.03)' },\n }}\n >\n <Checkbox\n checked={checked}\n disableRipple\n size=\"small\"\n sx={{\n mr: 0.75,\n color: checkboxColor,\n '&.Mui-checked': {\n color: checkboxCheckedColor,\n },\n }}\n />\n <ListItemText\n primary={option.name}\n slotProps={{\n primary: {\n fontSize: 14,\n lineHeight: 1.2,\n fontWeight: 500,\n color: optionTextColor,\n },\n }}\n />\n </ListItemButton>\n );\n })}\n </React.Fragment>\n ))\n : filteredList.map(option => {\n const checked = draftSelection.some(\n item => item.id === option.id\n );\n return (\n <ListItemButton\n key={option.id}\n onClick={() => toggleOption(option)}\n dense\n sx={{\n py: 0.45,\n px: 1.25,\n minHeight: 36,\n borderBottom: '1px solid rgba(0,0,0,0.06)',\n '&:last-of-type': { borderBottom: 'none' },\n '&:hover': { bgcolor: 'rgba(0,0,0,0.03)' },\n }}\n >\n <Checkbox\n checked={checked}\n disableRipple\n size=\"small\"\n sx={{\n mr: 0.75,\n color: checkboxColor,\n '&.Mui-checked': {\n color: checkboxCheckedColor,\n },\n }}\n />\n <ListItemText\n primary={option.name}\n slotProps={{\n primary: {\n fontSize: 14,\n lineHeight: 1.2,\n fontWeight: 500,\n color: optionTextColor,\n },\n }}\n />\n </ListItemButton>\n );\n })}\n </Box>\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ px: 1.25, py: 1, borderTop: '1px solid #E5E7EB' }}\n >\n <Button\n variant=\"outlined\"\n fullWidth\n onClick={handleClose}\n sx={{\n textTransform: 'none',\n fontWeight: 600,\n minHeight: 34,\n py: 0.4,\n bgcolor: cancelBg,\n color: cancelColor,\n borderColor: cancelBorderColor,\n '&:hover': {\n bgcolor: cancelBg,\n borderColor: cancelBorderColor,\n },\n }}\n >\n {cancelLabel}\n </Button>\n <Button\n variant=\"contained\"\n fullWidth\n onClick={handleApply}\n sx={{\n textTransform: 'none',\n fontWeight: 700,\n minHeight: 34,\n py: 0.4,\n bgcolor: applyBg,\n color: applyColor,\n '&:hover': { bgcolor: applyBg },\n }}\n >\n {applyLabel}\n </Button>\n </Stack>\n </React.Fragment>\n ) : (\n list.map(option => (\n <ListItemButton\n key={option.id}\n onClick={() => handleSelect(option)}\n dense\n sx={{\n py: 0.75,\n px: 2,\n minHeight: 36,\n borderBottom: '1px solid rgba(0,0,0,0.06)',\n '&:last-of-type': { borderBottom: 'none' },\n '&:hover': { bgcolor: 'rgba(0,0,0,0.03)' },\n }}\n >\n <ListItemText\n primary={option.name}\n slotProps={{\n primary: {\n fontSize: 14,\n fontWeight: 500,\n lineHeight: 1.3,\n },\n }}\n />\n </ListItemButton>\n ))\n )}\n </List>\n </Paper>\n </ClickAwayListener>\n </Popper>\n </Box>\n );\n};\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n RankedBarListItem,\n RankedBarListProps,\n RankedBarListSegment,\n RankedBarListSegmentTooltipRenderContext,\n} from './RankedBarList.types';\n\nconst defaultBarColor = '#8963F0';\nconst defaultTrackColor = '#E8E8E8';\n\nfunction defaultFormatSegmentTooltip(\n segment: RankedBarListSegment,\n _row: RankedBarListItem\n): string {\n return `${segment.label} : ${segment.value}`;\n}\n\n/** MUI Popper surface: no padding so the custom card controls layout. */\nconst segmentTooltipPopperSx: SxProps<Theme> = {\n p: 0,\n m: 0,\n bgcolor: 'transparent',\n boxShadow: 'none',\n border: 'none',\n maxWidth: 'none',\n};\n\nconst defaultSegmentTooltipCardSx: SxProps<Theme> = {\n maxWidth: 280,\n bgcolor: '#fff',\n borderRadius: 1,\n border: '1px solid #E8E8E8',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n overflow: 'hidden',\n};\n\nfunction SegmentTooltipTitle({\n segment,\n row,\n formatSegmentTooltip,\n segmentTooltipSx,\n}: {\n segment: RankedBarListSegment;\n row: RankedBarListItem;\n formatSegmentTooltip: (\n segment: RankedBarListSegment,\n row: RankedBarListItem\n ) => string;\n segmentTooltipSx?: SxProps<Theme>;\n}): React.ReactElement {\n const customText = formatSegmentTooltip(segment, row);\n const defaultPattern = `${segment.label} : ${segment.value}`;\n const useStructured = customText === defaultPattern;\n\n const cardSx = segmentTooltipSx\n ? ([defaultSegmentTooltipCardSx, segmentTooltipSx] as SxProps<Theme>)\n : defaultSegmentTooltipCardSx;\n\n return (\n <Box sx={cardSx}>\n <Box sx={{ height: 3, bgcolor: 'grey.200', width: '100%' }} />\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 0.5,\n rowGap: 0.5,\n px: 1.5,\n py: 1.25,\n }}\n >\n <Box\n component=\"span\"\n aria-hidden\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: segment.color,\n flexShrink: 0,\n }}\n />\n {useStructured ? (\n <>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {segment.label}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {' : '}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 700,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {segment.value}\n </Typography>\n </>\n ) : (\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 500,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {customText}\n </Typography>\n )}\n </Box>\n </Box>\n );\n}\n\nfunction resolveCardMaxWidth(\n cardMaxWidth: RankedBarListProps['cardMaxWidth'],\n fullWidth: boolean | undefined\n):\n | number\n | string\n | { xs?: number | string; sm?: number | string; md?: number | string } {\n if (fullWidth) {\n return '100%';\n }\n if (cardMaxWidth === undefined) {\n return { xs: '100%', sm: 640 };\n }\n if (typeof cardMaxWidth === 'number') {\n return `${cardMaxWidth}px`;\n }\n if (typeof cardMaxWidth === 'string') {\n return cardMaxWidth;\n }\n return {\n xs:\n cardMaxWidth.xs !== undefined\n ? typeof cardMaxWidth.xs === 'number'\n ? `${cardMaxWidth.xs}px`\n : cardMaxWidth.xs\n : '100%',\n sm:\n cardMaxWidth.sm !== undefined\n ? typeof cardMaxWidth.sm === 'number'\n ? `${cardMaxWidth.sm}px`\n : cardMaxWidth.sm\n : 640,\n ...(cardMaxWidth.md !== undefined\n ? {\n md:\n typeof cardMaxWidth.md === 'number'\n ? `${cardMaxWidth.md}px`\n : cardMaxWidth.md,\n }\n : {}),\n };\n}\n\nfunction RankedBarRowTrack({\n pct,\n row,\n barColor,\n barTrackColor,\n barHeight,\n isBarWidthAnimationActive,\n formatSegmentTooltip,\n renderSegmentTooltip,\n segmentTooltipSx,\n}: {\n pct: number;\n row: RankedBarListItem;\n barColor: string;\n barTrackColor: string;\n barHeight: number;\n isBarWidthAnimationActive: boolean;\n formatSegmentTooltip: (\n segment: RankedBarListSegment,\n row: RankedBarListItem\n ) => string;\n renderSegmentTooltip?: RankedBarListProps['renderSegmentTooltip'];\n segmentTooltipSx?: SxProps<Theme>;\n}): React.ReactElement {\n const segments = row.segments;\n const segSum = segments?.reduce((acc, s) => acc + s.value, 0) ?? 0;\n const useStack = Boolean(segments?.length) && segSum > 0;\n\n const widthTransition = isBarWidthAnimationActive\n ? (theme: Theme) =>\n theme.transitions.create('width', {\n duration: theme.transitions.duration.shorter,\n })\n : 'none';\n\n /** Theme `borderRadius: 2` can exceed bar height and causes uneven corner clamping between slices. */\n const endCapRadius = `${Math.max(1, Math.floor(barHeight / 2))}px`;\n\n return (\n <Box\n sx={{\n height: barHeight,\n borderRadius: endCapRadius,\n bgcolor: barTrackColor,\n overflow: 'hidden',\n width: '100%',\n }}\n >\n {useStack && segments ? (\n <Box\n sx={{\n height: barHeight,\n width: `${pct}%`,\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'stretch',\n alignContent: 'stretch',\n minWidth: 0,\n transition: widthTransition,\n }}\n >\n {segments.map((seg, i) => (\n <Tooltip\n key={seg.id}\n title={(() => {\n if (renderSegmentTooltip) {\n const custom = renderSegmentTooltip({\n segment: seg,\n row,\n } satisfies RankedBarListSegmentTooltipRenderContext);\n return custom == null ? '' : custom;\n }\n return (\n <SegmentTooltipTitle\n segment={seg}\n row={row}\n formatSegmentTooltip={formatSegmentTooltip}\n segmentTooltipSx={segmentTooltipSx}\n />\n );\n })()}\n enterTouchDelay={0}\n slotProps={{\n tooltip: {\n sx: segmentTooltipPopperSx,\n },\n }}\n >\n <Box\n sx={{\n flexGrow: seg.value,\n flexShrink: 1,\n flexBasis: 0,\n minWidth: 2,\n height: barHeight,\n minHeight: barHeight,\n maxHeight: barHeight,\n boxSizing: 'border-box',\n lineHeight: 0,\n bgcolor: seg.color,\n cursor: 'default',\n ...(i === 0\n ? {\n borderTopLeftRadius: endCapRadius,\n borderBottomLeftRadius: endCapRadius,\n }\n : {}),\n ...(i === segments.length - 1\n ? {\n borderTopRightRadius: endCapRadius,\n borderBottomRightRadius: endCapRadius,\n }\n : {}),\n }}\n />\n </Tooltip>\n ))}\n </Box>\n ) : (\n <Box\n sx={{\n height: '100%',\n width: `${pct}%`,\n borderRadius: endCapRadius,\n bgcolor: barColor,\n transition: widthTransition,\n }}\n />\n )}\n </Box>\n );\n}\n\n/**\n * Ranked list widget: title row, optional header actions, scrollable list of labels with\n * horizontal bars sized by numeric value (highest value = full bar width).\n */\nexport const RankedBarList = ({\n title,\n items,\n sortByValueDescending = true,\n maxValue: maxValueProp,\n listHeaderLabel = 'Cameras (High to Low)',\n valueColumnHeader = 'No. of Alerts',\n showSortControl: showSortControlProp = true,\n onSortClick,\n headerActions,\n barColor = defaultBarColor,\n barTrackColor = defaultTrackColor,\n barHeight = 7,\n formatSegmentTooltip = defaultFormatSegmentTooltip,\n renderSegmentTooltip,\n segmentTooltipSx,\n listMaxHeight = 280,\n fullWidth,\n fillHeight,\n cardMaxWidth,\n cardSx,\n emptyStatePlaceholderProps,\n isBarWidthAnimationActive = true,\n scrollListToTopOnItemsChange = true,\n customization,\n}: RankedBarListProps) => {\n const showSortControl = customization?.showSortControl ?? showSortControlProp;\n\n const listScrollRef = React.useRef<HTMLDivElement>(null);\n\n const itemsSignature = React.useMemo(\n () =>\n items\n .map(i => {\n const seg =\n i.segments?.map(s => `${s.id}:${s.value}`).join('|') ?? '';\n return `${i.id}:${i.value}:${seg}`;\n })\n .join('\\0'),\n [items]\n );\n\n React.useLayoutEffect(() => {\n if (!scrollListToTopOnItemsChange) {\n return;\n }\n const el = listScrollRef.current;\n if (!el) {\n return;\n }\n el.scrollTop = 0;\n }, [itemsSignature, scrollListToTopOnItemsChange]);\n\n const rows = React.useMemo(() => {\n const copy = [...items];\n if (sortByValueDescending) {\n copy.sort((a, b) => b.value - a.value);\n }\n return copy;\n }, [items, sortByValueDescending]);\n\n const maxValue = React.useMemo(() => {\n if (maxValueProp !== undefined && maxValueProp > 0) {\n return maxValueProp;\n }\n const m = rows.reduce((acc, r) => Math.max(acc, r.value), 0);\n return m > 0 ? m : 1;\n }, [maxValueProp, rows]);\n\n return (\n <Box\n sx={{\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n minWidth: 0,\n maxWidth: resolveCardMaxWidth(cardMaxWidth, fullWidth),\n boxSizing: 'border-box',\n ...(fillHeight\n ? {\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n }\n : {}),\n ...cardSx,\n }}\n >\n <Stack\n spacing={2}\n sx={\n fillHeight ? { flex: 1, minHeight: 0, overflow: 'hidden' } : undefined\n }\n >\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n gap={2}\n sx={fillHeight ? { flexShrink: 0 } : undefined}\n >\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={\n [\n {\n fontWeight: 700,\n color: 'text.primary',\n pr: 1,\n fontSize: { xs: 16, sm: 18 },\n },\n ...(customization?.titleSx != null\n ? [customization.titleSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {title}\n </Typography>\n {headerActions ? (\n <Box sx={{ flexShrink: 0 }}>{headerActions}</Box>\n ) : null}\n </Stack>\n\n <Box\n sx={{\n border: '1px solid #E8E8E8',\n borderRadius: 2,\n bgcolor: '#FAFAFA',\n overflow: 'hidden',\n ...(fillHeight\n ? {\n flex: 1,\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n }\n : {}),\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{\n px: 2,\n py: 1.25,\n borderBottom: '1px solid rgba(0,0,0,0.08)',\n bgcolor: '#fff',\n flexShrink: 0,\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Typography\n variant=\"body2\"\n sx={\n [\n { fontWeight: 600, color: 'text.primary', fontSize: 13 },\n ...(customization?.listHeaderSx != null\n ? [customization.listHeaderSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {listHeaderLabel}\n </Typography>\n {showSortControl ? (\n <IconButton\n size=\"small\"\n aria-label=\"Sort\"\n onClick={onSortClick}\n sx={{ p: 0.35, color: 'text.secondary' }}\n >\n <Icon icon=\"tabler:arrows-sort\" width={18} height={18} />\n </IconButton>\n ) : null}\n </Stack>\n <Typography\n variant=\"body2\"\n sx={\n [\n { fontWeight: 600, color: 'text.secondary', fontSize: 12 },\n ...(customization?.listHeaderSx != null\n ? [customization.listHeaderSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {valueColumnHeader}\n </Typography>\n </Stack>\n\n <Box\n ref={listScrollRef}\n sx={{\n ...(fillHeight\n ? {\n flex: 1,\n minHeight: 0,\n maxHeight: 'none',\n }\n : { maxHeight: listMaxHeight }),\n overflowY: 'auto',\n bgcolor: '#fff',\n }}\n >\n {rows.length === 0 ? (\n <ChartEmptyState\n minHeight={220}\n {...emptyStatePlaceholderProps}\n />\n ) : (\n rows.map((row, index) => {\n const pct = Math.min(\n 100,\n Math.max(0, (row.value / maxValue) * 100)\n );\n return (\n <Box\n key={row.id}\n sx={{\n px: 2,\n py: 1.5,\n borderBottom:\n index < rows.length - 1\n ? '1px solid rgba(0,0,0,0.06)'\n : 'none',\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{ mb: 0.75 }}\n >\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n color: 'text.primary',\n fontWeight: 500,\n fontSize: 14,\n },\n ...(customization?.rowTypographySx != null\n ? [customization.rowTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {row.label}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n color: 'text.primary',\n fontWeight: 600,\n fontSize: 14,\n minWidth: 28,\n textAlign: 'right',\n },\n ...(customization?.valueTypographySx != null\n ? [customization.valueTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {row.value}\n </Typography>\n </Stack>\n <RankedBarRowTrack\n pct={pct}\n row={row}\n barColor={barColor}\n barTrackColor={barTrackColor}\n barHeight={barHeight}\n isBarWidthAnimationActive={isBarWidthAnimationActive}\n formatSegmentTooltip={formatSegmentTooltip}\n renderSegmentTooltip={renderSegmentTooltip}\n segmentTooltipSx={segmentTooltipSx}\n />\n </Box>\n );\n })\n )}\n </Box>\n </Box>\n </Stack>\n </Box>\n );\n};\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport ToggleButton from '@mui/material/ToggleButton';\nimport ToggleButtonGroup from '@mui/material/ToggleButtonGroup';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport { ChartWidgetInfoButton } from '../../ChartWidgetInfoButton';\nimport type {\n ChartWidgetInfoButtonProps,\n ChartWidgetInfoPopoverContent,\n} from '../../ChartWidgetInfoButton/ChartWidgetInfoButton.types';\nimport { useQueueTimeBreakdownCustomization } from '../../QueueTimeBreakdown/QueueTimeBreakdownCustomizationContext';\nimport type { QueueTimeChartFilter } from '../../QueueTimeBreakdown/QueueTimeBreakdown.types';\nimport { mergeSx } from '../../QueueTimeBreakdown/queueTimeBreakdownCustomization.merge';\nimport { ChartWidgetHeaderSeparator } from '../../utils/ChartWidgetHeaderSeparator';\n\nfunction mergeInfoButtonPresentation(\n fromTheme: Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>> | undefined,\n fromProps: Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>> | undefined\n): Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>> {\n return {\n ...fromTheme,\n ...fromProps,\n sx: mergeSx(fromTheme?.sx, fromProps?.sx),\n };\n}\n\nexport type TimePeriodFilterProps = {\n selectedFilter: QueueTimeChartFilter;\n onFilterChange: React.Dispatch<React.SetStateAction<QueueTimeChartFilter>>;\n /**\n * Info popover beside D/W/M/Y. Pass **`ChartWidgetInfoPopoverContent`** to show separator +\n * **ChartWidgetInfoButton**. Omit or **`null`** hides them (no implicit copy). For standalone use,\n * prefer **`TIME_PERIOD_FILTER_INFO_POPOVER`** (neutral D/W/M/Y). **`TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN`**\n * is for **QueueTimeBreakdown** only — that card injects it when **`infoPopover`** is omitted; do not\n * use the breakdown preset on **TimePeriodFilter** outside that widget.\n */\n infoPopover?: ChartWidgetInfoPopoverContent | null;\n /**\n * Presentation for **ChartWidgetInfoButton** (ignored when **infoPopover** is omitted or **`null`**).\n * Overrides the same fields from **customization.periodFilter.infoButtonProps** when both are set.\n */\n infoButtonProps?: Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>>;\n /** Overrides the same keys from **customization.periodFilter.rootSx** when both are set. */\n sx?: SxProps<Theme>;\n};\n\nconst PERIODS = ['Day', 'Week', 'Month', 'Year'] as const;\n\nfunction periodLetter(period: (typeof PERIODS)[number]): string {\n switch (period) {\n case 'Day':\n return 'D';\n case 'Week':\n return 'W';\n case 'Month':\n return 'M';\n case 'Year':\n return 'Y';\n default:\n return '';\n }\n}\n\n/**\n * Day / Week / Month / Year segmented control — square D/W/M/Y cells, optional info button.\n * Layout-neutral: no title or page-level alignment; wrap in your own **Stack** / **Box** or pass **sx**.\n *\n * Theme **customization.periodFilter** supports colours, **toggleGroupSx**, **toggleButtonSx**,\n * **infoStackSx**, and **infoButtonProps**; component **infoButtonProps** override theme **infoButtonProps** for overlapping keys.\n *\n * Source: **`packages/falcon-ui/src/components/filters/TimePeriodFilter/`** (see **`components/tabs/`** for a similar package layout).\n */\nexport function TimePeriodFilter({\n selectedFilter,\n onFilterChange,\n infoPopover,\n infoButtonProps,\n sx,\n}: TimePeriodFilterProps): React.ReactElement {\n const { periodFilter: pf } = useQueueTimeBreakdownCustomization();\n const SEGMENT_PX = pf?.segmentSizePx ?? 36;\n const borderRadius = pf?.borderRadiusPx ?? 8;\n const fontSize = pf?.fontSizePx ?? 13;\n const borderCol = pf?.borderColor ?? '#E5E7EB';\n const trackBg = pf?.trackBackground ?? '#F3F4F6';\n const dividerCol = pf?.dividerColor ?? borderCol;\n const inactiveColor = pf?.inactiveColor ?? '#0f172a';\n const activeBg = pf?.activeBackground ?? '#000000';\n const activeColor = pf?.activeColor ?? '#ffffff';\n const hoverBg = pf?.inactiveHoverBackground ?? 'rgba(15, 23, 42, 0.06)';\n\n const handleChange = (\n _event: React.MouseEvent<HTMLElement>,\n next: QueueTimeChartFilter | null\n ): void => {\n if (next !== null) {\n onFilterChange(next);\n }\n };\n\n const resolvedInfoPopover: ChartWidgetInfoPopoverContent | null =\n infoPopover ?? null;\n\n const mergedInfoButton = React.useMemo(\n () =>\n mergeInfoButtonPresentation(pf?.infoButtonProps, infoButtonProps ?? {}),\n [pf?.infoButtonProps, infoButtonProps]\n );\n\n return (\n <Box\n sx={mergeSx(\n {\n display: 'inline-flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 1.5,\n rowGap: 1,\n },\n pf?.rootSx,\n sx\n )}\n >\n <ToggleButtonGroup\n exclusive\n value={selectedFilter}\n onChange={handleChange}\n aria-label=\"Time period\"\n sx={mergeSx(\n {\n display: 'inline-flex',\n width: 'auto',\n border: `1px solid ${borderCol}`,\n borderRadius: `${borderRadius}px`,\n overflow: 'hidden',\n bgcolor: trackBg,\n '& .MuiToggleButtonGroup-grouped': {\n border: 0,\n borderRadius: 0,\n margin: 0,\n },\n '& .MuiToggleButton-root': {\n boxSizing: 'border-box',\n width: SEGMENT_PX,\n height: SEGMENT_PX,\n minWidth: SEGMENT_PX,\n maxWidth: SEGMENT_PX,\n px: 0,\n py: 0,\n flex: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: 700,\n fontSize: `${fontSize}px`,\n lineHeight: 1,\n textTransform: 'none',\n color: inactiveColor,\n bgcolor: 'transparent',\n border: 'none',\n '&:not(:first-of-type)': {\n borderLeft: `1px solid ${dividerCol}`,\n },\n '&:hover': {\n bgcolor: hoverBg,\n },\n '&.Mui-selected': {\n bgcolor: activeBg,\n color: activeColor,\n '&:hover': {\n bgcolor: activeBg,\n },\n },\n },\n },\n pf?.toggleGroupSx\n )}\n >\n {PERIODS.map(period => (\n <ToggleButton\n key={period}\n value={period}\n disableRipple\n sx={mergeSx(pf?.toggleButtonSx)}\n >\n {periodLetter(period)}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n {resolvedInfoPopover ? (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.5}\n sx={mergeSx({ flexShrink: 0 }, pf?.infoStackSx)}\n >\n <ChartWidgetHeaderSeparator />\n <ChartWidgetInfoButton\n {...mergedInfoButton}\n popover={resolvedInfoPopover}\n ariaLabel={mergedInfoButton.ariaLabel ?? 'Time period information'}\n />\n </Stack>\n ) : null}\n </Box>\n );\n}\n","import * as React from 'react';\nimport type { QueueTimeBreakdownCustomization } from './queueTimeBreakdown.customization.types';\n\nconst QueueTimeBreakdownCustomizationContext =\n React.createContext<QueueTimeBreakdownCustomization>({});\n\nexport type QueueTimeBreakdownCustomizationProviderProps = {\n value: QueueTimeBreakdownCustomization;\n children: React.ReactNode;\n};\n\nexport function QueueTimeBreakdownCustomizationProvider({\n value,\n children,\n}: QueueTimeBreakdownCustomizationProviderProps): React.ReactElement {\n const memo = React.useMemo(() => value, [value]);\n return (\n <QueueTimeBreakdownCustomizationContext.Provider value={memo}>\n {children}\n </QueueTimeBreakdownCustomizationContext.Provider>\n );\n}\n\nexport function useQueueTimeBreakdownCustomization(): QueueTimeBreakdownCustomization {\n return React.useContext(QueueTimeBreakdownCustomizationContext);\n}\n","import type { CSSProperties } from 'react';\n\n/**\n * Shared Recharts `<Tooltip />` look for QueueTimeBreakdown (donut / stacked bar):\n * light panel, rounded corners — matches dashboard light tooltip reference.\n */\nexport const queueRechartsTooltipContentStyle: CSSProperties = {\n backgroundColor: '#F4F4F5',\n border: '1px solid #E4E4E7',\n borderRadius: 8,\n padding: '8px 12px',\n fontSize: 12,\n lineHeight: 1.45,\n boxShadow: '0 4px 16px rgba(15, 23, 42, 0.1)',\n};\n\nexport const queueRechartsTooltipItemStyle: CSSProperties = {\n color: '#3f3f46',\n fontSize: 12,\n padding: '4px 0',\n};\n\n/** Category line when Recharts renders a label (stacked bar / donut). */\nexport const queueRechartsTooltipLabelStyleCategory: CSSProperties = {\n color: '#71717A',\n fontSize: 12,\n fontWeight: 600,\n marginBottom: 8,\n paddingBottom: 8,\n borderBottom: '1px solid #D4D4D8',\n};\n\nexport const queueRechartsTooltipLabelStyleMuted: CSSProperties = {\n color: '#71717A',\n fontSize: 12,\n fontWeight: 600,\n};\n","import type { CSSProperties } from 'react';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport type {\n QueueTimeAreaTooltipTheme,\n QueueTimeRechartsTooltipTheme,\n} from './queueTimeBreakdown.customization.types';\nimport {\n queueRechartsTooltipContentStyle,\n queueRechartsTooltipItemStyle,\n queueRechartsTooltipLabelStyleMuted,\n} from './queueTimeBreakdown.rechartsTooltip';\n\nexport function mergeCss(a: CSSProperties, b?: CSSProperties): CSSProperties {\n if (!b) {\n return { ...a };\n }\n return { ...a, ...b };\n}\n\nexport function mergeSx(\n ...parts: Array<SxProps<Theme> | undefined>\n): SxProps<Theme> | undefined {\n const flat = parts.filter(Boolean) as SxProps<Theme>[];\n if (flat.length === 0) {\n return undefined;\n }\n if (flat.length === 1) {\n return flat[0];\n }\n return flat.flat() as SxProps<Theme>;\n}\n\nexport function mergeRechartsTooltipStyles(\n overrides?: QueueTimeRechartsTooltipTheme\n): {\n contentStyle: CSSProperties;\n itemStyle: CSSProperties;\n labelStyle: CSSProperties;\n wrapperStyle: CSSProperties;\n} {\n return {\n contentStyle: mergeCss(\n queueRechartsTooltipContentStyle,\n overrides?.contentStyle\n ),\n itemStyle: mergeCss(queueRechartsTooltipItemStyle, overrides?.itemStyle),\n labelStyle: mergeCss(\n queueRechartsTooltipLabelStyleMuted,\n overrides?.labelStyle\n ),\n wrapperStyle: mergeCss({ outline: 'none' }, overrides?.wrapperStyle),\n };\n}\n\nconst defaultAreaTooltipBase: Required<QueueTimeAreaTooltipTheme> = {\n container: {\n background: '#F4F4F5',\n border: '1px solid #E4E4E7',\n borderRadius: 8,\n width: 'max-content',\n maxWidth: 220,\n boxShadow: '0 4px 16px rgba(15, 23, 42, 0.1)',\n overflow: 'hidden',\n fontSize: 11,\n fontFamily: 'inherit',\n },\n header: {\n background: '#EBEBED',\n padding: '6px 8px',\n color: '#71717A',\n fontWeight: 600,\n borderBottom: '1px solid #D4D4D8',\n },\n body: { padding: '6px 8px' },\n row: {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '3px 0',\n whiteSpace: 'nowrap',\n },\n dot: {\n width: 7,\n height: 7,\n borderRadius: '50%',\n flexShrink: 0,\n },\n label: { color: '#71717A' },\n value: { fontWeight: 600, color: '#18181B' },\n};\n\nexport function mergeAreaTooltipStyles(\n overrides?: QueueTimeAreaTooltipTheme\n): Required<QueueTimeAreaTooltipTheme> {\n return {\n container: mergeCss(defaultAreaTooltipBase.container, overrides?.container),\n header: mergeCss(defaultAreaTooltipBase.header, overrides?.header),\n body: mergeCss(defaultAreaTooltipBase.body, overrides?.body),\n row: mergeCss(defaultAreaTooltipBase.row, overrides?.row),\n dot: mergeCss(defaultAreaTooltipBase.dot, overrides?.dot),\n label: mergeCss(defaultAreaTooltipBase.label, overrides?.label),\n value: mergeCss(defaultAreaTooltipBase.value, overrides?.value),\n };\n}\n","import Box from '@mui/material/Box';\nimport * as React from 'react';\nimport type { ChartWidgetSegmentedTabsProps } from './ChartWidgetSegmentedTabs.types';\n\ntype IndicatorRect = {\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\nconst defaultIndicator: IndicatorRect = {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n};\n\n/**\n * Pill-style segmented control for chart cards (e.g. Walk-in scope tabs, billing analytics).\n *\n * **Defaults** match the classic walk-in look: grey track, **white** selected pill, dark text, light shadow.\n * Override **`trackBackgroundColor`**, **`activeTabBackground`**, **`activeTabColor`**, **`inactiveTabColor`**, and\n * **`activeTabBoxShadow`** for other themes (e.g. violet selected pill + white text, **`activeTabBoxShadow: 'none'`**).\n *\n * Use **`tabLayout=\"equalWidth\"`** when the track is full width and each tab should grow to **fill** the bar;\n * default **`intrinsic`** keeps label-sized pills aligned to the **start** (walk-in style).\n *\n * The active segment uses a **sliding pill** (animated with **`tabIndicatorTransitionMs`**).\n */\nexport const ChartWidgetSegmentedTabs = ({\n tabs,\n activeTabId,\n onTabChange,\n ariaLabel = 'Scope',\n fullWidth = true,\n tabFontSize = 14,\n rootSx,\n trackBackgroundColor = '#ECECEC',\n activeTabBackground = '#fff',\n activeTabColor = '#2a2a2a',\n inactiveTabColor = '#2a2a2a',\n activeTabBoxShadow = '0 1px 2px rgba(0,0,0,0.08)',\n tabLayout = 'intrinsic',\n activeTabFontWeight = 700,\n inactiveTabFontWeight = 600,\n tabIndicatorTransitionMs = 260,\n}: ChartWidgetSegmentedTabsProps) => {\n const trackRef = React.useRef<HTMLDivElement>(null);\n const tabRefs = React.useRef<(HTMLDivElement | null)[]>([]);\n const [indicator, setIndicator] =\n React.useState<IndicatorRect>(defaultIndicator);\n\n const activeIndex = React.useMemo(() => {\n const i = tabs.findIndex(t => t.id === activeTabId);\n return i >= 0 ? i : 0;\n }, [tabs, activeTabId]);\n\n const updateIndicator = React.useCallback(() => {\n const track = trackRef.current;\n const tabEl = tabRefs.current[activeIndex];\n if (!track || !tabEl) {\n return;\n }\n const trackRect = track.getBoundingClientRect();\n const tabRect = tabEl.getBoundingClientRect();\n setIndicator({\n left: tabRect.left - trackRect.left,\n top: tabRect.top - trackRect.top,\n width: tabRect.width,\n height: tabRect.height,\n });\n }, [activeIndex]);\n\n React.useLayoutEffect(() => {\n updateIndicator();\n }, [updateIndicator, tabs, activeTabId, tabLayout, fullWidth]);\n\n React.useLayoutEffect(() => {\n const track = trackRef.current;\n if (!track) {\n return;\n }\n const ro = new ResizeObserver(() => {\n updateIndicator();\n });\n ro.observe(track);\n return () => {\n ro.disconnect();\n };\n }, [updateIndicator]);\n\n return (\n <Box\n ref={trackRef}\n sx={{\n position: 'relative',\n display: 'flex',\n p: 0.5,\n borderRadius: 999,\n bgcolor: trackBackgroundColor,\n gap: 0.5,\n flexWrap: tabLayout === 'equalWidth' ? 'nowrap' : 'wrap',\n boxSizing: 'border-box',\n ...(fullWidth\n ? { alignSelf: 'stretch', width: '100%' }\n : {\n alignSelf: 'flex-start',\n width: 'fit-content',\n maxWidth: '100%',\n }),\n ...rootSx,\n }}\n role=\"tablist\"\n aria-label={ariaLabel}\n >\n {indicator.width > 0 ? (\n <Box\n aria-hidden\n sx={{\n position: 'absolute',\n left: indicator.left,\n top: indicator.top,\n width: indicator.width,\n height: indicator.height,\n borderRadius: 999,\n bgcolor: activeTabBackground,\n boxShadow: activeTabBoxShadow,\n transition: `left ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), top ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), width ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), height ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1)`,\n pointerEvents: 'none',\n zIndex: 0,\n }}\n />\n ) : null}\n {tabs.map((tab, index) => {\n const selected = tab.id === activeTabId;\n return (\n <Box\n key={tab.id}\n ref={(el: HTMLDivElement | null) => {\n tabRefs.current[index] = el;\n }}\n role=\"tab\"\n aria-selected={selected}\n tabIndex={selected ? 0 : -1}\n onClick={() => onTabChange(tab.id)}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onTabChange(tab.id);\n }\n }}\n sx={{\n position: 'relative',\n zIndex: 1,\n px: 2.25,\n py: 0.85,\n borderRadius: 999,\n cursor: 'pointer',\n userSelect: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n bgcolor: 'transparent',\n fontWeight: selected\n ? activeTabFontWeight\n : inactiveTabFontWeight,\n fontSize: tabFontSize,\n color: selected ? activeTabColor : inactiveTabColor,\n transition: theme =>\n theme.transitions.create(['color'], {\n duration: theme.transitions.duration.shorter,\n }),\n ...(tabLayout === 'equalWidth'\n ? {\n flex: '1 1 0',\n minWidth: 0,\n }\n : {}),\n }}\n >\n {tabLayout === 'equalWidth' ? (\n <Box\n component=\"span\"\n sx={{\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n width: '100%',\n }}\n >\n {tab.label}\n </Box>\n ) : (\n tab.label\n )}\n </Box>\n );\n })}\n </Box>\n );\n};\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport Paper from '@mui/material/Paper';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport type { TypographyProps } from '@mui/material/Typography';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { useLayoutEffect, useRef, useState } from 'react';\nimport { ChartWidgetInfoButton } from '../../ChartWidgetInfoButton';\nimport type { KpiStatCardProps } from './KpiStatCard.types';\nimport { useAnimatedMetric } from './useAnimatedMetric';\n\nconst defaultInlineIconSize = 48;\n/** Decorative icon inside the detailed card badge (px). */\nconst defaultDetailedIconSize = 30;\n/** Width/height of the top-right icon backdrop (px). */\nconst defaultIconBackdropSize = 48;\nconst defaultIconColor = '#5c6bc0';\n\n/** @default when `metricColor` omitted */\nconst defaultMetricColor = '#000000';\n\n/** Detailed card defaults (px). */\nconst defaultCardWidthPx = 247;\nconst defaultCardPaddingPx = 12;\nconst defaultBlockGapPx = 8;\nconst defaultInlineCardMinHeightPx = 96;\nconst defaultDetailedCardMinHeightPx = 118;\n\n/** Row trend defaults (px). */\nconst defaultRowTrendFontSizePx = 12;\nconst defaultRowTrendIconSizePx = 16;\n\nfunction formatValue(value: string | number): string {\n if (typeof value === 'number') {\n return value.toLocaleString();\n }\n return value;\n}\n\ntype KpiMetricValueDisplayProps = {\n value: string | number;\n metricColor: string;\n animateValue: boolean;\n valueAnimationDurationMs: number;\n valueAnimationUseGrouping: boolean;\n valueAnimationLocale?: string;\n layout: 'inline' | 'detailed';\n valueTypographySx?: SxProps<Theme>;\n};\n\nfunction KpiMetricValueDisplay({\n value,\n metricColor,\n animateValue,\n valueAnimationDurationMs,\n valueAnimationUseGrouping,\n valueAnimationLocale,\n layout,\n valueTypographySx,\n}: KpiMetricValueDisplayProps) {\n const isNumeric = typeof value === 'number' && Number.isFinite(value);\n const animated = useAnimatedMetric(\n isNumeric ? value : 0,\n isNumeric && animateValue,\n valueAnimationDurationMs\n );\n\n const displayText =\n isNumeric && animateValue\n ? Math.round(animated).toLocaleString(valueAnimationLocale, {\n useGrouping: valueAnimationUseGrouping,\n })\n : formatValue(value);\n\n const tooltipText = formatValue(value);\n\n if (layout === 'inline') {\n return (\n <OverflowTooltipTypography\n tooltip={tooltipText}\n variant=\"h5\"\n fontWeight={700}\n lineHeight={1.2}\n sx={\n [\n { color: metricColor, width: '100%' },\n ...(valueTypographySx != null ? [valueTypographySx] : []),\n ] as SxProps<Theme>\n }\n >\n {displayText}\n </OverflowTooltipTypography>\n );\n }\n\n return (\n <OverflowTooltipTypography\n tooltip={tooltipText}\n variant=\"h4\"\n fontWeight={700}\n sx={\n [\n {\n color: metricColor,\n fontSize: { xs: 26, sm: 30 },\n minWidth: 0,\n flex: '0 1 auto',\n },\n ...(valueTypographySx != null ? [valueTypographySx] : []),\n ] as SxProps<Theme>\n }\n >\n {displayText}\n </OverflowTooltipTypography>\n );\n}\n\ntype OverflowTooltipTypographyProps = TypographyProps & { tooltip: string };\n\n/**\n * Shows {@link Tooltip} with full text only when the line is truncated (ellipsis).\n */\nfunction OverflowTooltipTypography({\n tooltip,\n ...typographyProps\n}: OverflowTooltipTypographyProps) {\n const ref = useRef<HTMLElement>(null);\n const [isTruncated, setIsTruncated] = useState(false);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) {\n return;\n }\n const update = () => {\n setIsTruncated(el.scrollWidth > el.clientWidth + 0.5);\n };\n update();\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => {\n ro.disconnect();\n };\n }, [tooltip, typographyProps.children]);\n\n return (\n <Tooltip\n title={tooltip}\n disableHoverListener={!isTruncated}\n placement=\"top-start\"\n enterDelay={400}\n >\n <Typography ref={ref} noWrap {...typographyProps} />\n </Tooltip>\n );\n}\n\nexport const KpiStatCard = (props: KpiStatCardProps) => {\n const {\n title,\n value,\n icon,\n iconColor = defaultIconColor,\n sx,\n customization,\n } = props;\n const displayValue = value ?? '-';\n const labelTypographySx = customization?.labelTypographySx;\n const valueTypographySx = customization?.valueTypographySx;\n const trendComparisonTypographySx =\n customization?.trendComparisonTypographySx;\n const stackedComparisonTypographySx =\n customization?.stackedComparisonTypographySx;\n const metricColor = props.metricColor ?? defaultMetricColor;\n const animateValue = props.animateValue ?? true;\n const valueAnimationDurationMs = props.valueAnimationDurationMs ?? 1000;\n const valueAnimationUseGrouping = props.valueAnimationUseGrouping ?? true;\n const { valueAnimationLocale } = props;\n const iconSize =\n props.iconSize ??\n (props.variant === 'inline'\n ? defaultInlineIconSize\n : defaultDetailedIconSize);\n\n if (props.variant === 'inline') {\n const { cardMinHeightPx = defaultInlineCardMinHeightPx, cardMaxHeightPx } =\n props;\n return (\n <Paper\n elevation={0}\n sx={{\n p: 2,\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: 2,\n minHeight: cardMinHeightPx,\n ...(cardMaxHeightPx != null\n ? { maxHeight: cardMaxHeightPx, overflow: 'auto' as const }\n : {}),\n ...sx,\n }}\n >\n <Box\n sx={{\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Icon\n icon={icon}\n color={iconColor}\n width={iconSize}\n height={iconSize}\n />\n </Box>\n <Stack\n spacing={0.5}\n alignItems=\"flex-start\"\n justifyContent=\"center\"\n sx={{ flex: 1, minWidth: 0 }}\n >\n <OverflowTooltipTypography\n tooltip={title}\n variant=\"subtitle2\"\n fontWeight={700}\n color=\"text.primary\"\n sx={\n [\n { width: '100%' },\n ...(labelTypographySx != null ? [labelTypographySx] : []),\n ] as SxProps<Theme>\n }\n >\n {title}\n </OverflowTooltipTypography>\n <KpiMetricValueDisplay\n value={displayValue}\n metricColor={metricColor}\n animateValue={animateValue}\n valueAnimationDurationMs={valueAnimationDurationMs}\n valueAnimationUseGrouping={valueAnimationUseGrouping}\n valueAnimationLocale={valueAnimationLocale}\n layout=\"inline\"\n valueTypographySx={valueTypographySx}\n />\n </Stack>\n </Paper>\n );\n }\n\n const {\n trend,\n infoPopover,\n infoPlacement = 'value',\n iconBackdropColor = '#EDE7F6',\n iconBackdropShape = 'rounded',\n trendColor,\n titleColor = 'text.secondary',\n cardWidthPx = defaultCardWidthPx,\n cardPaddingPx = defaultCardPaddingPx,\n blockGapPx = defaultBlockGapPx,\n cardMinHeightPx = defaultDetailedCardMinHeightPx,\n cardMaxHeightPx,\n iconBackdropSizePx = defaultIconBackdropSize,\n rowTrendFontSizePx = defaultRowTrendFontSizePx,\n rowTrendIconSizePx = defaultRowTrendIconSizePx,\n rowTrendComparisonColor,\n } = props;\n\n const resolvedTrendColor =\n trendColor ?? (trend?.direction === 'down' ? '#d32f2f' : '#2e7d32');\n const trendLayout = trend?.layout ?? 'row';\n const stackedHighlightColor = trend?.comparisonColor ?? '#5E35B1';\n const stackedPrefixColor = trend?.comparisonPrefixColor ?? 'text.secondary';\n const rowComparisonColor = rowTrendComparisonColor ?? 'text.secondary';\n\n const trendPercentLabel = trend?.percentLabel ?? '0%';\n const trendComparisonText = trend?.comparisonText ?? 'vs yesterday';\n const trendDirection = trend?.direction;\n\n const stackedSplit =\n trendLayout === 'stacked' &&\n typeof trend?.comparisonPrefix === 'string' &&\n trend?.comparisonPrefix.length > 0 &&\n typeof trend?.comparisonHighlight === 'string' &&\n trend?.comparisonHighlight.length > 0;\n\n const infoButton = infoPopover ? (\n <ChartWidgetInfoButton\n density=\"compact\"\n popover={infoPopover}\n ariaLabel={`${title} more information`}\n sx={{ flexShrink: 0 }}\n />\n ) : null;\n\n return (\n <Paper\n elevation={0}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n boxSizing: 'border-box',\n width: cardWidthPx,\n maxWidth: '100%',\n p: `${cardPaddingPx}px`,\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n boxShadow: '0 1px 3px rgba(0,0,0,0.06)',\n position: 'relative',\n overflow: cardMaxHeightPx != null ? 'auto' : 'hidden',\n minHeight: cardMinHeightPx,\n ...(cardMaxHeightPx != null ? { maxHeight: cardMaxHeightPx } : {}),\n ...sx,\n }}\n >\n <Stack\n spacing={`${blockGapPx}px`}\n alignItems=\"stretch\"\n sx={{ width: '100%', minWidth: 0 }}\n >\n {props.slotHeader ? (\n <Box sx={{ width: '100%' }}>{props.slotHeader}</Box>\n ) : null}\n\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"flex-start\"\n sx={{ width: '100%', minWidth: 0 }}\n >\n <Stack\n spacing={`${blockGapPx}px`}\n alignItems=\"flex-start\"\n sx={{ flex: 1, minWidth: 0, pr: 7 }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.5}\n useFlexGap\n sx={{ minWidth: 0, alignSelf: 'stretch', maxWidth: '100%' }}\n >\n <OverflowTooltipTypography\n tooltip={title}\n variant=\"body2\"\n fontWeight={600}\n sx={\n [\n {\n color: titleColor,\n minWidth: 0,\n flex: '0 1 auto',\n },\n ...(labelTypographySx != null ? [labelTypographySx] : []),\n ] as SxProps<Theme>\n }\n >\n {title}\n </OverflowTooltipTypography>\n {infoPlacement === 'title' ? infoButton : null}\n </Stack>\n\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.75}\n useFlexGap\n sx={{ minWidth: 0, alignSelf: 'stretch', maxWidth: '100%' }}\n >\n <KpiMetricValueDisplay\n value={displayValue}\n metricColor={metricColor}\n animateValue={animateValue}\n valueAnimationDurationMs={valueAnimationDurationMs}\n valueAnimationUseGrouping={valueAnimationUseGrouping}\n valueAnimationLocale={valueAnimationLocale}\n layout=\"detailed\"\n valueTypographySx={valueTypographySx}\n />\n {infoPlacement === 'value' ? infoButton : null}\n </Stack>\n\n {trendLayout === 'stacked' ? (\n stackedSplit ? (\n <Typography\n variant=\"body2\"\n component=\"div\"\n sx={\n [\n {\n fontWeight: 400,\n lineHeight: 1.4,\n minWidth: 0,\n alignSelf: 'stretch',\n },\n ...(stackedComparisonTypographySx != null\n ? [stackedComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Typography\n component=\"span\"\n variant=\"body2\"\n sx={\n [\n { fontWeight: 400, color: stackedPrefixColor },\n ...(stackedComparisonTypographySx != null\n ? [stackedComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trend.comparisonPrefix}\n </Typography>\n <Typography\n component=\"span\"\n variant=\"body2\"\n sx={\n [\n { fontWeight: 400, color: stackedHighlightColor },\n ...(stackedComparisonTypographySx != null\n ? [stackedComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trend.comparisonHighlight}\n </Typography>\n </Typography>\n ) : typeof trend.comparisonText === 'string' ? (\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n color: trend.comparisonColor ?? 'text.secondary',\n fontWeight: 400,\n lineHeight: 1.4,\n minWidth: 0,\n alignSelf: 'stretch',\n },\n ...(stackedComparisonTypographySx != null\n ? [stackedComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trend.comparisonText}\n </Typography>\n ) : trend.comparisonText != null ? (\n <Box\n sx={\n [\n {\n typography: 'body2',\n color: trend.comparisonColor ?? 'text.secondary',\n fontWeight: 400,\n lineHeight: 1.4,\n minWidth: 0,\n alignSelf: 'stretch',\n '& strong': { fontWeight: 600 },\n },\n ...(stackedComparisonTypographySx != null\n ? [stackedComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trend.comparisonText}\n </Box>\n ) : null\n ) : (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.75}\n flexWrap=\"nowrap\"\n useFlexGap\n sx={{ width: '100%', minWidth: 0 }}\n >\n <Typography\n component=\"span\"\n fontWeight={600}\n sx={{\n color: resolvedTrendColor,\n flexShrink: 0,\n fontSize: `${rowTrendFontSizePx}px`,\n lineHeight: 1.35,\n }}\n >\n {trendPercentLabel}\n </Typography>\n {trendDirection && (\n <Box sx={{ flexShrink: 0, lineHeight: 0, display: 'flex' }}>\n <Icon\n icon={\n trendDirection === 'down'\n ? 'mdi:trending-down'\n : 'mdi:trending-up'\n }\n width={rowTrendIconSizePx}\n height={rowTrendIconSizePx}\n style={{ color: resolvedTrendColor }}\n />\n </Box>\n )}\n {typeof trendComparisonText === 'string' ? (\n <OverflowTooltipTypography\n tooltip={trendComparisonText}\n component=\"span\"\n fontWeight={700}\n sx={\n [\n {\n fontSize: `${rowTrendFontSizePx}px`,\n lineHeight: 1.35,\n color: rowComparisonColor,\n minWidth: 0,\n flex: '1 1 auto',\n },\n ...(trendComparisonTypographySx != null\n ? [trendComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trendComparisonText}\n </OverflowTooltipTypography>\n ) : (\n <Box\n sx={\n [\n {\n fontSize: `${rowTrendFontSizePx}px`,\n lineHeight: 1.35,\n fontWeight: 700,\n color: rowComparisonColor,\n minWidth: 0,\n flex: '1 1 auto',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n '& strong': {\n fontWeight: 700,\n color: rowComparisonColor,\n fontSize: 'inherit',\n },\n },\n ...(trendComparisonTypographySx != null\n ? [trendComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trendComparisonText}\n </Box>\n )}\n </Stack>\n )}\n </Stack>\n </Stack>\n </Stack>\n\n <Box\n sx={{\n position: 'absolute',\n top: cardPaddingPx,\n right: cardPaddingPx,\n width: iconBackdropSizePx,\n height: iconBackdropSizePx,\n borderRadius: iconBackdropShape === 'round' ? '50%' : 2,\n bgcolor: iconBackdropColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n zIndex: 1,\n }}\n >\n <Icon\n icon={icon}\n color={iconColor}\n width={iconSize}\n height={iconSize}\n />\n </Box>\n </Paper>\n );\n};\n","import { useEffect, useRef, useState } from 'react';\n\n/**\n * Ease-out cubic for a natural deceleration (similar to many count-up UIs).\n */\nfunction easeOutCubic(t: number): number {\n return 1 - (1 - t) ** 3;\n}\n\n/**\n * Animates a numeric metric when `target` changes. First paint uses `target` with no tween\n * (avoids flashing from 0 on mount). Opt out with `enabled: false`.\n */\nexport function useAnimatedMetric(\n target: number,\n enabled: boolean,\n durationMs: number\n): number {\n const [display, setDisplay] = useState(target);\n const displayRef = useRef(target);\n const didMountRef = useRef(false);\n const rafRef = useRef(0);\n\n useEffect(() => {\n const cancelRaf = () => {\n if (rafRef.current !== 0) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = 0;\n }\n };\n\n if (!enabled || !Number.isFinite(target)) {\n cancelRaf();\n displayRef.current = target;\n setDisplay(target);\n return;\n }\n\n if (!didMountRef.current) {\n didMountRef.current = true;\n displayRef.current = target;\n setDisplay(target);\n return;\n }\n\n const from = displayRef.current;\n if (from === target) {\n return;\n }\n\n cancelRaf();\n const start = performance.now();\n let cancelled = false;\n\n const step = (now: number) => {\n if (cancelled) {\n return;\n }\n const elapsed = now - start;\n const t = Math.min(1, elapsed / durationMs);\n const eased = easeOutCubic(t);\n const next = from + (target - from) * eased;\n displayRef.current = next;\n setDisplay(next);\n if (t < 1) {\n rafRef.current = requestAnimationFrame(step);\n } else {\n displayRef.current = target;\n setDisplay(target);\n rafRef.current = 0;\n }\n };\n\n rafRef.current = requestAnimationFrame(step);\n\n return () => {\n cancelled = true;\n cancelRaf();\n };\n }, [target, enabled, durationMs]);\n\n return display;\n}\n","import { Button as MuiButton, CircularProgress } from '@mui/material';\nimport type { FalconButtonProps } from './FalconButton.types';\n\nexport const FalconButton = ({\n loading = false,\n disabled,\n children,\n size = 'large',\n variant = 'contained',\n type = 'submit',\n fullWidth = true,\n className = 'falcon-btn',\n ...props\n}: FalconButtonProps) => (\n <MuiButton\n disabled={disabled || loading}\n size={size}\n variant={variant}\n type={type}\n fullWidth={fullWidth}\n className={className}\n {...props}\n >\n {loading ? <CircularProgress size={16} color=\"inherit\" /> : children}\n </MuiButton>\n);\n","import { Autocomplete, TextField } from '@mui/material';\nimport type { FalconDIstrictFilterProps } from './FalconDIstrictFilter.types';\n\n/** District filter — full implementation can be migrated from apps/docs. */\nexport const FalconDIstrictFilter = ({\n label = 'District',\n options = [],\n value = [],\n onChange,\n}: FalconDIstrictFilterProps) => (\n <Autocomplete\n multiple\n options={options}\n value={value}\n onChange={(_, newValue) => onChange?.(newValue)}\n getOptionLabel={(opt) =>\n typeof opt === 'object' && opt !== null ? opt.label : ''\n }\n isOptionEqualToValue={(a, b) => a.id === b.id}\n renderInput={(params) => (\n <TextField {...params} label={label} placeholder=\"Select districts\" />\n )}\n />\n);\n","import { Box, Stack, Typography, useTheme } from '@mui/material';\nimport type { FalconGrayButtonProps } from './FalconGrayButton.types';\n\nexport const FalconGrayButton = ({\n text,\n Icon,\n onClick,\n}: FalconGrayButtonProps) => {\n const theme = useTheme();\n return (\n <Box\n sx={{\n cursor: onClick ? 'pointer' : 'default',\n padding: 4,\n borderRadius: '8px',\n background: theme.palette.secondary?.light ?? '#f0f0f0',\n }}\n onClick={onClick}\n role={onClick ? 'button' : undefined}\n >\n <Stack direction=\"row\" justifyContent=\"center\" gap={4} alignItems=\"center\">\n {Icon}\n <Typography fontSize={12} align=\"center\" fontWeight=\"bold\">\n {text}\n </Typography>\n </Stack>\n </Box>\n );\n};\n","import { Box, Divider, Stack } from '@mui/material';\nimport type { FalconPaginationProps } from './FalconPagination.types';\n\nconst selectStyle = {\n border: 'none',\n backgroundColor: 'transparent',\n padding: '5px 10px',\n fontSize: '14px',\n fontWeight: 500,\n color: '#555770',\n cursor: 'pointer',\n outline: 'none',\n} as const;\n\nconst optionStyle = { padding: '5px 10px' } as const;\n\nconst btnStyle = {\n border: 'none',\n backgroundColor: 'transparent',\n padding: '5px 10px',\n cursor: 'pointer',\n outline: 'none',\n} as const;\n\nexport const FalconPagination = ({\n pageNo,\n setPageNo,\n perPage,\n setPerPage,\n totalItems,\n perPageOptions = [12, 24, 36],\n}: FalconPaginationProps) => {\n const totalPage = Math.ceil(totalItems / perPage) || 1;\n\n return (\n <Stack\n spacing={2}\n alignItems=\"center\"\n direction=\"row\"\n width=\"100%\"\n bgcolor=\"#F0F0F0\"\n >\n <Box>\n <select\n style={selectStyle}\n value={perPage}\n onChange={(e) => setPerPage(Number(e.target.value))}\n aria-label=\"Items per page\"\n >\n {perPageOptions.map((n) => (\n <option key={n} style={optionStyle} value={n}>\n {n}\n </option>\n ))}\n </select>\n </Box>\n <Divider orientation=\"vertical\" flexItem />\n\n <Box sx={{ flex: 1 }}>\n <Box sx={{ color: '#525252', fontFamily: 'roboto' }}>\n {perPage * (pageNo - 1) + 1} - {Math.min(perPage * pageNo, totalItems)}{' '}\n of {totalItems} items\n </Box>\n </Box>\n <Divider orientation=\"vertical\" flexItem />\n\n <Stack alignItems=\"center\" direction=\"row\" gap={1}>\n <Box>\n <select\n style={selectStyle}\n value={pageNo}\n onChange={(e) => setPageNo(Number(e.target.value))}\n aria-label=\"Page number\"\n >\n {Array.from({ length: totalPage }, (_, i) => (\n <option key={i} style={optionStyle} value={i + 1}>\n {i + 1}\n </option>\n ))}\n </select>\n </Box>\n <Box sx={{ color: '#525252', fontFamily: 'roboto' }}>\n of {totalPage} pages\n </Box>\n </Stack>\n\n <Divider orientation=\"vertical\" flexItem />\n\n <Stack direction=\"row\" gap={1}>\n <button\n type=\"button\"\n disabled={pageNo === 1}\n onClick={() => setPageNo(pageNo - 1)}\n style={btnStyle}\n aria-label=\"Previous page\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path d=\"M10 12L5 8L10 4V12Z\" fill=\"#161616\" />\n </svg>\n </button>\n <button\n type=\"button\"\n disabled={pageNo === totalPage}\n onClick={() => setPageNo(pageNo + 1)}\n style={btnStyle}\n aria-label=\"Next page\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path d=\"M6 4L11 8L6 12V4Z\" fill=\"#161616\" />\n </svg>\n </button>\n </Stack>\n </Stack>\n );\n};\n","import {\n FormControl,\n InputLabel,\n MenuItem,\n Select,\n SelectChangeEvent,\n} from '@mui/material';\nimport type { FalconSelectProps } from './FalconSelect.types';\n\nfunction normalizeOptions(\n options: string[] | { value: string; label: string }[]\n): { value: string; label: string }[] {\n return options.map((opt) =>\n typeof opt === 'string' ? { value: opt.toLowerCase(), label: opt } : opt\n );\n}\n\nexport const FalconSelect = ({\n label,\n value,\n onChange,\n options,\n disabled = false,\n clearable = true,\n}: FalconSelectProps) => {\n const items = normalizeOptions(options);\n const handleChange = (event: SelectChangeEvent<string>) => {\n const v = event.target.value as string;\n onChange(v !== '' ? v : '');\n };\n\n return (\n <FormControl variant=\"filled\" fullWidth color=\"primary\">\n <InputLabel id={`falcon-select-${label}-label`}>\n Select {label} *\n </InputLabel>\n <Select\n disabled={disabled}\n value={value?.toLowerCase() ?? ''}\n label={`Select ${label}`}\n onChange={handleChange}\n labelId={`falcon-select-${label}-label`}\n id={`falcon-select-${label}`}\n >\n {clearable && (\n <MenuItem value=\"\">\n <em>--Clear--</em>\n </MenuItem>\n )}\n {items.map((item, i) => (\n <MenuItem key={i} value={item.value}>\n {item.label}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n );\n};\n","import Stack from '@mui/material/Stack';\nimport Switch from '@mui/material/Switch';\nimport { styled } from '@mui/material/styles';\nimport type { FalconSingleSwitchProps } from './FalconSingleSwitch.types';\n\nconst AntSwitch = styled(Switch)(() => ({\n width: 28,\n height: 16,\n padding: 0,\n display: 'flex',\n '&:active': {\n '& .MuiSwitch-thumb': { width: 15 },\n '& .MuiSwitch-switchBase.Mui-checked': { transform: 'translateX(9px)' },\n },\n '& .MuiSwitch-switchBase': {\n padding: 2,\n '&.Mui-checked': {\n transform: 'translateX(12px)',\n color: '#fff',\n '& + .MuiSwitch-track': { opacity: 1 },\n },\n },\n '& .MuiSwitch-thumb': {\n boxShadow: '0 2px 4px 0 rgb(0 35 11 / 20%)',\n width: 12,\n height: 12,\n borderRadius: 6,\n },\n '& .MuiSwitch-track': {\n borderRadius: 8,\n opacity: 1,\n backgroundColor: 'rgba(0,0,0,.25)',\n boxSizing: 'border-box',\n },\n}));\n\nexport const FalconSingleSwitch = ({\n color,\n setStatus,\n value = false,\n onChange,\n}: FalconSingleSwitchProps) => {\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>, checked: boolean) => {\n setStatus?.(checked);\n onChange?.(event, checked);\n };\n\n return (\n <Stack direction=\"row\" margin={2} spacing={1} alignItems=\"center\">\n <AntSwitch\n checked={value}\n onChange={handleChange}\n color={color}\n size=\"medium\"\n inputProps={{ 'aria-label': 'toggle' }}\n />\n </Stack>\n );\n};\n","import { Box } from '@mui/material';\nimport { DataGrid } from '@mui/x-data-grid';\nimport { useState } from 'react';\nimport type { FalconTableProps } from './FalconTable.types';\n\nexport const FalconTable = <T extends Record<string, unknown>>({\n rows,\n getRowId,\n columns,\n pageSizeOptions = [7, 10, 25, 50],\n}: FalconTableProps<T>) => {\n const [paginationModel, setPaginationModel] = useState({\n page: 0,\n pageSize: 7,\n });\n\n return (\n <Box\n sx={{\n border: '2px solid #F2F2F2',\n padding: '16px',\n borderRadius: '12px',\n }}\n >\n <DataGrid\n autoHeight\n sx={{\n minHeight: '48px',\n '& .MuiDataGrid-columnHeaders': {\n borderBottom: '0px',\n borderRadius: '6px !important',\n },\n '& .MuiDataGrid-columnHeaderTitle': {\n color: '#7A7A7A !important',\n },\n }}\n rows={rows ?? []}\n getRowId={getRowId}\n columns={columns}\n disableRowSelectionOnClick\n pageSizeOptions={pageSizeOptions}\n paginationModel={paginationModel}\n onPaginationModelChange={setPaginationModel}\n />\n </Box>\n );\n};\n","import { Box, Typography } from '@mui/material';\nimport type { FalconTicketColumsFilterProps } from './FalconTicketColumsFilter.types';\n\n/** Column filter UI — full implementation can be migrated from apps/docs. */\nexport const FalconTicketColumsFilter = ({\n columns = [],\n selected = [],\n onSelectionChange,\n}: FalconTicketColumsFilterProps) => (\n <Box sx={{ p: 2, minWidth: 280 }}>\n <Typography variant=\"subtitle2\" gutterBottom>\n Select columns\n </Typography>\n {columns.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No columns configured. Pass columns prop.\n </Typography>\n ) : (\n <Typography variant=\"body2\">\n {selected.length} of {columns.length} selected\n </Typography>\n )}\n {onSelectionChange && (\n <Typography variant=\"caption\" display=\"block\" sx={{ mt: 1 }}>\n (Column checkboxes to be wired from app)\n </Typography>\n )}\n </Box>\n);\n","import { Button, Popover } from '@mui/material';\nimport { useState } from 'react';\nimport type { FalconTicketFilterProps } from './FalconTicketFilter.types';\n\nexport const FalconTicketFilter = ({\n children,\n label = 'FILTERS',\n open: controlledOpen,\n onOpenChange,\n}: FalconTicketFilterProps) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const open = controlledOpen ?? internalOpen;\n const setOpen = onOpenChange ?? setInternalOpen;\n\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n setOpen(true);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n setOpen(false);\n };\n\n return (\n <>\n <Button onClick={handleClick} variant=\"outlined\" size=\"medium\">\n {label}\n </Button>\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <div style={{ padding: 16, minWidth: 280 }}>{children}</div>\n </Popover>\n </>\n );\n};\n","import type { ChartWidgetInfoPopoverContent } from '../ChartWidgetInfoButton/ChartWidgetInfoButton.types';\n\n/**\n * Ready-made **`ChartWidgetInfoPopoverContent`** for **TimePeriodFilter** (D / W / M / Y) when you want\n * generic help — **not** tied to **QueueTimeBreakdown** or any other specific card.\n *\n * **Use this when:** you show the period control next to charts or KPIs on any page and need a short\n * explanation of what the control does and why it matters, without duplicating copy in your app.\n *\n * **What it contains (for authors / Storybook):**\n * - **`title`:** “Time period” — names the control.\n * - **`description`:** Explains that switching day / week / month / year changes grouping or how the time axis is labelled.\n * - **`helpTitle`:** “How does it help?”\n * - **`helpBullets`:** (1) Align the view with your reporting window; (2) Keep period in sync with other controls on the page.\n *\n * Pass as **`infoPopover={TIME_PERIOD_FILTER_INFO_POPOVER}`** on **TimePeriodFilter**, or use your own\n * **`ChartWidgetInfoPopoverContent`** if you need product-specific wording.\n */\nexport const TIME_PERIOD_FILTER_INFO_POPOVER: ChartWidgetInfoPopoverContent = {\n title: 'Time period',\n description:\n 'Switch between day, week, month, and year to change how data is grouped or how the time axis is labelled.',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'Match the view to your reporting window (e.g. weekly reviews vs monthly rollups).',\n 'Use the same period across controls on the page so everything stays in sync.',\n ],\n};\n\n/**\n * Info copy aligned with the **QueueTimeBreakdown** composite card (header next to D/W/M/Y).\n * **QueueTimeBreakdown** uses this when **`infoPopover`** is omitted on the card.\n * Use **`TIME_PERIOD_FILTER_INFO_POPOVER`** instead when the filter is not on that card.\n */\nexport const TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN: ChartWidgetInfoPopoverContent =\n {\n title: 'Queue Time Breakdown',\n description:\n 'Shows how visitors distribute across queue-time buckets for each row, compares today vs yesterday in the donuts, and plots the trend for the selected period (day, week, month, year).',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'See which stores or zones keep people longer in each time band.',\n 'Switch D / W / M / Y to align the area chart with your reporting window.',\n 'Compare donut slices to spot day-over-day shifts in bucket mix.',\n ],\n };\n\n/** @deprecated Use {@link TIME_PERIOD_FILTER_INFO_POPOVER}. */\nexport const CHART_PERIOD_FILTER_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n TIME_PERIOD_FILTER_INFO_POPOVER;\n\n/** @deprecated Use {@link TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN}. */\nexport const QUEUE_TIME_BREAKDOWN_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN;\n\n/**\n * @deprecated Use {@link TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN}.\n */\nexport const DEFAULT_QUEUE_TIME_BREAKDOWN_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN;\n","import type { HeatMapChartLegendProps } from './HeatMapChartLegend.types';\n\nexport const HeatMapChartLegend = ({\n title,\n items,\n gradientId,\n gradientStops,\n}: HeatMapChartLegendProps) => (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n marginBottom: '16px',\n fontFamily: 'sans-serif',\n }}\n >\n <span\n style={{\n fontSize: '12px',\n fontWeight: 700,\n color: '#374151',\n minWidth: '80px',\n textAlign: 'right',\n }}\n >\n {title}\n </span>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n flex: 1,\n maxWidth: '600px',\n }}\n >\n <svg\n width=\"100%\"\n height=\"32\"\n style={{ filter: 'drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1))' }}\n >\n <defs>\n <linearGradient\n id={gradientId}\n x1=\"0%\"\n y1=\"0%\"\n x2=\"100%\"\n y2=\"0%\"\n >\n {gradientStops.map((stop, index) => (\n <stop\n key={index}\n offset={stop.offset}\n stopColor={stop.color}\n stopOpacity=\"1\"\n />\n ))}\n </linearGradient>\n </defs>\n <rect\n width=\"100%\"\n height=\"100%\"\n fill={`url(#${gradientId})`}\n />\n </svg>\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingLeft: '16px',\n paddingRight: '16px',\n }}\n >\n {items.map((item, index) => (\n <span\n key={index}\n style={{\n fontSize: '9px',\n fontWeight: 600,\n color: 'white',\n textShadow: '0 1px 2px rgba(0, 0, 0, 0.5)',\n letterSpacing: '0.025em',\n }}\n >\n {item.label}\n </span>\n ))}\n </div>\n </div>\n </div>\n);\n","import type { ProgressBarNumberProps } from './ProgressBarNumber.types';\n\nconst FullProgress = ({\n number,\n numColor,\n}: Omit<ProgressBarNumberProps, 'progress'>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={56}\n height={56}\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n >\n <circle\n cx={28}\n cy={28}\n r={26}\n fill=\"#D9D9D9\"\n stroke=\"#222222\"\n strokeWidth={4}\n />\n <text x={28} y={36} fontSize={24} textAnchor=\"middle\" fill={numColor}>\n {number}\n </text>\n </svg>\n);\n\nconst HalfProgress = ({\n number,\n numColor,\n}: Omit<ProgressBarNumberProps, 'progress'>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={56}\n height={56}\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n >\n <circle\n cx={28}\n cy={28}\n r={26}\n fill=\"#D9D9D9\"\n stroke=\"#222222\"\n strokeWidth={4}\n strokeDasharray={85}\n strokeDashoffset={130}\n />\n <text x={28} y={36} fontSize={24} textAnchor=\"middle\" fill={numColor}>\n {number}\n </text>\n </svg>\n);\n\nconst NoProgress = ({\n number,\n numColor,\n}: Omit<ProgressBarNumberProps, 'progress'>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={56}\n height={56}\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n >\n <circle\n cx={28}\n cy={28}\n r={26}\n fill=\"#D9D9D9\"\n stroke=\"#222222\"\n strokeOpacity=\"0.1\"\n strokeWidth=\"4\"\n />\n <text x={28} y={36} fontSize={24} textAnchor=\"middle\" fill={numColor}>\n {number}\n </text>\n </svg>\n);\n\nexport const ProgressBarNumber = ({\n number,\n progress,\n numColor,\n}: ProgressBarNumberProps) => {\n if (progress === 0) {\n return <NoProgress number={number} numColor={numColor} />;\n }\n if (progress === 50) {\n return <HalfProgress number={number} numColor={numColor} />;\n }\n if (progress === 100) {\n return <FullProgress number={number} numColor={numColor} />;\n }\n return <div>Invalid Progress</div>;\n};\n","import Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Cell,\n LabelList,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n FootfallByAgeGroupsProps,\n FootfallByAgeGroupsRow,\n FootfallByAgeGroupsSeries,\n FootfallByAgeGroupsTooltipRenderContext,\n FootfallByAgeGroupsTooltipStyles,\n} from './FootfallByAgeGroups.types';\n\nconst OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX = 430 as const;\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_FOOTFALL_BY_AGE_CHART_MARGIN = {\n top: 36,\n right: 28,\n left: 12,\n bottom: 28,\n} as const;\nconst OLY_DEFAULT_FOOTFALL_BY_AGE_STACK_TOTAL_LABEL_FILL = '#28293D' as const;\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\n/** Merge MUI \\`sx\\` with a base object (supports array / function overrides). */\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nfunction rowTotal(\n row: FootfallByAgeGroupsRow,\n series: FootfallByAgeGroupsSeries[]\n): number {\n return series.reduce((acc, s) => {\n const v = row[s.dataKey];\n return acc + (typeof v === 'number' ? v : Number(v) || 0);\n }, 0);\n}\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}K`;\n }\n return String(value);\n}\n\ntype FootfallAgeTooltipProps = TooltipContentProps & {\n isBarHovered: boolean;\n series: FootfallByAgeGroupsSeries[];\n categoryLabel: string;\n overallLabel: string;\n tooltipStyles?: FootfallByAgeGroupsTooltipStyles;\n};\n\nfunction FootfallAgeTooltip({\n active,\n payload,\n label,\n isBarHovered,\n series,\n categoryLabel,\n overallLabel,\n tooltipStyles,\n}: FootfallAgeTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || !isBarHovered || label === undefined) {\n return null;\n }\n\n const total = payload.reduce((sum: number, entry: TooltipPayloadEntry) => {\n const v = entry.value;\n const n = typeof v === 'number' ? v : Number(v);\n return sum + (Number.isFinite(n) ? n : 0);\n }, 0);\n\n const ts = tooltipStyles;\n const sectionBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n marginBottom: '8px',\n };\n\n return (\n <div\n style={mergeCss(\n {\n backgroundColor: 'white',\n borderRadius: '8px',\n padding: '16px',\n minWidth: '180px',\n maxWidth: '260px',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n },\n ts?.container\n )}\n >\n <div\n style={mergeCss(\n { ...sectionBase, marginBottom: '8px' },\n ts?.sectionRow\n )}\n >\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {categoryLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {label}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {overallLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {total.toLocaleString()}\n </div>\n </div>\n {series.map((s: FootfallByAgeGroupsSeries) => {\n const entry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === s.dataKey\n );\n const raw = entry?.value;\n const value = typeof raw === 'number' ? raw : Number(raw ?? 0);\n return (\n <div style={mergeCss(sectionBase, ts?.sectionRow)} key={s.dataKey}>\n <div\n style={mergeCss(\n {\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: s.color,\n },\n ts?.seriesDot\n )}\n />\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 700,\n },\n ts?.seriesName\n )}\n >\n {s.label}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {value.toLocaleString()}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/** Props passed by Recharts `LabelList` `content` renderer. */\ninterface RechartsBarLabelListProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n index?: number;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction StackTotalLabel({\n series,\n rows,\n x,\n y,\n width,\n height,\n index,\n stackTotalFill,\n}: RechartsBarLabelListProps & {\n series: FootfallByAgeGroupsSeries[];\n rows: FootfallByAgeGroupsRow[];\n stackTotalFill: string;\n}) {\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n const nh = toNum(height);\n if (\n index === undefined ||\n nx === undefined ||\n ny === undefined ||\n nw === undefined ||\n nh === undefined\n ) {\n return null;\n }\n const row = rows[index];\n if (!row) return null;\n const total = rowTotal(row, series);\n const cx = nx + nw / 2;\n const cy = ny - 4;\n return (\n <text\n x={cx}\n y={cy}\n fill={stackTotalFill}\n fontSize={12}\n fontWeight={500}\n textAnchor=\"middle\"\n >\n {formatBarLabel(total)}\n </text>\n );\n}\n\n/**\n * Stacked bar chart for footfall (or counts) by age groups per category, with hover dimming, optional horizontal scroll, and a custom tooltip.\n */\nconst defaultMinWidthPerCategory = 56;\n/** Default Recharts \\`maxBarSize\\` cap (slimmer than category min width when bands are wide). */\nconst defaultMaxBarThickness = 36;\n/** Left/right space for Y-axis ticks and padding inside the scrollable plot. */\nconst chartWidthAxisGutter = 72;\n\nconst defaultChartMargin = OLY_DEFAULT_FOOTFALL_BY_AGE_CHART_MARGIN;\n\nconst defaultChartColors = {\n ...OLY_DEFAULT_COMPOSED_CHART_CHROME,\n stackTotalLabelFill: OLY_DEFAULT_FOOTFALL_BY_AGE_STACK_TOTAL_LABEL_FILL,\n} as const;\n\nexport function FootfallByAgeGroups({\n title,\n data,\n series,\n chartHeight = OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX,\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendRowSx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n headerActions,\n tooltipCategoryLabel = 'Time',\n tooltipOverallLabel = 'Overall',\n tooltipStyles,\n renderTooltip,\n showLegend = true,\n chartMargin: chartMarginProp,\n chartColors: chartColorsProp,\n emptyStatePlaceholderProps,\n dimmedStackOpacity = 0.35,\n barStackId = 'footfall-by-age-groups',\n}: FootfallByAgeGroupsProps) {\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\n const [barHovered, setBarHovered] = React.useState(false);\n\n const handleMouseEnter = React.useCallback((_: unknown, index: number) => {\n setBarHovered(true);\n setActiveIndex(index);\n }, []);\n\n const handleMouseLeave = React.useCallback(() => {\n setBarHovered(false);\n setActiveIndex(null);\n }, []);\n\n const processedData = React.useMemo(\n () => data.map(row => ({ ...row })),\n [data]\n );\n\n const hasMeaningfulData = React.useMemo(\n () =>\n processedData.some(row =>\n series.some(s => {\n const raw = row[s.dataKey];\n const value =\n typeof raw === 'number'\n ? raw\n : raw === null || raw === undefined\n ? 0\n : Number(raw);\n return Number.isFinite(value) && value > 0;\n })\n ),\n [processedData, series]\n );\n\n const resolvedMaxBarSize = React.useMemo(() => {\n if (maxBarSizeProp !== undefined) {\n return maxBarSizeProp;\n }\n const categoryCap =\n minWidthPerCategory > 0\n ? minWidthPerCategory\n : defaultMinWidthPerCategory;\n return Math.min(categoryCap, defaultMaxBarThickness);\n }, [maxBarSizeProp, minWidthPerCategory]);\n\n const categoryScrollActive = React.useMemo(() => {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScrollProp === 'off') {\n return false;\n }\n if (horizontalScrollProp === 'on') {\n return true;\n }\n return processedData.length > 1;\n }, [horizontalScrollProp, minWidthPerCategory, processedData.length]);\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n /**\n * Explicit pixel width so Recharts lays out correctly inside `overflow-x: auto` (ResponsiveContainer + % widths clip in flex/Storybook).\n * When category scroll is active: at least category minimum or the visible viewport, whichever is wider.\n */\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n const barOpacity = (index: number) =>\n activeIndex === null || activeIndex === index ? 1 : dimmedStackOpacity;\n\n const lastSeriesIndex = series.length - 1;\n\n const chartMargin = React.useMemo(\n () => ({\n ...defaultChartMargin,\n ...chartMarginProp,\n }),\n [chartMarginProp]\n );\n\n const chartColors = React.useMemo(\n () => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n },\n titleRowSx\n )}\n >\n {headerActions ? (\n <Box\n sx={{\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 1,\n }}\n >\n {headerActions}\n </Box>\n ) : null}\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'center',\n width: '100%',\n px: headerActions ? 5 : 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n {showLegend && hasMeaningfulData && series.length > 0 ? (\n <Box\n sx={sxChain(\n {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'center',\n alignItems: 'center',\n columnGap: { xs: 2, sm: 3 },\n rowGap: 1,\n py: 0.5,\n px: { xs: 0, sm: 1 },\n },\n legendRowSx\n )}\n >\n {series.map(s => (\n <Stack\n key={s.dataKey}\n direction=\"row\"\n alignItems=\"center\"\n sx={sxChain({ gap: 1 }, legendItemSx)}\n >\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n flexShrink: 0,\n bgcolor: s.color,\n borderRadius: '2px',\n },\n legendSwatchSx\n )}\n />\n <Typography\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {s.legendLabel ?? s.label}\n </Typography>\n </Stack>\n ))}\n </Box>\n ) : null}\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {hasMeaningfulData ? (\n <BarChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n maxBarSize={resolvedMaxBarSize}\n onMouseLeave={handleMouseLeave}\n style={{ overflow: 'visible' }}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n angle={-38}\n textAnchor=\"end\"\n interval={0}\n height={57}\n dy={8}\n tick={{ fontSize: 12 }}\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400 }}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <Tooltip\n cursor={false}\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n rows: processedData,\n series,\n } satisfies FootfallByAgeGroupsTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return (\n <FootfallAgeTooltip\n {...tooltipProps}\n isBarHovered={barHovered}\n series={series}\n categoryLabel={tooltipCategoryLabel}\n overallLabel={tooltipOverallLabel}\n tooltipStyles={tooltipStyles}\n />\n );\n }}\n />\n {series.map((s, i) => (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n name={s.label}\n stackId={barStackId}\n fill={s.color}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {processedData.map((row, index) => (\n <Cell\n key={`${s.dataKey}-${row.name}-${index}`}\n fillOpacity={barOpacity(index)}\n />\n ))}\n {i === lastSeriesIndex ? (\n <LabelList\n content={(labelProps: RechartsBarLabelListProps) => (\n <StackTotalLabel\n {...labelProps}\n series={series}\n rows={processedData}\n stackTotalFill={chartColors.stackTotalLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n ))}\n </BarChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <ChartEmptyState\n minHeight={chartHeight}\n {...emptyStatePlaceholderProps}\n />\n </Box>\n )}\n </Box>\n </Stack>\n </Box>\n );\n}\n","/** Shared max-width rules for chart cards (WalkinAnalysis-style). */\nexport type ChartCardMaxWidth =\n | number\n | string\n | {\n xs?: number | string;\n sm?: number | string;\n md?: number | string;\n };\n\nexport function resolveChartCardMaxWidth(\n cardMaxWidth: ChartCardMaxWidth | undefined\n):\n | number\n | string\n | { xs?: number | string; sm?: number | string; md?: number | string } {\n if (cardMaxWidth === undefined) {\n return { xs: '100%', sm: 640 };\n }\n if (typeof cardMaxWidth === 'number') {\n return `${cardMaxWidth}px`;\n }\n if (typeof cardMaxWidth === 'string') {\n return cardMaxWidth;\n }\n return {\n xs:\n cardMaxWidth.xs !== undefined\n ? typeof cardMaxWidth.xs === 'number'\n ? `${cardMaxWidth.xs}px`\n : cardMaxWidth.xs\n : '100%',\n sm:\n cardMaxWidth.sm !== undefined\n ? typeof cardMaxWidth.sm === 'number'\n ? `${cardMaxWidth.sm}px`\n : cardMaxWidth.sm\n : 640,\n ...(cardMaxWidth.md !== undefined\n ? {\n md:\n typeof cardMaxWidth.md === 'number'\n ? `${cardMaxWidth.md}px`\n : cardMaxWidth.md,\n }\n : {}),\n };\n}\n","import Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Cell,\n LabelList,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n FootfallByGenderChartColors,\n FootfallByGenderHorizontalScroll,\n FootfallByGenderProps,\n FootfallByGenderRow,\n FootfallByGenderTooltipRenderContext,\n FootfallByGenderTooltipStyles,\n} from './FootfallByGender.types';\n\nconst OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX = 430 as const;\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_FOOTFALL_GENDER_CHART_MARGIN = {\n top: 28,\n right: 20,\n left: 16,\n bottom: 28,\n} as const;\nconst OLY_DEFAULT_FOOTFALL_GENDER_SERIES_COLORS = {\n male: '#7266E9',\n female: '#E85D4C',\n} as const;\nconst OLY_DEFAULT_FOOTFALL_GENDER_BAR_VALUE_LABEL_FILL = '#4B5563' as const;\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nconst defaultSeriesLabels = { male: 'Male', female: 'Female' } as const;\nconst defaultSeriesColors = OLY_DEFAULT_FOOTFALL_GENDER_SERIES_COLORS;\n\nconst defaultMinWidthPerCategory = 72;\nconst defaultMaxBarThickness = 32;\nconst chartWidthAxisGutter = 88;\n\nconst defaultChartMargin = OLY_DEFAULT_FOOTFALL_GENDER_CHART_MARGIN;\n\nconst defaultChartColors: FootfallByGenderChartColors = {\n ...OLY_DEFAULT_COMPOSED_CHART_CHROME,\n barValueLabelFill: OLY_DEFAULT_FOOTFALL_GENDER_BAR_VALUE_LABEL_FILL,\n};\n\nconst topReserveForBarLabels = 58;\nconst topReserveNoBarLabels = 28;\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}k`;\n }\n return String(value);\n}\n\nfunction formatYAxisTickDefault(value: number): string {\n if (!Number.isFinite(value)) {\n return '';\n }\n const abs = Math.abs(value);\n if (abs >= 1000) {\n const k = value / 1000;\n const text = Number.isInteger(k) ? String(k) : k.toFixed(1);\n return `${text}k`;\n }\n return String(value);\n}\n\ntype GenderTooltipProps = TooltipContentProps & {\n isBarHovered: boolean;\n categoryLabel: string;\n overallLabel: string;\n seriesLabels: { male: string; female: string };\n seriesColors: { male: string; female: string };\n tooltipStyles?: FootfallByGenderTooltipStyles;\n};\n\nfunction GenderTooltip({\n active,\n payload,\n label,\n isBarHovered,\n categoryLabel,\n overallLabel,\n seriesLabels,\n seriesColors,\n tooltipStyles,\n}: GenderTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || !isBarHovered || label === undefined) {\n return null;\n }\n\n const maleEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === 'male'\n );\n const femaleEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === 'female'\n );\n const male = Number(maleEntry?.value ?? 0);\n const female = Number(femaleEntry?.value ?? 0);\n const total = male + female;\n\n const ts = tooltipStyles;\n const sectionBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n marginBottom: '8px',\n };\n\n return (\n <div\n style={mergeCss(\n {\n backgroundColor: 'white',\n borderRadius: '8px',\n padding: '16px',\n width: '180px',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n },\n ts?.container\n )}\n >\n <div\n style={mergeCss(\n { ...sectionBase, marginBottom: '8px' },\n ts?.sectionRow\n )}\n >\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {categoryLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {label}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {overallLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {total.toLocaleString()}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: seriesColors.male,\n },\n ts?.seriesDot\n )}\n />\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.seriesName\n )}\n >\n {seriesLabels.male}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {male.toLocaleString()}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: seriesColors.female,\n },\n ts?.seriesDot\n )}\n />\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.seriesName\n )}\n >\n {seriesLabels.female}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {female.toLocaleString()}\n </div>\n </div>\n </div>\n );\n}\n\nfunction resolveCategoryScroll(\n minWidthPerCategory: number,\n horizontalScroll: FootfallByGenderHorizontalScroll,\n categoryCount: number\n): boolean {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScroll === 'off') {\n return false;\n }\n if (horizontalScroll === 'on') {\n return true;\n }\n return categoryCount > 1;\n}\n\n/**\n * Grouped bar chart: two series (male / female) per category, with hover dimming and a custom tooltip.\n */\nexport function FootfallByGender({\n title,\n data,\n seriesLabels: seriesLabelsProp,\n seriesColors: seriesColorsProp,\n chartHeight = OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX,\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n barGap = 0,\n showLegend = true,\n showBarValueLabels = true,\n dimmedBarOpacity = 0.3,\n hoveredBarOpacity = 0.9,\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendOverlaySx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartViewportSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n headerActions,\n tooltipCategoryLabel = 'Region',\n tooltipOverallLabel = 'Overall Walk-ins',\n tooltipStyles,\n renderTooltip,\n chartMargin: chartMarginProp,\n chartColors: chartColorsProp,\n emptyStatePlaceholderProps,\n yAxisTickFormatter,\n}: FootfallByGenderProps) {\n const seriesLabels = { ...defaultSeriesLabels, ...seriesLabelsProp };\n const seriesColors = { ...defaultSeriesColors, ...seriesColorsProp };\n\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\n const [barHovered, setBarHovered] = React.useState(false);\n\n const handleMouseEnter = React.useCallback((_: unknown, index: number) => {\n setBarHovered(true);\n setActiveIndex(index);\n }, []);\n\n const handleMouseLeave = React.useCallback(() => {\n setBarHovered(false);\n setActiveIndex(null);\n }, []);\n\n const processedData = React.useMemo((): FootfallByGenderRow[] => {\n return data.map(row => ({ ...row }));\n }, [data]);\n\n const categoryScrollActive = React.useMemo(\n () =>\n resolveCategoryScroll(\n minWidthPerCategory,\n horizontalScrollProp,\n processedData.length\n ),\n [horizontalScrollProp, minWidthPerCategory, processedData.length]\n );\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n const resolvedMaxBarSize = React.useMemo(() => {\n if (maxBarSizeProp !== undefined) {\n return maxBarSizeProp;\n }\n const categoryCap =\n minWidthPerCategory > 0\n ? minWidthPerCategory\n : defaultMinWidthPerCategory;\n return Math.min(categoryCap, defaultMaxBarThickness);\n }, [maxBarSizeProp, minWidthPerCategory]);\n\n const chartMargin = React.useMemo(() => {\n const top = showBarValueLabels\n ? topReserveForBarLabels\n : topReserveNoBarLabels;\n return {\n ...defaultChartMargin,\n top,\n ...chartMarginProp,\n };\n }, [showBarValueLabels, chartMarginProp]);\n\n const chartColors = React.useMemo(\n () => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n const yAxisTick = yAxisTickFormatter ?? formatYAxisTickDefault;\n\n const barOpacity = (index: number) =>\n activeIndex === null || activeIndex === index\n ? hoveredBarOpacity\n : dimmedBarOpacity;\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n },\n titleRowSx\n )}\n >\n {headerActions ? (\n <Box\n sx={{\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 1,\n }}\n >\n {headerActions}\n </Box>\n ) : null}\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'center',\n width: '100%',\n px: headerActions ? 5 : 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n },\n chartViewportSx\n )}\n >\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n height: '100%',\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {processedData.length > 0 ? (\n <BarChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n barGap={barGap}\n maxBarSize={resolvedMaxBarSize}\n onMouseLeave={handleMouseLeave}\n style={{ overflow: 'visible' }}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n angle={-38}\n textAnchor=\"end\"\n interval={0}\n height={68}\n tickMargin={10}\n dy={6}\n tick={{ fontSize: 12 }}\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n width={52}\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400 }}\n tickFormatter={yAxisTick}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <Tooltip\n cursor={false}\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n rows: processedData,\n } satisfies FootfallByGenderTooltipRenderContext);\n return customTooltip == null ? null : (\n <>{customTooltip}</>\n );\n }\n return (\n <GenderTooltip\n {...tooltipProps}\n isBarHovered={barHovered}\n categoryLabel={tooltipCategoryLabel}\n overallLabel={tooltipOverallLabel}\n seriesLabels={seriesLabels}\n seriesColors={seriesColors}\n tooltipStyles={tooltipStyles}\n />\n );\n }}\n />\n <Bar\n dataKey=\"male\"\n name={seriesLabels.male}\n fill={seriesColors.male}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {processedData.map((row, index) => (\n <Cell\n key={`m-${row.name}-${index}`}\n fillOpacity={barOpacity(index)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n dataKey=\"male\"\n position=\"top\"\n offset={12}\n fill={chartColors.barValueLabelFill}\n fontSize={12}\n angle={-90}\n formatter={label => formatBarLabel(Number(label))}\n />\n ) : null}\n </Bar>\n <Bar\n dataKey=\"female\"\n name={seriesLabels.female}\n fill={seriesColors.female}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {processedData.map((row, index) => (\n <Cell\n key={`f-${row.name}-${index}`}\n fillOpacity={barOpacity(index)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n dataKey=\"female\"\n position=\"top\"\n offset={12}\n fill={chartColors.barValueLabelFill}\n fontSize={12}\n angle={-90}\n formatter={label => formatBarLabel(Number(label))}\n />\n ) : null}\n </Bar>\n </BarChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <ChartEmptyState\n minHeight={chartHeight}\n {...emptyStatePlaceholderProps}\n />\n </Box>\n )}\n </Box>\n {showLegend && processedData.length > 0 ? (\n <Box\n component=\"ul\"\n sx={sxChain(\n {\n position: 'absolute',\n top: 6,\n right: 10,\n zIndex: 2,\n listStyle: 'none',\n m: 0,\n p: 0,\n pl: 1,\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'nowrap',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 2,\n pointerEvents: 'none',\n },\n legendOverlaySx\n )}\n >\n <Box\n component=\"li\"\n sx={sxChain(\n {\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n flexShrink: 0,\n },\n legendItemSx\n )}\n >\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n borderRadius: '3px',\n bgcolor: seriesColors.male,\n flexShrink: 0,\n },\n legendSwatchSx\n )}\n />\n <Typography\n component=\"span\"\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {seriesLabels.male}\n </Typography>\n </Box>\n <Box\n component=\"li\"\n sx={sxChain(\n {\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n flexShrink: 0,\n },\n legendItemSx\n )}\n >\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n borderRadius: '3px',\n bgcolor: seriesColors.female,\n flexShrink: 0,\n },\n legendSwatchSx\n )}\n />\n <Typography\n component=\"span\"\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {seriesLabels.female}\n </Typography>\n </Box>\n </Box>\n ) : null}\n </Box>\n </Stack>\n </Box>\n );\n}\n","import Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport {\n Bar,\n CartesianGrid,\n Cell,\n ComposedChart,\n LabelList,\n Line,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport { useChartPlotScrollToEnd } from '../../_chart/useChartPlotScrollToEnd';\nimport type {\n PasserbyConversionChartColors,\n PasserbyConversionProps,\n PasserbyConversionRow,\n PasserbyConversionTooltipRenderContext,\n PasserbyConversionTooltipStyles,\n} from './PasserbyConversion.types';\n\nconst OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX = 430 as const;\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_PASSERBY_CHART_MARGIN = {\n top: 28,\n right: 8,\n left: 4,\n bottom: 28,\n} as const;\nconst OLY_DEFAULT_PASSERBY_CHART_SERIES_COLORS = {\n passerbyBarFill: '#FFCC4D',\n walkInsBarFill: '#008099',\n conversionLineStroke: '#6B4C84',\n barValueLabelFill: '#374151',\n} as const;\n\nconst PASSERBY_KEY = 'passerby';\nconst WALKINS_KEY = 'walkIns';\nconst CONVERSION_KEY = 'conversion';\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}k`;\n }\n return String(value);\n}\n\nfunction formatYAxisTickDefault(value: number): string {\n if (!Number.isFinite(value)) {\n return '';\n }\n const abs = Math.abs(value);\n if (abs >= 1000) {\n const k = value / 1000;\n const text = Number.isInteger(k) ? String(k) : k.toFixed(1);\n return `${text}k`;\n }\n return String(value);\n}\n\ninterface RechartsBarLabelListProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n value?: number | string | null;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction BarTopLabel({\n x,\n y,\n width,\n value,\n fill,\n}: RechartsBarLabelListProps & { fill: string }) {\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n if (nx === undefined || ny === undefined || nw === undefined) {\n return null;\n }\n const n =\n value === null || value === undefined\n ? NaN\n : typeof value === 'number'\n ? value\n : Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n return null;\n }\n const cx = nx + nw / 2;\n const cy = ny - 6;\n return (\n <text\n x={cx}\n y={cy}\n fill={fill}\n fontSize={12}\n fontWeight={500}\n textAnchor=\"middle\"\n >\n {formatBarLabel(n)}\n </text>\n );\n}\n\nfunction tooltipDatumFromPayload(\n payload: TooltipContentProps['payload']\n): PasserbyConversionRow | undefined {\n const raw = payload?.[0]?.payload;\n if (\n raw &&\n typeof raw === 'object' &&\n PASSERBY_KEY in raw &&\n WALKINS_KEY in raw\n ) {\n return raw as PasserbyConversionRow;\n }\n return undefined;\n}\n\ntype ConversionTooltipProps = TooltipContentProps & {\n timeLabel: string;\n overallLabel: string;\n walkInsLabel: string;\n passerbyLabel: string;\n conversionLabel: string;\n formatConversion: (value: number) => string;\n colors: { walkIns: string; passerby: string; conversion: string };\n showConversionRow: boolean;\n tooltipStyles?: PasserbyConversionTooltipStyles;\n};\n\nfunction ConversionTooltip({\n active,\n payload,\n label,\n timeLabel,\n overallLabel,\n walkInsLabel,\n passerbyLabel,\n conversionLabel,\n formatConversion,\n colors,\n showConversionRow,\n tooltipStyles,\n}: ConversionTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || label === undefined) {\n return null;\n }\n\n const datum = tooltipDatumFromPayload(payload);\n const passerbyEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === PASSERBY_KEY\n );\n const walkEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === WALKINS_KEY\n );\n const passerby = Number(passerbyEntry?.value ?? 0);\n const walkIns = Number(walkEntry?.value ?? 0);\n const overall = passerby + walkIns;\n\n const timeDisplay =\n datum?.timeSlotLabel !== undefined && datum.timeSlotLabel !== ''\n ? datum.timeSlotLabel\n : String(label);\n\n const convRaw = datum?.conversion;\n const conversion =\n typeof convRaw === 'number' && Number.isFinite(convRaw) ? convRaw : NaN;\n const showConv = showConversionRow && Number.isFinite(conversion);\n\n const ts = tooltipStyles;\n const rowBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 6,\n rowGap: 2,\n marginBottom: 8,\n };\n const labelStyle = mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 700 },\n ts?.label\n );\n const valueStyle = mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.value\n );\n const dotBase = mergeCss(\n {\n width: 10,\n height: 10,\n borderRadius: '50%',\n flexShrink: 0,\n },\n ts?.seriesDot\n );\n\n return (\n <div\n style={mergeCss(\n {\n backgroundColor: '#fff',\n borderRadius: 8,\n padding: '12px 14px',\n width: 'max-content',\n maxWidth: 220,\n minWidth: 0,\n boxSizing: 'border-box',\n boxShadow: '0 2px 12px rgba(0, 0, 0, 0.12)',\n border: '1px solid #E8E8E8',\n },\n ts?.container\n )}\n >\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{timeLabel}:</span>\n <span style={valueStyle}>{timeDisplay}</span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{overallLabel}:</span>\n <span style={valueStyle}>{overall.toLocaleString()}</span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span\n style={mergeCss({ ...dotBase, backgroundColor: colors.walkIns })}\n />\n <span\n style={mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 500 },\n ts?.seriesName\n )}\n >\n {walkInsLabel}:\n </span>\n <span\n style={mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {walkIns.toLocaleString()}\n </span>\n </div>\n <div\n style={mergeCss(\n { ...rowBase, marginBottom: showConv ? 8 : 0 },\n ts?.row\n )}\n >\n <span\n style={mergeCss({ ...dotBase, backgroundColor: colors.passerby })}\n />\n <span\n style={mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 500 },\n ts?.seriesName\n )}\n >\n {passerbyLabel}:\n </span>\n <span\n style={mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {passerby.toLocaleString()}\n </span>\n </div>\n {showConv ? (\n <div style={mergeCss({ ...rowBase, marginBottom: 0 }, ts?.row)}>\n <span\n style={mergeCss({ ...dotBase, backgroundColor: colors.conversion })}\n />\n <span\n style={mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 500 },\n ts?.seriesName\n )}\n >\n {conversionLabel}:\n </span>\n <span\n style={mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {formatConversion(conversion)}\n </span>\n </div>\n ) : null}\n </div>\n );\n}\n\nconst defaultMinWidthPerCategory = 56;\nconst defaultMaxBarThickness = 28;\nconst chartWidthAxisGutter = 108;\n\nconst defaultChartMargin = OLY_DEFAULT_PASSERBY_CHART_MARGIN;\n\nconst topReserveForBarLabels = 52;\nconst topReserveNoBarLabels = 22;\n\nconst defaultChartColors = {\n ...OLY_DEFAULT_COMPOSED_CHART_CHROME,\n ...OLY_DEFAULT_PASSERBY_CHART_SERIES_COLORS,\n} as const;\n\nfunction defaultFormatTooltipConversion(value: number): string {\n return `${Math.round(value)}%`;\n}\n\nexport function PasserbyConversion({\n title,\n data,\n timeSlots,\n fillMissingTimeSlots = true,\n chartHeight = OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX,\n passerbySeriesName = 'Passerby',\n walkInsSeriesName = 'Walk-ins',\n conversionSeriesName = 'Conversion',\n lineType = 'natural',\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n barGap = 0,\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendRowSx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n headerActions,\n tooltipTimeLabel = 'Time',\n tooltipOverallLabel = 'Overall',\n tooltipWalkInsLabel,\n tooltipPasserbyLabel,\n tooltipConversionLabel = 'Conversion(%)',\n formatTooltipConversion = defaultFormatTooltipConversion,\n conversionAxisLabel,\n yAxisTickFormatter,\n conversionAxisTickFormatter,\n tooltipStyles,\n renderTooltip,\n showLegend = true,\n showConversionLine: showConversionLineProp,\n showBarValueLabels = true,\n chartMargin: chartMarginProp,\n chartColors: chartColorsProp,\n emptyStatePlaceholderProps,\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n scrollChartToEndOnDataChange = true,\n}: PasserbyConversionProps) {\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\n\n const handleBarMouseEnter = React.useCallback((_: unknown, index: number) => {\n setActiveIndex(index);\n }, []);\n\n const handleChartMouseLeave = React.useCallback(() => {\n setActiveIndex(null);\n }, []);\n\n const processedData = React.useMemo(() => {\n const clone = data.map(row => ({ ...row }));\n if (!timeSlots || !fillMissingTimeSlots) {\n return clone;\n }\n const byName = new Map(clone.map(r => [r.name, r] as const));\n return timeSlots.map(slot => {\n const existing = byName.get(slot.name);\n if (existing) return existing;\n return {\n name: slot.name,\n timeSlotLabel: slot.timeSlotLabel ?? slot.name,\n passerby: 0,\n walkIns: 0,\n conversion: null,\n };\n });\n }, [data, timeSlots, fillMissingTimeSlots]);\n\n const hasMeaningfulData = React.useMemo(\n () =>\n processedData.some(row => {\n const conversionValue =\n typeof row.conversion === 'number' && Number.isFinite(row.conversion)\n ? row.conversion\n : 0;\n return row.passerby > 0 || row.walkIns > 0 || conversionValue !== 0;\n }),\n [processedData]\n );\n\n const hasConversionData = React.useMemo(\n () =>\n processedData.some(\n r => typeof r.conversion === 'number' && Number.isFinite(r.conversion)\n ),\n [processedData]\n );\n\n const showConversionLine =\n showConversionLineProp !== undefined\n ? showConversionLineProp\n : hasConversionData;\n\n const resolvedMaxBarSize = React.useMemo(() => {\n if (maxBarSizeProp !== undefined) {\n return maxBarSizeProp;\n }\n const categoryCap =\n minWidthPerCategory > 0\n ? minWidthPerCategory\n : defaultMinWidthPerCategory;\n // Two grouped `<Bar>` series: Recharts `maxBarSize` is per bar. Capping at `defaultMaxBarThickness`\n // while `minWidthPerCategory` is large (e.g. horizontal scroll) leaves a wide empty band *between* the bars.\n if (categoryCap <= 2 * defaultMaxBarThickness) {\n return Math.min(categoryCap, defaultMaxBarThickness);\n }\n const perBarIdeal = Math.max(8, Math.floor((categoryCap / 2) * 0.92));\n return Math.min(perBarIdeal, categoryCap);\n }, [maxBarSizeProp, minWidthPerCategory]);\n\n const categoryScrollActive = React.useMemo(() => {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScrollProp === 'off') {\n return false;\n }\n if (horizontalScrollProp === 'on') {\n return true;\n }\n return processedData.length > 1;\n }, [horizontalScrollProp, minWidthPerCategory, processedData.length]);\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n useChartPlotScrollToEnd(scrollRef, {\n enabled: scrollChartToEndOnDataChange,\n categoryScrollActive,\n dataLength: processedData.length,\n dataVersion: processedData,\n });\n\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n const chartColors = React.useMemo(\n (): Required<PasserbyConversionChartColors> => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n const chartMargin = React.useMemo(() => {\n const top = showBarValueLabels\n ? topReserveForBarLabels\n : topReserveNoBarLabels;\n const right = showConversionLine ? 52 : defaultChartMargin.right;\n return {\n ...defaultChartMargin,\n top,\n right,\n ...chartMarginProp,\n };\n }, [showBarValueLabels, showConversionLine, chartMarginProp]);\n\n const yTickLeft = yAxisTickFormatter ?? formatYAxisTickDefault;\n const yTickRight = conversionAxisTickFormatter ?? formatYAxisTickDefault;\n\n const barFillOpacity = React.useCallback(\n (index: number) =>\n activeIndex === null || activeIndex === index ? 1 : 0.38,\n [activeIndex]\n );\n\n const resolvedWalkInsTooltipLabel = tooltipWalkInsLabel ?? walkInsSeriesName;\n const resolvedPasserbyTooltipLabel =\n tooltipPasserbyLabel ?? passerbySeriesName;\n\n const legendItems = React.useMemo(() => {\n const items: {\n key: string;\n label: string;\n color: string;\n isLine?: boolean;\n }[] = [\n {\n key: 'walkins',\n label: walkInsSeriesName,\n color: chartColors.walkInsBarFill,\n },\n {\n key: 'passerby',\n label: passerbySeriesName,\n color: chartColors.passerbyBarFill,\n },\n ];\n if (showConversionLine) {\n items.push({\n key: 'conversion',\n label: conversionSeriesName,\n color: chartColors.conversionLineStroke,\n isLine: true,\n });\n }\n return items;\n }, [\n passerbySeriesName,\n walkInsSeriesName,\n conversionSeriesName,\n chartColors.walkInsBarFill,\n chartColors.passerbyBarFill,\n chartColors.conversionLineStroke,\n showConversionLine,\n ]);\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n width: '100%',\n minWidth: 0,\n },\n titleRowSx\n )}\n >\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'left',\n flex: 1,\n minWidth: 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n {headerActions ? (\n <Box sx={{ flexShrink: 0, display: 'flex', alignItems: 'center' }}>\n {headerActions}\n </Box>\n ) : null}\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n {showLegend && hasMeaningfulData && legendItems.length > 0 ? (\n <Box\n sx={sxChain(\n {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'flex-end',\n alignItems: 'center',\n columnGap: { xs: 2, sm: 3 },\n rowGap: 1,\n py: 0.5,\n px: { xs: 0, sm: 1 },\n },\n legendRowSx\n )}\n >\n {legendItems.map(item => (\n <Stack\n key={item.key}\n direction=\"row\"\n alignItems=\"center\"\n sx={sxChain({ gap: 1 }, legendItemSx)}\n >\n {item.isLine ? (\n <Box\n sx={sxChain(\n {\n width: 16,\n height: 3,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: 0.5,\n alignSelf: 'center',\n },\n legendSwatchSx\n )}\n />\n ) : (\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: '2px',\n },\n legendSwatchSx\n )}\n />\n )}\n <Typography\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {item.label}\n </Typography>\n </Stack>\n ))}\n </Box>\n ) : null}\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {hasMeaningfulData ? (\n <ComposedChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n maxBarSize={resolvedMaxBarSize}\n barGap={barGap}\n style={{ overflow: 'visible' }}\n onMouseLeave={handleChartMouseLeave}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n xAxisId=\"bottom\"\n angle={-42}\n textAnchor=\"end\"\n interval={0}\n height={64}\n tickMargin={8}\n dy={4}\n tick={{ fontSize: 12 }}\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n yAxisId=\"left\"\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400 }}\n tickFormatter={yTickLeft}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n width={44}\n />\n {showConversionLine ? (\n <YAxis\n yAxisId=\"right\"\n orientation=\"right\"\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400 }}\n tickFormatter={yTickRight}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n width={44}\n {...(conversionAxisLabel\n ? {\n label: {\n value: conversionAxisLabel,\n angle: 90,\n position: 'insideRight' as const,\n offset: 8,\n style: {\n fill: '#424242',\n fontSize: 11,\n fontWeight: 500,\n textAnchor: 'middle' as const,\n },\n },\n }\n : {})}\n />\n ) : null}\n <Tooltip\n cursor={false}\n wrapperStyle={{ outline: 'none', zIndex: 10 }}\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n rows: processedData,\n showConversionLine,\n } satisfies PasserbyConversionTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return (\n <ConversionTooltip\n {...tooltipProps}\n timeLabel={tooltipTimeLabel}\n overallLabel={tooltipOverallLabel}\n walkInsLabel={resolvedWalkInsTooltipLabel}\n passerbyLabel={resolvedPasserbyTooltipLabel}\n conversionLabel={tooltipConversionLabel}\n formatConversion={formatTooltipConversion}\n colors={{\n walkIns: chartColors.walkInsBarFill,\n passerby: chartColors.passerbyBarFill,\n conversion: chartColors.conversionLineStroke,\n }}\n showConversionRow={showConversionLine}\n tooltipStyles={tooltipStyles}\n />\n );\n }}\n />\n <Bar\n yAxisId=\"left\"\n xAxisId=\"bottom\"\n dataKey={PASSERBY_KEY}\n name={passerbySeriesName}\n fill={chartColors.passerbyBarFill}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n radius={[2, 2, 0, 0]}\n onMouseEnter={handleBarMouseEnter}\n >\n {processedData.map((_, i) => (\n <Cell\n key={`pb-${i}`}\n fill={chartColors.passerbyBarFill}\n fillOpacity={barFillOpacity(i)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n content={props => (\n <BarTopLabel\n {...(props as RechartsBarLabelListProps)}\n fill={chartColors.barValueLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n <Bar\n yAxisId=\"left\"\n xAxisId=\"bottom\"\n dataKey={WALKINS_KEY}\n name={walkInsSeriesName}\n fill={chartColors.walkInsBarFill}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n radius={[2, 2, 0, 0]}\n onMouseEnter={handleBarMouseEnter}\n >\n {processedData.map((_, i) => (\n <Cell\n key={`wi-${i}`}\n fill={chartColors.walkInsBarFill}\n fillOpacity={barFillOpacity(i)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n content={props => (\n <BarTopLabel\n {...(props as RechartsBarLabelListProps)}\n fill={chartColors.barValueLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n {showConversionLine ? (\n <Line\n yAxisId=\"right\"\n xAxisId=\"bottom\"\n type={lineType}\n dataKey={CONVERSION_KEY}\n name={conversionSeriesName}\n stroke={chartColors.conversionLineStroke}\n strokeWidth={2}\n dot={{\n r: 3,\n fill: chartColors.conversionLineStroke,\n strokeWidth: 0,\n }}\n connectNulls={false}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n />\n ) : null}\n </ComposedChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <ChartEmptyState\n minHeight={chartHeight}\n {...emptyStatePlaceholderProps}\n />\n </Box>\n )}\n </Box>\n </Stack>\n </Box>\n );\n}\n","import * as React from 'react';\n\n/**\n * When the plot is wider than the viewport (`overflow-x: auto`), scrolls horizontally\n * to the end after data updates so the latest categories stay in view.\n */\nexport function useChartPlotScrollToEnd(\n scrollRef: React.RefObject<HTMLElement | null>,\n options: {\n enabled: boolean;\n categoryScrollActive: boolean;\n dataLength: number;\n /** Triggers when row content changes (e.g. pass `processedData`). */\n dataVersion: unknown;\n }\n): void {\n const { enabled, categoryScrollActive, dataLength, dataVersion } = options;\n\n React.useLayoutEffect(() => {\n if (!enabled) {\n return;\n }\n if (!categoryScrollActive) {\n return;\n }\n if (dataLength === 0) {\n return;\n }\n const el = scrollRef.current;\n if (!el) {\n return;\n }\n const scrollToEnd = (): void => {\n el.scrollLeft = Math.max(0, el.scrollWidth - el.clientWidth);\n };\n scrollToEnd();\n requestAnimationFrame(scrollToEnd);\n }, [enabled, categoryScrollActive, dataLength, dataVersion, scrollRef]);\n}\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport { useTheme, type SxProps, type Theme } from '@mui/material/styles';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport { Cell, Pie, PieChart, ResponsiveContainer, Tooltip } from 'recharts';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport { ChartWidgetSegmentedTabs } from '../../tabs/ChartWidgetSegmentedTabs';\nimport type {\n WalkinAnalysisCardMaxWidth,\n WalkinAnalysisPieSize,\n WalkinAnalysisProps,\n WalkinAnalysisSlice,\n WalkinAnalysisTooltipRenderContext,\n WalkinAnalysisTypography,\n} from './WalkinAnalysis.types';\n\nconst OLY_LIFESTYLE_STRONG_TITLE_COLOR = '#0f172a' as const;\nconst OLY_LIFESTYLE_LEGEND_VALUE_COLOR = '#64748B' as const;\n\nconst walkinPieSizeDefaults = { xs: 180, sm: 220, md: 260 } as const;\n\nfunction px(n: number): string {\n return `${n}px`;\n}\n\nfunction resolveFontSize(\n value: number | string | undefined,\n fallbackPx: number\n): number | string {\n if (value === undefined) return fallbackPx;\n if (typeof value === 'number') return value;\n return value;\n}\n\nfunction resolveCardMaxWidth(\n cardMaxWidth: WalkinAnalysisCardMaxWidth | undefined\n):\n | number\n | string\n | { xs?: number | string; sm?: number | string; md?: number | string } {\n if (cardMaxWidth === undefined) {\n return { xs: '100%', sm: 640 };\n }\n if (typeof cardMaxWidth === 'number') {\n return px(cardMaxWidth);\n }\n if (typeof cardMaxWidth === 'string') {\n return cardMaxWidth;\n }\n return {\n xs:\n cardMaxWidth.xs !== undefined\n ? typeof cardMaxWidth.xs === 'number'\n ? px(cardMaxWidth.xs)\n : cardMaxWidth.xs\n : '100%',\n sm:\n cardMaxWidth.sm !== undefined\n ? typeof cardMaxWidth.sm === 'number'\n ? px(cardMaxWidth.sm)\n : cardMaxWidth.sm\n : 640,\n ...(cardMaxWidth.md !== undefined\n ? {\n md:\n typeof cardMaxWidth.md === 'number'\n ? px(cardMaxWidth.md)\n : cardMaxWidth.md,\n }\n : {}),\n };\n}\n\nfunction useWalkinResolvedPieSize(\n pieSize: WalkinAnalysisPieSize | undefined\n): number {\n const theme = useTheme();\n const mdUp = useMediaQuery(theme.breakpoints.up('md'));\n const smUp = useMediaQuery(theme.breakpoints.up('sm'));\n\n if (typeof pieSize === 'number') {\n return pieSize;\n }\n const merged = {\n xs: pieSize?.xs ?? walkinPieSizeDefaults.xs,\n sm: pieSize?.sm ?? walkinPieSizeDefaults.sm,\n md: pieSize?.md ?? walkinPieSizeDefaults.md,\n };\n if (mdUp) return merged.md;\n if (smUp) return merged.sm;\n return merged.xs;\n}\n\nconst numberFormatter = new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 0,\n});\n\n/** Recharts `Pie` row: positive counts only (zero-count slices stay in the legend only). */\ntype WalkinPieDatum = Pick<\n WalkinAnalysisSlice,\n 'id' | 'label' | 'color' | 'segmentPercentColor'\n> & { value: number };\n\nfunction walkinSlicesToPieData(\n slices: WalkinAnalysisSlice[]\n): WalkinPieDatum[] {\n return slices\n .filter(s => s.count > 0)\n .map(s => ({\n id: s.id,\n label: s.label,\n value: s.count,\n color: s.color,\n segmentPercentColor: s.segmentPercentColor,\n }));\n}\n\ntype WalkinPieTooltipProps = TooltipContentProps & {\n sliceTotal: number;\n titleFontSize: number | string;\n valueFontSize: number | string;\n};\n\nfunction WalkinPieTooltip({\n active,\n payload,\n sliceTotal,\n titleFontSize,\n valueFontSize,\n}: WalkinPieTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length) {\n return null;\n }\n const first = payload[0] as TooltipPayloadEntry;\n const datum = first.payload as WalkinPieDatum | undefined;\n if (!datum || typeof datum.value !== 'number') {\n return null;\n }\n const pct = sliceTotal > 0 ? Math.round((datum.value / sliceTotal) * 100) : 0;\n return (\n <Box\n sx={{\n bgcolor: '#fff',\n borderRadius: 1,\n px: 1.5,\n py: 1.25,\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n border: '1px solid #E8E8E8',\n minWidth: 168,\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ mb: 0.75 }}>\n <Box\n sx={{\n width: 12,\n height: 12,\n borderRadius: 0.5,\n bgcolor: datum.color,\n flexShrink: 0,\n }}\n />\n <Typography\n sx={{\n fontSize: titleFontSize,\n fontWeight: 700,\n color: OLY_LIFESTYLE_STRONG_TITLE_COLOR,\n lineHeight: 1.3,\n }}\n >\n {datum.label}\n </Typography>\n </Stack>\n <Typography\n variant=\"body2\"\n sx={{\n color: OLY_LIFESTYLE_LEGEND_VALUE_COLOR,\n fontSize: valueFontSize,\n }}\n >\n {numberFormatter.format(datum.value)} ({pct}%)\n </Typography>\n </Box>\n );\n}\n\nfunction WalkinPiePercentLabel(props: {\n cx?: number;\n cy?: number;\n midAngle?: number;\n innerRadius?: number;\n outerRadius?: number;\n percent?: number;\n payload?: WalkinPieDatum;\n fontSize: number | string;\n}): React.ReactElement | null {\n const {\n cx: cxProp,\n cy: cyProp,\n midAngle: midProp,\n innerRadius: innerProp,\n outerRadius: outerProp,\n percent: percentProp,\n payload,\n fontSize,\n } = props;\n const cx = cxProp ?? 0;\n const cy = cyProp ?? 0;\n const midAngle = midProp ?? 0;\n const innerRadius = innerProp ?? 0;\n const outerRadius = outerProp ?? 0;\n const percent = percentProp ?? 0;\n const rounded = Math.round(percent * 100);\n if (rounded <= 0) {\n return null;\n }\n const labelRadius = innerRadius + (outerRadius - innerRadius) * 0.58;\n const rad = (-midAngle * Math.PI) / 180;\n const x = cx + labelRadius * Math.cos(rad);\n const y = cy + labelRadius * Math.sin(rad);\n return (\n <text\n x={x}\n y={y}\n fill={payload?.segmentPercentColor ?? '#fff'}\n fontSize={fontSize}\n fontWeight={600}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n >\n {rounded}%\n </text>\n );\n}\n\nfunction WalkinPieChart({\n slices,\n size,\n typography,\n activeTabId,\n renderTooltip,\n emptyStatePlaceholderProps,\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n}: {\n slices: WalkinAnalysisSlice[];\n size: number;\n typography: WalkinAnalysisTypography | undefined;\n activeTabId: string;\n renderTooltip?: WalkinAnalysisProps['renderTooltip'];\n emptyStatePlaceholderProps?: WalkinAnalysisProps['emptyStatePlaceholderProps'];\n isChartAnimationActive?: boolean;\n chartAnimationDuration?: number;\n}) {\n const total = slices.reduce((sum, s) => sum + s.count, 0);\n const pieData = React.useMemo(() => walkinSlicesToPieData(slices), [slices]);\n\n const piePercentSize = resolveFontSize(typography?.piePercent, 14);\n const tooltipTitleSize = resolveFontSize(typography?.tooltipTitle, 13);\n const tooltipValueSize = resolveFontSize(typography?.tooltipValue, 12);\n\n if (total <= 0) {\n return <ChartEmptyState minHeight={size} {...emptyStatePlaceholderProps} />;\n }\n\n const outerRadius = size * 0.42;\n\n return (\n <Box\n role=\"img\"\n aria-label=\"Walk-in analysis pie chart\"\n sx={{\n width: size,\n height: size,\n lineHeight: 0,\n '& .recharts-surface:focus': { outline: 'none' },\n }}\n >\n <ResponsiveContainer width={size} height={size}>\n <PieChart>\n <Tooltip\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n slices,\n total,\n activeTabId,\n } satisfies WalkinAnalysisTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return (\n <WalkinPieTooltip\n {...tooltipProps}\n sliceTotal={total}\n titleFontSize={tooltipTitleSize}\n valueFontSize={tooltipValueSize}\n />\n );\n }}\n wrapperStyle={{ outline: 'none', zIndex: 2 }}\n />\n <Pie\n data={pieData}\n dataKey=\"value\"\n nameKey=\"label\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={0}\n outerRadius={outerRadius}\n startAngle={90}\n endAngle={450}\n paddingAngle={0}\n stroke=\"none\"\n labelLine={false}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n label={labelProps => (\n <WalkinPiePercentLabel\n {...labelProps}\n fontSize={piePercentSize}\n />\n )}\n >\n {pieData.map(entry => (\n <Cell key={entry.id} fill={entry.color} stroke=\"none\" />\n ))}\n </Pie>\n </PieChart>\n </ResponsiveContainer>\n </Box>\n );\n}\n\n/**\n * Walk-in style analysis card: title row (optional `headerActions`), tabs, Recharts pie, legend.\n * Pie and legend are driven by `slices` (`label`, `count`, `color`, optional legend / segment % colors).\n */\nexport const WalkinAnalysis = ({\n title,\n tabs,\n activeTabId,\n onTabChange,\n segmentedTabsFullWidth,\n segmentedTabsSx,\n slices,\n headerActions,\n cardSx,\n cardMaxWidth,\n pieSize,\n typography,\n customization,\n emptyStatePlaceholderProps,\n renderTooltip,\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n}: WalkinAnalysisProps) => {\n const resolvedPieSize = useWalkinResolvedPieSize(pieSize);\n const total = slices.reduce((sum, s) => sum + s.count, 0);\n\n return (\n <Box\n sx={{\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n ...cardSx,\n }}\n >\n <Stack spacing={2.5}>\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n gap={2}\n {...(customization?.titleRowStackSx != null\n ? {\n sx: [customization.titleRowStackSx] as SxProps<Theme>,\n }\n : {})}\n >\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={\n [\n {\n fontWeight: 700,\n color: OLY_LIFESTYLE_STRONG_TITLE_COLOR,\n pr: 1,\n ...(typography?.title != null\n ? { fontSize: typography.title }\n : {}),\n },\n ...(customization?.titleSx != null\n ? [customization.titleSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {title}\n </Typography>\n {headerActions ? (\n <Box sx={{ flexShrink: 0 }}>{headerActions}</Box>\n ) : null}\n </Stack>\n\n <ChartWidgetSegmentedTabs\n tabs={tabs}\n activeTabId={activeTabId}\n onTabChange={onTabChange}\n ariaLabel=\"Analysis scope\"\n fullWidth={segmentedTabsFullWidth}\n tabFontSize={typography?.tabs}\n rootSx={segmentedTabsSx}\n />\n\n <Stack\n direction={{ xs: 'column', sm: 'row' }}\n spacing={3}\n alignItems=\"center\"\n justifyContent=\"flex-start\"\n sx={{ width: '100%' }}\n >\n <Box sx={{ flexShrink: 0, lineHeight: 0 }}>\n <WalkinPieChart\n slices={slices}\n size={resolvedPieSize}\n typography={typography}\n activeTabId={activeTabId}\n renderTooltip={renderTooltip}\n emptyStatePlaceholderProps={emptyStatePlaceholderProps}\n isChartAnimationActive={isChartAnimationActive}\n chartAnimationDuration={chartAnimationDuration}\n />\n </Box>\n <Stack\n spacing={2}\n sx={\n [\n {\n flex: 1,\n minWidth: 0,\n alignSelf: { xs: 'stretch', sm: 'auto' },\n width: { xs: '100%', sm: 'auto' },\n },\n ...(customization?.legendColumnStackSx != null\n ? [customization.legendColumnStackSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {slices.map(slice => {\n const pct =\n total > 0 ? Math.round((slice.count / total) * 100) : 0;\n return (\n <Stack key={slice.id} spacing={0.75}>\n <Typography\n sx={\n [\n {\n fontStyle: 'italic',\n fontWeight: 700,\n color:\n slice.legendLabelColor ??\n OLY_LIFESTYLE_STRONG_TITLE_COLOR,\n fontSize: resolveFontSize(\n typography?.legendLabel,\n 13\n ),\n },\n ...(customization?.legendTypographySx != null\n ? [customization.legendTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {slice.label}\n </Typography>\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <Box\n sx={{\n width: 14,\n height: 14,\n borderRadius: 0.5,\n bgcolor: slice.color,\n flexShrink: 0,\n }}\n />\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n color:\n slice.legendValueColor ??\n OLY_LIFESTYLE_LEGEND_VALUE_COLOR,\n fontSize: resolveFontSize(\n typography?.legendValue,\n 12\n ),\n },\n ...(customization?.legendTypographySx != null\n ? [customization.legendTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {numberFormatter.format(slice.count)} ({pct}%)\n </Typography>\n {slice.legendInfo ? (\n <Box sx={{ display: 'inline-flex', flexShrink: 0 }}>\n {slice.legendInfo}\n </Box>\n ) : null}\n </Stack>\n </Stack>\n );\n })}\n </Stack>\n </Stack>\n </Stack>\n </Box>\n );\n};\n","import Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport {\n Bar,\n CartesianGrid,\n ComposedChart,\n LabelList,\n Line,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport { useChartPlotScrollToEnd } from '../../_chart/useChartPlotScrollToEnd';\nimport type {\n WalkinTrafficProps,\n WalkinTrafficRow,\n WalkinTrafficTooltipRenderContext,\n WalkinTrafficTooltipStyles,\n} from './WalkinTraffic.types';\n\nconst defaultFfGrowthTooltipFooterNote =\n \"*This FF Growth % compares today's hourly FF with the same hours on this date last year.\";\n\nconst OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX = 430 as const;\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_WALKIN_TRAFFIC_CHART_MARGIN = {\n top: 28,\n right: 20,\n left: 12,\n bottom: 28,\n} as const;\nconst OLY_DEFAULT_WALKIN_TRAFFIC_CHART_SERIES_COLORS = {\n barFill: '#0086A9',\n lineStroke: '#4B5563',\n barValueLabelFill: '#374151',\n} as const;\n\nfunction hasFooterText(note: string | null | undefined): note is string {\n return typeof note === 'string' && note.trim().length > 0;\n}\n\nfunction tooltipDatumFromPayload(\n payload: TooltipContentProps['payload']\n): WalkinTrafficRow | undefined {\n const raw = payload?.[0]?.payload;\n if (raw && typeof raw === 'object' && 'walkIns' in raw) {\n return raw as WalkinTrafficRow;\n }\n return undefined;\n}\n\nfunction GrowthDirectionIcon({ direction }: { direction: 'up' | 'down' }) {\n const bg = direction === 'up' ? '#22C55E' : '#EF4444';\n const glyph = direction === 'up' ? '▲' : '▼';\n return (\n <span\n style={{\n display: 'inline-flex',\n width: 16,\n height: 16,\n borderRadius: '50%',\n backgroundColor: bg,\n alignItems: 'center',\n justifyContent: 'center',\n marginLeft: 6,\n flexShrink: 0,\n }}\n aria-hidden\n >\n <span\n style={{\n color: '#fff',\n fontSize: 8,\n lineHeight: 1,\n transform: direction === 'up' ? undefined : 'translateY(0.5px)',\n }}\n >\n {glyph}\n </span>\n </span>\n );\n}\n\nconst BAR_KEY = 'walkIns';\nconst TREND_KEY = 'trend';\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}k`;\n }\n return String(value);\n}\n\nfunction formatYAxisTickDefault(value: number): string {\n if (!Number.isFinite(value)) {\n return '';\n }\n const abs = Math.abs(value);\n if (abs >= 1000) {\n const k = value / 1000;\n const text = Number.isInteger(k) ? String(k) : k.toFixed(1);\n return `${text}k`;\n }\n return String(value);\n}\n\ninterface RechartsBarLabelListProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n value?: number | string | null;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction BarTopLabel({\n x,\n y,\n width,\n value,\n fill,\n}: RechartsBarLabelListProps & { fill: string }) {\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n if (nx === undefined || ny === undefined || nw === undefined) {\n return null;\n }\n const n =\n value === null || value === undefined\n ? NaN\n : typeof value === 'number'\n ? value\n : Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n return null;\n }\n const cx = nx + nw / 2;\n const cy = ny - 6;\n return (\n <text\n x={cx}\n y={cy}\n fill={fill}\n fontSize={12}\n fontWeight={500}\n textAnchor=\"middle\"\n >\n {formatBarLabel(n)}\n </text>\n );\n}\n\ntype TrafficTooltipProps = TooltipContentProps & {\n tooltipTitle: string;\n timeLabel: string;\n currentYearLabel: string;\n lastYearLabel: string;\n growthLabel: string;\n footerNote: string | null | undefined;\n showTrendLine: boolean;\n accentColor: string;\n tooltipStyles?: WalkinTrafficTooltipStyles;\n};\n\nfunction TrafficTooltip({\n active,\n payload,\n label,\n tooltipTitle,\n timeLabel,\n currentYearLabel,\n lastYearLabel,\n growthLabel,\n footerNote,\n showTrendLine,\n accentColor,\n tooltipStyles,\n}: TrafficTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || label === undefined) {\n return null;\n }\n\n const datum = tooltipDatumFromPayload(payload);\n\n const barEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === BAR_KEY\n );\n const lineEntry = showTrendLine\n ? payload.find((p: TooltipPayloadEntry) => String(p.dataKey) === TREND_KEY)\n : undefined;\n\n const walk = Number(barEntry?.value ?? 0);\n const trendRaw = lineEntry?.value;\n const trend =\n typeof trendRaw === 'number'\n ? trendRaw\n : trendRaw === null || trendRaw === undefined\n ? NaN\n : Number(trendRaw);\n\n const timeDisplay =\n datum?.timeSlotLabel !== undefined && datum.timeSlotLabel !== ''\n ? datum.timeSlotLabel\n : String(label);\n\n const growthRaw = datum?.ffGrowthPercent;\n const growth =\n typeof growthRaw === 'number' && Number.isFinite(growthRaw)\n ? growthRaw\n : NaN;\n const showGrowthRow = Number.isFinite(growth);\n const growthDirection: 'up' | 'down' | null = !showGrowthRow\n ? null\n : growth > 0\n ? 'up'\n : growth < 0\n ? 'down'\n : null;\n\n const showFooter = hasFooterText(footerNote);\n const footerText =\n showFooter && typeof footerNote === 'string' ? footerNote.trim() : '';\n\n const ts = tooltipStyles;\n const rowBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'baseline',\n flexWrap: 'wrap',\n columnGap: 4,\n rowGap: 2,\n marginBottom: 6,\n };\n\n const labelStyle = mergeCss(\n { color: '#1a1a1a', fontSize: 11, fontWeight: 700 },\n ts?.label\n );\n const valueStyle = mergeCss(\n { color: '#757575', fontSize: 11, fontWeight: 400 },\n ts?.value\n );\n\n return (\n <div\n style={mergeCss(\n {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'stretch',\n },\n ts?.wrapper\n )}\n >\n <div\n style={{\n position: 'absolute',\n left: -6,\n top: 18,\n width: 0,\n height: 0,\n borderTop: '6px solid transparent',\n borderBottom: '6px solid transparent',\n borderRight: '7px solid #fff',\n zIndex: 1,\n filter: 'drop-shadow(-1px 0 0 #E8E8E8)',\n }}\n aria-hidden\n />\n <div\n style={mergeCss(\n {\n position: 'relative',\n zIndex: 2,\n backgroundColor: '#fff',\n borderRadius: 8,\n padding: '10px 12px 10px',\n width: 'max-content',\n maxWidth: 200,\n minWidth: 0,\n boxSizing: 'border-box',\n boxShadow: '0 2px 12px rgba(0, 0, 0, 0.12)',\n border: '1px solid #E8E8E8',\n },\n ts?.container\n )}\n >\n <div\n style={mergeCss(\n {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n marginBottom: 8,\n },\n ts?.header\n )}\n >\n <span\n style={mergeCss(\n {\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: accentColor,\n flexShrink: 0,\n },\n ts?.headerDot\n )}\n />\n <span\n style={mergeCss(\n {\n color: '#1a1a1a',\n fontSize: 12,\n fontWeight: 700,\n lineHeight: 1.25,\n },\n ts?.headerTitle\n )}\n >\n {tooltipTitle}\n </span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{timeLabel}:</span>\n <span style={valueStyle}>{timeDisplay}</span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{currentYearLabel}:</span>\n <span style={valueStyle}>\n {Number.isFinite(walk) ? walk.toLocaleString() : '—'}\n </span>\n </div>\n {showTrendLine && Number.isFinite(trend) ? (\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{lastYearLabel}:</span>\n <span style={valueStyle}>{trend.toLocaleString()}</span>\n </div>\n ) : null}\n {showGrowthRow ? (\n <div\n style={mergeCss(\n {\n ...rowBase,\n alignItems: 'center',\n marginBottom: showFooter ? 8 : 0,\n },\n ts?.row\n )}\n >\n <span style={labelStyle}>{growthLabel}:</span>\n <span style={valueStyle}>\n {`${Number.isInteger(growth) ? String(growth) : growth.toFixed(1)}%`}\n </span>\n {growthDirection ? (\n <GrowthDirectionIcon direction={growthDirection} />\n ) : null}\n </div>\n ) : null}\n {showFooter ? (\n <p\n style={mergeCss(\n {\n margin: 0,\n paddingTop: 8,\n borderTop: '1px solid #ECECEC',\n color: '#8A8A8A',\n fontSize: 9,\n fontStyle: 'italic',\n lineHeight: 1.4,\n },\n ts?.footer\n )}\n >\n {footerText}\n </p>\n ) : null}\n </div>\n </div>\n );\n}\n\nconst defaultMinWidthPerCategory = 52;\nconst defaultMaxBarThickness = 36;\nconst chartWidthAxisGutter = 72;\n\nconst defaultChartMargin = OLY_DEFAULT_WALKIN_TRAFFIC_CHART_MARGIN;\n\nconst topReserveForBarLabels = 52;\nconst topReserveNoBarLabels = 22;\n\nconst defaultChartColors = {\n ...OLY_DEFAULT_COMPOSED_CHART_CHROME,\n ...OLY_DEFAULT_WALKIN_TRAFFIC_CHART_SERIES_COLORS,\n} as const;\n\nexport function WalkinTraffic({\n title,\n data,\n chartHeight = OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX,\n barSeriesName = 'Walk-ins',\n lineSeriesName = 'Trend',\n lineType = 'natural',\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendRowSx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n headerActions,\n tooltipTitle = 'Overall Walk-in Traffic',\n tooltipTimeLabel,\n tooltipCurrentYearLabel = 'This year',\n tooltipLastYearLabel = 'Last year',\n tooltipGrowthLabel = 'FF Growth%',\n tooltipFooterNote: tooltipFooterNoteProp,\n tooltipHourLabel,\n tooltipStyles,\n renderTooltip,\n showLegend = true,\n showTrendLine: showTrendLineProp,\n showLineInLegend = false,\n showBarValueLabels = true,\n chartMargin: chartMarginProp,\n chartColors: chartColorsProp,\n emptyStatePlaceholderProps,\n yAxisTickFormatter,\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n scrollChartToEndOnDataChange = true,\n}: WalkinTrafficProps) {\n const tooltipFooterNote =\n tooltipFooterNoteProp === undefined\n ? defaultFfGrowthTooltipFooterNote\n : tooltipFooterNoteProp;\n\n const processedData = React.useMemo(\n () => data.map(row => ({ ...row })),\n [data]\n );\n\n const hasMeaningfulData = React.useMemo(\n () =>\n processedData.some(row => {\n const trendValue =\n typeof row.trend === 'number' && Number.isFinite(row.trend)\n ? row.trend\n : 0;\n return row.walkIns > 0 || trendValue !== 0;\n }),\n [processedData]\n );\n\n const hasTrendData = React.useMemo(\n () =>\n processedData.some(\n r => typeof r.trend === 'number' && Number.isFinite(r.trend)\n ),\n [processedData]\n );\n\n const showTrendLine =\n showTrendLineProp !== undefined ? showTrendLineProp : hasTrendData;\n\n const resolvedMaxBarSize = React.useMemo(() => {\n if (maxBarSizeProp !== undefined) {\n return maxBarSizeProp;\n }\n const categoryCap =\n minWidthPerCategory > 0\n ? minWidthPerCategory\n : defaultMinWidthPerCategory;\n return Math.min(categoryCap, defaultMaxBarThickness);\n }, [maxBarSizeProp, minWidthPerCategory]);\n\n const categoryScrollActive = React.useMemo(() => {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScrollProp === 'off') {\n return false;\n }\n if (horizontalScrollProp === 'on') {\n return true;\n }\n return processedData.length > 1;\n }, [horizontalScrollProp, minWidthPerCategory, processedData.length]);\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n useChartPlotScrollToEnd(scrollRef, {\n enabled: scrollChartToEndOnDataChange,\n categoryScrollActive,\n dataLength: processedData.length,\n dataVersion: processedData,\n });\n\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n const chartMargin = React.useMemo(() => {\n const top = showBarValueLabels\n ? topReserveForBarLabels\n : topReserveNoBarLabels;\n return {\n ...defaultChartMargin,\n top,\n ...chartMarginProp,\n };\n }, [showBarValueLabels, chartMarginProp]);\n\n const chartColors = React.useMemo(\n () => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n const yTick = yAxisTickFormatter ?? formatYAxisTickDefault;\n\n const resolvedTooltipTimeLabel =\n tooltipTimeLabel ?? tooltipHourLabel ?? 'Time';\n\n const legendItems = React.useMemo(() => {\n const items: {\n key: string;\n label: string;\n color: string;\n isLine?: boolean;\n }[] = [\n {\n key: 'bar',\n label: barSeriesName,\n color: chartColors.barFill,\n },\n ];\n if (showTrendLine && showLineInLegend) {\n items.push({\n key: 'line',\n label: lineSeriesName,\n color: chartColors.lineStroke,\n isLine: true,\n });\n }\n return items;\n }, [\n barSeriesName,\n chartColors.barFill,\n chartColors.lineStroke,\n lineSeriesName,\n showLineInLegend,\n showTrendLine,\n ]);\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n },\n titleRowSx\n )}\n >\n {headerActions ? (\n <Box\n sx={{\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 1,\n }}\n >\n {headerActions}\n </Box>\n ) : null}\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'center',\n width: '100%',\n px: headerActions ? 5 : 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n {showLegend && hasMeaningfulData && legendItems.length > 0 ? (\n <Box\n sx={sxChain(\n {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'center',\n alignItems: 'center',\n columnGap: { xs: 2, sm: 3 },\n rowGap: 1,\n py: 0.5,\n px: { xs: 0, sm: 1 },\n },\n legendRowSx\n )}\n >\n {legendItems.map(item => (\n <Stack\n key={item.key}\n direction=\"row\"\n alignItems=\"center\"\n sx={sxChain({ gap: 1 }, legendItemSx)}\n >\n {item.isLine ? (\n <Box\n sx={sxChain(\n {\n width: 16,\n height: 3,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: 0.5,\n alignSelf: 'center',\n },\n legendSwatchSx\n )}\n />\n ) : (\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: '2px',\n },\n legendSwatchSx\n )}\n />\n )}\n <Typography\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {item.label}\n </Typography>\n </Stack>\n ))}\n </Box>\n ) : null}\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {hasMeaningfulData ? (\n <ComposedChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n maxBarSize={resolvedMaxBarSize}\n style={{ overflow: 'visible' }}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n angle={-42}\n textAnchor=\"end\"\n interval={0}\n height={64}\n tickMargin={8}\n dy={4}\n tick={{ fontSize: 12 }}\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400 }}\n tickFormatter={yTick}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <Tooltip\n cursor={false}\n wrapperStyle={{ outline: 'none', zIndex: 10 }}\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n rows: processedData,\n showTrendLine,\n } satisfies WalkinTrafficTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return (\n <TrafficTooltip\n {...tooltipProps}\n tooltipTitle={tooltipTitle}\n timeLabel={resolvedTooltipTimeLabel}\n currentYearLabel={tooltipCurrentYearLabel}\n lastYearLabel={tooltipLastYearLabel}\n growthLabel={tooltipGrowthLabel}\n footerNote={tooltipFooterNote}\n showTrendLine={showTrendLine}\n accentColor={chartColors.barFill}\n tooltipStyles={tooltipStyles}\n />\n );\n }}\n />\n <Bar\n dataKey={BAR_KEY}\n name={barSeriesName}\n fill={chartColors.barFill}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n radius={[2, 2, 0, 0]}\n >\n {showBarValueLabels ? (\n <LabelList\n content={props => (\n <BarTopLabel\n {...(props as RechartsBarLabelListProps)}\n fill={chartColors.barValueLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n {showTrendLine ? (\n <Line\n type={lineType}\n dataKey={TREND_KEY}\n name={lineSeriesName}\n stroke={chartColors.lineStroke}\n strokeWidth={2}\n dot={false}\n connectNulls={false}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n />\n ) : null}\n </ComposedChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <ChartEmptyState\n minHeight={chartHeight}\n {...emptyStatePlaceholderProps}\n />\n </Box>\n )}\n </Box>\n </Stack>\n </Box>\n );\n}\n","/** Primary line + tooltip fill (violet). */\nexport const BILLING_COUNTER_LINE_PRIMARY = '#7C3AED' as const;\n\n/** Default pill track behind segmented tabs. */\nexport const BILLING_COUNTER_TABS_TRACK_BG = '#E8E8E8' as const;\n","import type { ChartWidgetInfoPopoverContent } from '../ChartWidgetInfoButton/ChartWidgetInfoButton.types';\n\nexport const DEFAULT_BILLING_COUNTER_ANALYTICS_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n {\n title: 'Billing Counter Analytics',\n description:\n 'Trend lines for billing-counter visits, average queue time, and alerts. Switch tabs to compare metrics over the same date range.',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'Track daily load at billing counters and spot spikes.',\n 'Monitor queue-time trends to adjust staffing.',\n 'See when alert volume rises relative to traffic.',\n ],\n };\n","import type { ChartWidgetSegmentedTab } from '../tabs/ChartWidgetSegmentedTabs';\nimport type { BillingCounterAnalyticsPoint } from './BillingCounterAnalytics.types';\n\nexport const billingCounterDefaultTabs: ChartWidgetSegmentedTab[] = [\n { id: 'visits', label: 'Billing Counter Visits' },\n { id: 'queue', label: 'Avg. Queue Time' },\n { id: 'alerts', label: 'Alerts Generated' },\n];\n\nconst X_LABELS = [\n 'Jan 12',\n 'Jan 13',\n 'Jan 14',\n 'Jan 15',\n 'Jan 16',\n 'Jan 17',\n 'Jan 18',\n 'Jan 19',\n 'Jan 20',\n 'Jan 21',\n 'Jan 22',\n 'Jan 23',\n 'Today',\n] as const;\n\nfunction clamp(n: number, lo: number, hi: number): number {\n return Math.min(hi, Math.max(lo, n));\n}\n\nfunction seriesForTab(\n phase: number,\n scale: number,\n bias: number\n): BillingCounterAnalyticsPoint[] {\n return X_LABELS.map((label, i) => {\n const wobble = Math.sin((i + phase) * 0.55) * scale;\n const ramp = i * 2.2;\n const raw = 52 + wobble + ramp * 0.15 + bias;\n return {\n label,\n value: clamp(Math.round(raw), 18, 98),\n };\n });\n}\n\n/** Demo datasets aligned with **billingCounterDefaultTabs** ids. */\nexport const billingCounterMockSeriesByTabId: Record<\n string,\n BillingCounterAnalyticsPoint[]\n> = {\n visits: seriesForTab(0, 22, 0),\n queue: seriesForTab(2.1, 18, -8),\n alerts: seriesForTab(4.2, 28, -18),\n};\n","import Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport * as React from 'react';\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport { ChartWidgetHeaderSeparator } from '../utils/ChartWidgetHeaderSeparator';\nimport { ChartWidgetInfoButton } from '../ChartWidgetInfoButton';\nimport { ChartWidgetSegmentedTabs } from '../tabs/ChartWidgetSegmentedTabs';\nimport { ChartEmptyState } from '../utils/ChartEmptyState';\nimport {\n BILLING_COUNTER_LINE_PRIMARY,\n BILLING_COUNTER_TABS_TRACK_BG,\n} from './billingCounterAnalytics.chartTokens';\nimport { DEFAULT_BILLING_COUNTER_ANALYTICS_INFO_POPOVER } from './billingCounterAnalytics.defaultInfoPopover';\nimport { mergeSx } from './billingCounterAnalyticsCustomization.merge';\nimport {\n BillingCounterAnalyticsCustomizationProvider,\n useBillingCounterAnalyticsCustomization,\n} from './BillingCounterAnalyticsCustomizationContext';\nimport type {\n BillingCounterAnalyticsProps,\n BillingCounterAnalyticsTooltipRenderContext,\n} from './BillingCounterAnalytics.types';\nimport { BillingCounterAnalyticsTooltip } from './BillingCounterAnalyticsTooltip';\n\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_CHART_AXIS_TICK_FILL = '#64748B' as const;\n\nfunction LinePlot({\n data,\n yAxisDomain,\n yAxisTicks,\n activeTabId,\n renderTooltip,\n}: {\n data: { label: string; value: number }[];\n yAxisDomain: [number, number];\n yAxisTicks: number[];\n activeTabId: string;\n renderTooltip?: BillingCounterAnalyticsProps['renderTooltip'];\n}): React.ReactElement {\n const { lineChart: lc } = useBillingCounterAnalyticsCustomization();\n const height = lc?.heightPx ?? 300;\n const lineColor = lc?.lineColor ?? BILLING_COUNTER_LINE_PRIMARY;\n const strokeW = lc?.lineStrokeWidth ?? 2;\n const gridStroke =\n lc?.gridStroke ?? OLY_DEFAULT_COMPOSED_CHART_CHROME.cartesianGridStroke;\n const dash = lc?.gridStrokeDasharray ?? '3 3';\n const m = {\n top: lc?.margin?.top ?? 12,\n right: lc?.margin?.right ?? 16,\n bottom: lc?.margin?.bottom ?? 8,\n left: lc?.margin?.left ?? 4,\n };\n const xFill = lc?.xAxisTickFill ?? OLY_DEFAULT_CHART_AXIS_TICK_FILL;\n const yFill = lc?.yAxisTickFill ?? OLY_DEFAULT_CHART_AXIS_TICK_FILL;\n const yWidth = lc?.yAxisWidth ?? 36;\n const cursorStroke = lc?.cursorStroke ?? '#9CA3AF';\n const cursorDash = lc?.cursorStrokeDasharray ?? '4 4';\n const lineType = lc?.lineType ?? 'linear';\n\n return (\n <Box sx={{ width: '100%', height, mt: 0.5 }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart data={data} margin={m}>\n <CartesianGrid\n strokeDasharray={dash}\n vertical={false}\n stroke={gridStroke}\n />\n <XAxis\n dataKey=\"label\"\n tick={{ fill: xFill, fontSize: 11 }}\n tickLine={false}\n axisLine={{\n stroke: OLY_DEFAULT_COMPOSED_CHART_CHROME.axisTickLineStroke,\n }}\n interval={0}\n height={40}\n />\n <YAxis\n domain={yAxisDomain}\n ticks={yAxisTicks}\n tick={{ fill: yFill, fontSize: 11 }}\n tickLine={false}\n axisLine={false}\n width={yWidth}\n />\n <Tooltip\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n data,\n activeTabId,\n } satisfies BillingCounterAnalyticsTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return <BillingCounterAnalyticsTooltip {...tooltipProps} />;\n }}\n cursor={{ stroke: cursorStroke, strokeDasharray: cursorDash }}\n allowEscapeViewBox={{ x: false, y: true }}\n />\n <Line\n type={lineType}\n dataKey=\"value\"\n stroke={lineColor}\n strokeWidth={strokeW}\n strokeLinejoin=\"miter\"\n strokeLinecap=\"butt\"\n dot={false}\n activeDot={{\n r: 5,\n fill: lineColor,\n stroke: '#ffffff',\n strokeWidth: 2,\n }}\n isAnimationActive={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </Box>\n );\n}\n\n/**\n * Billing counter analytics card: title row (optional info), pill tabs, Recharts line chart with violet styling.\n */\nexport function BillingCounterAnalytics({\n title = 'Billing Counter Analytics',\n tabs,\n activeTabId,\n onTabChange,\n data,\n seriesByTabId,\n yAxisDomain = [0, 100],\n yAxisTicks = [20, 40, 60, 80, 100],\n infoPopover,\n renderTooltip,\n emptyStatePlaceholderProps,\n customization,\n}: BillingCounterAnalyticsProps): React.ReactElement {\n const chartData = React.useMemo(() => {\n if (seriesByTabId) {\n return seriesByTabId[activeTabId] ?? [];\n }\n return data ?? [];\n }, [seriesByTabId, data, activeTabId]);\n\n const resolvedInfo =\n infoPopover === undefined\n ? DEFAULT_BILLING_COUNTER_ANALYTICS_INFO_POPOVER\n : infoPopover;\n\n const rootSx = mergeSx(\n {\n bgcolor: '#FFFFFF',\n borderRadius: 2,\n boxShadow: '0 1px 3px rgba(15, 23, 42, 0.08)',\n },\n customization?.rootCard?.sx\n );\n\n const st = customization?.segmentedTabs;\n const titleSx = mergeSx(\n {\n fontWeight: 700,\n fontSize: { xs: '1rem', sm: '1.05rem' },\n color: '#0f172a',\n },\n customization?.header?.titleSx\n );\n\n return (\n <BillingCounterAnalyticsCustomizationProvider value={customization ?? {}}>\n <Card elevation={customization?.rootCard?.elevation ?? 0} sx={rootSx}>\n <CardContent>\n <Stack spacing={1.75} sx={{ width: '100%' }}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={2}\n flexWrap=\"wrap\"\n >\n <Typography sx={titleSx}>{title}</Typography>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.5}\n sx={{ flexShrink: 0 }}\n >\n {resolvedInfo ? (\n <>\n <ChartWidgetHeaderSeparator />\n <ChartWidgetInfoButton\n popover={resolvedInfo}\n ariaLabel=\"Billing counter analytics information\"\n />\n </>\n ) : null}\n </Stack>\n </Stack>\n\n <ChartWidgetSegmentedTabs\n tabs={tabs}\n activeTabId={activeTabId}\n onTabChange={onTabChange}\n ariaLabel=\"Billing counter metric\"\n trackBackgroundColor={\n st?.trackBackgroundColor ?? BILLING_COUNTER_TABS_TRACK_BG\n }\n activeTabBackground={\n st?.activeTabBackground ?? BILLING_COUNTER_LINE_PRIMARY\n }\n activeTabColor={st?.activeTabColor ?? '#ffffff'}\n inactiveTabColor={st?.inactiveTabColor ?? '#525252'}\n activeTabBoxShadow={st?.activeTabBoxShadow ?? 'none'}\n fullWidth={st?.fullWidth ?? true}\n tabFontSize={st?.tabFontSize ?? 14}\n rootSx={st?.rootSx}\n tabLayout={st?.tabLayout ?? 'equalWidth'}\n activeTabFontWeight={st?.activeTabFontWeight ?? 700}\n inactiveTabFontWeight={st?.inactiveTabFontWeight ?? 600}\n />\n\n {chartData.length > 0 ? (\n <LinePlot\n data={chartData}\n yAxisDomain={yAxisDomain}\n yAxisTicks={yAxisTicks}\n activeTabId={activeTabId}\n renderTooltip={renderTooltip}\n />\n ) : (\n <ChartEmptyState\n minHeight={300}\n {...emptyStatePlaceholderProps}\n />\n )}\n </Stack>\n </CardContent>\n </Card>\n </BillingCounterAnalyticsCustomizationProvider>\n );\n}\n\nexport default BillingCounterAnalytics;\n","import type { CSSProperties } from 'react';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport function mergeCss(a: CSSProperties, b?: CSSProperties): CSSProperties {\n if (!b) {\n return { ...a };\n }\n return { ...a, ...b };\n}\n\nexport function mergeSx(\n ...parts: Array<SxProps<Theme> | undefined>\n): SxProps<Theme> | undefined {\n const flat = parts.filter(Boolean) as SxProps<Theme>[];\n if (flat.length === 0) {\n return undefined;\n }\n if (flat.length === 1) {\n return flat[0];\n }\n return flat.flat() as SxProps<Theme>;\n}\n","import * as React from 'react';\nimport type { BillingCounterAnalyticsCustomization } from './billingCounterAnalytics.customization.types';\n\nconst BillingCounterAnalyticsCustomizationContext =\n React.createContext<BillingCounterAnalyticsCustomization>({});\n\nexport type BillingCounterAnalyticsCustomizationProviderProps = {\n value: BillingCounterAnalyticsCustomization;\n children: React.ReactNode;\n};\n\nexport function BillingCounterAnalyticsCustomizationProvider({\n value,\n children,\n}: BillingCounterAnalyticsCustomizationProviderProps): React.ReactElement {\n const memo = React.useMemo(() => value, [value]);\n return (\n <BillingCounterAnalyticsCustomizationContext.Provider value={memo}>\n {children}\n </BillingCounterAnalyticsCustomizationContext.Provider>\n );\n}\n\nexport function useBillingCounterAnalyticsCustomization(): BillingCounterAnalyticsCustomization {\n return React.useContext(BillingCounterAnalyticsCustomizationContext);\n}\n","import * as React from 'react';\nimport type { TooltipContentProps } from 'recharts';\nimport { mergeCss } from './billingCounterAnalyticsCustomization.merge';\nimport { useBillingCounterAnalyticsCustomization } from './BillingCounterAnalyticsCustomizationContext';\n\nfunction formatTooltipValue(n: number): string {\n return new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }).format(\n Math.round(n)\n );\n}\n\nexport function BillingCounterAnalyticsTooltip(\n props: TooltipContentProps\n): React.ReactElement | null {\n const { active, payload, label } = props;\n const { lineChart: lc } = useBillingCounterAnalyticsCustomization();\n const tt = lc?.tooltip;\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const raw = payload[0]?.value;\n const num =\n typeof raw === 'number' ? raw : typeof raw === 'string' ? Number(raw) : NaN;\n if (!Number.isFinite(num)) {\n return null;\n }\n\n const labelText = label !== undefined && label !== null ? String(label) : '—';\n\n const borderColor = tt?.borderColor ?? '#E5E7EB';\n const radius = tt?.borderRadiusPx ?? 6;\n const shadow = tt?.boxShadow ?? '0 4px 14px rgba(15, 23, 42, 0.12)';\n const topBg = tt?.topBarBackground ?? '#E5E7EB';\n const topH = tt?.topBarHeightPx ?? 8;\n const bodyBg = tt?.bodyBackground ?? '#FFFFFF';\n const fs = tt?.fontSizePx ?? 13;\n const gap = tt?.lineGapPx ?? 6;\n const dateP = tt?.dateLabelPrefix ?? 'Date: ';\n const totalP = tt?.totalLabelPrefix ?? 'Total: ';\n const prefixFw = tt?.prefixFontWeight ?? 400;\n const valueFw = tt?.valueFontWeight ?? 700;\n\n const uniformText =\n tt?.textColor != null &&\n tt?.prefixColor === undefined &&\n tt?.valueColor === undefined;\n const prefixCol = uniformText ? tt.textColor : (tt?.prefixColor ?? '#6B7280');\n const valueCol = uniformText ? tt.textColor : (tt?.valueColor ?? '#111827');\n\n const rowStyle: React.CSSProperties = {\n fontSize: fs,\n lineHeight: 1.35,\n margin: 0,\n };\n\n const bodyStyle = mergeCss(\n {\n boxSizing: 'border-box',\n backgroundColor: bodyBg,\n padding: '10px 12px',\n },\n tt?.bodyStyle\n );\n\n return (\n <div\n style={{\n pointerEvents: 'none',\n minWidth: 160,\n maxWidth: 280,\n }}\n >\n <div\n style={{\n border: `1px solid ${borderColor}`,\n borderRadius: radius,\n overflow: 'hidden',\n backgroundColor: bodyBg,\n boxShadow: shadow,\n }}\n >\n <div\n style={{\n height: topH,\n backgroundColor: topBg,\n flexShrink: 0,\n }}\n aria-hidden\n />\n <div style={bodyStyle}>\n <div style={rowStyle}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {dateP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {labelText}\n </span>\n </div>\n <div style={{ ...rowStyle, marginTop: gap }}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {totalP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {formatTooltipValue(num)}\n </span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Shared queue-time visualization palette (stacked bar, donut, area).\n * Four violet shades, light → dark (segment index order) — pill bar / donut / area.\n */\nexport const QUEUE_CHART_COLORS = [\n '#E9E5FF',\n '#C4B5FD',\n '#8B5CF6',\n '#6D28D9',\n] as const;\n\n/** Thin horizontal stacked bar height (px); pill radius uses half of this. */\nexport const QUEUE_STACKED_BAR_THICKNESS_PX = 8;\n","import Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Grid from '@mui/material/Grid';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport * as React from 'react';\nimport { ChartWidgetInfoButton } from '../ChartWidgetInfoButton';\nimport { ChartEmptyState } from '../utils/ChartEmptyState';\nimport { TimePeriodFilter } from '../filters/TimePeriodFilter';\nimport { TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN } from '../filters/timePeriodFilter.infoPopover';\nimport type {\n QueueTimeBreakdownProps,\n QueueTimeChartFilter,\n} from './QueueTimeBreakdown.types';\nimport { QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC } from './QueueTimeBreakdown.types';\nimport QueueTimeBreakdownArea, {\n getQueueTimeBreakdownAreaSeriesData,\n getQueueTimeBreakdownAreaXAxisData,\n} from './QueueTimeBreakdownArea';\nimport { QueueTimeBreakdownCustomizationProvider } from './QueueTimeBreakdownCustomizationContext';\nimport { QueueTimeBreakdownDonut } from './QueueTimeBreakdownDonut';\nimport { QueueTimeBreakdownStackedBar } from './QueueTimeBreakdownStackedBar';\nimport { QUEUE_CHART_COLORS } from './queueTimeBreakdown.chartTokens';\nimport { mergeSx } from './queueTimeBreakdownCustomization.merge';\n\nfunction defaultBucketLegendFromPalette(palette: readonly string[]) {\n return [\n { percent: '12%', label: '> 16mins', color: palette[0 % palette.length] },\n { percent: '22%', label: '7 - 15mins', color: palette[1 % palette.length] },\n { percent: '36%', label: '3 - 6mins', color: palette[2 % palette.length] },\n { percent: '16%', label: '1 - 2mins', color: palette[3 % palette.length] },\n ] as const;\n}\n\n/**\n * Queue time breakdown dashboard widget: stacked bars, queue buckets, donut comparison, area chart (Recharts).\n */\nexport function QueueTimeBreakdown({\n data,\n Donut_data,\n donutYesterdayData,\n headerImageSrc,\n headlineTotal = '14,123',\n headlineSubtitle = 'Queue Time Breakdown Of All Visitors',\n dataComparisonTitle = 'Data Comparison:',\n queueBucketLegend,\n title = 'Queue Time Breakdown',\n infoPopover,\n headlineInfoPopover,\n renderAreaTooltip,\n renderDonutTooltip,\n renderStackedBarTooltip,\n customization,\n}: QueueTimeBreakdownProps): React.ReactElement {\n const isSmallScreen = useMediaQuery('(max-width:600px)');\n const [filter, setFilter] = React.useState<QueueTimeChartFilter>('Day');\n const yesterdayDonut = donutYesterdayData ?? Donut_data;\n const hasComparisonData = React.useMemo(() => {\n const values = [...Donut_data, ...yesterdayDonut];\n return values.some(value => Number.isFinite(value) && value > 0);\n }, [Donut_data, yesterdayDonut]);\n const palette =\n customization?.chartPalette && customization.chartPalette.length > 0\n ? customization.chartPalette\n : QUEUE_CHART_COLORS;\n const legend = queueBucketLegend ?? defaultBucketLegendFromPalette(palette);\n const resolvedHeaderImageSrc =\n headerImageSrc === undefined\n ? QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC\n : headerImageSrc;\n const resolvedPeriodInfoPopover =\n infoPopover === undefined\n ? TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN\n : infoPopover;\n const resolvedHeadlineInfoPopover =\n headlineInfoPopover === undefined\n ? resolvedPeriodInfoPopover\n : headlineInfoPopover;\n\n const rootSx = mergeSx(\n {\n bgcolor: '#FFFFFF',\n borderRadius: 2,\n boxShadow: '0 1px 3px rgba(15, 23, 42, 0.08)',\n },\n customization?.rootCard?.sx\n );\n\n const periodTitleSx = mergeSx(\n { fontWeight: 700, color: '#0f172a' },\n customization?.periodFilter?.titleSx\n );\n\n return (\n <QueueTimeBreakdownCustomizationProvider value={customization ?? {}}>\n <Card elevation={customization?.rootCard?.elevation ?? 0} sx={rootSx}>\n <CardContent sx={mergeSx(customization?.rootCard?.cardContentSx)}>\n <Stack width=\"100%\" direction=\"column\" gap={3} mb={4}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n flexWrap=\"wrap\"\n gap={2}\n width=\"100%\"\n >\n <Typography\n variant={isSmallScreen ? 'subtitle2' : 'body1'}\n sx={periodTitleSx}\n >\n {title}\n </Typography>\n <TimePeriodFilter\n selectedFilter={filter}\n onFilterChange={setFilter}\n infoPopover={resolvedPeriodInfoPopover}\n />\n </Stack>\n <Box>\n <Grid container spacing={3}>\n <Grid size={{ md: 6, xs: 12 }}>\n <Stack\n gap={1}\n sx={mergeSx(customization?.leftColumn?.columnStackSx)}\n >\n <Stack>\n <Stack\n direction=\"row\"\n gap={4}\n justifyContent=\"start\"\n alignItems=\"center\"\n >\n {resolvedHeaderImageSrc ? (\n <Box\n component=\"img\"\n src={resolvedHeaderImageSrc}\n alt=\"\"\n width={52}\n height={52}\n sx={{ objectFit: 'contain' }}\n />\n ) : null}\n <Stack>\n <Typography\n sx={mergeSx(\n {\n fontSize: '20px',\n fontWeight: 600,\n color: '#222222',\n },\n customization?.header?.headlineSx\n )}\n >\n {headlineTotal}\n </Typography>\n <Stack direction=\"row\" alignItems=\"center\" gap={1}>\n <Typography\n sx={mergeSx(\n {\n fontSize: '11px',\n fontWeight: 400,\n color: '#222222',\n },\n customization?.header?.subtitleSx\n )}\n >\n {headlineSubtitle}\n </Typography>\n {resolvedHeadlineInfoPopover ? (\n <ChartWidgetInfoButton\n density=\"compact\"\n popover={resolvedHeadlineInfoPopover}\n ariaLabel=\"Queue time breakdown information\"\n />\n ) : null}\n </Stack>\n </Stack>\n </Stack>\n </Stack>\n <Stack\n sx={mergeSx(customization?.leftColumn?.barRowsStackSx)}\n >\n {data.map(item => (\n <QueueTimeBreakdownStackedBar\n key={item.name}\n row={item}\n legendRows={legend}\n renderTooltip={renderStackedBarTooltip}\n />\n ))}\n </Stack>\n </Stack>\n <Typography\n sx={mergeSx(\n {\n marginTop: '10px',\n fontSize: '14px',\n fontWeight: 500,\n color: '#222222',\n },\n customization?.dataComparison?.titleSx\n )}\n >\n {dataComparisonTitle}\n </Typography>\n <Card\n elevation={0}\n sx={mergeSx(\n {\n cursor: 'pointer',\n marginTop: '10px',\n bgcolor: '#FFFFFF',\n border: '1px solid #E5E7EB',\n borderRadius: 2,\n },\n customization?.dataComparison?.cardSx\n )}\n >\n <CardContent sx={{ padding: '4px 8px' }}>\n {hasComparisonData ? (\n <Stack\n direction=\"row\"\n justifyContent=\"space-evenly\"\n alignItems=\"center\"\n >\n <Stack width=\"50%\">\n <QueueTimeBreakdownDonut\n averageData={Donut_data}\n chartFilter={filter}\n LabelName=\"Today\"\n renderTooltip={renderDonutTooltip}\n />\n </Stack>\n <Box\n component=\"span\"\n sx={mergeSx(\n {\n height: '180px',\n width: '2px',\n backgroundColor: '#D8D9E4',\n display: 'inline-block',\n },\n customization?.dataComparison?.dividerSx\n )}\n />\n <Stack width=\"50%\">\n <QueueTimeBreakdownDonut\n averageData={yesterdayDonut}\n chartFilter={filter}\n LabelName=\"Yesterday\"\n renderTooltip={renderDonutTooltip}\n />\n </Stack>\n </Stack>\n ) : (\n <ChartEmptyState minHeight={220} />\n )}\n </CardContent>\n </Card>\n </Grid>\n\n <Grid size={{ md: 6, xs: 12 }}>\n <Card\n elevation={0}\n sx={mergeSx(\n {\n cursor: 'pointer',\n borderRadius: '8px',\n border: '1px solid #E5E7EB',\n bgcolor: '#FFFFFF',\n height: '100%',\n },\n customization?.areaChart?.cardSx\n )}\n >\n <CardContent\n sx={mergeSx(\n { padding: '10px 8px' },\n customization?.areaChart?.cardContentSx\n )}\n >\n <QueueTimeBreakdownArea\n series={getQueueTimeBreakdownAreaSeriesData(filter)}\n xAxis={getQueueTimeBreakdownAreaXAxisData(filter)}\n renderTooltip={renderAreaTooltip}\n />\n </CardContent>\n </Card>\n </Grid>\n </Grid>\n </Box>\n </Stack>\n </CardContent>\n </Card>\n </QueueTimeBreakdownCustomizationProvider>\n );\n}\n\nexport default QueueTimeBreakdown;\n\nexport { generateMockPerformanceData } from './queueTimeBreakdown.mock';\n","import type { ChartWidgetInfoPopoverContent } from '../ChartWidgetInfoButton/ChartWidgetInfoButton.types';\nimport type { QueueTimeBreakdownCustomization } from './queueTimeBreakdown.customization.types';\nimport type { QueueTimeBreakdownAreaProps } from './QueueTimeBreakdownArea';\nimport type { QueueTimeBreakdownDonutProps } from './QueueTimeBreakdownDonut';\nimport type { QueueTimeBreakdownStackedBarProps } from './QueueTimeBreakdownStackedBar';\n\nexport type { QueueTimeBreakdownCustomization };\n\n/**\n * Header illustration for the queue breakdown card.\n * Default GIF path (place under app **`public`** or override with **`headerImageSrc`**).\n */\nexport const QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC =\n '/images/icon/DwellBreakdownIcon.gif' as const;\n\n/** One series slice for Apex stacked horizontal bars. */\nexport type QueueTimeStackedSeriesItem = {\n name: string;\n data: number[];\n};\n\n/** One row of stacked-bar data (e.g. per store). */\nexport type QueueTimeBreakdownBarRow = {\n name: string;\n data: QueueTimeStackedSeriesItem[];\n total: number;\n};\n\nexport type QueueTimeChartFilter = 'Day' | 'Week' | 'Month' | 'Year';\n\n/** Optional legend chip under the stacked bars (percent + label + color). */\nexport type QueueBucketLegendItem = {\n percent: string;\n label: string;\n color: string;\n};\n\nexport type QueueTimeBreakdownProps = {\n /** Stacked horizontal bar rows. */\n data: QueueTimeBreakdownBarRow[];\n /** Donut slice values (e.g. today). */\n Donut_data: number[];\n /** Optional second donut; defaults to Donut_data for both sides. */\n donutYesterdayData?: number[];\n total_visitor_today?: number;\n overall_visitor_per_hour?: number;\n overall_visitor_per_min?: number;\n top_store?: string;\n /**\n * Header illustration URL. Defaults to {@link QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC}\n * (same asset as the queue-time dashboard widget). Pass `''` to hide the icon.\n */\n headerImageSrc?: string;\n /** Main KPI number shown next to the icon. */\n headlineTotal?: string;\n /** Subtitle under the headline. */\n headlineSubtitle?: string;\n /** Row title above the donut comparison card. */\n dataComparisonTitle?: string;\n /** Legend under the stacked bars; defaults to four queue buckets. */\n queueBucketLegend?: QueueBucketLegendItem[];\n /** Card / widget title. */\n title?: string;\n /**\n * Header info popover (next to D/W/M/Y). When omitted, the widget uses\n * **`TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN`**. Pass **`null`** to hide the separator and\n * **`ChartWidgetInfoButton`**. Standalone **`TimePeriodFilter`** does not inject popover copy implicitly.\n */\n infoPopover?: ChartWidgetInfoPopoverContent | null;\n /**\n * Info popover shown beside the headline subtitle (\"Avg. Queue Time Breakdown...\").\n * Defaults to the same content used by `infoPopover` when omitted.\n * Pass `null` to hide the subtitle info button.\n */\n headlineInfoPopover?: ChartWidgetInfoPopoverContent | null;\n /**\n * Full custom tooltip renderer for the area chart.\n */\n renderAreaTooltip?: QueueTimeBreakdownAreaProps['renderTooltip'];\n /**\n * Full custom tooltip renderer for both donut charts.\n */\n renderDonutTooltip?: QueueTimeBreakdownDonutProps['renderTooltip'];\n /**\n * Full custom tooltip renderer for each stacked bar row.\n */\n renderStackedBarTooltip?: QueueTimeBreakdownStackedBarProps['renderTooltip'];\n /** Visual / layout overrides for all sub-widgets (tooltips, palette, D/W/M/Y control, etc.). */\n customization?: QueueTimeBreakdownCustomization;\n};\n","import { Stack } from '@mui/material';\nimport { useTheme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { ReactNode } from 'react';\nimport {\n Area,\n AreaChart,\n CartesianGrid,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport type { QueueTimeChartFilter } from './QueueTimeBreakdown.types';\nimport {\n QueueTimeBreakdownAreaTooltip,\n type QueueTimeBreakdownAreaTooltipProps,\n} from './QueueTimeBreakdownAreaTooltip';\nimport { useQueueTimeBreakdownCustomization } from './QueueTimeBreakdownCustomizationContext';\nimport { QUEUE_CHART_COLORS } from './queueTimeBreakdown.chartTokens';\n\nexport type QueueTimeAreaSeriesPoint = {\n name: string;\n data: number[];\n};\n\nexport type QueueTimeBreakdownAreaProps = {\n series: QueueTimeAreaSeriesPoint[];\n xAxis: string[];\n renderTooltip?: (\n context: QueueTimeBreakdownAreaTooltipRenderContext\n ) => ReactNode;\n};\n\nexport type QueueTimeBreakdownAreaTooltipRenderContext = {\n tooltipProps: TooltipContentProps;\n chartData: Record<string, string | number>[];\n series: QueueTimeAreaSeriesPoint[];\n xAxis: string[];\n};\n\nfunction mergeAreaData(\n seriesList: QueueTimeAreaSeriesPoint[],\n categories: string[]\n): Record<string, string | number>[] {\n return categories.map((cat, i) => {\n const row: Record<string, string | number> = { name: cat };\n seriesList.forEach(s => {\n row[s.name] = s.data[i] ?? 0;\n });\n return row;\n });\n}\n\nconst defaultMargin = { top: 8, right: 8, bottom: 8, left: 8 };\n\nconst QueueTimeBreakdownArea = ({\n series,\n xAxis,\n renderTooltip,\n}: QueueTimeBreakdownAreaProps): React.ReactElement => {\n const theme = useTheme();\n const { chartPalette, areaChart: ac } = useQueueTimeBreakdownCustomization();\n const palette =\n chartPalette && chartPalette.length > 0 ? chartPalette : QUEUE_CHART_COLORS;\n const chartData = React.useMemo(\n () => mergeAreaData(series, xAxis),\n [series, xAxis]\n );\n const stackH = ac?.stackHeightPx ?? 330;\n const chartH = ac?.chartHeightPx ?? 350;\n const margin = React.useMemo(\n () => ({ ...defaultMargin, ...ac?.margin }),\n [ac?.margin]\n );\n const gridStroke = ac?.gridStroke ?? theme.palette.divider;\n const yLabel = ac?.yAxisLabel ?? 'No of Visitors';\n\n return (\n <Stack justifyContent=\"center\" height={stackH}>\n <ResponsiveContainer width=\"100%\" height={chartH}>\n <AreaChart data={chartData} margin={margin}>\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke={gridStroke}\n vertical={false}\n />\n <XAxis\n dataKey=\"name\"\n tick={{ fill: theme.palette.text.secondary, fontSize: 11 }}\n axisLine={false}\n tickLine={false}\n />\n <YAxis\n tick={{ fill: theme.palette.text.secondary, fontSize: 11 }}\n axisLine={false}\n tickLine={false}\n tickFormatter={v => {\n const n = typeof v === 'number' ? v : Number(v);\n const safe = Number.isFinite(n) ? n : 0;\n return safe > 1000 ? `${Math.ceil(safe / 1000)}k` : String(safe);\n }}\n label={{\n value: yLabel,\n angle: -90,\n position: 'insideLeft',\n style: { fill: theme.palette.text.secondary, fontSize: 11 },\n }}\n />\n {series.map((s, i) => (\n <Area\n key={s.name}\n type=\"monotone\"\n dataKey={s.name}\n stackId=\"queueArea\"\n stroke={palette[i % palette.length]}\n fill={palette[i % palette.length]}\n fillOpacity={1}\n strokeWidth={0}\n />\n ))}\n <Tooltip\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const custom = renderTooltip({\n tooltipProps,\n chartData,\n series,\n xAxis,\n });\n return custom == null ? null : <>{custom}</>;\n }\n const { active, payload, label } = tooltipProps;\n return (\n <QueueTimeBreakdownAreaTooltip\n active={active}\n label={label}\n payload={\n payload as QueueTimeBreakdownAreaTooltipProps['payload']\n }\n styleOverrides={ac?.areaTooltip}\n />\n );\n }}\n cursor={{\n stroke: ac?.cursorStroke ?? '#D4D4D8',\n strokeWidth: ac?.cursorStrokeWidth ?? 1,\n }}\n wrapperStyle={{ outline: 'none' }}\n />\n </AreaChart>\n </ResponsiveContainer>\n </Stack>\n );\n};\n\nexport default QueueTimeBreakdownArea;\n\nconst xDays = [\n 'April 1',\n 'April 2',\n 'April 3',\n 'April 4',\n 'April 5',\n 'April 6',\n 'Today',\n];\nconst xWeeks = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\nconst xMonths = ['Jan', 'Feb', 'Mar', 'Apr'];\nconst xYears = ['2018', '2019', '2020', '2021', '2022', '2023', '2024'];\n\nexport function getQueueTimeBreakdownAreaXAxisData(\n type: QueueTimeChartFilter\n): string[] {\n switch (type) {\n case 'Day':\n return xDays;\n case 'Week':\n return xWeeks;\n case 'Month':\n return xMonths;\n case 'Year':\n return xYears;\n default:\n return xDays;\n }\n}\n\nexport function getQueueTimeBreakdownAreaSeriesData(\n type: QueueTimeChartFilter\n): QueueTimeAreaSeriesPoint[] {\n const axis = getQueueTimeBreakdownAreaXAxisData(type);\n const areas = ['1-15 mins', '16-30 mins', '30-45 mins', '> 45 mins'] as const;\n const out: QueueTimeAreaSeriesPoint[] = [];\n\n areas.forEach(area => {\n const data: number[] = [];\n const range =\n area === '1-15 mins'\n ? 500\n : area === '16-30 mins'\n ? 1000\n : area === '30-45 mins'\n ? 2000\n : 1500;\n for (let i = 0; i < axis.length; i += 1) {\n data.push(range + i * 100 * Math.floor(Math.random() * 10));\n }\n out.push({ name: area, data });\n });\n\n return out;\n}\n","import * as React from 'react';\nimport type { QueueTimeAreaTooltipTheme } from './queueTimeBreakdown.customization.types';\nimport { mergeAreaTooltipStyles } from './queueTimeBreakdownCustomization.merge';\n\n/** Normalized row after Recharts payload cast. */\ntype TooltipRow = {\n value?: unknown;\n name?: unknown;\n color?: string;\n dataKey?: unknown;\n};\n\nexport type QueueTimeBreakdownAreaTooltipProps = {\n active?: boolean;\n payload?: ReadonlyArray<TooltipRow>;\n label?: unknown;\n /** Merged with built-in defaults; set via `QueueTimeBreakdown` `customization.areaChart.areaTooltip`. */\n styleOverrides?: QueueTimeAreaTooltipTheme;\n};\n\nfunction numberFromTooltipValue(v: unknown): number {\n if (typeof v === 'number' && Number.isFinite(v)) {\n return v;\n }\n if (typeof v === 'string') {\n const n = Number(v);\n return Number.isFinite(n) ? n : 0;\n }\n if (Array.isArray(v) && v.length > 0) {\n const first = v[0];\n if (typeof first === 'number' && Number.isFinite(first)) {\n return first;\n }\n }\n return 0;\n}\n\nfunction formatVisitorValue(n: number): string {\n if (!Number.isFinite(n)) {\n return '';\n }\n if (Math.abs(n) >= 1000) {\n return `${(n / 1000).toFixed(1)}k`;\n }\n return String(Math.round(n));\n}\n\n/**\n * Area chart tooltip — header strip + rows: dot · label : value.\n * Styles are customizable via `styleOverrides` (see `QueueTimeAreaTooltipTheme`).\n */\nexport function QueueTimeBreakdownAreaTooltip({\n active,\n payload,\n label,\n styleOverrides,\n}: QueueTimeBreakdownAreaTooltipProps): React.ReactElement | null {\n const s = React.useMemo(\n () => mergeAreaTooltipStyles(styleOverrides),\n [styleOverrides]\n );\n\n if (!active || payload == null || payload.length === 0) {\n return null;\n }\n\n return (\n <div style={s.container}>\n <div style={s.header}>{label != null ? String(label) : ''}</div>\n <div style={s.body}>\n {payload.map((entry, i) => {\n const name =\n typeof entry.name === 'string'\n ? entry.name\n : entry.name != null\n ? String(entry.name)\n : '';\n const safe = numberFromTooltipValue(entry.value);\n const color =\n typeof entry.color === 'string' ? entry.color : '#8B5CF6';\n const key =\n entry.dataKey != null ? String(entry.dataKey) : `row-${i}`;\n return (\n <div key={key} style={s.row}>\n <span\n style={{\n ...s.dot,\n backgroundColor: color,\n }}\n />\n <span style={s.label}>{`${name} :`}</span>\n <span style={s.value}>{formatVisitorValue(safe)}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport * as React from 'react';\nimport type { ReactNode } from 'react';\nimport { Cell, Pie, PieChart, ResponsiveContainer, Tooltip } from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport { useQueueTimeBreakdownCustomization } from './QueueTimeBreakdownCustomizationContext';\nimport type { QueueTimeChartFilter } from './QueueTimeBreakdown.types';\nimport { QUEUE_CHART_COLORS } from './queueTimeBreakdown.chartTokens';\nimport {\n mergeRechartsTooltipStyles,\n mergeSx,\n} from './queueTimeBreakdownCustomization.merge';\n\nconst RADIAN = Math.PI / 180;\n\nfunction DefaultDonutTooltip({\n tooltipProps,\n pieData,\n palette,\n}: {\n tooltipProps: TooltipContentProps;\n pieData: PieDatum[];\n total: number;\n palette: readonly string[];\n}): React.ReactElement | null {\n const { active, payload } = tooltipProps;\n if (!active || !payload?.length) {\n return null;\n }\n const entry = payload[0];\n const name = entry?.name ?? '';\n const rawValue = entry?.value;\n const value =\n typeof rawValue === 'number' ? rawValue : (Number(rawValue) ?? 0);\n const colorIndex = pieData.findIndex(d => d.name === name);\n const color = palette[colorIndex % palette.length];\n\n return (\n <Box\n sx={{\n pointerEvents: 'none',\n backgroundColor: '#FFFFFF',\n border: '1px solid #E5E7EB',\n borderRadius: 1.5,\n boxShadow: '0 4px 14px rgba(15, 23, 42, 0.12)',\n zIndex: 9999,\n overflow: 'hidden',\n }}\n >\n <Box sx={{ height: 3, bgcolor: '#E5E7EB', width: '100%' }} />\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1}\n sx={{ px: '10px', py: '6px' }}\n >\n <Box\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: color,\n flexShrink: 0,\n }}\n />\n <Stack direction=\"row\" spacing={0.5} alignItems=\"baseline\">\n <Typography\n sx={{\n fontSize: 13,\n fontWeight: 500,\n color: '#6B7280',\n lineHeight: 1,\n }}\n >\n {name}:\n </Typography>\n <Typography\n sx={{\n fontSize: 14,\n fontWeight: 700,\n color: '#374151',\n lineHeight: 1,\n }}\n >\n {value.toLocaleString()}\n </Typography>\n </Stack>\n </Stack>\n </Box>\n );\n}\n\n/** Recharts `Pie` label payload (subset we need). */\ntype PieSectorLabelPayload = {\n cx?: number;\n cy?: number;\n midAngle?: number;\n innerRadius?: number;\n outerRadius?: number;\n percent?: number;\n index?: number;\n};\n\ntype DonutInnerLabelExtra = {\n lightSliceFill?: string;\n darkSliceFill?: string;\n};\n\n/** Percent text at mid-annulus so it reads inside the donut ring (not outside). */\nfunction DonutInnerPercentLabel(\n props: Readonly<PieSectorLabelPayload & DonutInnerLabelExtra>\n): React.ReactElement | null {\n const {\n cx,\n cy,\n midAngle,\n innerRadius,\n outerRadius,\n percent,\n index = 0,\n lightSliceFill = '#5B21B6',\n darkSliceFill = '#FFFFFF',\n } = props;\n if (\n cx == null ||\n cy == null ||\n midAngle == null ||\n innerRadius == null ||\n outerRadius == null ||\n percent == null\n ) {\n return null;\n }\n const p = percent;\n if (p < 0.025) {\n return null;\n }\n const midR = innerRadius + (outerRadius - innerRadius) / 2;\n const x = cx + midR * Math.cos(-midAngle * RADIAN);\n const y = cy + midR * Math.sin(-midAngle * RADIAN);\n const text = `${(p * 100).toFixed(0)}%`;\n const lightSlice = index < 2;\n const fill = lightSlice ? lightSliceFill : darkSliceFill;\n\n return (\n <text\n x={x}\n y={y}\n fill={fill}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontSize={11}\n fontWeight={600}\n style={{\n pointerEvents: 'none',\n textShadow: lightSlice ? 'none' : '0 1px 2px rgba(0,0,0,0.45)',\n }}\n >\n {text}\n </text>\n );\n}\n\nconst DEFAULT_LABELS = [\n '0-20 years old (male)',\n '21-45 years old (male)',\n '46-60 years old (male)',\n '60+ years old (male)',\n] as const;\n\nexport type QueueTimeBreakdownDonutProps = {\n chartFilter: QueueTimeChartFilter;\n averageData: number[];\n LabelName: string;\n labels?: readonly string[];\n renderTooltip?: (\n context: QueueTimeBreakdownDonutTooltipRenderContext\n ) => ReactNode;\n};\n\ntype PieDatum = { name: string; value: number };\n\nexport type QueueTimeBreakdownDonutTooltipRenderContext = {\n tooltipProps: TooltipContentProps;\n pieData: PieDatum[];\n total: number;\n chartFilter: QueueTimeChartFilter;\n labelName: string;\n};\n\nexport function QueueTimeBreakdownDonut({\n chartFilter,\n averageData,\n LabelName,\n labels = DEFAULT_LABELS,\n renderTooltip,\n}: QueueTimeBreakdownDonutProps): React.ReactElement {\n const { chartPalette, donut: dn } = useQueueTimeBreakdownCustomization();\n const palette =\n chartPalette && chartPalette.length > 0 ? chartPalette : QUEUE_CHART_COLORS;\n const tt = React.useMemo(\n () => mergeRechartsTooltipStyles(dn?.tooltip),\n [dn?.tooltip]\n );\n const innerR = dn?.innerRadius ?? 58;\n const outerR = dn?.outerRadius ?? 88;\n const padAngle = dn?.paddingAngle ?? 0;\n const chartH = dn?.chartHeightPx ?? 220;\n\n const pieData: PieDatum[] = React.useMemo(() => {\n return labels.map((name, i) => ({\n name,\n value: Math.max(0, averageData[i] ?? 0),\n }));\n }, [averageData, labels]);\n\n const total = pieData.reduce((s, d) => s + d.value, 0) || 1;\n\n return (\n <Box\n sx={mergeSx(\n { position: 'relative', width: '100%', minHeight: 200 },\n dn?.containerSx\n )}\n >\n <ResponsiveContainer width=\"100%\" height={chartH}>\n <PieChart key={chartFilter}>\n <Pie\n data={pieData}\n dataKey=\"value\"\n nameKey=\"name\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={innerR}\n outerRadius={outerR}\n paddingAngle={padAngle}\n labelLine={false}\n label={(props: PieSectorLabelPayload) => (\n <DonutInnerPercentLabel\n {...props}\n lightSliceFill={dn?.innerPercentOnLightSliceFill}\n darkSliceFill={dn?.innerPercentOnDarkSliceFill}\n />\n )}\n >\n {pieData.map((_, index) => (\n <Cell\n key={`cell-${index}`}\n fill={palette[index % palette.length]}\n stroke=\"none\"\n />\n ))}\n </Pie>\n <Tooltip\n contentStyle={tt.contentStyle}\n itemStyle={tt.itemStyle}\n labelStyle={tt.labelStyle}\n wrapperStyle={{ ...tt.wrapperStyle, zIndex: 9999 }}\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const custom = renderTooltip({\n tooltipProps,\n pieData,\n total,\n chartFilter,\n labelName: LabelName,\n });\n return custom == null ? null : <>{custom}</>;\n }\n return (\n <DefaultDonutTooltip\n tooltipProps={tooltipProps}\n pieData={pieData}\n total={total}\n palette={palette}\n />\n );\n }}\n formatter={\n renderTooltip\n ? undefined\n : (value, name) => {\n const v =\n value == null\n ? 0\n : typeof value === 'number'\n ? value\n : Number(value);\n const safe = Number.isFinite(v) ? v : 0;\n const label =\n typeof name === 'string' ? name : String(name ?? '');\n return [`${((safe / total) * 100).toFixed(0)}%`, label];\n }\n }\n />\n </PieChart>\n </ResponsiveContainer>\n <Box\n sx={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n textAlign: 'center',\n }}\n >\n <Typography\n sx={mergeSx(\n { fontSize: '13px', fontWeight: 600, color: '#373d3f' },\n dn?.centerLabelSx\n )}\n >\n {LabelName}\n </Typography>\n </Box>\n </Box>\n );\n}\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport type { ReactNode } from 'react';\nimport * as React from 'react';\nimport type {\n QueueBucketLegendItem,\n QueueTimeBreakdownBarRow,\n} from './QueueTimeBreakdown.types';\nimport { useQueueTimeBreakdownCustomization } from './QueueTimeBreakdownCustomizationContext';\nimport {\n QUEUE_CHART_COLORS,\n QUEUE_STACKED_BAR_THICKNESS_PX,\n} from './queueTimeBreakdown.chartTokens';\nimport { mergeSx } from './queueTimeBreakdownCustomization.merge';\n\nconst segmentTooltipPopperSx: SxProps<Theme> = {\n p: 0,\n m: 0,\n bgcolor: 'transparent',\n boxShadow: 'none',\n border: 'none',\n maxWidth: 'none',\n};\n\nconst defaultSegmentTooltipCardSx: SxProps<Theme> = {\n minWidth: 160,\n bgcolor: '#fff',\n borderRadius: 1.5,\n border: '1px solid #E5E7EB',\n boxShadow: '0 4px 14px rgba(15, 23, 42, 0.12)',\n overflow: 'hidden',\n pointerEvents: 'none',\n zIndex: 9999,\n};\n\nfunction SegmentTooltip({\n name,\n value,\n color,\n}: {\n name: string;\n value: number;\n pct: string;\n color: string;\n}): React.ReactElement {\n return (\n <Box sx={defaultSegmentTooltipCardSx}>\n <Box sx={{ height: 3, bgcolor: '#E5E7EB', width: '100%' }} />\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1}\n sx={{ px: '10px', py: '6px' }}\n >\n <Box\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: color,\n flexShrink: 0,\n }}\n />\n <Stack direction=\"row\" spacing={0.5} alignItems=\"baseline\">\n <Typography\n sx={{\n fontSize: 13,\n fontWeight: 500,\n color: '#6B7280',\n lineHeight: 1,\n }}\n >\n {name}:\n </Typography>\n <Typography\n sx={{\n fontSize: 14,\n fontWeight: 700,\n color: '#374151',\n lineHeight: 1,\n }}\n >\n {value.toLocaleString()}\n </Typography>\n </Stack>\n </Stack>\n </Box>\n );\n}\n\nexport type QueueTimeBreakdownStackedBarProps = {\n row: QueueTimeBreakdownBarRow;\n /** One entry per segment: percent line + range line (aligned under each slice). */\n legendRows: readonly QueueBucketLegendItem[];\n renderTooltip?: (\n context: QueueTimeBreakdownStackedBarTooltipRenderContext\n ) => ReactNode;\n};\n\nexport type QueueTimeBreakdownStackedBarTooltipRenderContext = {\n row: QueueTimeBreakdownBarRow;\n segmentIndex: number;\n percent: number;\n count: number;\n color: string;\n};\n\n/**\n * Custom horizontal 100% stacked bar — slim pill with rounded ends.\n * Segments are individually hoverable with MUI tooltips.\n */\nexport function QueueTimeBreakdownStackedBar({\n row,\n legendRows,\n renderTooltip,\n}: QueueTimeBreakdownStackedBarProps): React.ReactElement {\n const { chartPalette, stackedBar: sb } = useQueueTimeBreakdownCustomization();\n const palette =\n chartPalette && chartPalette.length > 0 ? chartPalette : QUEUE_CHART_COLORS;\n\n const rawValues = React.useMemo(\n () => row.data.map(seg => Math.max(0, seg.data[0] ?? 0)),\n [row.data]\n );\n const total = React.useMemo(\n () => rawValues.reduce((a, b) => a + b, 0) || 1,\n [rawValues]\n );\n const pcts = React.useMemo(\n () => rawValues.map(v => (v / total) * 100),\n [rawValues, total]\n );\n\n const h = sb?.barThicknessPx ?? Math.max(14, QUEUE_STACKED_BAR_THICKNESS_PX);\n\n return (\n <Stack spacing={0} sx={{ width: '100%', mb: 1.5 }}>\n <Box\n sx={{\n width: '100%',\n height: h,\n display: 'flex',\n overflow: 'hidden',\n }}\n >\n {pcts.map((p, i) => {\n if (p <= 0) return null;\n const color = palette[i % palette.length];\n const segName = legendRows[i]?.label ?? row.data[i]?.name ?? '';\n const count = rawValues[i];\n const pctStr = p.toFixed(1);\n\n return (\n <Tooltip\n key={`seg-${row.name}-${i}`}\n title={\n renderTooltip ? (\n renderTooltip({\n row,\n segmentIndex: i,\n percent: p,\n count,\n color,\n })\n ) : (\n <SegmentTooltip\n name={segName}\n value={count}\n pct={pctStr}\n color={color}\n />\n )\n }\n enterTouchDelay={0}\n slotProps={{\n tooltip: {\n sx: segmentTooltipPopperSx,\n },\n }}\n >\n <Box\n sx={{\n width: `${p}%`,\n height: '100%',\n bgcolor: color,\n cursor: 'pointer',\n transition: 'opacity 0.2s',\n '&:hover': {\n opacity: 0.85,\n },\n }}\n />\n </Tooltip>\n );\n })}\n </Box>\n\n <Box\n sx={mergeSx(\n {\n display: 'flex',\n flexDirection: 'row',\n width: '100%',\n mt: 2,\n alignItems: 'flex-start',\n },\n sb?.labelRowContainerSx\n )}\n >\n {pcts.map((p, i) => {\n if (p <= 0) return null;\n const leg = legendRows[i];\n const pctText = leg?.percent ?? `${Math.round(p)}%`;\n const labelText = leg?.label ?? row.data[i]?.name ?? '';\n const countValue = rawValues[i];\n const countText = new Intl.NumberFormat('en-US').format(countValue);\n\n return (\n <Box\n key={`lbl-${row.name}-${i}`}\n title={`${countText} (${pctText}) ${labelText}`.trim()}\n sx={{\n flex: `0 0 ${p}%`,\n minWidth: 0,\n maxWidth: `${p}%`,\n px: 0.75,\n textAlign: 'center',\n overflow: 'hidden',\n }}\n >\n <Typography\n sx={mergeSx(\n {\n fontSize: 'clamp(13px, 1.2vw, 20px)',\n fontWeight: 700,\n color: '#7A7F87',\n lineHeight: 1.15,\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n sb?.labelPercentSx\n )}\n >\n {`${countText} (${pctText})`}\n </Typography>\n <Typography\n sx={mergeSx(\n {\n fontSize: 'clamp(9px, 0.9vw, 11px)',\n fontWeight: 600,\n color: '#7A7F87',\n lineHeight: 1.25,\n mt: 0.4,\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n sb?.labelRangeSx\n )}\n >\n {labelText}\n </Typography>\n </Box>\n );\n })}\n </Box>\n </Stack>\n );\n}\n","import type { QueueTimeBreakdownBarRow } from './QueueTimeBreakdown.types';\n\nconst ageGroups = [\n '0-20 years old (male)',\n '21-45 years old (male)',\n '46-60 years old (male)',\n '60+ years old (male)',\n] as const;\n\nconst storeList = ['Max Indonesia'] as const;\n\n/** Demo data for Storybook / prototyping. */\nexport function generateMockPerformanceData(): QueueTimeBreakdownBarRow[] {\n const data: QueueTimeBreakdownBarRow[] = [];\n\n storeList.forEach(store => {\n data.push({\n name: store,\n data: ageGroups.map(age => ({\n name: age,\n data: [Math.floor(Math.random() * 1000)],\n })),\n total: Math.floor(Math.random() * 10000),\n });\n });\n\n return data;\n}\n","'use client';\n\nimport { Icon } from '@iconify/react';\nimport {\n Box,\n Button,\n IconButton,\n Paper,\n Skeleton,\n Stack,\n Tooltip,\n Typography,\n} from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { ResponsiveContainer, Treemap } from 'recharts';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n FootFallHeatMapIconColor,\n FootFallHeatMapIconSize,\n FootFallHeatMapIconSizeContext,\n FootFallHeatMapKpiStripPresentation,\n FootFallHeatMapKpiStripSegmentTooltipRenderContext,\n FootFallHeatMapTileIconRole,\n FootFallHeatMapViewProps,\n} from './FootFallHeatMapView.types';\nimport { DEFAULT_FOOTFALL_TILE_ICONS } from './FootFallHeatMapView.types';\nimport {\n deriveFootfallHeatMapKpiStrip,\n type FootfallHeatMapDerivedStrip,\n} from './footfallHeatMapDerivedStrip';\nimport {\n buildTreemapNodes,\n createTreemapTileColorResolver,\n getNestedList,\n hashColor,\n parseMinutes,\n parseZoneKpiStripFromRaw,\n preprocessData,\n skipSingleBranchLevels,\n type TreemapNode,\n type ZoneAnalyticsFlatItem,\n type ZoneAnalyticsHierarchy,\n} from './footfallHeatMapTree';\n\nexport type {\n FootFallHeatMapKpiStripPresentation,\n FootFallHeatMapKpiSummaryCardItem,\n FootFallHeatMapSummaryKpis,\n FootFallHeatMapViewProps,\n} from './FootFallHeatMapView.types';\n\ninterface DataShape {\n previous: TreemapNode[][];\n current: TreemapNode[];\n}\n\ntype RankedStripItem =\n FootfallHeatMapDerivedStrip['rankedBarList']['items'][number];\ntype RankedStripSegment = NonNullable<RankedStripItem['segments']>[number];\n\nfunction toDisplayNumber(value: number): string {\n if (!Number.isFinite(value)) return '0';\n return new Intl.NumberFormat('en-IN').format(value);\n}\n\nfunction resolveSegmentFill(\n presentation: FootFallHeatMapKpiStripPresentation | undefined,\n segmentIndex: number,\n dataColor: string | undefined\n): string {\n const palette = presentation?.segmentColors;\n if (palette && palette.length > 0) {\n return palette[segmentIndex % palette.length] ?? dataColor ?? '#90A4AE';\n }\n return dataColor ?? '#90A4AE';\n}\n\nfunction InlineStatCard({\n icon,\n title,\n value,\n sx,\n iconColor = '#1565C0',\n}: {\n icon: string;\n title: string;\n value: number;\n sx?: SxProps<Theme>;\n iconColor?: string;\n}) {\n return (\n <Paper\n elevation={0}\n sx={\n [\n {\n bgcolor: '#fff',\n border: '1px solid #E0E0E0',\n borderRadius: 2,\n p: 1.5,\n minWidth: 180,\n flex: '1 1 240px',\n maxWidth: 340,\n },\n ...(sx ? [sx] : []),\n ] as SxProps<Theme>\n }\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1.5}>\n <Icon\n icon={icon}\n width={28}\n height={28}\n color={iconColor}\n style={{ flexShrink: 0 }}\n />\n <Stack spacing={0.15}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 500, color: 'text.primary' }}\n >\n {title}\n </Typography>\n <Typography\n variant=\"h6\"\n sx={{ lineHeight: 1.1, fontWeight: 700, color: 'text.primary' }}\n >\n {toDisplayNumber(value)}\n </Typography>\n </Stack>\n </Stack>\n </Paper>\n );\n}\n\nfunction InlineSegmentStrip({\n item,\n scaleTotal,\n presentation,\n}: {\n item: RankedStripItem;\n scaleTotal: number;\n presentation?: FootFallHeatMapKpiStripPresentation;\n}) {\n const segments = item.segments ?? [];\n const lastIdx = segments.length - 1;\n const segmentTotal = segments.reduce((sum, seg) => sum + seg.value, 0);\n const total = item.value > 0 ? item.value : segmentTotal;\n const scaleBase = scaleTotal > 0 ? scaleTotal : total;\n const filledPercent = Math.max(\n 0,\n Math.min(100, scaleBase > 0 ? (total / scaleBase) * 100 : 0)\n );\n const barHeight = presentation?.barHeight ?? 12;\n const trackInsetPx = presentation?.trackInsetPx ?? 3;\n const trackBg = presentation?.trackBackgroundColor ?? '#ECEFF3';\n return (\n <Stack spacing={0.75}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={1}\n >\n <Typography\n variant=\"subtitle2\"\n sx={\n [\n { fontWeight: 700 },\n ...(presentation?.segmentTitleSx\n ? [presentation.segmentTitleSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {item.label}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={\n [\n { fontWeight: 700, color: 'text.secondary' },\n ...(presentation?.segmentValueSx\n ? [presentation.segmentValueSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {toDisplayNumber(item.value)}\n </Typography>\n </Stack>\n <Box\n sx={{\n width: '100%',\n height: barHeight,\n borderRadius: 999,\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'stretch',\n backgroundColor: trackBg,\n px: `${trackInsetPx}px`,\n boxSizing: 'border-box',\n }}\n >\n {segments.map((segment, idx) => {\n const widthPercent =\n total > 0 ? (segment.value / total) * filledPercent : 0;\n const isLast = idx === lastIdx;\n const fill = resolveSegmentFill(presentation, idx, segment.color);\n return (\n <Tooltip\n key={segment.id}\n title={(() => {\n if (presentation?.renderSegmentTooltip) {\n const custom = presentation.renderSegmentTooltip({\n segment,\n segmentIndex: idx,\n itemLabel: item.label,\n itemValue: item.value,\n } satisfies FootFallHeatMapKpiStripSegmentTooltipRenderContext);\n return custom == null ? '' : custom;\n }\n return (\n <InlineSegmentTooltipCard\n segment={segment}\n dotColor={fill}\n cardSx={presentation?.segmentTooltipCardSx}\n />\n );\n })()}\n enterTouchDelay={0}\n slotProps={{\n tooltip: {\n sx: inlineSegmentTooltipPopperSx,\n },\n }}\n >\n <Box\n sx={{\n width: `${Math.max(0, widthPercent)}%`,\n backgroundColor: fill,\n minWidth: segment.value > 0 ? 3 : 0,\n cursor: 'pointer',\n borderTopLeftRadius: idx === 0 ? 999 : 0,\n borderBottomLeftRadius: idx === 0 ? 999 : 0,\n borderTopRightRadius: isLast ? 999 : 0,\n borderBottomRightRadius: isLast ? 999 : 0,\n }}\n />\n </Tooltip>\n );\n })}\n </Box>\n </Stack>\n );\n}\n\n/** Match the segmented tooltip shell used in RankedBarList. */\nconst inlineSegmentTooltipPopperSx: SxProps<Theme> = {\n p: 0,\n m: 0,\n bgcolor: 'transparent',\n boxShadow: 'none',\n border: 'none',\n maxWidth: 'none',\n};\n\nconst inlineSegmentTooltipCardSx: SxProps<Theme> = {\n maxWidth: 280,\n bgcolor: '#fff',\n borderRadius: 1,\n border: '1px solid #E8E8E8',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n overflow: 'hidden',\n};\n\nfunction InlineSegmentTooltipCard({\n segment,\n dotColor,\n cardSx,\n}: {\n segment: RankedStripSegment;\n dotColor: string;\n cardSx?: SxProps<Theme>;\n}): React.ReactElement {\n const tooltipSurfaceSx = cardSx\n ? ([inlineSegmentTooltipCardSx, cardSx] as SxProps<Theme>)\n : inlineSegmentTooltipCardSx;\n return (\n <Box sx={tooltipSurfaceSx}>\n <Box sx={{ height: 3, bgcolor: 'grey.200', width: '100%' }} />\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 0.5,\n rowGap: 0.5,\n px: 1.5,\n py: 1.25,\n }}\n >\n <Box\n component=\"span\"\n aria-hidden\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: dotColor,\n flexShrink: 0,\n }}\n />\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {segment.label}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {' : '}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 700,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {toDisplayNumber(segment.value)}\n </Typography>\n </Box>\n </Box>\n );\n}\n\nfunction FootfallHeatMapKpiRankedBlock({\n strip,\n stackSx,\n presentation,\n}: {\n strip: FootfallHeatMapDerivedStrip;\n stackSx?: SxProps<Theme>;\n presentation?: FootFallHeatMapKpiStripPresentation;\n}) {\n const { summaryKpis, rankedBarList } = strip;\n const scaleTotal = Math.max(\n summaryKpis.overallVisitors,\n ...rankedBarList.items.map(item => item.value)\n );\n const statIcon = presentation?.statCardIconColor ?? '#1565C0';\n const customSummary = presentation?.summaryCards?.(summaryKpis);\n const useCustomSummary = customSummary !== undefined;\n\n return (\n <Stack\n spacing={2}\n sx={\n [\n { width: '100%' },\n ...(stackSx ? [stackSx] : []),\n ...(presentation?.kpiContainerSx\n ? [presentation.kpiContainerSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {useCustomSummary && customSummary.length === 0 ? null : (\n <Stack direction=\"row\" spacing={1.5} flexWrap=\"wrap\" useFlexGap>\n {useCustomSummary\n ? customSummary.map(card => (\n <InlineStatCard\n key={card.id}\n icon={card.icon ?? 'mdi:chart-box-outline'}\n title={card.title}\n value={card.value}\n sx={\n [presentation?.statCardSx, card.sx].filter(\n Boolean\n ) as SxProps<Theme>\n }\n iconColor={card.iconColor ?? statIcon}\n />\n ))\n : [\n <InlineStatCard\n key=\"default-stores\"\n icon=\"mdi:store-marker-outline\"\n title=\"No. of Stores\"\n value={summaryKpis.storeCount}\n sx={presentation?.statCardSx}\n iconColor={statIcon}\n />,\n <InlineStatCard\n key=\"default-visitors\"\n icon=\"fluent:people-community-16-filled\"\n title=\"Overall Visitors\"\n value={summaryKpis.overallVisitors}\n sx={presentation?.statCardSx}\n iconColor={statIcon}\n />,\n ]}\n </Stack>\n )}\n <Stack spacing={1.25} sx={{ pt: 0.5, pb: 1 }}>\n {rankedBarList.items.map(item => (\n <InlineSegmentStrip\n key={item.id}\n item={item}\n scaleTotal={scaleTotal}\n presentation={presentation}\n />\n ))}\n </Stack>\n </Stack>\n );\n}\n\ntype HierarchyLevel = 'Country' | 'Region' | 'State' | 'City';\nconst HIERARCHY_LEVELS: readonly HierarchyLevel[] = [\n 'Country',\n 'Region',\n 'State',\n 'City',\n] as const;\n\nfunction collectNodesAtDepth(\n nodes: TreemapNode[],\n depth: number\n): TreemapNode[] {\n if (depth <= 0) return nodes;\n return nodes.flatMap(node => collectNodesAtDepth(node.list ?? [], depth - 1));\n}\n\nfunction normalizeNodePercentages(nodes: TreemapNode[]): TreemapNode[] {\n const totalRaw = nodes.reduce((sum, node) => sum + (node._raw ?? 0), 0) || 1;\n return nodes.map(node => {\n const raw = node._raw ?? 0;\n const pct = (raw / totalRaw) * 100;\n return {\n ...node,\n value: pct,\n originalValue: pct,\n };\n });\n}\n\nfunction parseStartPath(path?: string | string[] | null): string[] {\n if (!path) return [];\n const raw = Array.isArray(path) ? path : String(path).split('/');\n return raw.map(segment => String(segment).trim()).filter(Boolean);\n}\n\nfunction scopeNodesByPath(\n rootNodes: TreemapNode[],\n startFromPath?: string | string[] | null,\n mode: 'children' | 'self' = 'children'\n): TreemapNode[] | null {\n const segments = parseStartPath(startFromPath);\n if (segments.length === 0) return null;\n\n let current = rootNodes;\n let matched: TreemapNode | undefined;\n\n for (const segment of segments) {\n const key = segment.toLowerCase();\n matched = current.find(\n node => String(node.name).trim().toLowerCase() === key\n );\n if (!matched) return null;\n current = matched.list ?? [];\n }\n\n if (!matched) return null;\n\n if (mode === 'self') {\n return normalizeNodePercentages([matched]);\n }\n\n if ((matched.list ?? []).length > 0) {\n return normalizeNodePercentages(matched.list);\n }\n\n return normalizeNodePercentages([matched]);\n}\n\nfunction buildRootNodesFromInitial(\n initialData: ZoneAnalyticsHierarchy | ZoneAnalyticsFlatItem[],\n sortBy: 'walkins' | 'dwell',\n startFromLevel: HierarchyLevel,\n startFromPath: string | string[] | undefined,\n startFromPathMode: 'children' | 'self',\n tileColorFromSeed: (seed: string) => string\n): TreemapNode[] {\n if (Array.isArray(initialData)) {\n const items = initialData as ZoneAnalyticsFlatItem[];\n const total =\n items.reduce(\n (sum, it) =>\n sum +\n (sortBy === 'walkins'\n ? it.visitor_count\n : parseMinutes(it.avg_dwell_time)),\n 0\n ) || 1;\n\n return items.map(it => {\n const raw =\n sortBy === 'walkins'\n ? it.visitor_count\n : parseMinutes(it.avg_dwell_time);\n const percentage = (raw / total) * 100;\n\n return {\n name: it.category_name,\n value: percentage,\n originalValue: percentage,\n color: tileColorFromSeed(`flat/${it.category_id}`),\n overallData: { count: it.visitor_count, dwell: it.avg_dwell_time },\n list: [],\n leafMetrics: undefined,\n zoneKpiStrip: parseZoneKpiStripFromRaw(\n it as unknown as Record<string, unknown>\n ),\n _raw: raw,\n };\n });\n }\n\n const hierarchical = initialData as ZoneAnalyticsHierarchy;\n const topContainer =\n (hierarchical?.Country && {\n key: 'Country' as const,\n container: hierarchical.Country,\n }) ||\n (hierarchical?.Region && {\n key: 'Region' as const,\n container: hierarchical.Region,\n }) ||\n (hierarchical?.State && {\n key: 'State' as const,\n container: hierarchical.State,\n }) ||\n (hierarchical?.City && {\n key: 'City' as const,\n container: hierarchical.City,\n }) ||\n null;\n\n if (!topContainer) return [];\n\n const builtRoot = buildTreemapNodes({\n container: topContainer.container as Record<string, unknown>,\n sortBy,\n pathKey: topContainer.key,\n tileColorFromSeed,\n });\n\n const scopedNodes = scopeNodesByPath(\n builtRoot,\n startFromPath,\n startFromPathMode\n );\n if (scopedNodes) return scopedNodes;\n\n const topIdx = HIERARCHY_LEVELS.indexOf(topContainer.key);\n const startIdx = HIERARCHY_LEVELS.indexOf(startFromLevel);\n if (topIdx === -1 || startIdx === -1 || startIdx <= topIdx) {\n return builtRoot;\n }\n\n const depthDelta = startIdx - topIdx;\n const collected = collectNodesAtDepth(builtRoot, depthDelta);\n return normalizeNodePercentages(collected);\n}\n\nfunction resolveIconSize(\n prop: FootFallHeatMapIconSize | undefined,\n ctx: FootFallHeatMapIconSizeContext\n): number {\n if (prop === undefined || prop === 'auto') {\n return Math.max(8, ctx.baseIconSize);\n }\n if (typeof prop === 'number') {\n return Math.max(8, prop);\n }\n return Math.max(8, prop(ctx));\n}\n\nfunction resolveIconColor(\n prop: FootFallHeatMapIconColor | undefined,\n tileColor: string,\n role: FootFallHeatMapTileIconRole\n): string {\n const p = prop ?? 'tile';\n if (p === 'tile') {\n if (role === 'header') return '#757575';\n return tileColor;\n }\n if (typeof p === 'string') return p;\n return p({ tileColor, role });\n}\n\n/**\n * In-store zone treemap with drill-down and leaf KPIs. Pass `initialData` from your API or mocks.\n */\nexport function FootFallHeatMapView({\n initialData,\n isLoading = false,\n isFetching = false,\n error,\n title = 'In-Store Zone Performance',\n infoTooltip = 'How different sections or product zones perform by traffic share. Block size = share of activity.',\n brandLabel = 'Reliance Digital',\n icons: iconsProp,\n iconSize: iconSizeProp,\n iconColor: iconColorProp,\n headerInfoIconSize = 22,\n treemap: treemapProp,\n tree: treeProp,\n kpiStrip: kpiStripPresentation,\n emptyStatePlaceholderProps,\n}: FootFallHeatMapViewProps) {\n const sortBy = treeProp?.sortBy ?? 'walkins';\n const startFromLevel = treeProp?.startFromLevel ?? 'Region';\n const startFromPath = treeProp?.startFromPath;\n const startFromPathMode = treeProp?.startFromPathMode ?? 'children';\n const terminalNodeView = treeProp?.terminalNodeView ?? 'details';\n const collapseSingleChildLevels =\n treeProp?.collapseSingleChildLevels ?? false;\n const customBuildNodes = treeProp?.buildNodes;\n const icons = { ...DEFAULT_FOOTFALL_TILE_ICONS, ...iconsProp };\n const treemapLayout = {\n heightWithBreadcrumb: treemapProp?.heightWithBreadcrumb ?? 400,\n heightWithoutBreadcrumb: treemapProp?.heightWithoutBreadcrumb ?? 450,\n terminalSingleCardHeight: treemapProp?.terminalSingleCardHeight,\n leafDetailsBodyHeight: treemapProp?.leafDetailsBodyHeight,\n leafDetailsBodySx: treemapProp?.leafDetailsBodySx,\n aspectRatio: treemapProp?.aspectRatio ?? 4 / 3,\n stroke: treemapProp?.stroke ?? '#ffffff',\n fill: treemapProp?.fill ?? '#ffffff',\n tileMetrics: treemapProp?.tileMetrics,\n tileColors: treemapProp?.tileColors,\n };\n const tileMetrics = treemapLayout.tileMetrics;\n const tileColorFromSeed = useMemo(\n () => createTreemapTileColorResolver(treemapLayout.tileColors),\n [treemapLayout.tileColors]\n );\n const [data, setData] = useState<DataShape>({\n previous: [],\n current: [],\n });\n const [showLeaf, setShowLeaf] = useState(false);\n const [trackingDetails, setTrackingDetails] = useState<TreemapNode[]>([]);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!initialData) {\n setData({ previous: [], current: [] });\n setShowLeaf(false);\n setTrackingDetails([]);\n return;\n }\n\n setLoading(true);\n const built = customBuildNodes\n ? customBuildNodes(initialData, { sortBy, tileColorFromSeed })\n : buildRootNodesFromInitial(\n initialData,\n sortBy,\n startFromLevel,\n startFromPath,\n startFromPathMode,\n tileColorFromSeed\n );\n const rootNodes = collapseSingleChildLevels\n ? skipSingleBranchLevels(built)\n : preprocessData(built);\n setData({ previous: [], current: rootNodes });\n setShowLeaf(false);\n setTrackingDetails([]);\n setLoading(false);\n }, [\n initialData,\n sortBy,\n customBuildNodes,\n collapseSingleChildLevels,\n startFromLevel,\n startFromPath,\n startFromPathMode,\n tileColorFromSeed,\n ]);\n\n const derivedKpiStrip = useMemo(() => {\n if (isLoading || loading || !initialData) return null;\n const activeZoneForStrip: TreemapNode | undefined =\n trackingDetails.length > 0\n ? trackingDetails[trackingDetails.length - 1]\n : undefined;\n return deriveFootfallHeatMapKpiStrip(\n activeZoneForStrip,\n data.current ?? []\n );\n }, [isLoading, loading, initialData, trackingDetails, data]);\n\n const formatPercentage = (value: number) => {\n if (typeof value !== 'number') return '0%';\n const formatted = value.toFixed(2);\n const trimmed = formatted.replace(/\\.?0+$/, '');\n return `${trimmed}%`;\n };\n\n const renderCustomizedContent = (\n props: Record<string, unknown>\n ): React.ReactElement => {\n const x = props.x as number;\n const y = props.y as number;\n const width = props.width as number;\n const height = props.height as number;\n const name = props.name as string;\n const index = props.index as number;\n const payload =\n (props?.payload as TreemapNode & { payload?: TreemapNode }) ?? props;\n const inner = (payload as { payload?: TreemapNode }).payload ?? payload;\n const originalValue =\n (inner as TreemapNode)?.originalValue ??\n data?.current[index]?.originalValue;\n const tileColor =\n (inner as TreemapNode)?.color ??\n (props?.color as string) ??\n (props?.fill as string) ??\n hashColor(String(name ?? index ?? ''));\n\n const handleClick = () => {\n const p = inner as TreemapNode;\n setTrackingDetails(pre => {\n const expectedDepth = data.previous.length;\n const normalizedPath = pre.slice(0, expectedDepth);\n return [...normalizedPath, p];\n });\n\n const nested = getNestedList(p);\n const hasNestedChildren = Boolean(nested?.length);\n const isStoresLevel = p?._childContainerKey === 'Stores';\n const shouldShowDetails =\n terminalNodeView === 'details' && (!hasNestedChildren || isStoresLevel);\n const shouldDrillDeeper = hasNestedChildren && !shouldShowDetails;\n\n if (shouldDrillDeeper) {\n setShowLeaf(false);\n setData({\n previous: [[...data.current], ...data.previous],\n current: collapseSingleChildLevels\n ? skipSingleBranchLevels(nested ?? [])\n : preprocessData(nested ?? []),\n });\n return;\n }\n\n if (shouldShowDetails) {\n setShowLeaf(true);\n setData({\n previous: [[...data.current], ...data.previous],\n current: [],\n });\n return;\n }\n\n const alreadyFocusedTerminalTile =\n !hasNestedChildren &&\n data.current.length === 1 &&\n String(data.current[0]?.name ?? '') === String(p?.name ?? '');\n if (alreadyFocusedTerminalTile) return;\n\n setShowLeaf(false);\n setData({\n previous: [[...data.current], ...data.previous],\n current: preprocessData([p]),\n });\n };\n\n const minDim = Math.min(width, height);\n const effectiveDim = Math.sqrt(width * height);\n const isLarge = minDim > 200;\n const isSmall = minDim <= 120;\n\n const fontSize = Math.max(11, Math.min(24, Math.floor(effectiveDim * 0.1)));\n const baseIconSize = Math.max(10, fontSize - 2);\n const padding = Math.max(0.5, Math.min(3, minDim * 0.015));\n\n const sizeCtx = (\n role: FootFallHeatMapTileIconRole\n ): FootFallHeatMapIconSizeContext => ({\n baseIconSize,\n role,\n fontSize,\n minDim,\n effectiveDim,\n });\n\n const visitorsIconPx = resolveIconSize(iconSizeProp, sizeCtx('visitors'));\n const dwellIconPx = resolveIconSize(iconSizeProp, sizeCtx('dwell'));\n const visitorsIconColor = resolveIconColor(\n iconColorProp,\n tileColor,\n 'visitors'\n );\n const dwellIconColor = resolveIconColor(iconColorProp, tileColor, 'dwell');\n\n const p = inner as TreemapNode;\n\n return (\n <foreignObject\n x={x}\n y={y}\n width={width}\n height={height}\n style={{ borderRadius: '12px', overflow: 'hidden' }}\n >\n <Stack\n onClick={handleClick}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') handleClick();\n }}\n role=\"button\"\n tabIndex={0}\n sx={{\n backgroundColor: tileColor,\n color: '#FFFFFF',\n p: padding,\n textAlign: 'center',\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: isSmall\n ? width > height\n ? 'row'\n : 'column'\n : 'column',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n overflow: 'hidden',\n border: '1px solid #FFFFFF',\n gap: isSmall ? 1 : 2,\n borderRadius: '12px',\n transition: 'transform 0.5s ease-in-out',\n '&:hover': {\n transform: 'scale(1.10)',\n },\n }}\n >\n <Stack\n direction={isSmall ? 'row' : 'column'}\n justifyContent=\"center\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n gap={1}\n sx={{\n mb: isSmall ? 0.5 : 1,\n }}\n >\n <Typography\n sx={{\n fontSize: `${fontSize}px!important`,\n fontWeight: 500,\n fontFamily: 'Noto Sans, sans-serif',\n color: '#fff',\n maxWidth: '100%',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n lineHeight: 1.2,\n textAlign: 'center',\n }}\n title={name}\n >\n {name}\n </Typography>\n <Typography\n sx={{\n fontSize: `${fontSize}px!important`,\n fontWeight: '700',\n textAlign: 'center',\n color: '#fff',\n }}\n >\n {formatPercentage(Number(originalValue))}\n </Typography>\n </Stack>\n\n <Stack\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n sx={\n [\n {\n gap: isSmall ? 0.5 : 1,\n },\n ...(tileMetrics?.metricsRowStackSx != null\n ? [tileMetrics.metricsRowStackSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.5}\n sx={\n [\n {\n backgroundColor: '#f4f4f4',\n color: '#333',\n px: isLarge ? 2 : 1,\n py: isLarge ? 1 : 0.3,\n borderRadius: 10,\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.1)',\n },\n ...(tileMetrics?.metricPillStackSx != null\n ? [tileMetrics.metricPillStackSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Box\n sx={\n [\n {\n backgroundColor: '#ffff',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n ...(tileMetrics?.metricPillIconBoxSx != null\n ? [tileMetrics.metricPillIconBoxSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Icon\n icon={icons.visitors}\n color={visitorsIconColor}\n fontSize={visitorsIconPx}\n />\n </Box>\n <Typography\n sx={\n [\n {\n fontSize: `${Math.max(8, fontSize * 0.6)}px !important`,\n fontWeight: 600,\n fontFamily: 'Noto Sans, sans-serif',\n whiteSpace: 'nowrap',\n },\n ...(tileMetrics?.metricPillValueTypographySx != null\n ? [tileMetrics.metricPillValueTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {p?.overallData ? p?.overallData.count : ''}\n </Typography>\n </Stack>\n\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.5}\n sx={\n [\n {\n backgroundColor: '#f4f4f4',\n color: '#333',\n px: isLarge ? 2 : 1,\n py: isLarge ? 1 : 0.3,\n borderRadius: 10,\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.1)',\n },\n ...(tileMetrics?.metricPillStackSx != null\n ? [tileMetrics.metricPillStackSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Box\n sx={\n [\n {\n backgroundColor: '#ffff',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n ...(tileMetrics?.metricPillIconBoxSx != null\n ? [tileMetrics.metricPillIconBoxSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Icon\n icon={icons.dwell}\n color={dwellIconColor}\n fontSize={dwellIconPx}\n />\n </Box>\n <Typography\n sx={\n [\n {\n fontSize: `${Math.max(8, fontSize * 0.6)}px !important`,\n fontWeight: 600,\n fontFamily: 'Noto Sans, sans-serif',\n whiteSpace: 'nowrap',\n },\n ...(tileMetrics?.metricPillValueTypographySx != null\n ? [tileMetrics.metricPillValueTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {p?.overallData ? p?.overallData.dwell : ''}\n </Typography>\n </Stack>\n </Stack>\n </Stack>\n </foreignObject>\n );\n };\n\n const handleClose = () => {\n setShowLeaf(false);\n const history = trackingDetails.slice(0, -1);\n setTrackingDetails(history);\n const obj1 = {\n current: data.previous[0] ?? [],\n previous: data.previous.slice(1),\n };\n setData(obj1);\n };\n\n const LabelTag = ({ textColor = '#f0f0f0' }: { textColor?: string }) => {\n const pathSegments = trackingDetails\n .map(t => String(t?.name ?? '').trim())\n .filter(Boolean);\n const breadcrumbSegments = Array.from(new Set([...pathSegments].reverse()));\n\n return (\n <Stack direction=\"row\" alignItems=\"baseline\" flexWrap=\"wrap\" gap={1.5}>\n {breadcrumbSegments.length === 0 ? (\n <Typography\n component=\"span\"\n sx={{\n '@media (max-width:500px)': {\n fontSize: '12px !important',\n },\n }}\n fontSize={'26px !important'}\n fontWeight={600}\n color={textColor}\n >\n {brandLabel}\n </Typography>\n ) : (\n <>\n {breadcrumbSegments.map((seg, i) => (\n <React.Fragment key={`${seg}-${i}`}>\n {i > 0 ? (\n <Typography\n component=\"span\"\n fontSize={'15px !important'}\n fontWeight={400}\n color={textColor}\n sx={{ px: 0.25 }}\n >\n /\n </Typography>\n ) : null}\n <Typography\n component=\"span\"\n sx={{\n '@media (max-width:500px)': {\n fontSize: i === 0 ? '12px !important' : '11px !important',\n },\n }}\n fontSize={i === 0 ? '26px !important' : '15px !important'}\n fontWeight={i === 0 ? 600 : 500}\n color={textColor}\n >\n {seg}\n </Typography>\n </React.Fragment>\n ))}\n {brandLabel ? (\n <>\n <Typography\n component=\"span\"\n fontSize={'15px !important'}\n fontWeight={400}\n color={textColor}\n >\n /\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n '@media (max-width:500px)': {\n fontSize: '11px !important',\n },\n }}\n fontSize={'15px !important'}\n fontWeight={500}\n color={textColor}\n >\n {brandLabel}\n </Typography>\n </>\n ) : null}\n </>\n )}\n </Stack>\n );\n };\n\n const is500Error =\n error !== null &&\n error !== undefined &&\n typeof error === 'object' &&\n 'status' in error &&\n (error as { status: number }).status === 500;\n\n if (is500Error) {\n return (\n <Box sx={{ p: 4, textAlign: 'center' }}>\n <Typography color=\"error\">\n Something went wrong (500). Try again later.\n </Typography>\n </Box>\n );\n }\n\n if (isLoading || loading) {\n return (\n <Skeleton\n variant=\"rectangular\"\n width=\"100%\"\n height={400}\n sx={{ borderRadius: '10px' }}\n />\n );\n }\n\n const showChart = !isLoading && initialData && !loading;\n\n const headerDataForBreadcrumb =\n trackingDetails.length > 0 ? trackingDetails.at(-1) : undefined;\n const headerData = headerDataForBreadcrumb;\n const isDrilledIntoZone = Boolean(\n showChart &&\n data?.previous &&\n data.previous.length > 0 &&\n headerDataForBreadcrumb\n );\n\n const zoneBarColor = headerData?.color ?? '#0A4FCB';\n /** Breadcrumb + % always white on the zone-colored drill bar (design). */\n const zoneBarHeaderFg = '#fff';\n\n const isTerminalSingleCardView = Boolean(\n showChart &&\n !showLeaf &&\n trackingDetails.length > 0 &&\n data.current.length === 1 &&\n !(getNestedList(data.current[0])?.length ?? 0)\n );\n /**\n * `terminalNodeView: \"card\"` keeps a single treemap tile at the leaf — but the zone KPI strip above\n * already shows the same zone name, share %, and breakdown. Omit the treemap to avoid a duplicate\n * “full chart” block (Story: Hierarchical (Terminal card reduced height)).\n */\n const hideTreemapForTerminalCardWithKpi =\n terminalNodeView === 'card' &&\n isTerminalSingleCardView &&\n derivedKpiStrip !== null;\n /** KPI + ranked list: visible for terminal nodes (card/details). Hidden for intermediate drill levels. */\n const showKpiStrip = Boolean(\n showChart && derivedKpiStrip && (showLeaf || isTerminalSingleCardView)\n );\n const showLeafDetailsBody = Boolean(showChart && showLeaf);\n const leafDetailsBodyHeight =\n treemapLayout.leafDetailsBodyHeight ??\n Math.max(180, treemapLayout.heightWithBreadcrumb - 140);\n const treemapHeight = isTerminalSingleCardView\n ? (treemapLayout.terminalSingleCardHeight ??\n treemapLayout.heightWithBreadcrumb)\n : data?.previous?.length > 0\n ? treemapLayout.heightWithBreadcrumb\n : treemapLayout.heightWithoutBreadcrumb;\n const hasTreemapData = (data?.current?.length ?? 0) > 0;\n\n const headerIconPx = resolveIconSize(iconSizeProp, {\n baseIconSize: headerInfoIconSize,\n role: 'header',\n fontSize: 14,\n minDim: 24,\n effectiveDim: headerInfoIconSize,\n });\n const headerIconColorResolved = resolveIconColor(\n iconColorProp,\n '#888888',\n 'header'\n );\n\n return (\n <Stack width=\"100%\">\n <Box\n sx={{\n width: '100%',\n mb: 2,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1,\n }}\n >\n <Typography variant=\"h6\" fontWeight={700}>\n {title}\n </Typography>\n <Stack direction=\"row\" alignItems=\"center\" gap={1}>\n {isFetching ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n Updating…\n </Typography>\n ) : null}\n <Tooltip title={infoTooltip} arrow>\n <IconButton\n size=\"small\"\n aria-label=\"Zone performance info\"\n edge=\"end\"\n >\n <Icon\n icon={icons.headerInfo}\n width={headerIconPx}\n height={headerIconPx}\n color={headerIconColorResolved}\n />\n </IconButton>\n </Tooltip>\n </Stack>\n </Box>\n\n {data?.previous?.length > 0 && headerData ? (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{\n px: 1.25,\n py: 1,\n mb: 0,\n borderRadius: '10px 10px 0 0',\n color: zoneBarHeaderFg,\n backgroundColor: zoneBarColor,\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <Button\n size=\"small\"\n onClick={handleClose}\n startIcon={\n <Icon\n icon=\"mdi:chevron-left\"\n width={16}\n height={16}\n color={zoneBarColor}\n />\n }\n sx={{\n minWidth: 0,\n color: zoneBarColor,\n bgcolor: '#fff',\n px: 1,\n borderRadius: 999,\n '&:hover': { bgcolor: '#F5F5F5' },\n }}\n >\n Back\n </Button>\n <LabelTag textColor={zoneBarHeaderFg} />\n </Stack>\n <Typography\n variant=\"h6\"\n sx={{ color: zoneBarHeaderFg, fontWeight: 700 }}\n >\n ({formatPercentage(Number(headerData?.originalValue ?? 0))})\n </Typography>\n </Stack>\n ) : null}\n\n {/* KPI + ranked list only in drilled zone (below zone-colored header, above treemap) */}\n {isDrilledIntoZone && showKpiStrip && derivedKpiStrip ? (\n <FootfallHeatMapKpiRankedBlock\n strip={derivedKpiStrip}\n presentation={kpiStripPresentation}\n stackSx={{\n mb: showLeafDetailsBody ? 0 : 2,\n px: 2,\n pt: 2,\n bgcolor: '#fff',\n border: '1px solid #E8E8E8',\n borderTop: 'none',\n borderBottom: showLeafDetailsBody ? 'none' : undefined,\n borderRadius: showLeafDetailsBody ? 0 : '0 0 8px 8px',\n }}\n />\n ) : null}\n\n {showLeafDetailsBody ? (\n <Box\n sx={\n [\n {\n mb: 2,\n bgcolor: '#fff',\n border: '1px solid #E8E8E8',\n borderTop: 'none',\n borderRadius: '0 0 8px 8px',\n minHeight: leafDetailsBodyHeight,\n },\n ...(treemapLayout.leafDetailsBodySx\n ? [treemapLayout.leafDetailsBodySx]\n : []),\n ] as SxProps<Theme>\n }\n />\n ) : null}\n\n {showLeaf ? null : showChart ? (\n hideTreemapForTerminalCardWithKpi ? null : hasTreemapData ? (\n <ResponsiveContainer width=\"100%\" height={treemapHeight}>\n <Treemap\n data={data?.current ?? []}\n dataKey=\"value\"\n stroke={treemapLayout.stroke}\n fill={treemapLayout.fill}\n content={renderCustomizedContent as never}\n isAnimationActive={false}\n aspectRatio={treemapLayout.aspectRatio}\n animationDuration={0}\n style={{ borderRadius: '12px' }}\n />\n </ResponsiveContainer>\n ) : (\n <ChartEmptyState\n minHeight={treemapHeight}\n {...emptyStatePlaceholderProps}\n />\n )\n ) : (\n <ChartEmptyState minHeight={400} {...emptyStatePlaceholderProps} />\n )}\n </Stack>\n );\n}\n\nexport default FootFallHeatMapView;\n","import type { SxProps, Theme } from '@mui/material/styles';\nimport type { ReactNode } from 'react';\nimport type { ChartEmptyStateProps } from '../../utils/ChartEmptyState';\nimport type {\n FootFallHeatMapTreemapColorCustomization,\n TreemapNode,\n ZoneAnalyticsFlatItem,\n ZoneAnalyticsHierarchy,\n} from './footfallHeatMapTree';\n\nexport const DEFAULT_FOOTFALL_TILE_ICONS = {\n visitors: 'fluent:people-community-16-filled',\n dwell: 'clarity:clock-solid',\n headerInfo: 'mdi:information-outline',\n} as const;\n\nexport type FootFallHeatMapTileIconRole = 'visitors' | 'dwell' | 'header';\n\nexport type FootFallHeatMapIconSizeContext = {\n /** Auto baseline from tile geometry (px). */\n baseIconSize: number;\n role: FootFallHeatMapTileIconRole;\n fontSize: number;\n minDim: number;\n effectiveDim: number;\n};\n\n/** Pixel size or scale from `baseIconSize` / geometry. */\nexport type FootFallHeatMapIconSize =\n | 'auto'\n | number\n | ((ctx: FootFallHeatMapIconSizeContext) => number);\n\n/** `tile` = match tile fill color; otherwise CSS color string or resolver. */\nexport type FootFallHeatMapIconColor =\n | 'tile'\n | string\n | ((ctx: { tileColor: string; role: FootFallHeatMapTileIconRole }) => string);\n\nexport type FootFallHeatMapIcons = {\n /** Iconify id for the visitor count chip in each tile. */\n visitors?: string;\n /** Iconify id for the dwell time chip. */\n dwell?: string;\n /** Iconify id for the title-row info button. */\n headerInfo?: string;\n};\n\n/**\n * Optional `sx` for visitor/dwell **metric chips** inside each treemap `foreignObject` tile\n * (replaces brittle `& foreignObject > .MuiStack-root …` overrides on a parent wrapper).\n */\nexport type FootFallHeatMapTileMetricsCustomization = {\n /** Merged onto the **row** `Stack` that wraps both metric pills (below title / %). */\n metricsRowStackSx?: SxProps<Theme>;\n /** Merged onto each **pill** `Stack` (visitors + dwell) after built-in chip styles. */\n metricPillStackSx?: SxProps<Theme>;\n /** Merged onto the **numeric Typography** inside each pill after built-in styles. */\n metricPillValueTypographySx?: SxProps<Theme>;\n /** Merged onto the **icon circle `Box`** inside each pill after built-in styles. */\n metricPillIconBoxSx?: SxProps<Theme>;\n};\n\nexport type FootFallHeatMapTreemapLayout = {\n /** Pixel height when a breadcrumb strip is visible above the chart. */\n heightWithBreadcrumb?: number;\n /** Pixel height when there is no breadcrumb. */\n heightWithoutBreadcrumb?: number;\n /** Optional pixel height for terminal single-card view (default falls back to `heightWithBreadcrumb`). */\n terminalSingleCardHeight?: number;\n /** Optional pixel height for the blank body below terminal details strip (default: derived from treemap height). */\n leafDetailsBodyHeight?: number;\n /** Recharts treemap aspect ratio (width/height per sector logic). */\n aspectRatio?: number;\n stroke?: string;\n fill?: string;\n /** MUI `sx` merged onto the blank terminal-details body below the KPI strip. */\n leafDetailsBodySx?: SxProps<Theme>;\n /** Per-tile visitor/dwell metric chip styling (merged on real `Stack` / `Typography` / `Box` nodes). */\n tileMetrics?: FootFallHeatMapTileMetricsCustomization;\n /**\n * Treemap tile **fill** tuning: vivid HSL pipeline from **`hashColor(seed)`**, or a full **`tileColorFromSeed`** override.\n * Wired into default **`buildTreemapNodes`** and passed as **`options.tileColorFromSeed`** to **`tree.buildNodes`**.\n */\n tileColors?: FootFallHeatMapTreemapColorCustomization;\n};\n\nexport type FootFallHeatMapTreeOptions = {\n /** Starting hierarchy level shown in treemap for hierarchical payloads. */\n startFromLevel?: 'Country' | 'Region' | 'State' | 'City';\n /**\n * Optional path to a specific hierarchy node to render first.\n * Example: `'India/North'` or `['India', 'North']`.\n * When provided, this takes precedence over `startFromLevel`.\n */\n startFromPath?: string | string[];\n /**\n * `children` (default): render selected node's immediate children.\n * `self`: render only the selected node tile.\n */\n startFromPathMode?: 'children' | 'self';\n /**\n * Behavior at terminal node (no deeper hierarchy, or final Stores level).\n * - `details` (default): compact KPI + segmented detail view (treemap cleared; optional details body below).\n * - `card`: keep drilling into a single treemap tile when there is no zone KPI strip; when a KPI strip is\n * derived for the terminal zone, the duplicate treemap is omitted so only breadcrumb + KPI strip remain.\n */\n terminalNodeView?: 'card' | 'details';\n /** Sort metric when building node weights from API payloads. */\n sortBy?: 'walkins' | 'dwell';\n /**\n * When true, if the root (or a drill level) has exactly one child, the treemap jumps into that child automatically.\n * Default **false** so **Region → State → City** (and other levels) stay visible instead of skipping straight to cities.\n */\n collapseSingleChildLevels?: boolean;\n /**\n * Replace default hierarchy/flat parsing. Return root-level `TreemapNode[]`\n * (each node may nest `list` children).\n */\n buildNodes?: (\n initialData: ZoneAnalyticsHierarchy | ZoneAnalyticsFlatItem[] | null,\n options: {\n sortBy: 'walkins' | 'dwell';\n /** From **`treemap.tileColors`** — use for tile `color` fields (same resolver as built-in tree). */\n tileColorFromSeed?: (seed: string) => string;\n }\n ) => TreemapNode[];\n};\n\n/** KPI numbers used for the summary row and passed to `summaryCards`. */\nexport type FootFallHeatMapSummaryKpis = {\n storeCount: number;\n overallVisitors: number;\n};\n\n/** One summary KPI card above the segmented bar (Iconify icon + title + value). */\nexport type FootFallHeatMapKpiSummaryCardItem = {\n id: string;\n title: string;\n value: number;\n /** Iconify id. Default `mdi:chart-box-outline`. */\n icon?: string;\n /** Merged after shared `statCardSx`. */\n sx?: SxProps<Theme>;\n /** Per-card icon color; falls back to `statCardIconColor`. */\n iconColor?: string;\n};\n\nexport type FootFallHeatMapKpiStripSegmentTooltipRenderContext = {\n segment: {\n id: string;\n label: string;\n value: number;\n color?: string;\n };\n segmentIndex: number;\n itemLabel: string;\n itemValue: number;\n};\n\n/**\n * Optional styling for the zone KPI block: summary stat cards, outer panel, segmented bar, and tooltips.\n * Segment colors cycle by index when the palette is shorter than the number of segments.\n */\nexport type FootFallHeatMapKpiStripPresentation = {\n /** Override segment fills; cycles when fewer entries than segments. */\n segmentColors?: readonly string[];\n /** Bar height in px. */\n barHeight?: number;\n /** Horizontal padding inside the track in px (inset from rounded caps). */\n trackInsetPx?: number;\n /** Track background behind segments. */\n trackBackgroundColor?: string;\n\n /** Merged onto the outer KPI panel (container under the breadcrumb). Applied after built-in layout styles. */\n kpiContainerSx?: SxProps<Theme>;\n /** Merged onto each summary stat card (`Paper`). */\n statCardSx?: SxProps<Theme>;\n /** Icon color for both stat cards. Default `#1565C0`. */\n statCardIconColor?: string;\n /** Zone / row title next to the segmented bar. */\n segmentTitleSx?: SxProps<Theme>;\n /** Total value on the right of the segment row. */\n segmentValueSx?: SxProps<Theme>;\n /** Merged onto the segment tooltip card (popover). */\n segmentTooltipCardSx?: SxProps<Theme>;\n /**\n * Full custom renderer for segmented bar tooltips.\n * When provided, default tooltip card layout is skipped.\n */\n renderSegmentTooltip?: (\n context: FootFallHeatMapKpiStripSegmentTooltipRenderContext\n ) => ReactNode;\n\n /**\n * Build any number of summary KPI cards from live zone metrics. When the returned array is **non-empty**,\n * it replaces the default “No. of Stores” / “Overall Visitors” pair. Return `[]` to hide all summary cards.\n */\n summaryCards?: (\n kpi: FootFallHeatMapSummaryKpis\n ) => readonly FootFallHeatMapKpiSummaryCardItem[];\n};\n\nexport type FootFallHeatMapViewProps = {\n initialData: ZoneAnalyticsHierarchy | ZoneAnalyticsFlatItem[] | null;\n isLoading?: boolean;\n isFetching?: boolean;\n error?: unknown;\n title?: string;\n /** Tooltip on the header info icon. */\n infoTooltip?: string;\n /** Shown in the drill breadcrumb after `/` (e.g. store name). */\n brandLabel?: string;\n\n icons?: FootFallHeatMapIcons;\n iconSize?: FootFallHeatMapIconSize;\n iconColor?: FootFallHeatMapIconColor;\n /** Info button icon width/height in px when `iconSize` is `auto` (header role). */\n headerInfoIconSize?: number;\n\n treemap?: FootFallHeatMapTreemapLayout;\n tree?: FootFallHeatMapTreeOptions;\n /**\n * KPI zone UI: optional **`summaryCards(kpi)`** for any number of summary stat cards; segmented bar; outer\n * panel; `statCardSx` / `statCardIconColor`; segment row + tooltip styling.\n */\n kpiStrip?: FootFallHeatMapKpiStripPresentation;\n emptyStatePlaceholderProps?: ChartEmptyStateProps;\n};\n","/**\n * Internal: KPI strip + single segmented bar for the **active zone** (same layout at every drill level).\n * Not part of the public footfall-heat-map API.\n */\n\nimport type {\n RankedBarListItem,\n RankedBarListSegment,\n} from '../RankedBarList/RankedBarList.types';\n\nimport type { TreemapNode, ZoneKpiStripPayload } from './footfallHeatMapTree';\n\nconst ZONE_SEGMENT_COLORS = [\n '#E5735F',\n '#7EB0C2',\n '#F4C20D',\n '#6D6ED7',\n] as const;\nconst DEFAULT_SEGMENT_LABELS: [string, string, string, string] = [\n 'Walk-by',\n 'Browsing',\n 'Engaged',\n 'Converted',\n];\n\nfunction parseVisitorCount(raw: string | number | undefined): number {\n if (typeof raw === 'number' && Number.isFinite(raw)) return raw;\n if (typeof raw === 'string') {\n const n = Number(String(raw).replace(/[^\\d.]/g, ''));\n return Number.isFinite(n) ? n : 0;\n }\n return 0;\n}\n\nfunction defaultFourParts(total: number): [number, number, number, number] {\n if (total <= 0) return [0, 0, 0, 0];\n const a = Math.round(total * 0.38);\n const b = Math.round(total * 0.32);\n const c = Math.round(total * 0.2);\n const d = total - a - b - c;\n return [a, b, c, d];\n}\n\nfunction rowFromExplicitStrip(\n zoneName: string,\n strip: ZoneKpiStripPayload\n): RankedBarListItem {\n const id = `zone-strip-${encodeURIComponent(zoneName)}`;\n const segments: RankedBarListSegment[] = strip.segments.map((s, i) => ({\n id: `${id}-seg-${i}`,\n label: s.label,\n value: s.value,\n color: ZONE_SEGMENT_COLORS[i],\n }));\n const value = strip.segments.reduce((sum, s) => sum + s.value, 0);\n return { id, label: zoneName, value, segments };\n}\n\nfunction rowFromHeuristicLabel(\n zoneName: string,\n total: number\n): RankedBarListItem {\n const [a, b, c, d] = defaultFourParts(total);\n const id = `zone-heuristic-${encodeURIComponent(zoneName)}`;\n const segments: RankedBarListSegment[] = [a, b, c, d].map((value, i) => ({\n id: `${id}-seg-${i}`,\n label: DEFAULT_SEGMENT_LABELS[i],\n value,\n color: ZONE_SEGMENT_COLORS[i],\n }));\n return { id, label: zoneName, value: a + b + c + d, segments };\n}\n\nexport type FootfallHeatMapDerivedStrip = {\n summaryKpis: { storeCount: number; overallVisitors: number };\n rankedBarList: {\n title: string;\n items: RankedBarListItem[];\n listHeaderLabel: string;\n valueColumnHeader: string;\n };\n};\n\n/**\n * @param activeZone — Last node in the drill path (the zone you are inside). `undefined` at root.\n * @param childTiles — Sibling tiles shown in the treemap (`data.current`).\n */\nexport function deriveFootfallHeatMapKpiStrip(\n activeZone: TreemapNode | undefined,\n childTiles: TreemapNode[]\n): FootfallHeatMapDerivedStrip | null {\n if (activeZone) {\n const childRowsSource = (activeZone.list ?? []).filter(\n n => parseVisitorCount(n.overallData?.count) > 0\n );\n if (childRowsSource.length > 0) {\n const items = childRowsSource.map(node =>\n rowFromHeuristicLabel(\n node.name,\n parseVisitorCount(node.overallData?.count)\n )\n );\n const overallVisitorsFromChildren = childRowsSource.reduce(\n (sum, node) => sum + parseVisitorCount(node.overallData?.count),\n 0\n );\n const fallbackVisitors = parseVisitorCount(activeZone.overallData?.count);\n const overallVisitors =\n overallVisitorsFromChildren > 0\n ? overallVisitorsFromChildren\n : fallbackVisitors;\n const fromExplicitStoreCount = activeZone.zoneKpiStrip?.storeCount;\n const storeCount =\n fromExplicitStoreCount && fromExplicitStoreCount > 0\n ? fromExplicitStoreCount\n : childRowsSource.length;\n\n return {\n summaryKpis: {\n storeCount,\n overallVisitors:\n activeZone.zoneKpiStrip?.overallVisitors ?? overallVisitors,\n },\n rankedBarList: {\n title: `${activeZone.name} store performance`,\n items,\n listHeaderLabel: 'Store',\n valueColumnHeader: 'Visitors',\n },\n };\n }\n\n if (activeZone.zoneKpiStrip) {\n const zs = activeZone.zoneKpiStrip;\n return {\n summaryKpis: {\n storeCount: zs.storeCount,\n overallVisitors: zs.overallVisitors,\n },\n rankedBarList: {\n title: 'Zone breakdown',\n items: [rowFromExplicitStrip(activeZone.name, zs)],\n listHeaderLabel: 'Zone',\n valueColumnHeader: 'Visitors',\n },\n };\n }\n\n const fromNode = parseVisitorCount(activeZone.overallData?.count);\n const fromChildren = childTiles.reduce(\n (s, n) => s + parseVisitorCount(n.overallData?.count),\n 0\n );\n const overallVisitors = fromNode > 0 ? fromNode : fromChildren;\n const storeCount = childTiles.length;\n\n return {\n summaryKpis: { storeCount, overallVisitors },\n rankedBarList: {\n title: 'Zone breakdown',\n items: [rowFromHeuristicLabel(activeZone.name, overallVisitors)],\n listHeaderLabel: 'Zone',\n valueColumnHeader: 'Visitors',\n },\n };\n }\n\n if (!childTiles.length) return null;\n\n const overallVisitors = childTiles.reduce(\n (s, n) => s + parseVisitorCount(n.overallData?.count),\n 0\n );\n const storeCount = childTiles.length;\n\n return {\n summaryKpis: { storeCount, overallVisitors },\n rankedBarList: {\n title: 'Footfall overview',\n items: [rowFromHeuristicLabel('Overview', overallVisitors)],\n listHeaderLabel: 'Scope',\n valueColumnHeader: 'Visitors',\n },\n };\n}\n","/**\n * Treemap data helpers for FootFallHeatMap.\n * Recharts expects nested `children`; our tree uses `list` internally.\n */\n\nexport type ZoneAnalyticsHierarchy = {\n Country?: Record<string, unknown>;\n Region?: Record<string, unknown>;\n State?: Record<string, unknown>;\n City?: Record<string, unknown>;\n};\n\nexport type ZoneAnalyticsFlatItem = {\n category_id: number;\n category_name: string;\n percentage: number;\n visitor_count: number;\n avg_dwell_time: string;\n /** Optional; same shape as hierarchy `zone_kpi_strip` when this row should drive the strip alone. */\n zone_kpi_strip?: Record<string, unknown>;\n};\n\nexport type ZoneAnalyticsMetrics = {\n overall_visits?: number;\n trend?: { direction?: 'up' | 'down'; percentage?: number };\n unique_customer_walkins?: number;\n walkins_trend?: { direction?: 'up' | 'down'; percentage?: number };\n first_visit_count?: number;\n first_visit_trend?: { direction?: 'up' | 'down'; percentage?: number };\n avg_wait_time_per_visitor?: string;\n wait_time_trend?: { direction?: 'up' | 'down'; percentage?: number };\n attended_customers?: number;\n attended_trend?: { direction?: 'up' | 'down'; percentage?: number };\n unattended_customers?: number;\n unattended_trend?: { direction?: 'up' | 'down'; percentage?: number };\n avg_dwell_time?: string;\n dwell_time_trend?: { direction?: 'up' | 'down'; percentage?: number };\n};\n\n/** Optional per-zone KPI + 3-segment bar from API (`zone_kpi_strip` on hierarchy nodes). Same layout at every level; values vary by zone. */\nexport type ZoneKpiStripPayload = {\n storeCount: number;\n overallVisitors: number;\n segments: [\n { label: string; value: number },\n { label: string; value: number },\n { label: string; value: number },\n ];\n};\n\nexport type TreemapNode = {\n name: string;\n value: number;\n originalValue: number;\n color: string;\n overallData: {\n count: number | string;\n dwell: string;\n };\n list: TreemapNode[];\n /** Set when passing to Recharts Treemap (uses `children` for nesting). */\n children?: TreemapNode[];\n leafMetrics?: ZoneAnalyticsMetrics;\n /** When set, KPI strip + single segmented row use these values for this zone (when it is the active drill context). */\n zoneKpiStrip?: ZoneKpiStripPayload;\n _childContainerKey?: string;\n _raw?: number;\n};\n\n/** Recharts Treemap reads `children`, not `list`. */\nexport function toRechartsTreemapData(nodes: TreemapNode[]): TreemapNode[] {\n return nodes.map(n => ({\n ...n,\n children: n.list?.length ? toRechartsTreemapData(n.list) : undefined,\n })) as TreemapNode[];\n}\n\nexport function preprocessData(data: TreemapNode[]): TreemapNode[] {\n if (!data || !Array.isArray(data)) return [];\n\n const processedData = [...data];\n\n const totalValue = processedData.reduce((sum, item) => sum + item.value, 0);\n const threshold = totalValue * 0.05;\n\n return processedData.map(item => ({\n ...item,\n originalValue: item.value,\n value: Math.max(item.value, threshold),\n }));\n}\n\nexport function skipSingleBranchLevels(nodes: TreemapNode[]): TreemapNode[] {\n let currentNodes = preprocessData(nodes);\n let safetyCounter = 0;\n\n while (\n currentNodes.length === 1 &&\n Array.isArray(currentNodes[0]?.list) &&\n currentNodes[0].list.length > 0 &&\n safetyCounter < 10\n ) {\n currentNodes = preprocessData(currentNodes[0].list);\n safetyCounter += 1;\n }\n\n return currentNodes;\n}\n\nexport function parseMinutes(avgDwellTime?: string): number {\n if (!avgDwellTime) return 0;\n\n const m = String(avgDwellTime)\n .trim()\n .match(/([\\d.]+)/);\n\n return m ? Number(m[1]) : 0;\n}\n\nexport function isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nexport function getChildContainer(\n node: unknown\n): { key: string; container: Record<string, unknown> } | null {\n if (!isPlainObject(node)) return null;\n\n /** Prefer geographic / org levels in order so Region → State → City stay distinct in the treemap. */\n const preferred = ['Region', 'State', 'City', 'Stores', 'Zones'];\n for (const k of preferred) {\n if (isPlainObject(node[k]))\n return { key: k, container: node[k] as Record<string, unknown> };\n }\n\n for (const [k, v] of Object.entries(node)) {\n if (\n [\n 'total_footfall',\n 'avg_dwell_time',\n 'data',\n 'zone_kpi_strip',\n 'zoneKpiStrip',\n ].includes(k)\n )\n continue;\n if (isPlainObject(v)) return { key: k, container: v };\n }\n\n return null;\n}\n\nexport function metricForNode(\n node: unknown,\n sortBy: 'walkins' | 'dwell'\n): number {\n if (!node) return 0;\n const n = node as Record<string, unknown>;\n const data = n.data as Record<string, unknown> | undefined;\n if (data?.overall_visits != null) {\n return sortBy === 'walkins'\n ? Number(data.overall_visits)\n : parseMinutes(data.avg_dwell_time as string);\n }\n\n if (n.total_footfall != null) {\n return sortBy === 'walkins'\n ? Number(n.total_footfall)\n : parseMinutes(n.avg_dwell_time as string);\n }\n\n if (n.visitor_count != null) {\n return sortBy === 'walkins'\n ? Number(n.visitor_count)\n : parseMinutes(n.avg_dwell_time as string);\n }\n\n return 0;\n}\n\n/** Read optional `zone_kpi_strip` / `zoneKpiStrip` from a hierarchy or flat API node. */\nexport function parseZoneKpiStripFromRaw(\n node: Record<string, unknown>\n): ZoneKpiStripPayload | undefined {\n const raw = node.zone_kpi_strip ?? node.zoneKpiStrip;\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;\n const r = raw as Record<string, unknown>;\n const storeCount = Number(r.store_count ?? r.storeCount);\n const overallVisitors = Number(r.overall_visitors ?? r.overallVisitors);\n const segRaw = r.segments;\n if (!Array.isArray(segRaw) || segRaw.length !== 3) return undefined;\n const triple = segRaw.map((item, i) => {\n const o = item as Record<string, unknown>;\n return {\n label: String(o.label ?? `Segment ${i + 1}`),\n value: Number(o.value ?? 0),\n };\n });\n if (\n !Number.isFinite(storeCount) ||\n !Number.isFinite(overallVisitors) ||\n triple.some(t => !Number.isFinite(t.value))\n ) {\n return undefined;\n }\n return {\n storeCount,\n overallVisitors,\n segments: [triple[0], triple[1], triple[2]],\n };\n}\n\nexport function hashColor(seed: string): string {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h * 31 + seed.charCodeAt(i)) >>> 0;\n\n const r = 80 + (h & 0x7f);\n const g = 80 + ((h >> 7) & 0x7f);\n const b = 80 + ((h >> 14) & 0x7f);\n\n const toHex = (x: number) => x.toString(16).padStart(2, '0');\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const m = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(hex.trim());\n if (!m) return null;\n\n return {\n r: parseInt(m[1], 16),\n g: parseInt(m[2], 16),\n b: parseInt(m[3], 16),\n };\n}\n\nfunction rgbToHsl(\n r: number,\n g: number,\n b: number\n): { h: number; s: number; l: number } {\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const l = (max + min) / 2;\n let h = 0;\n let s = 0;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case rn:\n h = (gn - bn) / d + (gn < bn ? 6 : 0);\n break;\n case gn:\n h = (bn - rn) / d + 2;\n break;\n default:\n h = (rn - gn) / d + 4;\n }\n h /= 6;\n }\n\n return { h, s, l };\n}\n\nfunction hslToRgb(\n h: number,\n s: number,\n l: number\n): {\n r: number;\n g: number;\n b: number;\n} {\n let r: number;\n let g: number;\n let b: number;\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const hue2rgb = (t: number) => {\n let x = t;\n if (x < 0) x += 1;\n if (x > 1) x -= 1;\n if (x < 1 / 6) return p + (q - p) * 6 * x;\n if (x < 1 / 2) return q;\n if (x < 2 / 3) return p + (q - p) * (2 / 3 - x) * 6;\n\n return p;\n };\n r = hue2rgb(h + 1 / 3);\n g = hue2rgb(h);\n b = hue2rgb(h - 1 / 3);\n }\n\n return {\n r: Math.round(Math.min(255, Math.max(0, r * 255))),\n g: Math.round(Math.min(255, Math.max(0, g * 255))),\n b: Math.round(Math.min(255, Math.max(0, b * 255))),\n };\n}\n\n/**\n * Optional treemap tile fill: **vivid** HSL tuning from **`hashColor(seed)`**, or a full **`tileColorFromSeed`** override.\n * Pass **`treemap.tileColors`** on **`FootFallHeatMapView`**, or use **`createTreemapTileColorResolver`** inside **`tree.buildNodes`**.\n */\nexport type FootFallHeatMapTreemapColorCustomization = {\n /** Replace the built-in vivid / hash pipeline entirely. */\n tileColorFromSeed?: (seed: string) => string;\n /** Multiply base saturation after conversion to HSL. @default **1.48** */\n saturationBoost?: number;\n /** Added after boost; result is clamped to **1**. @default **0.1** */\n saturationFloor?: number;\n /** Clamp lightness lower bound (**0–1**). @default **0.38** */\n lightnessClampMin?: number;\n /** Clamp lightness upper bound (**0–1**). @default **0.55** */\n lightnessClampMax?: number;\n /** Scale base lightness from hash before clamp. @default **0.96** */\n lightnessScale?: number;\n /** Offset after scale. @default **0.02** */\n lightnessOffset?: number;\n};\n\n/**\n * - **`undefined` / `null`** → **`hashColor`** only.\n * - **`{ tileColorFromSeed }`** → use that resolver.\n * - **Any other object** (including **`{}`**) → vivid HSL pipeline with defaults merged from **`customization`**.\n */\nexport function createTreemapTileColorResolver(\n customization?: FootFallHeatMapTreemapColorCustomization | null\n): (seed: string) => string {\n if (customization?.tileColorFromSeed) {\n return customization.tileColorFromSeed;\n }\n if (customization == null) {\n return (seed: string) => hashColor(seed);\n }\n\n const saturationBoost = customization.saturationBoost ?? 1.48;\n const saturationFloor = customization.saturationFloor ?? 0.1;\n const lightnessClampMin = customization.lightnessClampMin ?? 0.38;\n const lightnessClampMax = customization.lightnessClampMax ?? 0.55;\n const lightnessScale = customization.lightnessScale ?? 0.96;\n const lightnessOffset = customization.lightnessOffset ?? 0.02;\n\n return (seed: string) => {\n const base = hashColor(seed);\n const rgb = hexToRgb(base);\n if (!rgb) return base;\n const { h, s: s0, l: l0 } = rgbToHsl(rgb.r, rgb.g, rgb.b);\n const s = Math.min(1, s0 * saturationBoost + saturationFloor);\n const l = Math.min(\n lightnessClampMax,\n Math.max(lightnessClampMin, l0 * lightnessScale + lightnessOffset)\n );\n const out = hslToRgb(h, s, l);\n const hx = (n: number) => n.toString(16).padStart(2, '0');\n\n return `#${hx(out.r)}${hx(out.g)}${hx(out.b)}`;\n };\n}\n\nexport function buildTreemapNodes({\n container,\n sortBy,\n pathKey,\n tileColorFromSeed,\n}: {\n container: Record<string, unknown>;\n sortBy: 'walkins' | 'dwell';\n pathKey: string;\n /** When set, used for `color`; otherwise **`hashColor(\\`${pathKey}/${name}\\`)`**. */\n tileColorFromSeed?: (seed: string) => string;\n}): TreemapNode[] {\n const entries = Object.entries(container);\n const total =\n entries.reduce((sum, [, v]) => sum + metricForNode(v, sortBy), 0) || 1;\n\n return entries.map(([name, node]): TreemapNode => {\n const raw = metricForNode(node, sortBy);\n const percentage = (raw / total) * 100;\n const seed = `${pathKey}/${name}`;\n const color = tileColorFromSeed ? tileColorFromSeed(seed) : hashColor(seed);\n\n const childContainer = getChildContainer(node);\n const n = node as Record<string, unknown>;\n const leafMetrics: ZoneAnalyticsMetrics | undefined = n?.data\n ? (n.data as ZoneAnalyticsMetrics)\n : undefined;\n const dataMetrics = n?.data as ZoneAnalyticsMetrics | undefined;\n const countRaw =\n n?.total_footfall ?? n?.visitor_count ?? dataMetrics?.overall_visits ?? 0;\n const zoneKpiStrip = parseZoneKpiStripFromRaw(n);\n\n return {\n name,\n value: percentage,\n originalValue: percentage,\n color,\n overallData: {\n count:\n typeof countRaw === 'number' || typeof countRaw === 'string'\n ? countRaw\n : 0,\n dwell:\n (n?.avg_dwell_time as string) ?? dataMetrics?.avg_dwell_time ?? '0m',\n },\n list: childContainer\n ? buildTreemapNodes({\n container: childContainer.container,\n sortBy,\n pathKey: `${pathKey}/${name}`,\n tileColorFromSeed,\n })\n : [],\n leafMetrics,\n zoneKpiStrip,\n _childContainerKey: childContainer?.key,\n _raw: raw,\n };\n });\n}\n\nexport function getNestedList(\n payload: TreemapNode & { children?: TreemapNode[] }\n): TreemapNode[] | undefined {\n if (payload.list?.length) return payload.list;\n if (payload.children?.length) return payload.children;\n return undefined;\n}\n","import Grid from '@mui/material/Grid';\nimport Paper from '@mui/material/Paper';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { ZoneAnalyticsMetrics } from './footfallHeatMapTree';\n\ntype KpiRow = {\n id: number;\n title: string;\n value: string | number;\n};\n\nfunction metricsToRows(metrics: ZoneAnalyticsMetrics): KpiRow[] {\n return [\n { id: 1, title: 'Overall Visits', value: metrics.overall_visits ?? 0 },\n {\n id: 2,\n title: 'Unique Visitors',\n value: metrics.unique_customer_walkins ?? 0,\n },\n {\n id: 3,\n title: 'First Visit Count',\n value: metrics.first_visit_count ?? 0,\n },\n {\n id: 4,\n title: 'Average Wait Time',\n value: metrics.avg_wait_time_per_visitor ?? '0m',\n },\n {\n id: 5,\n title: 'Attended Customers',\n value: metrics.attended_customers ?? 0,\n },\n {\n id: 6,\n title: 'Unattended Customers',\n value: metrics.unattended_customers ?? 0,\n },\n {\n id: 7,\n title: 'Avg. Dwell Time (Mins)',\n value: metrics.avg_dwell_time ?? '0m',\n },\n ];\n}\n\n/** Zone KPI grid using MUI layout. */\nconst ZoneWiseKpiCards = ({ metrics }: { metrics: ZoneAnalyticsMetrics }) => {\n const rows = metricsToRows(metrics);\n\n return (\n <Grid container spacing={3} sx={{ marginTop: '10px', paddingX: '6px' }}>\n {rows.map(item => (\n <Grid\n key={item.id}\n size={{\n xs: 12,\n sm: 6,\n md: 3,\n }}\n >\n <Paper\n elevation={0}\n sx={{\n p: 2,\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#FAFAFA',\n height: '100%',\n }}\n >\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n fontWeight={600}\n >\n {item.title}\n </Typography>\n <Stack mt={1}>\n <Typography variant=\"h6\" fontWeight={700}>\n {item.value}\n </Typography>\n </Stack>\n </Paper>\n </Grid>\n ))}\n </Grid>\n );\n};\n\nexport default ZoneWiseKpiCards;\n","import type { ChartWidgetInfoPopoverContent } from '../../ChartWidgetInfoButton/ChartWidgetInfoButton.types';\n\nexport const DEFAULT_PEAK_BILLING_HOURS_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n {\n title: 'Peak Billing Hours',\n description:\n 'Hourly billing-counter volume for the selected window. Switch tabs to compare visits, average queue time, or alerts.',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'See which hours drive the most counter traffic.',\n 'Align staffing with peaks and quiet periods.',\n 'Compare metrics across the segmented views.',\n ],\n };\n","import type { ChartWidgetSegmentedTab } from '../../tabs/ChartWidgetSegmentedTabs';\nimport type { PeakBillingHoursPoint } from './PeakBillingHours.types';\n\nexport const peakBillingHoursDefaultTabs: ChartWidgetSegmentedTab[] = [\n { id: 'visits', label: 'Billing Counter Visits' },\n { id: 'queue', label: 'Avg. Queue Time' },\n { id: 'alerts', label: 'Alerts Generated' },\n];\n\n/** Matches the **Billing Counter Visits** demo (last 7 days style). */\nexport const peakBillingHoursVisitsMock: PeakBillingHoursPoint[] = [\n { label: '12pm', value: 42 },\n { label: '10am', value: 32 },\n { label: '1pm', value: 29 },\n { label: '11am', value: 25 },\n { label: '8am', value: 23 },\n { label: '7am', value: 19 },\n { label: '9am', value: 12 },\n { label: '2pm', value: 0 },\n { label: '3pm', value: 0 },\n { label: '4pm', value: 0 },\n { label: '5pm', value: 0 },\n { label: '6pm', value: 0 },\n { label: '7pm', value: 0 },\n { label: '8pm', value: 0 },\n];\n\nfunction scaledRow(\n row: PeakBillingHoursPoint,\n factor: number,\n bias: number\n): PeakBillingHoursPoint {\n const v = Math.max(0, Math.round(row.value * factor + bias));\n return { label: row.label, value: v };\n}\n\nexport const peakBillingHoursMockSeriesByTabId: Record<\n string,\n PeakBillingHoursPoint[]\n> = {\n visits: peakBillingHoursVisitsMock,\n queue: peakBillingHoursVisitsMock.map(r =>\n scaledRow(r, 0.35, r.value > 0 ? 2 : 0)\n ),\n alerts: peakBillingHoursVisitsMock.map(r =>\n scaledRow(r, 0.12, r.value > 0 ? 1 : 0)\n ),\n};\n","import Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport * as React from 'react';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n LabelList,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport {\n BILLING_COUNTER_LINE_PRIMARY,\n BILLING_COUNTER_TABS_TRACK_BG,\n} from '../../BillingCounterAnalytics/billingCounterAnalytics.chartTokens';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport { mergeSx } from '../../BillingCounterAnalytics/billingCounterAnalyticsCustomization.merge';\nimport { ChartWidgetHeaderSeparator } from '../../utils/ChartWidgetHeaderSeparator';\nimport { ChartWidgetInfoButton } from '../../ChartWidgetInfoButton';\nimport { ChartWidgetSegmentedTabs } from '../../tabs/ChartWidgetSegmentedTabs';\nimport { DEFAULT_PEAK_BILLING_HOURS_INFO_POPOVER } from './peakBillingHours.defaultInfoPopover';\nimport {\n PeakBillingHoursCustomizationProvider,\n usePeakBillingHoursCustomization,\n} from './PeakBillingHoursCustomizationContext';\nimport type {\n PeakBillingHoursProps,\n PeakBillingHoursTooltipRenderContext,\n} from './PeakBillingHours.types';\nimport { PeakBillingHoursTooltip } from './PeakBillingHoursTooltip';\n\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_CHART_AXIS_TICK_FILL = '#64748B' as const;\n\ninterface BarValueLabelProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n value?: number | string | null;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction PeakBarTopLabel(\n props: BarValueLabelProps & {\n fill: string;\n fontSize: number;\n fontWeight: number;\n }\n): React.ReactElement | null {\n const { x, y, width, value, fill, fontSize, fontWeight } = props;\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n if (nx === undefined || ny === undefined || nw === undefined) {\n return null;\n }\n const n =\n value === null || value === undefined\n ? NaN\n : typeof value === 'number'\n ? value\n : Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n return null;\n }\n const cx = nx + nw / 2;\n const cy = ny - 6;\n return (\n <text\n x={cx}\n y={cy}\n fill={fill}\n fontSize={fontSize}\n fontWeight={fontWeight}\n textAnchor=\"middle\"\n >\n {String(Math.round(n))}\n </text>\n );\n}\n\nfunction BarPlot({\n data,\n yAxisDomain,\n yAxisTicks,\n activeTabId,\n renderTooltip,\n}: {\n data: { label: string; value: number }[];\n yAxisDomain: [number, number];\n yAxisTicks: number[];\n activeTabId: string;\n renderTooltip?: PeakBillingHoursProps['renderTooltip'];\n}): React.ReactElement {\n const { barChart: bc } = usePeakBillingHoursCustomization();\n const height = bc?.heightPx ?? 320;\n const barColor = bc?.barColor ?? BILLING_COUNTER_LINE_PRIMARY;\n const barRadius = bc?.barRadius ?? 0;\n const gridStroke =\n bc?.gridStroke ?? OLY_DEFAULT_COMPOSED_CHART_CHROME.cartesianGridStroke;\n const dash = bc?.gridStrokeDasharray ?? '3 3';\n const m = {\n top: bc?.margin?.top ?? 28,\n right: bc?.margin?.right ?? 12,\n bottom: bc?.margin?.bottom ?? 8,\n left: bc?.margin?.left ?? 4,\n };\n const xFill = bc?.xAxisTickFill ?? OLY_DEFAULT_CHART_AXIS_TICK_FILL;\n const yFill = bc?.yAxisTickFill ?? OLY_DEFAULT_CHART_AXIS_TICK_FILL;\n const yWidth = bc?.yAxisWidth ?? 32;\n const labelFill = bc?.barValueLabelFill ?? '#374151';\n const labelFs = bc?.barValueLabelFontSizePx ?? 12;\n const hoverBandFill = bc?.hoverBandFill ?? 'rgba(226, 232, 240, 0.75)';\n const categoryGap = bc?.barCategoryGap ?? '18%';\n const barGap = bc?.barGap ?? 4;\n\n const radiusTuple: [number, number, number, number] = [\n barRadius,\n barRadius,\n barRadius,\n barRadius,\n ];\n\n return (\n <Box sx={{ width: '100%', height, mt: 0.5 }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart\n data={data}\n margin={m}\n barCategoryGap={categoryGap}\n barGap={barGap}\n >\n <CartesianGrid\n strokeDasharray={dash}\n vertical={false}\n stroke={gridStroke}\n />\n <XAxis\n dataKey=\"label\"\n tick={{ fill: xFill, fontSize: 11 }}\n tickLine={false}\n axisLine={{\n stroke: OLY_DEFAULT_COMPOSED_CHART_CHROME.axisTickLineStroke,\n }}\n interval={0}\n height={36}\n />\n <YAxis\n domain={yAxisDomain}\n ticks={yAxisTicks}\n tick={{ fill: yFill, fontSize: 11 }}\n tickLine={false}\n axisLine={false}\n width={yWidth}\n />\n <Tooltip\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n data,\n activeTabId,\n } satisfies PeakBillingHoursTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return <PeakBillingHoursTooltip {...tooltipProps} />;\n }}\n cursor={{\n fill: hoverBandFill,\n stroke: 'transparent',\n strokeWidth: 0,\n }}\n allowEscapeViewBox={{ x: false, y: true }}\n />\n <Bar\n dataKey=\"value\"\n name=\"Visits\"\n fill={barColor}\n radius={radiusTuple}\n isAnimationActive={false}\n maxBarSize={48}\n >\n <LabelList\n dataKey=\"value\"\n content={(props: unknown) => (\n <PeakBarTopLabel\n {...(props as BarValueLabelProps)}\n fill={labelFill}\n fontSize={labelFs}\n fontWeight={500}\n />\n )}\n />\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n </Box>\n );\n}\n\n/**\n * Peak billing hours card: title + subtitle, info control, violet segmented tabs (intrinsic),\n * vertical bar chart with square tops, value labels, and panel tooltip.\n */\nexport function PeakBillingHours({\n title = 'Peak Billing Hours',\n subtitle = '(Last 7 days)',\n tabs,\n activeTabId,\n onTabChange,\n data,\n seriesByTabId,\n yAxisDomain = [0, 50],\n yAxisTicks = [0, 10, 20, 30, 40, 50],\n infoPopover,\n renderTooltip,\n emptyStatePlaceholderProps,\n customization,\n}: PeakBillingHoursProps): React.ReactElement {\n const chartData = React.useMemo(() => {\n if (seriesByTabId) {\n return seriesByTabId[activeTabId] ?? [];\n }\n return data ?? [];\n }, [seriesByTabId, data, activeTabId]);\n\n const resolvedInfo =\n infoPopover === undefined\n ? DEFAULT_PEAK_BILLING_HOURS_INFO_POPOVER\n : infoPopover;\n\n const rootSx = mergeSx(\n {\n bgcolor: '#FFFFFF',\n borderRadius: 2,\n boxShadow: '0 1px 3px rgba(15, 23, 42, 0.08)',\n },\n customization?.rootCard?.sx\n );\n\n const st = customization?.segmentedTabs;\n const titleSx = mergeSx(\n {\n fontWeight: 700,\n fontSize: { xs: '1rem', sm: '1.05rem' },\n color: '#0f172a',\n display: 'inline',\n },\n customization?.header?.titleSx\n );\n const subtitleSx = mergeSx(\n {\n display: 'inline',\n ml: 0.75,\n color: '#6B7280',\n fontSize: '0.9375rem',\n fontWeight: 400,\n },\n customization?.header?.subtitleSx\n );\n\n return (\n <PeakBillingHoursCustomizationProvider value={customization ?? {}}>\n <Card elevation={customization?.rootCard?.elevation ?? 0} sx={rootSx}>\n <CardContent>\n <Stack spacing={1.75} sx={{ width: '100%' }}>\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n gap={2}\n flexWrap=\"wrap\"\n >\n <Box component=\"div\" sx={{ minWidth: 0 }}>\n <Typography component=\"span\" sx={titleSx}>\n {title}\n </Typography>\n <Typography component=\"span\" sx={subtitleSx}>\n {subtitle}\n </Typography>\n </Box>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.5}\n sx={{ flexShrink: 0 }}\n >\n {resolvedInfo ? (\n <>\n <ChartWidgetHeaderSeparator />\n <ChartWidgetInfoButton\n popover={resolvedInfo}\n ariaLabel=\"Peak billing hours information\"\n />\n </>\n ) : null}\n </Stack>\n </Stack>\n\n <ChartWidgetSegmentedTabs\n tabs={tabs}\n activeTabId={activeTabId}\n onTabChange={onTabChange}\n ariaLabel=\"Peak billing metric\"\n trackBackgroundColor={\n st?.trackBackgroundColor ?? BILLING_COUNTER_TABS_TRACK_BG\n }\n activeTabBackground={\n st?.activeTabBackground ?? BILLING_COUNTER_LINE_PRIMARY\n }\n activeTabColor={st?.activeTabColor ?? '#ffffff'}\n inactiveTabColor={st?.inactiveTabColor ?? '#525252'}\n activeTabBoxShadow={st?.activeTabBoxShadow ?? 'none'}\n fullWidth={st?.fullWidth ?? true}\n tabFontSize={st?.tabFontSize ?? 14}\n rootSx={st?.rootSx}\n tabLayout={st?.tabLayout ?? 'equalWidth'}\n activeTabFontWeight={st?.activeTabFontWeight ?? 700}\n inactiveTabFontWeight={st?.inactiveTabFontWeight ?? 600}\n />\n\n {chartData.length > 0 ? (\n <BarPlot\n data={chartData}\n yAxisDomain={yAxisDomain}\n yAxisTicks={yAxisTicks}\n activeTabId={activeTabId}\n renderTooltip={renderTooltip}\n />\n ) : (\n <ChartEmptyState\n minHeight={320}\n {...emptyStatePlaceholderProps}\n />\n )}\n </Stack>\n </CardContent>\n </Card>\n </PeakBillingHoursCustomizationProvider>\n );\n}\n\nexport default PeakBillingHours;\n","import * as React from 'react';\nimport type { PeakBillingHoursCustomization } from './peakBillingHours.customization.types';\n\nconst PeakBillingHoursCustomizationContext =\n React.createContext<PeakBillingHoursCustomization>({});\n\nexport type PeakBillingHoursCustomizationProviderProps = {\n value: PeakBillingHoursCustomization;\n children: React.ReactNode;\n};\n\nexport function PeakBillingHoursCustomizationProvider({\n value,\n children,\n}: PeakBillingHoursCustomizationProviderProps): React.ReactElement {\n const memo = React.useMemo(() => value, [value]);\n return (\n <PeakBillingHoursCustomizationContext.Provider value={memo}>\n {children}\n </PeakBillingHoursCustomizationContext.Provider>\n );\n}\n\nexport function usePeakBillingHoursCustomization(): PeakBillingHoursCustomization {\n return React.useContext(PeakBillingHoursCustomizationContext);\n}\n","import * as React from 'react';\nimport type { TooltipContentProps } from 'recharts';\nimport { mergeCss } from '../../BillingCounterAnalytics/billingCounterAnalyticsCustomization.merge';\nimport { usePeakBillingHoursCustomization } from './PeakBillingHoursCustomizationContext';\n\nfunction formatTooltipValue(n: number): string {\n return new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }).format(\n Math.round(n)\n );\n}\n\nexport function PeakBillingHoursTooltip(\n props: TooltipContentProps\n): React.ReactElement | null {\n const { active, payload, label } = props;\n const { barChart: bc } = usePeakBillingHoursCustomization();\n const tt = bc?.tooltip;\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const raw = payload[0]?.value;\n const num =\n typeof raw === 'number' ? raw : typeof raw === 'string' ? Number(raw) : NaN;\n if (!Number.isFinite(num)) {\n return null;\n }\n\n const labelText = label !== undefined && label !== null ? String(label) : '—';\n\n const borderColor = tt?.borderColor ?? '#E5E7EB';\n const radius = tt?.borderRadiusPx ?? 0;\n const shadow = tt?.boxShadow ?? '0 4px 14px rgba(15, 23, 42, 0.12)';\n const topBg = tt?.topBarBackground ?? '#E5E7EB';\n const topH = tt?.topBarHeightPx ?? 8;\n const bodyBg = tt?.bodyBackground ?? '#FFFFFF';\n const fs = tt?.fontSizePx ?? 13;\n const gap = tt?.lineGapPx ?? 6;\n const dateP = tt?.dateLabelPrefix ?? 'Date: ';\n const totalP = tt?.totalLabelPrefix ?? 'Total: ';\n const prefixFw = tt?.prefixFontWeight ?? 400;\n const valueFw = tt?.valueFontWeight ?? 700;\n\n const uniformText =\n tt?.textColor != null &&\n tt?.prefixColor === undefined &&\n tt?.valueColor === undefined;\n const prefixCol = uniformText ? tt.textColor : (tt?.prefixColor ?? '#6B7280');\n const valueCol = uniformText ? tt.textColor : (tt?.valueColor ?? '#111827');\n\n const rowStyle: React.CSSProperties = {\n fontSize: fs,\n lineHeight: 1.35,\n margin: 0,\n };\n\n const bodyStyle = mergeCss(\n {\n boxSizing: 'border-box',\n backgroundColor: bodyBg,\n padding: '10px 12px',\n },\n tt?.bodyStyle\n );\n\n return (\n <div\n style={{\n pointerEvents: 'none',\n minWidth: 160,\n maxWidth: 280,\n }}\n >\n <div\n style={{\n border: `1px solid ${borderColor}`,\n borderRadius: radius,\n overflow: 'hidden',\n backgroundColor: bodyBg,\n boxShadow: shadow,\n }}\n >\n <div\n style={{\n height: topH,\n backgroundColor: topBg,\n flexShrink: 0,\n }}\n aria-hidden\n />\n <div style={bodyStyle}>\n <div style={rowStyle}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {dateP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {labelText}\n </span>\n </div>\n <div style={{ ...rowStyle, marginTop: gap }}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {totalP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {formatTooltipValue(num)}\n </span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import CssBaseline from '@mui/material/CssBaseline';\nimport {\n ThemeProvider,\n createTheme,\n responsiveFontSizes,\n} from '@mui/material/styles';\nimport React from 'react';\nimport type {\n FalconThemeMode,\n FalconThemeProviderProps,\n} from './FalconThemeProvider.types';\n\n// ─── Brand palette ────────────────────────────────────────────────────────────\n\nconst lightColor = '51, 48, 60';\nconst darkColor = '228, 230, 244';\nconst darkPaperBg = '#2F3349';\n\nfunction buildPalette(mode: FalconThemeMode) {\n const mainColor = mode === 'light' ? lightColor : darkColor;\n\n return {\n mode,\n primary: {\n light: 'rgba(103, 80, 164, 0.02)',\n main: '#d8c5f9',\n dark: '#8710D8',\n contrastText: '#FFF',\n },\n secondary: {\n light: '#EFEFEF',\n main: '#1D192B',\n dark: '#949699',\n contrastText: '#FFF',\n },\n error: {\n light: '#ED6F70',\n main: '#EA5455',\n dark: '#CE4A4B',\n contrastText: '#FFF',\n },\n warning: {\n light: '#FFAB5A',\n main: '#FF9F43',\n dark: '#E08C3B',\n contrastText: '#FFF',\n },\n info: {\n light: '#1FD5EB',\n main: '#00CFE8',\n dark: '#00B6CC',\n contrastText: '#FFF',\n },\n success: {\n light: '#42CE80',\n main: '#28C76F',\n dark: '#23AF62',\n contrastText: '#FFF',\n },\n text: {\n primary: `rgba(${mainColor}, 0.87)`,\n secondary: `rgba(${mainColor}, 0.6)`,\n disabled: `rgba(${mainColor}, 0.38)`,\n },\n divider: `rgba(${mainColor}, 0.12)`,\n background: {\n paper: mode === 'light' ? '#F2EBFF' : darkPaperBg,\n default: mode === 'light' ? '#F8F7FA' : '#25293C',\n },\n action: {\n active: `rgba(${mainColor}, 0.54)`,\n hover: `rgba(${mainColor}, 0.04)`,\n selected: `rgba(${mainColor}, 0.08)`,\n disabled: `rgba(${mainColor}, 0.26)`,\n disabledBackground: `rgba(${mainColor}, 0.12)`,\n focus: `rgba(${mainColor}, 0.12)`,\n },\n };\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport const FalconThemeProvider = ({\n children,\n mode: modeProp,\n settings,\n}: FalconThemeProviderProps) => {\n const mode: FalconThemeMode = settings?.mode ?? modeProp ?? 'light';\n const direction = settings?.direction ?? 'ltr';\n\n const theme = responsiveFontSizes(\n createTheme({\n direction,\n palette: buildPalette(mode),\n shape: { borderRadius: 6 },\n typography: { fontFamily: '\"Inter\", \"Public Sans\", sans-serif' },\n mixins: { toolbar: { minHeight: 64 } },\n })\n );\n\n return (\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n );\n};\n"],"mappings":"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","names":["mergeSx","import_material","import_material","import_jsx_runtime","import_react","ClickAwayListener","Autocomplete","Box","Checkbox","TextField","Popper","ButtonBase","import_jsx_runtime","CloseIcon","import_material","import_jsx_runtime","import_react","import_Box","import_ClickAwayListener","import_Popper","import_styles","React","import_jsx_runtime","Box","Stack","Typography","IconButton","Popper","ClickAwayListener","import_jsx_runtime","Divider","import_react","import_Box","import_Typography","import_jsx_runtime","Box","Typography","import_react","import_Box","import_Checkbox","import_ClickAwayListener","import_Popper","import_Stack","import_TextField","import_Typography","import_styles","React","import_jsx_runtime","defaultTriggerBg","Box","Stack","Typography","Popper","ClickAwayListener","Paper","List","TextField","InputAdornment","ListItemButton","Checkbox","ListItemText","Button","import_react","import_Box","import_IconButton","import_Stack","import_Typography","React","import_jsx_runtime","Box","Typography","Tooltip","Stack","IconButton","import_Box","import_Stack","React","React","import_jsx_runtime","mergeSx","import_jsx_runtime","mergeSx","Box","ToggleButtonGroup","ToggleButton","Stack","import_Box","React","import_jsx_runtime","Box","import_react","import_Box","import_Paper","import_Stack","import_Tooltip","import_Typography","import_react","import_jsx_runtime","defaultIconColor","Tooltip","Typography","cardMinHeightPx","cardMaxHeightPx","Paper","Box","Stack","import_material","import_jsx_runtime","MuiButton","import_material","import_jsx_runtime","import_material","import_jsx_runtime","Icon","import_material","import_jsx_runtime","import_material","import_jsx_runtime","import_Stack","import_styles","import_jsx_runtime","Switch","Stack","import_material","import_react","import_jsx_runtime","import_material","import_jsx_runtime","import_material","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_Box","import_Divider","import_Stack","import_Typography","React","import_jsx_runtime","mergeCss","Box","Stack","Typography","Divider","import_Box","import_Divider","import_Stack","import_Typography","React","import_recharts","import_jsx_runtime","OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX","OLY_DEFAULT_COMPOSED_CHART_CHROME","mergeCss","sxChain","defaultMinWidthPerCategory","defaultMaxBarThickness","chartWidthAxisGutter","defaultChartMargin","defaultChartColors","formatBarLabel","Box","Stack","Typography","Divider","import_Box","import_Divider","import_Stack","import_Typography","React","import_recharts","React","import_jsx_runtime","OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX","OLY_DEFAULT_COMPOSED_CHART_CHROME","mergeCss","sxChain","formatBarLabel","formatYAxisTickDefault","toNum","defaultMinWidthPerCategory","defaultMaxBarThickness","chartWidthAxisGutter","defaultChartMargin","topReserveForBarLabels","topReserveNoBarLabels","defaultChartColors","Box","Stack","Typography","Divider","import_Box","import_Stack","import_styles","import_Typography","React","import_recharts","import_jsx_runtime","resolveCardMaxWidth","useMediaQuery","Box","Stack","Typography","import_Box","import_Divider","import_Stack","import_Typography","React","import_recharts","import_jsx_runtime","OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX","OLY_DEFAULT_COMPOSED_CHART_CHROME","tooltipDatumFromPayload","mergeCss","sxChain","formatBarLabel","formatYAxisTickDefault","toNum","BarTopLabel","defaultMinWidthPerCategory","defaultMaxBarThickness","chartWidthAxisGutter","defaultChartMargin","topReserveForBarLabels","topReserveNoBarLabels","defaultChartColors","Box","Stack","Typography","Divider","import_Box","import_Stack","import_Typography","React","import_recharts","mergeCss","mergeSx","React","import_jsx_runtime","import_jsx_runtime","mergeCss","import_jsx_runtime","OLY_DEFAULT_COMPOSED_CHART_CHROME","Box","mergeSx","Card","CardContent","Stack","Typography","import_Box","import_Card","import_CardContent","import_Stack","import_Typography","import_useMediaQuery","React","import_material","import_styles","React","import_recharts","React","import_jsx_runtime","import_jsx_runtime","import_Box","import_Stack","import_Typography","React","import_recharts","import_jsx_runtime","Box","Stack","Typography","mergeSx","import_Box","import_Stack","import_Tooltip","import_Typography","React","import_jsx_runtime","segmentTooltipPopperSx","defaultSegmentTooltipCardSx","Box","Stack","Typography","Tooltip","mergeSx","import_jsx_runtime","useMediaQuery","mergeSx","Card","CardContent","Stack","Typography","Box","Grid","import_react","import_material","React","import_recharts","overallVisitors","storeCount","import_jsx_runtime","p","import_Grid","import_Paper","import_Stack","import_Typography","import_jsx_runtime","Grid","Paper","Typography","Stack","import_Box","import_Card","import_CardContent","import_Stack","import_Typography","React","import_recharts","React","import_jsx_runtime","import_jsx_runtime","formatTooltipValue","mergeCss","import_jsx_runtime","OLY_DEFAULT_COMPOSED_CHART_CHROME","OLY_DEFAULT_CHART_AXIS_TICK_FILL","toNum","Box","mergeSx","Card","CardContent","Stack","Typography","import_styles","import_jsx_runtime","CssBaseline"]}