@grafana/flamegraph
Version:
Grafana flamegraph visualization component
1 lines • 43.1 kB
Source Map (JSON)
{"version":3,"file":"FlameGraphContainer.cjs","sources":["../../src/FlameGraphContainer.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport uFuzzy from '@leeoniya/ufuzzy';\nimport { useCallback, useEffect, useMemo, useState, useRef } from 'react';\nimport * as React from 'react';\nimport { useMeasure, usePrevious } from 'react-use';\n\nimport { type DataFrame, type GrafanaTheme2, escapeStringForRegex } from '@grafana/data';\nimport { ThemeContext } from '@grafana/ui';\n\nimport FlameGraph from './FlameGraph/FlameGraph';\nimport { type GetExtraContextMenuButtonsFunction } from './FlameGraph/FlameGraphContextMenu';\nimport { CollapsedMap, FlameGraphDataContainer } from './FlameGraph/dataTransform';\nimport FlameGraphHeader from './FlameGraphHeader';\nimport FlameGraphPane from './FlameGraphPane';\nimport FlameGraphTopTableContainer from './TopTable/FlameGraphTopTableContainer';\nimport {\n MIN_WIDTH_TO_SHOW_BOTH_TOPTABLE_AND_FLAMEGRAPH,\n MIN_WIDTH_FOR_SPLIT_VIEW,\n FLAMEGRAPH_CONTAINER_HEIGHT,\n} from './constants';\nimport { useColorScheme } from './hooks';\nimport { type ClickedItemData, PaneView, SelectedView, type TextAlign, ViewMode } from './types';\nimport { getAssistantContextFromDataFrame } from './utils';\n\nconst ufuzzy = new uFuzzy();\n\nexport type Props = {\n /**\n * DataFrame with the profile data. The dataFrame needs to have the following fields:\n * label: string - the label of the node\n * level: number - the nesting level of the node\n * value: number - the total value of the node\n * self: number - the self value of the node\n * Optionally if it represents diff of 2 different profiles it can also have fields:\n * valueRight: number - the total value of the node in the right profile\n * selfRight: number - the self value of the node in the right profile\n */\n data?: DataFrame;\n\n /**\n * Whether the header should be sticky and be always visible on the top when scrolling.\n */\n stickyHeader?: boolean;\n\n /**\n * Provides a theme for the visualization on which colors and some sizes are based.\n */\n getTheme: () => GrafanaTheme2;\n\n /**\n * Various interaction hooks that can be used to report on the interaction.\n */\n onTableSymbolClick?: (symbol: string) => void;\n onViewSelected?: (view: string) => void;\n onTextAlignSelected?: (align: string) => void;\n onTableSort?: (sort: string) => void;\n\n /**\n * Elements that will be shown in the header on the right side of the header buttons. Useful for additional\n * functionality.\n */\n extraHeaderElements?: React.ReactNode;\n\n /**\n * Extra buttons that will be shown in the context menu when user clicks on a Node.\n */\n getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction;\n\n /**\n * If true the flamegraph will be rendered on top of the table.\n */\n vertical?: boolean;\n\n /**\n * If true only the flamegraph will be rendered.\n */\n showFlameGraphOnly?: boolean;\n\n /**\n * Disable behaviour where similar items in the same stack will be collapsed into single item.\n */\n disableCollapsing?: boolean;\n /**\n * Whether or not to keep any focused item when the profile data changes.\n */\n keepFocusOnDataChange?: boolean;\n\n /**\n * If true, the assistant button will be shown in the header if available.\n * This is needed mainly for Profiles Drilldown where in some cases we need to hide the button to show alternative\n * option to use AI.\n * @default true\n */\n showAnalyzeWithAssistant?: boolean;\n\n /**\n * Enable the new pane-based UI with call tree support.\n */\n enableNewUI?: boolean;\n};\n\nconst FlameGraphContainer = ({\n data,\n onTableSymbolClick,\n onViewSelected,\n onTextAlignSelected,\n onTableSort,\n getTheme,\n stickyHeader,\n extraHeaderElements,\n vertical,\n showFlameGraphOnly,\n disableCollapsing,\n keepFocusOnDataChange,\n getExtraContextMenuButtons,\n showAnalyzeWithAssistant = true,\n enableNewUI,\n}: Props) => {\n const theme = useMemo(() => getTheme(), [getTheme]);\n\n if (enableNewUI) {\n return (\n <NewUIContainer\n data={data}\n onTableSymbolClick={onTableSymbolClick}\n onViewSelected={onViewSelected}\n onTextAlignSelected={onTextAlignSelected}\n onTableSort={onTableSort}\n theme={theme}\n stickyHeader={stickyHeader}\n extraHeaderElements={extraHeaderElements}\n vertical={vertical}\n showFlameGraphOnly={showFlameGraphOnly}\n disableCollapsing={disableCollapsing}\n keepFocusOnDataChange={keepFocusOnDataChange}\n getExtraContextMenuButtons={getExtraContextMenuButtons}\n showAnalyzeWithAssistant={showAnalyzeWithAssistant}\n />\n );\n }\n\n return (\n <LegacyContainer\n data={data}\n onTableSymbolClick={onTableSymbolClick}\n onViewSelected={onViewSelected}\n onTextAlignSelected={onTextAlignSelected}\n onTableSort={onTableSort}\n theme={theme}\n stickyHeader={stickyHeader}\n extraHeaderElements={extraHeaderElements}\n vertical={vertical}\n showFlameGraphOnly={showFlameGraphOnly}\n disableCollapsing={disableCollapsing}\n keepFocusOnDataChange={keepFocusOnDataChange}\n getExtraContextMenuButtons={getExtraContextMenuButtons}\n showAnalyzeWithAssistant={showAnalyzeWithAssistant}\n />\n );\n};\n\ntype InternalProps = {\n data?: DataFrame;\n onTableSymbolClick?: (symbol: string) => void;\n onViewSelected?: (view: string) => void;\n onTextAlignSelected?: (align: string) => void;\n onTableSort?: (sort: string) => void;\n theme: GrafanaTheme2;\n stickyHeader?: boolean;\n extraHeaderElements?: React.ReactNode;\n vertical?: boolean;\n showFlameGraphOnly?: boolean;\n disableCollapsing?: boolean;\n keepFocusOnDataChange?: boolean;\n getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction;\n showAnalyzeWithAssistant: boolean;\n};\n\nconst LegacyContainer = ({\n data,\n onTableSymbolClick,\n onViewSelected,\n onTextAlignSelected,\n onTableSort,\n theme,\n stickyHeader,\n extraHeaderElements,\n vertical,\n showFlameGraphOnly,\n disableCollapsing,\n keepFocusOnDataChange,\n getExtraContextMenuButtons,\n showAnalyzeWithAssistant,\n}: InternalProps) => {\n const [focusedItemData, setFocusedItemData] = useState<ClickedItemData>();\n\n const [rangeMin, setRangeMin] = useState(0);\n const [rangeMax, setRangeMax] = useState(1);\n const [search, setSearch] = useState('');\n const [selectedView, setSelectedView] = useState(SelectedView.Both);\n const [sizeRef, { width: containerWidth }] = useMeasure<HTMLDivElement>();\n const [textAlign, setTextAlign] = useState<TextAlign>('left');\n // This is a label of the item because in sandwich view we group all items by label and present a merged graph\n const [sandwichItem, setSandwichItem] = useState<string>();\n const [collapsedMap, setCollapsedMap] = useState(new CollapsedMap());\n\n // Use refs to hold the latest callback values to prevent unnecessary re-renders\n const onTableSymbolClickRef = useRef(onTableSymbolClick);\n const onTableSortRef = useRef(onTableSort);\n\n // Update refs when props change\n onTableSymbolClickRef.current = onTableSymbolClick;\n onTableSortRef.current = onTableSort;\n\n const dataContainer = useMemo((): FlameGraphDataContainer | undefined => {\n if (!data) {\n return;\n }\n\n const container = new FlameGraphDataContainer(data, { collapsing: !disableCollapsing }, theme);\n setCollapsedMap(container.getCollapsedMap());\n return container;\n }, [data, theme, disableCollapsing]);\n const [colorScheme, setColorScheme] = useColorScheme(dataContainer);\n const styles = getStyles(theme);\n const matchedLabels = useLabelSearch(search, dataContainer);\n\n // If user resizes window with both as the selected view\n useEffect(() => {\n if (\n containerWidth > 0 &&\n containerWidth < MIN_WIDTH_TO_SHOW_BOTH_TOPTABLE_AND_FLAMEGRAPH &&\n selectedView === SelectedView.Both &&\n !vertical\n ) {\n setSelectedView(SelectedView.FlameGraph);\n }\n }, [selectedView, setSelectedView, containerWidth, vertical]);\n\n const resetFocus = useCallback(() => {\n setFocusedItemData(undefined);\n setRangeMin(0);\n setRangeMax(1);\n }, [setFocusedItemData, setRangeMax, setRangeMin]);\n\n const resetSandwich = useCallback(() => {\n setSandwichItem(undefined);\n }, [setSandwichItem]);\n\n useEffect(() => {\n if (!keepFocusOnDataChange) {\n resetFocus();\n resetSandwich();\n return;\n }\n\n if (dataContainer && focusedItemData) {\n const item = dataContainer.getNodesWithLabel(focusedItemData.label)?.[0];\n\n if (item) {\n setFocusedItemData({ ...focusedItemData, item });\n\n const levels = dataContainer.getLevels();\n const totalViewTicks = levels.length ? levels[0][0].value : 0;\n setRangeMin(item.start / totalViewTicks);\n setRangeMax((item.start + item.value) / totalViewTicks);\n } else {\n setFocusedItemData({\n ...focusedItemData,\n item: {\n start: 0,\n value: 0,\n itemIndexes: [],\n children: [],\n level: 0,\n },\n });\n\n setRangeMin(0);\n setRangeMax(1);\n }\n }\n }, [dataContainer, keepFocusOnDataChange]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const onSymbolClick = useCallback(\n (symbol: string) => {\n const anchored = `^${escapeStringForRegex(symbol)}$`;\n\n if (search === anchored) {\n setSearch('');\n } else {\n onTableSymbolClickRef.current?.(symbol);\n setSearch(anchored);\n resetFocus();\n }\n },\n [setSearch, resetFocus, search]\n );\n\n // Memoize methods to prevent unnecessary re-renders of FlameGraphTopTableContainer\n const onSearch = useCallback(\n (str: string) => {\n if (!str) {\n setSearch('');\n return;\n }\n setSearch(`^${escapeStringForRegex(str)}$`);\n },\n [setSearch]\n );\n const onSandwich = useCallback(\n (label: string) => {\n resetFocus();\n setSandwichItem(label);\n },\n [resetFocus, setSandwichItem]\n );\n const onTableSortStable = useCallback((sort: string) => {\n onTableSortRef.current?.(sort);\n }, []);\n\n if (!dataContainer) {\n return null;\n }\n\n const flameGraph = (\n <FlameGraph\n data={dataContainer}\n rangeMin={rangeMin}\n rangeMax={rangeMax}\n matchedLabels={matchedLabels}\n setRangeMin={setRangeMin}\n setRangeMax={setRangeMax}\n onItemFocused={(data) => setFocusedItemData(data)}\n focusedItemData={focusedItemData}\n textAlign={textAlign}\n sandwichItem={sandwichItem}\n onSandwich={onSandwich}\n onFocusPillClick={resetFocus}\n onSandwichPillClick={resetSandwich}\n colorScheme={colorScheme}\n showFlameGraphOnly={showFlameGraphOnly}\n collapsing={!disableCollapsing}\n getExtraContextMenuButtons={getExtraContextMenuButtons}\n selectedView={selectedView}\n search={search}\n collapsedMap={collapsedMap}\n setCollapsedMap={setCollapsedMap}\n />\n );\n\n const table = (\n <FlameGraphTopTableContainer\n data={dataContainer}\n onSymbolClick={onSymbolClick}\n search={search}\n matchedLabels={matchedLabels}\n sandwichItem={sandwichItem}\n onSandwich={setSandwichItem}\n onSearch={onSearch}\n onTableSort={onTableSortStable}\n colorScheme={colorScheme}\n />\n );\n\n let body;\n if (showFlameGraphOnly || selectedView === SelectedView.FlameGraph) {\n body = flameGraph;\n } else if (selectedView === SelectedView.TopTable) {\n body = <div className={styles.tableContainer}>{table}</div>;\n } else if (selectedView === SelectedView.Both) {\n if (vertical) {\n body = (\n <div>\n <div className={styles.verticalGraphContainer}>{flameGraph}</div>\n <div className={styles.verticalTableContainer}>{table}</div>\n </div>\n );\n } else {\n body = (\n <div className={styles.horizontalContainer}>\n <div className={styles.horizontalTableContainer}>{table}</div>\n <div className={styles.horizontalGraphContainer}>{flameGraph}</div>\n </div>\n );\n }\n }\n\n return (\n // We add the theme context to bridge the gap if this is rendered in non grafana environment where the context\n // isn't already provided.\n <ThemeContext.Provider value={theme}>\n <div ref={sizeRef} className={styles.container}>\n {!showFlameGraphOnly && (\n <FlameGraphHeader\n search={search}\n setSearch={setSearch}\n selectedView={selectedView}\n setSelectedView={(view) => {\n setSelectedView(view);\n onViewSelected?.(view);\n }}\n containerWidth={containerWidth}\n onReset={() => {\n resetFocus();\n resetSandwich();\n }}\n textAlign={textAlign}\n onTextAlignChange={(align) => {\n setTextAlign(align);\n onTextAlignSelected?.(align);\n }}\n showResetButton={Boolean(focusedItemData || sandwichItem)}\n colorScheme={colorScheme}\n onColorSchemeChange={setColorScheme}\n stickyHeader={Boolean(stickyHeader)}\n extraHeaderElements={extraHeaderElements}\n vertical={vertical}\n isDiffMode={dataContainer.isDiffFlamegraph()}\n setCollapsedMap={setCollapsedMap}\n collapsedMap={collapsedMap}\n assistantContext={data && showAnalyzeWithAssistant ? getAssistantContextFromDataFrame(data) : undefined}\n />\n )}\n\n <div className={styles.body}>{body}</div>\n </div>\n </ThemeContext.Provider>\n );\n};\n\nconst NewUIContainer = ({\n data,\n onTableSymbolClick,\n onViewSelected,\n onTextAlignSelected,\n onTableSort,\n theme,\n stickyHeader,\n extraHeaderElements,\n vertical,\n showFlameGraphOnly,\n disableCollapsing,\n keepFocusOnDataChange,\n getExtraContextMenuButtons,\n showAnalyzeWithAssistant,\n}: InternalProps) => {\n const [search, setSearch] = useState('');\n const [viewMode, setViewMode] = useState<ViewMode>(ViewMode.Split);\n const [leftPaneView, setLeftPaneView] = useState<PaneView>(PaneView.TopTable);\n const [rightPaneView, setRightPaneView] = useState<PaneView>(PaneView.FlameGraph);\n const [singleView, setSingleView] = useState<PaneView>(PaneView.FlameGraph);\n const [panesSwapped, setPanesSwapped] = useState(false);\n const [sizeRef, { width: containerWidth }] = useMeasure<HTMLDivElement>();\n const [resetKey, setResetKey] = useState(0);\n const [focusedItemIndexes, setFocusedItemIndexes] = useState<number[] | undefined>(undefined);\n const [sharedSandwichItem, setSharedSandwichItem] = useState<string | undefined>(undefined);\n\n const canShowSplitView = containerWidth > 0 && (containerWidth >= MIN_WIDTH_FOR_SPLIT_VIEW || Boolean(vertical));\n\n const onTableSymbolClickRef = useRef(onTableSymbolClick);\n const onTextAlignSelectedRef = useRef(onTextAlignSelected);\n const onTableSortRef = useRef(onTableSort);\n\n useEffect(() => {\n onTableSymbolClickRef.current = onTableSymbolClick;\n onTextAlignSelectedRef.current = onTextAlignSelected;\n onTableSortRef.current = onTableSort;\n });\n\n const stableOnTableSymbolClick = useCallback((symbol: string) => {\n onTableSymbolClickRef.current?.(symbol);\n }, []);\n\n const stableOnTextAlignSelected = useCallback((align: string) => {\n onTextAlignSelectedRef.current?.(align);\n }, []);\n\n const stableOnTableSort = useCallback((sort: string) => {\n onTableSortRef.current?.(sort);\n }, []);\n\n const dataContainer = useMemo((): FlameGraphDataContainer | undefined => {\n if (!data) {\n return;\n }\n\n return new FlameGraphDataContainer(data, { collapsing: !disableCollapsing }, theme);\n }, [data, theme, disableCollapsing]);\n\n const styles = getStyles(theme);\n const matchedLabels = useLabelSearch(search, dataContainer);\n\n const effectiveViewMode = canShowSplitView ? viewMode : ViewMode.Single;\n\n const prevViewMode = usePrevious(viewMode);\n useEffect(() => {\n if (prevViewMode === undefined) {\n return;\n }\n if (prevViewMode === ViewMode.Split && viewMode === ViewMode.Single) {\n setSingleView(rightPaneView);\n } else if (prevViewMode === ViewMode.Single && viewMode === ViewMode.Split) {\n setRightPaneView(singleView);\n }\n }, [viewMode, prevViewMode, rightPaneView, singleView]);\n\n if (!dataContainer) {\n return null;\n }\n\n const commonPaneProps = {\n dataContainer,\n search,\n matchedLabels,\n onTableSymbolClick: stableOnTableSymbolClick,\n onTextAlignSelected: stableOnTextAlignSelected,\n onTableSort: stableOnTableSort,\n showFlameGraphOnly,\n disableCollapsing,\n getExtraContextMenuButtons,\n setSearch,\n resetKey,\n keepFocusOnDataChange,\n focusedItemIndexes,\n setFocusedItemIndexes,\n };\n\n let body;\n if (showFlameGraphOnly) {\n body = (\n <FlameGraphPane\n {...commonPaneProps}\n paneView={PaneView.FlameGraph}\n viewMode={effectiveViewMode}\n paneViewForContextMenu={PaneView.FlameGraph}\n sharedSandwichItem={sharedSandwichItem}\n setSharedSandwichItem={setSharedSandwichItem}\n />\n );\n } else if (effectiveViewMode === ViewMode.Single) {\n body = (\n <FlameGraphPane\n {...commonPaneProps}\n paneView={singleView}\n viewMode={ViewMode.Single}\n paneViewForContextMenu={singleView}\n sharedSandwichItem={sharedSandwichItem}\n setSharedSandwichItem={setSharedSandwichItem}\n />\n );\n } else {\n const shouldSyncSandwich = leftPaneView !== rightPaneView;\n\n const leftPane = (\n <FlameGraphPane\n {...commonPaneProps}\n key=\"left-pane\"\n paneView={leftPaneView}\n viewMode={ViewMode.Split}\n paneViewForContextMenu={leftPaneView}\n sharedSandwichItem={shouldSyncSandwich ? sharedSandwichItem : undefined}\n setSharedSandwichItem={shouldSyncSandwich ? setSharedSandwichItem : undefined}\n />\n );\n\n const rightPane = (\n <FlameGraphPane\n {...commonPaneProps}\n key=\"right-pane\"\n paneView={rightPaneView}\n viewMode={ViewMode.Split}\n paneViewForContextMenu={rightPaneView}\n sharedSandwichItem={shouldSyncSandwich ? sharedSandwichItem : undefined}\n setSharedSandwichItem={shouldSyncSandwich ? setSharedSandwichItem : undefined}\n />\n );\n\n if (vertical) {\n body = (\n <div className={styles.verticalContainer}>\n <div className={styles.verticalPaneContainer} style={{ order: panesSwapped ? 2 : 1 }}>\n {leftPane}\n </div>\n <div className={styles.verticalPaneContainer} style={{ order: panesSwapped ? 1 : 2 }}>\n {rightPane}\n </div>\n </div>\n );\n } else {\n body = (\n <div className={styles.horizontalContainer}>\n <div className={styles.horizontalPaneContainer} style={{ order: panesSwapped ? 2 : 1 }}>\n {leftPane}\n </div>\n <div className={styles.horizontalPaneContainer} style={{ order: panesSwapped ? 1 : 2 }}>\n {rightPane}\n </div>\n </div>\n );\n }\n }\n\n return (\n <ThemeContext.Provider value={theme}>\n <div ref={sizeRef} className={styles.container}>\n {!showFlameGraphOnly && (\n <FlameGraphHeader\n enableNewUI={true}\n search={search}\n setSearch={setSearch}\n viewMode={viewMode}\n setViewMode={(mode) => {\n setViewMode(mode);\n onViewSelected?.(mode === ViewMode.Split ? 'split' : singleView);\n }}\n canShowSplitView={canShowSplitView}\n containerWidth={containerWidth}\n leftPaneView={panesSwapped ? rightPaneView : leftPaneView}\n setLeftPaneView={panesSwapped ? setRightPaneView : setLeftPaneView}\n rightPaneView={panesSwapped ? leftPaneView : rightPaneView}\n setRightPaneView={panesSwapped ? setLeftPaneView : setRightPaneView}\n singleView={singleView}\n setSingleView={(view) => {\n setSingleView(view);\n if (viewMode === ViewMode.Single) {\n onViewSelected?.(view);\n }\n }}\n onSwapPanes={() => setPanesSwapped((s) => !s)}\n onReset={() => {\n setSearch('');\n setFocusedItemIndexes(undefined);\n setSharedSandwichItem(undefined);\n setResetKey((k) => k + 1);\n }}\n showResetButton={Boolean(search)}\n stickyHeader={Boolean(stickyHeader)}\n extraHeaderElements={extraHeaderElements}\n assistantContext={data && showAnalyzeWithAssistant ? getAssistantContextFromDataFrame(data) : undefined}\n />\n )}\n\n <div className={styles.body}>{body}</div>\n </div>\n </ThemeContext.Provider>\n );\n};\n\n/**\n * Based on the search string it does a fuzzy search over all the unique labels, so we can highlight them later.\n */\nexport function useLabelSearch(\n search: string | undefined,\n data: FlameGraphDataContainer | undefined\n): Set<string> | undefined {\n return useMemo(() => {\n if (!search || !data) {\n // In this case undefined means there was no search so no attempt to\n // highlighting anything should be made.\n return undefined;\n }\n\n return labelSearch(search, data);\n }, [search, data]);\n}\n\nexport function labelSearch(search: string, data: FlameGraphDataContainer): Set<string> {\n const foundLabels = new Set<string>();\n const terms = search.split(',');\n\n const regexFilter = (labels: string[], pattern: string): boolean => {\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch (e) {\n return false;\n }\n\n let foundMatch = false;\n for (let label of labels) {\n if (!regex.test(label)) {\n continue;\n }\n\n foundLabels.add(label);\n foundMatch = true;\n }\n return foundMatch;\n };\n\n const fuzzyFilter = (labels: string[], term: string): boolean => {\n let idxs = ufuzzy.filter(labels, term);\n if (!idxs) {\n return false;\n }\n\n let foundMatch = false;\n for (let idx of idxs) {\n foundLabels.add(labels[idx]);\n foundMatch = true;\n }\n return foundMatch;\n };\n\n for (let term of terms) {\n if (!term) {\n continue;\n }\n\n const found = regexFilter(data.getUniqueLabels(), term);\n if (!found) {\n fuzzyFilter(data.getUniqueLabels(), term);\n }\n }\n\n return foundLabels;\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n container: css({\n label: 'container',\n overflow: 'auto',\n height: '100%',\n display: 'flex',\n flex: '1 1 0',\n flexDirection: 'column',\n minHeight: 0,\n gap: theme.spacing(1),\n }),\n body: css({\n label: 'body',\n flexGrow: 1,\n }),\n\n tableContainer: css({\n // This is not ideal for dashboard panel where it creates a double scroll. In a panel it should be 100% but then\n // in explore we need a specific height.\n height: FLAMEGRAPH_CONTAINER_HEIGHT,\n }),\n\n horizontalContainer: css({\n label: 'horizontalContainer',\n display: 'flex',\n minHeight: 0,\n flexDirection: 'row',\n columnGap: theme.spacing(1),\n width: '100%',\n }),\n\n horizontalGraphContainer: css({\n flexBasis: '50%',\n }),\n\n horizontalTableContainer: css({\n flexBasis: '50%',\n maxHeight: FLAMEGRAPH_CONTAINER_HEIGHT,\n }),\n\n verticalGraphContainer: css({\n marginBottom: theme.spacing(1),\n }),\n\n verticalTableContainer: css({\n height: FLAMEGRAPH_CONTAINER_HEIGHT,\n }),\n\n verticalContainer: css({\n label: 'verticalContainer',\n display: 'flex',\n flexDirection: 'column',\n }),\n\n horizontalPaneContainer: css({\n label: 'horizontalPaneContainer',\n flexBasis: '50%',\n maxHeight: FLAMEGRAPH_CONTAINER_HEIGHT,\n minWidth: 0,\n overflow: 'auto',\n }),\n\n verticalPaneContainer: css({\n label: 'verticalPaneContainer',\n marginBottom: theme.spacing(1),\n height: FLAMEGRAPH_CONTAINER_HEIGHT,\n }),\n };\n}\n\nexport default FlameGraphContainer;\n"],"names":["uFuzzy","useMemo","jsx","data","useState","SelectedView","useMeasure","CollapsedMap","useRef","FlameGraphDataContainer","useColorScheme","useEffect","MIN_WIDTH_TO_SHOW_BOTH_TOPTABLE_AND_FLAMEGRAPH","useCallback","escapeStringForRegex","FlameGraphTopTableContainer","jsxs","ThemeContext","FlameGraphHeader","getAssistantContextFromDataFrame","ViewMode","PaneView","MIN_WIDTH_FOR_SPLIT_VIEW","usePrevious","createElement","css","FLAMEGRAPH_CONTAINER_HEIGHT"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,MAAA,GAAS,IAAIA,uBAAA,EAAO;AA6E1B,MAAM,sBAAsB,CAAC;AAAA,EAC3B,IAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,QAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,qBAAA;AAAA,EACA,0BAAA;AAAA,EACA,wBAAA,GAA2B,IAAA;AAAA,EAC3B;AACF,CAAA,KAAa;AACX,EAAA,MAAM,QAAQC,aAAA,CAAQ,MAAM,UAAS,EAAG,CAAC,QAAQ,CAAC,CAAA;AAElD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,uBACEC,cAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,kBAAA;AAAA,QACA,cAAA;AAAA,QACA,mBAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA;AAAA,QACA,YAAA;AAAA,QACA,mBAAA;AAAA,QACA,QAAA;AAAA,QACA,kBAAA;AAAA,QACA,iBAAA;AAAA,QACA,qBAAA;AAAA,QACA,0BAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,uBACEA,cAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,kBAAA;AAAA,MACA,cAAA;AAAA,MACA,mBAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAA;AAAA,MACA,mBAAA;AAAA,MACA,QAAA;AAAA,MACA,kBAAA;AAAA,MACA,iBAAA;AAAA,MACA,qBAAA;AAAA,MACA,0BAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AAmBA,MAAM,kBAAkB,CAAC;AAAA,QACvBC,MAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,QAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,qBAAA;AAAA,EACA,0BAAA;AAAA,EACA;AACF,CAAA,KAAqB;AACnB,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIC,cAAA,EAA0B;AAExE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,cAAA,CAASC,mBAAa,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,OAAA,EAAS,EAAE,OAAO,cAAA,EAAgB,IAAIC,mBAAA,EAA2B;AACxE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIF,eAAoB,MAAM,CAAA;AAE5D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,cAAA,EAAiB;AACzD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,IAAIA,cAAA,CAAS,IAAIG,4BAAc,CAAA;AAGnE,EAAA,MAAM,qBAAA,GAAwBC,aAAO,kBAAkB,CAAA;AACvD,EAAA,MAAM,cAAA,GAAiBA,aAAO,WAAW,CAAA;AAGzC,EAAA,qBAAA,CAAsB,OAAA,GAAU,kBAAA;AAChC,EAAA,cAAA,CAAe,OAAA,GAAU,WAAA;AAEzB,EAAA,MAAM,aAAA,GAAgBP,cAAQ,MAA2C;AACvE,IAAA,IAAI,CAACE,MAAA,EAAM;AACT,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,IAAIM,qCAAA,CAAwBN,MAAA,EAAM,EAAE,UAAA,EAAY,CAAC,iBAAA,EAAkB,EAAG,KAAK,CAAA;AAC7F,IAAA,eAAA,CAAgB,SAAA,CAAU,iBAAiB,CAAA;AAC3C,IAAA,OAAO,SAAA;AAAA,EACT,CAAA,EAAG,CAACA,MAAA,EAAM,KAAA,EAAO,iBAAiB,CAAC,CAAA;AACnC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIO,qBAAe,aAAa,CAAA;AAClE,EAAA,MAAM,MAAA,GAAS,UAAU,KAAK,CAAA;AAC9B,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,MAAA,EAAQ,aAAa,CAAA;AAG1D,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IACE,cAAA,GAAiB,KACjB,cAAA,GAAiBC,wDAAA,IACjB,iBAAiBP,kBAAA,CAAa,IAAA,IAC9B,CAAC,QAAA,EACD;AACA,MAAA,eAAA,CAAgBA,mBAAa,UAAU,CAAA;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,eAAA,EAAiB,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAE5D,EAAA,MAAM,UAAA,GAAaQ,kBAAY,MAAM;AACnC,IAAA,kBAAA,CAAmB,KAAA,CAAS,CAAA;AAC5B,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AAAA,EACf,CAAA,EAAG,CAAC,kBAAA,EAAoB,WAAA,EAAa,WAAW,CAAC,CAAA;AAEjD,EAAA,MAAM,aAAA,GAAgBA,kBAAY,MAAM;AACtC,IAAA,eAAA,CAAgB,KAAA,CAAS,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAAF,eAAA,CAAU,MAAM;AAzPlB,IAAA,IAAA,EAAA;AA0PI,IAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,MAAA,UAAA,EAAW;AACX,MAAA,aAAA,EAAc;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,MAAA,MAAM,QAAO,EAAA,GAAA,aAAA,CAAc,iBAAA,CAAkB,eAAA,CAAgB,KAAK,MAArD,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAyD,CAAA,CAAA;AAEtE,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,kBAAA,CAAmB,EAAE,GAAG,eAAA,EAAiB,IAAA,EAAM,CAAA;AAE/C,QAAA,MAAM,MAAA,GAAS,cAAc,SAAA,EAAU;AACvC,QAAA,MAAM,cAAA,GAAiB,OAAO,MAAA,GAAS,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,EAAE,KAAA,GAAQ,CAAA;AAC5D,QAAA,WAAA,CAAY,IAAA,CAAK,QAAQ,cAAc,CAAA;AACvC,QAAA,WAAA,CAAA,CAAa,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,cAAc,CAAA;AAAA,MACxD,CAAA,MAAO;AACL,QAAA,kBAAA,CAAmB;AAAA,UACjB,GAAG,eAAA;AAAA,UACH,IAAA,EAAM;AAAA,YACJ,KAAA,EAAO,CAAA;AAAA,YACP,KAAA,EAAO,CAAA;AAAA,YACP,aAAa,EAAC;AAAA,YACd,UAAU,EAAC;AAAA,YACX,KAAA,EAAO;AAAA;AACT,SACD,CAAA;AAED,QAAA,WAAA,CAAY,CAAC,CAAA;AACb,QAAA,WAAA,CAAY,CAAC,CAAA;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,qBAAqB,CAAC,CAAA;AAEzC,EAAA,MAAM,aAAA,GAAgBE,iBAAA;AAAA,IACpB,CAAC,MAAA,KAAmB;AA7RxB,MAAA,IAAA,EAAA;AA8RM,MAAA,MAAM,QAAA,GAAW,CAAA,CAAA,EAAIC,yBAAA,CAAqB,MAAM,CAAC,CAAA,CAAA,CAAA;AAEjD,MAAA,IAAI,WAAW,QAAA,EAAU;AACvB,QAAA,SAAA,CAAU,EAAE,CAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAA,CAAA,EAAA,GAAA,qBAAA,CAAsB,YAAtB,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,qBAAA,EAAgC,MAAA,CAAA;AAChC,QAAA,SAAA,CAAU,QAAQ,CAAA;AAClB,QAAA,UAAA,EAAW;AAAA,MACb;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,UAAA,EAAY,MAAM;AAAA,GAChC;AAGA,EAAA,MAAM,QAAA,GAAWD,iBAAA;AAAA,IACf,CAAC,GAAA,KAAgB;AACf,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,SAAA,CAAU,EAAE,CAAA;AACZ,QAAA;AAAA,MACF;AACA,MAAA,SAAA,CAAU,CAAA,CAAA,EAAIC,yBAAA,CAAqB,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5C,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,MAAM,UAAA,GAAaD,iBAAA;AAAA,IACjB,CAAC,KAAA,KAAkB;AACjB,MAAA,UAAA,EAAW;AACX,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,CAAC,YAAY,eAAe;AAAA,GAC9B;AACA,EAAA,MAAM,iBAAA,GAAoBA,iBAAA,CAAY,CAAC,IAAA,KAAiB;AA7T1D,IAAA,IAAA,EAAA;AA8TI,IAAA,CAAA,EAAA,GAAA,cAAA,CAAe,YAAf,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,cAAA,EAAyB,IAAA,CAAA;AAAA,EAC3B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,mBACJX,cAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,aAAA;AAAA,MACN,QAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA,EAAe,CAACC,KAAAA,KAAS,kBAAA,CAAmBA,KAAI,CAAA;AAAA,MAChD,eAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,gBAAA,EAAkB,UAAA;AAAA,MAClB,mBAAA,EAAqB,aAAA;AAAA,MACrB,WAAA;AAAA,MACA,kBAAA;AAAA,MACA,YAAY,CAAC,iBAAA;AAAA,MACb,0BAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA;AAAA,GACF;AAGF,EAAA,MAAM,KAAA,mBACJD,cAAA;AAAA,IAACa,mCAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,aAAA;AAAA,MACN,aAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA,EAAY,eAAA;AAAA,MACZ,QAAA;AAAA,MACA,WAAA,EAAa,iBAAA;AAAA,MACb;AAAA;AAAA,GACF;AAGF,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,kBAAA,IAAsB,YAAA,KAAiBV,kBAAA,CAAa,UAAA,EAAY;AAClE,IAAA,IAAA,GAAO,UAAA;AAAA,EACT,CAAA,MAAA,IAAW,YAAA,KAAiBA,kBAAA,CAAa,QAAA,EAAU;AACjD,IAAA,IAAA,mBAAOH,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,gBAAiB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,EACvD,CAAA,MAAA,IAAW,YAAA,KAAiBG,kBAAA,CAAa,IAAA,EAAM;AAC7C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,mCACG,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAH,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,sBAAA,EAAyB,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,wBAC3DA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,wBAAyB,QAAA,EAAA,KAAA,EAAM;AAAA,OAAA,EACxD,CAAA;AAAA,IAEJ,CAAA,MAAO;AACL,MAAA,IAAA,mBACEc,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,mBAAA,EACrB,QAAA,EAAA;AAAA,wBAAAd,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,wBAAA,EAA2B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACxDA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,0BAA2B,QAAA,EAAA,UAAA,EAAW;AAAA,OAAA,EAC/D,CAAA;AAAA,IAEJ;AAAA,EACF;AAEA,EAAA;AAAA;AAAA;AAAA,oBAGEA,cAAA,CAACe,eAAA,CAAa,QAAA,EAAb,EAAsB,KAAA,EAAO,KAAA,EAC5B,QAAA,kBAAAD,eAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,SAAA,EAAW,MAAA,CAAO,SAAA,EAClC,QAAA,EAAA;AAAA,MAAA,CAAC,kBAAA,oBACAd,cAAA;AAAA,QAACgB,wBAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,SAAA;AAAA,UACA,YAAA;AAAA,UACA,eAAA,EAAiB,CAAC,IAAA,KAAS;AACzB,YAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,YAAA,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAiB,IAAA,CAAA;AAAA,UACnB,CAAA;AAAA,UACA,cAAA;AAAA,UACA,SAAS,MAAM;AACb,YAAA,UAAA,EAAW;AACX,YAAA,aAAA,EAAc;AAAA,UAChB,CAAA;AAAA,UACA,SAAA;AAAA,UACA,iBAAA,EAAmB,CAAC,KAAA,KAAU;AAC5B,YAAA,YAAA,CAAa,KAAK,CAAA;AAClB,YAAA,mBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,mBAAA,CAAsB,KAAA,CAAA;AAAA,UACxB,CAAA;AAAA,UACA,eAAA,EAAiB,OAAA,CAAQ,eAAA,IAAmB,YAAY,CAAA;AAAA,UACxD,WAAA;AAAA,UACA,mBAAA,EAAqB,cAAA;AAAA,UACrB,YAAA,EAAc,QAAQ,YAAY,CAAA;AAAA,UAClC,mBAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA,EAAY,cAAc,gBAAA,EAAiB;AAAA,UAC3C,eAAA;AAAA,UACA,YAAA;AAAA,UACA,gBAAA,EAAkBf,MAAA,IAAQ,wBAAA,GAA2BgB,sCAAA,CAAiChB,MAAI,CAAA,GAAI,KAAA;AAAA;AAAA,OAChG;AAAA,sBAGFD,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,MAAO,QAAA,EAAA,IAAA,EAAK;AAAA,KAAA,EACrC,CAAA,EACF;AAAA;AAEJ,CAAA;AAEA,MAAM,iBAAiB,CAAC;AAAA,EACtB,IAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,QAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,qBAAA;AAAA,EACA,0BAAA;AAAA,EACA;AACF,CAAA,KAAqB;AACnB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIE,eAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAA,CAAmBgB,eAAS,KAAK,CAAA;AACjE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIhB,cAAA,CAAmBiB,eAAS,QAAQ,CAAA;AAC5E,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIjB,cAAA,CAAmBiB,eAAS,UAAU,CAAA;AAChF,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIjB,cAAA,CAAmBiB,eAAS,UAAU,CAAA;AAC1E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIjB,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,EAAE,OAAO,cAAA,EAAgB,IAAIE,mBAAA,EAA2B;AACxE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIF,eAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,eAA+B,KAAA,CAAS,CAAA;AAC5F,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,eAA6B,KAAA,CAAS,CAAA;AAE1F,EAAA,MAAM,mBAAmB,cAAA,GAAiB,CAAA,KAAM,cAAA,IAAkBkB,kCAAA,IAA4B,QAAQ,QAAQ,CAAA,CAAA;AAE9G,EAAA,MAAM,qBAAA,GAAwBd,aAAO,kBAAkB,CAAA;AACvD,EAAA,MAAM,sBAAA,GAAyBA,aAAO,mBAAmB,CAAA;AACzD,EAAA,MAAM,cAAA,GAAiBA,aAAO,WAAW,CAAA;AAEzC,EAAAG,eAAA,CAAU,MAAM;AACd,IAAA,qBAAA,CAAsB,OAAA,GAAU,kBAAA;AAChC,IAAA,sBAAA,CAAuB,OAAA,GAAU,mBAAA;AACjC,IAAA,cAAA,CAAe,OAAA,GAAU,WAAA;AAAA,EAC3B,CAAC,CAAA;AAED,EAAA,MAAM,wBAAA,GAA2BE,iBAAA,CAAY,CAAC,MAAA,KAAmB;AAtdnE,IAAA,IAAA,EAAA;AAudI,IAAA,CAAA,EAAA,GAAA,qBAAA,CAAsB,YAAtB,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,qBAAA,EAAgC,MAAA,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,yBAAA,GAA4BA,iBAAA,CAAY,CAAC,KAAA,KAAkB;AA1dnE,IAAA,IAAA,EAAA;AA2dI,IAAA,CAAA,EAAA,GAAA,sBAAA,CAAuB,YAAvB,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,sBAAA,EAAiC,KAAA,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAA,GAAoBA,iBAAA,CAAY,CAAC,IAAA,KAAiB;AA9d1D,IAAA,IAAA,EAAA;AA+dI,IAAA,CAAA,EAAA,GAAA,cAAA,CAAe,YAAf,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,cAAA,EAAyB,IAAA,CAAA;AAAA,EAC3B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBZ,cAAQ,MAA2C;AACvE,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA;AAAA,IACF;AAEA,IAAA,OAAO,IAAIQ,sCAAwB,IAAA,EAAM,EAAE,YAAY,CAAC,iBAAA,IAAqB,KAAK,CAAA;AAAA,EACpF,CAAA,EAAG,CAAC,IAAA,EAAM,KAAA,EAAO,iBAAiB,CAAC,CAAA;AAEnC,EAAA,MAAM,MAAA,GAAS,UAAU,KAAK,CAAA;AAC9B,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,MAAA,EAAQ,aAAa,CAAA;AAE1D,EAAA,MAAM,iBAAA,GAAoB,gBAAA,GAAmB,QAAA,GAAWW,cAAA,CAAS,MAAA;AAEjE,EAAA,MAAM,YAAA,GAAeG,qBAAY,QAAQ,CAAA;AACzC,EAAAZ,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAiB,KAAA,CAAA,EAAW;AAC9B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,YAAA,KAAiBS,cAAA,CAAS,KAAA,IAAS,QAAA,KAAaA,eAAS,MAAA,EAAQ;AACnE,MAAA,aAAA,CAAc,aAAa,CAAA;AAAA,IAC7B,WAAW,YAAA,KAAiBA,cAAA,CAAS,MAAA,IAAU,QAAA,KAAaA,eAAS,KAAA,EAAO;AAC1E,MAAA,gBAAA,CAAiB,UAAU,CAAA;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,YAAA,EAAc,aAAA,EAAe,UAAU,CAAC,CAAA;AAEtD,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,aAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA,EAAoB,wBAAA;AAAA,IACpB,mBAAA,EAAqB,yBAAA;AAAA,IACrB,WAAA,EAAa,iBAAA;AAAA,IACb,kBAAA;AAAA,IACA,iBAAA;AAAA,IACA,0BAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,qBAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,IAAA,mBACElB,cAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACE,GAAG,eAAA;AAAA,QACJ,UAAUmB,cAAA,CAAS,UAAA;AAAA,QACnB,QAAA,EAAU,iBAAA;AAAA,QACV,wBAAwBA,cAAA,CAAS,UAAA;AAAA,QACjC,kBAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,EAEJ,CAAA,MAAA,IAAW,iBAAA,KAAsBD,cAAA,CAAS,MAAA,EAAQ;AAChD,IAAA,IAAA,mBACElB,cAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACE,GAAG,eAAA;AAAA,QACJ,QAAA,EAAU,UAAA;AAAA,QACV,UAAUkB,cAAA,CAAS,MAAA;AAAA,QACnB,sBAAA,EAAwB,UAAA;AAAA,QACxB,kBAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,EAEJ,CAAA,MAAO;AACL,IAAA,MAAM,qBAAqB,YAAA,KAAiB,aAAA;AAE5C,IAAA,MAAM,QAAA,mBACJI,mBAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACE,GAAG,eAAA;AAAA,QACJ,GAAA,EAAI,WAAA;AAAA,QACJ,QAAA,EAAU,YAAA;AAAA,QACV,UAAUJ,cAAA,CAAS,KAAA;AAAA,QACnB,sBAAA,EAAwB,YAAA;AAAA,QACxB,kBAAA,EAAoB,qBAAqB,kBAAA,GAAqB,KAAA,CAAA;AAAA,QAC9D,qBAAA,EAAuB,qBAAqB,qBAAA,GAAwB,KAAA;AAAA;AAAA,KACtE;AAGF,IAAA,MAAM,SAAA,mBACJI,mBAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACE,GAAG,eAAA;AAAA,QACJ,GAAA,EAAI,YAAA;AAAA,QACJ,QAAA,EAAU,aAAA;AAAA,QACV,UAAUJ,cAAA,CAAS,KAAA;AAAA,QACnB,sBAAA,EAAwB,aAAA;AAAA,QACxB,kBAAA,EAAoB,qBAAqB,kBAAA,GAAqB,KAAA,CAAA;AAAA,QAC9D,qBAAA,EAAuB,qBAAqB,qBAAA,GAAwB,KAAA;AAAA;AAAA,KACtE;AAGF,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,mBACEJ,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,iBAAA,EACrB,QAAA,EAAA;AAAA,wBAAAd,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,qBAAA,EAAuB,KAAA,EAAO,EAAE,KAAA,EAAO,YAAA,GAAe,CAAA,GAAI,CAAA,EAAE,EAChF,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,wBACAA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,qBAAA,EAAuB,KAAA,EAAO,EAAE,KAAA,EAAO,YAAA,GAAe,CAAA,GAAI,CAAA,EAAE,EAChF,QAAA,EAAA,SAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,IAEJ,CAAA,MAAO;AACL,MAAA,IAAA,mBACEc,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,mBAAA,EACrB,QAAA,EAAA;AAAA,wBAAAd,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,uBAAA,EAAyB,KAAA,EAAO,EAAE,KAAA,EAAO,YAAA,GAAe,CAAA,GAAI,CAAA,EAAE,EAClF,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,wBACAA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,uBAAA,EAAyB,KAAA,EAAO,EAAE,KAAA,EAAO,YAAA,GAAe,CAAA,GAAI,CAAA,EAAE,EAClF,QAAA,EAAA,SAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,IAEJ;AAAA,EACF;AAEA,EAAA,uBACEA,cAAA,CAACe,eAAA,CAAa,QAAA,EAAb,EAAsB,KAAA,EAAO,KAAA,EAC5B,QAAA,kBAAAD,eAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,SAAA,EAAW,MAAA,CAAO,SAAA,EAClC,QAAA,EAAA;AAAA,IAAA,CAAC,kBAAA,oBACAd,cAAA;AAAA,MAACgB,wBAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAa,IAAA;AAAA,QACb,MAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA,EAAa,CAAC,IAAA,KAAS;AACrB,UAAA,WAAA,CAAY,IAAI,CAAA;AAChB,UAAA,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAiB,IAAA,KAASE,cAAA,CAAS,KAAA,GAAQ,OAAA,GAAU,UAAA,CAAA;AAAA,QACvD,CAAA;AAAA,QACA,gBAAA;AAAA,QACA,cAAA;AAAA,QACA,YAAA,EAAc,eAAe,aAAA,GAAgB,YAAA;AAAA,QAC7C,eAAA,EAAiB,eAAe,gBAAA,GAAmB,eAAA;AAAA,QACnD,aAAA,EAAe,eAAe,YAAA,GAAe,aAAA;AAAA,QAC7C,gBAAA,EAAkB,eAAe,eAAA,GAAkB,gBAAA;AAAA,QACnD,UAAA;AAAA,QACA,aAAA,EAAe,CAAC,IAAA,KAAS;AACvB,UAAA,aAAA,CAAc,IAAI,CAAA;AAClB,UAAA,IAAI,QAAA,KAAaA,eAAS,MAAA,EAAQ;AAChC,YAAA,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAiB,IAAA,CAAA;AAAA,UACnB;AAAA,QACF,CAAA;AAAA,QACA,aAAa,MAAM,eAAA,CAAgB,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAC5C,SAAS,MAAM;AACb,UAAA,SAAA,CAAU,EAAE,CAAA;AACZ,UAAA,qBAAA,CAAsB,KAAA,CAAS,CAAA;AAC/B,UAAA,qBAAA,CAAsB,KAAA,CAAS,CAAA;AAC/B,UAAA,WAAA,CAAY,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,QAC1B,CAAA;AAAA,QACA,eAAA,EAAiB,QAAQ,MAAM,CAAA;AAAA,QAC/B,YAAA,EAAc,QAAQ,YAAY,CAAA;AAAA,QAClC,mBAAA;AAAA,QACA,gBAAA,EAAkB,IAAA,IAAQ,wBAAA,GAA2BD,sCAAA,CAAiC,IAAI,CAAA,GAAI,KAAA;AAAA;AAAA,KAChG;AAAA,oBAGFjB,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,MAAO,QAAA,EAAA,IAAA,EAAK;AAAA,GAAA,EACrC,CAAA,EACF,CAAA;AAEJ,CAAA;AAKO,SAAS,cAAA,CACd,QACA,IAAA,EACyB;AACzB,EAAA,OAAOD,cAAQ,MAAM;AACnB,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,EAAM;AAGpB,MAAA,OAAO,KAAA,CAAA;AAAA,IACT;AAEA,IAAA,OAAO,WAAA,CAAY,QAAQ,IAAI,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAI,CAAC,CAAA;AACnB;AAEO,SAAS,WAAA,CAAY,QAAgB,IAAA,EAA4C;AACtF,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAE9B,EAAA,MAAM,WAAA,GAAc,CAAC,MAAA,EAAkB,OAAA,KAA6B;AAClE,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,IAAI,OAAO,OAAO,CAAA;AAAA,IAC5B,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,UAAA,GAAa,KAAA;AACjB,IAAA,KAAA,IAAS,SAAS,MAAA,EAAQ;AACxB,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,WAAA,CAAY,IAAI,KAAK,CAAA;AACrB,MAAA,UAAA,GAAa,IAAA;AAAA,IACf;AACA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,MAAA,EAAkB,IAAA,KAA0B;AAC/D,IAAA,IAAI,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,IAAI,CAAA;AACrC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,UAAA,GAAa,KAAA;AACjB,IAAA,KAAA,IAAS,OAAO,IAAA,EAAM;AACpB,MAAA,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AAC3B,MAAA,UAAA,GAAa,IAAA;AAAA,IACf;AACA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AAEA,EAAA,KAAA,IAAS,QAAQ,KAAA,EAAO;AACtB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,eAAA,IAAmB,IAAI,CAAA;AACtD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,WAAA,CAAY,IAAA,CAAK,eAAA,EAAgB,EAAG,IAAI,CAAA;AAAA,IAC1C;AAAA,EACF;AAEA,EAAA,OAAO,WAAA;AACT;AAEA,SAAS,UAAU,KAAA,EAAsB;AACvC,EAAA,OAAO;AAAA,IACL,WAAWwB,OAAA,CAAI;AAAA,MACb,KAAA,EAAO,WAAA;AAAA,MACP,QAAA,EAAU,MAAA;AAAA,MACV,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,MAAA;AAAA,MACT,IAAA,EAAM,OAAA;AAAA,MACN,aAAA,EAAe,QAAA;AAAA,MACf,SAAA,EAAW,CAAA;AAAA,MACX,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,KACrB,CAAA;AAAA,IACD,MAAMA,OAAA,CAAI;AAAA,MACR,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,IAED,gBAAgBA,OAAA,CAAI;AAAA;AAAA;AAAA,MAGlB,MAAA,EAAQC;AAAA,KACT,CAAA;AAAA,IAED,qBAAqBD,OAAA,CAAI;AAAA,MACvB,KAAA,EAAO,qBAAA;AAAA,MACP,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,EAAW,CAAA;AAAA,MACX,aAAA,EAAe,KAAA;AAAA,MACf,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC1B,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,IAED,0BAA0BA,OAAA,CAAI;AAAA,MAC5B,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,IAED,0BAA0BA,OAAA,CAAI;AAAA,MAC5B,SAAA,EAAW,KAAA;AAAA,MACX,SAAA,EAAWC;AAAA,KACZ,CAAA;AAAA,IAED,wBAAwBD,OAAA,CAAI;AAAA,MAC1B,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,KAC9B,CAAA;AAAA,IAED,wBAAwBA,OAAA,CAAI;AAAA,MAC1B,MAAA,EAAQC;AAAA,KACT,CAAA;AAAA,IAED,mBAAmBD,OAAA,CAAI;AAAA,MACrB,KAAA,EAAO,mBAAA;AAAA,MACP,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe;AAAA,KAChB,CAAA;AAAA,IAED,yBAAyBA,OAAA,CAAI;AAAA,MAC3B,KAAA,EAAO,yBAAA;AAAA,MACP,SAAA,EAAW,KAAA;AAAA,MACX,SAAA,EAAWC,qCAAA;AAAA,MACX,QAAA,EAAU,CAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,IAED,uBAAuBD,OAAA,CAAI;AAAA,MACzB,KAAA,EAAO,uBAAA;AAAA,MACP,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC7B,MAAA,EAAQC;AAAA,KACT;AAAA,GACH;AACF;;;;;;"}