{"version":3,"file":"BarGauge.mjs","sources":["../../../../src/components/BarGauge/BarGauge.tsx"],"sourcesContent":["// Library\nimport { cx } from '@emotion/css';\nimport { CSSProperties, PureComponent, ReactNode } from 'react';\nimport * as React from 'react';\nimport tinycolor from 'tinycolor2';\n\nimport {\n  DisplayProcessor,\n  DisplayValue,\n  DisplayValueAlignmentFactors,\n  FALLBACK_COLOR,\n  FieldColorModeId,\n  FieldConfig,\n  FormattedValue,\n  formattedValueToString,\n  GAUGE_DEFAULT_MAXIMUM,\n  GAUGE_DEFAULT_MINIMUM,\n  getFieldColorMode,\n  ThresholdsMode,\n  TimeSeriesValue,\n  VizOrientation,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { BarGaugeDisplayMode, BarGaugeNamePlacement, BarGaugeValueMode, VizTextDisplayOptions } from '@grafana/schema';\n\nimport { Themeable2 } from '../../types/theme';\nimport { calculateFontSize, measureText } from '../../utils/measureText';\nimport { clearButtonStyles } from '../Button/Button';\nimport { FormattedValueDisplay } from '../FormattedValueDisplay/FormattedValueDisplay';\n\nconst MIN_VALUE_HEIGHT = 18;\nconst MAX_VALUE_HEIGHT = 50;\nconst MAX_VALUE_WIDTH = 150;\nconst TITLE_LINE_HEIGHT = 1.5;\nconst VALUE_LINE_HEIGHT = 1;\nconst VALUE_LEFT_PADDING = 10;\nconst VALUE_RIGHT_OVERFLOW_PADDING = 15;\n\nexport interface Props extends Themeable2 {\n  height: number;\n  width: number;\n  field: FieldConfig;\n  display?: DisplayProcessor;\n  value: DisplayValue;\n  orientation: VizOrientation;\n  text?: VizTextDisplayOptions;\n  itemSpacing?: number;\n  lcdCellWidth?: number;\n  displayMode: BarGaugeDisplayMode;\n  onClick?: React.MouseEventHandler<HTMLElement>;\n  className?: string;\n  showUnfilled?: boolean;\n  alignmentFactors?: DisplayValueAlignmentFactors;\n  valueDisplayMode?: BarGaugeValueMode;\n  namePlacement?: BarGaugeNamePlacement;\n  isOverflow: boolean;\n}\n\nexport class BarGauge extends PureComponent<Props> {\n  static defaultProps: Partial<Props> = {\n    lcdCellWidth: 12,\n    value: {\n      text: '100',\n      numeric: 100,\n    },\n    displayMode: BarGaugeDisplayMode.Gradient,\n    orientation: VizOrientation.Horizontal,\n    field: {\n      min: 0,\n      max: 100,\n      thresholds: {\n        mode: ThresholdsMode.Absolute,\n        steps: [],\n      },\n    },\n    itemSpacing: 8,\n    showUnfilled: true,\n    isOverflow: false,\n  };\n\n  render() {\n    const { onClick, className, theme } = this.props;\n    const { title } = this.props.value;\n    const styles = getTitleStyles(this.props);\n\n    if (onClick) {\n      return (\n        <button\n          type=\"button\"\n          style={styles.wrapper}\n          onClick={onClick}\n          className={cx(clearButtonStyles(theme), className)}\n        >\n          <div style={styles.title}>{title}</div>\n          {this.renderBarAndValue()}\n        </button>\n      );\n    }\n\n    return (\n      <div style={styles.wrapper} className={className}>\n        {title && <div style={styles.title}>{title}</div>}\n        {this.renderBarAndValue()}\n      </div>\n    );\n  }\n\n  renderBarAndValue() {\n    switch (this.props.displayMode) {\n      case 'lcd':\n        return this.renderRetroBars();\n      case 'basic':\n      case 'gradient':\n      default:\n        return this.renderBasicAndGradientBars();\n    }\n  }\n\n  renderBasicAndGradientBars(): ReactNode {\n    const { value, showUnfilled, valueDisplayMode } = this.props;\n\n    const styles = getBasicAndGradientStyles(this.props);\n\n    return (\n      <div style={styles.wrapper}>\n        {valueDisplayMode !== BarGaugeValueMode.Hidden && (\n          <FormattedValueDisplay\n            data-testid={selectors.components.Panels.Visualization.BarGauge.valueV2}\n            value={value}\n            style={styles.value}\n          />\n        )}\n        {showUnfilled && <div style={styles.emptyBar} />}\n        <div style={styles.bar} />\n      </div>\n    );\n  }\n\n  renderRetroBars(): ReactNode {\n    const {\n      display,\n      field,\n      value,\n      itemSpacing,\n      alignmentFactors,\n      orientation,\n      lcdCellWidth,\n      text,\n      valueDisplayMode,\n      theme,\n      isOverflow,\n    } = this.props;\n    const { valueHeight, valueWidth, maxBarHeight, maxBarWidth, wrapperWidth, wrapperHeight } =\n      calculateBarAndValueDimensions(this.props);\n    const minValue = field.min ?? GAUGE_DEFAULT_MINIMUM;\n    const maxValue = field.max ?? GAUGE_DEFAULT_MAXIMUM;\n\n    const isVert = isVertical(orientation);\n    const valueRange = maxValue - minValue;\n    const maxSize = isVert ? maxBarHeight : maxBarWidth;\n    const cellSpacing = itemSpacing!;\n    const cellCount = Math.floor(maxSize / lcdCellWidth!);\n    const cellSize = Math.floor((maxSize - cellSpacing * cellCount) / cellCount);\n    const valueColor = getTextValueColor(this.props);\n\n    const valueToBaseSizeOn = alignmentFactors ? alignmentFactors : value;\n    const valueStyles = getValueStyles(\n      valueToBaseSizeOn,\n      valueColor,\n      valueWidth,\n      valueHeight,\n      orientation,\n      isOverflow,\n      text\n    );\n\n    const containerStyles: CSSProperties = {\n      width: `${wrapperWidth}px`,\n      height: `${wrapperHeight}px`,\n      display: 'flex',\n    };\n\n    if (isVert) {\n      containerStyles.flexDirection = 'column-reverse';\n      containerStyles.alignItems = 'center';\n    } else {\n      containerStyles.flexDirection = 'row';\n      containerStyles.alignItems = 'center';\n      valueStyles.justifyContent = 'flex-end';\n    }\n\n    const cells: JSX.Element[] = [];\n\n    for (let i = 0; i < cellCount; i++) {\n      const currentValue = minValue + (valueRange / cellCount) * i;\n      const cellColor = getCellColor(currentValue, value, display);\n      const cellStyles: CSSProperties = {\n        borderRadius: theme.shape.radius.default,\n      };\n\n      if (cellColor.isLit) {\n        cellStyles.backgroundImage = `radial-gradient(${cellColor.background} 10%, ${cellColor.backgroundShade})`;\n      } else {\n        cellStyles.backgroundColor = cellColor.background;\n      }\n\n      if (isVert) {\n        cellStyles.height = `${cellSize}px`;\n        cellStyles.width = `${maxBarWidth}px`;\n        cellStyles.marginTop = `${cellSpacing}px`;\n      } else {\n        cellStyles.width = `${cellSize}px`;\n        cellStyles.height = `${maxBarHeight}px`;\n        cellStyles.marginRight = `${cellSpacing}px`;\n      }\n\n      cells.push(<div key={i.toString()} style={cellStyles} />);\n    }\n\n    return (\n      <div style={containerStyles}>\n        {cells}\n        {valueDisplayMode !== BarGaugeValueMode.Hidden && (\n          <FormattedValueDisplay\n            data-testid={selectors.components.Panels.Visualization.BarGauge.valueV2}\n            value={value}\n            style={valueStyles}\n          />\n        )}\n      </div>\n    );\n  }\n}\n\ninterface CellColors {\n  background: string;\n  backgroundShade?: string;\n  border: string;\n  isLit?: boolean;\n}\n\ninterface TitleDimensions {\n  fontSize: number;\n  placement: 'above' | 'left' | 'below' | 'hidden';\n  width: number;\n  height: number;\n}\n\nfunction isVertical(orientation: VizOrientation) {\n  return orientation === VizOrientation.Vertical;\n}\n\nfunction calculateTitleDimensions(props: Props): TitleDimensions {\n  const { height, width, alignmentFactors, orientation, text, namePlacement } = props;\n  const title = alignmentFactors ? alignmentFactors.title : props.value.title;\n\n  if (!title) {\n    return { fontSize: 0, width: 0, height: 0, placement: 'above' };\n  }\n\n  if (namePlacement === BarGaugeNamePlacement.Hidden) {\n    return {\n      fontSize: 0,\n      width: 0,\n      height: 0,\n      placement: BarGaugeNamePlacement.Hidden,\n    };\n  }\n\n  if (isVertical(orientation)) {\n    const fontSize = text?.titleSize ?? 14;\n    return {\n      fontSize: fontSize,\n      width: width,\n      height: fontSize * TITLE_LINE_HEIGHT,\n      placement: 'below',\n    };\n  }\n\n  const shouldDisplayValueAbove =\n    (height > 40 && namePlacement === BarGaugeNamePlacement.Auto) || namePlacement === BarGaugeNamePlacement.Top;\n\n  if (shouldDisplayValueAbove) {\n    if (text?.titleSize) {\n      return {\n        fontSize: text?.titleSize,\n        width: 0,\n        height: text.titleSize * TITLE_LINE_HEIGHT,\n        placement: 'above',\n      };\n    }\n\n    const maxTitleHeightRatio = 0.45;\n    const titleHeight = Math.max(Math.min(height * maxTitleHeightRatio, MAX_VALUE_HEIGHT), 17);\n\n    return {\n      fontSize: titleHeight / TITLE_LINE_HEIGHT,\n      width: 0,\n      height: titleHeight,\n      placement: 'above',\n    };\n  }\n\n  // title to left of bar scenario\n  const maxTitleHeightRatio = 0.6;\n  const titleHeight = Math.max(height * maxTitleHeightRatio, MIN_VALUE_HEIGHT);\n  const titleFontSize = titleHeight / TITLE_LINE_HEIGHT;\n  const textSize = measureText(title, titleFontSize);\n\n  // Do not allow title to take up more than 40% width\n  const textWidth = Math.min(textSize.width + 15, width * 0.4);\n\n  return {\n    fontSize: text?.titleSize ?? titleFontSize,\n    height: 0,\n    width: textWidth,\n    placement: 'left',\n  };\n}\n\nexport function getTitleStyles(props: Props): { wrapper: CSSProperties; title: CSSProperties } {\n  const wrapperStyles: CSSProperties = {\n    display: 'flex',\n    overflow: 'hidden',\n    width: '100%',\n  };\n\n  const titleDim = calculateTitleDimensions(props);\n\n  const titleStyles: CSSProperties = {\n    fontSize: `${titleDim.fontSize}px`,\n    whiteSpace: 'nowrap',\n    overflow: 'hidden',\n    textOverflow: 'ellipsis',\n    width: '100%',\n    alignItems: 'center',\n    alignSelf: 'center',\n  };\n\n  if (titleDim.placement === 'hidden') {\n    titleStyles.display = 'none';\n  } else {\n    if (isVertical(props.orientation)) {\n      wrapperStyles.flexDirection = 'column-reverse';\n      titleStyles.textAlign = 'center';\n    } else {\n      if (titleDim.placement === 'above') {\n        wrapperStyles.flexDirection = 'column';\n      } else {\n        wrapperStyles.flexDirection = 'row';\n\n        titleStyles.width = `${titleDim.width}px`;\n        titleStyles.textAlign = 'right';\n        titleStyles.paddingRight = '10px';\n      }\n    }\n  }\n\n  return {\n    wrapper: wrapperStyles,\n    title: titleStyles,\n  };\n}\n\ninterface BasicAndGradientStyles {\n  wrapper: CSSProperties;\n  bar: CSSProperties;\n  emptyBar: CSSProperties;\n  value: CSSProperties;\n}\n\ninterface BarAndValueDimensions {\n  valueWidth: number;\n  valueHeight: number;\n  maxBarWidth: number;\n  maxBarHeight: number;\n  wrapperHeight: number;\n  wrapperWidth: number;\n}\n\n/**\n * @internal\n * Only exported for unit tests\n **/\nexport function calculateBarAndValueDimensions(props: Props): BarAndValueDimensions {\n  const { height, width, orientation, text, alignmentFactors, valueDisplayMode } = props;\n  const titleDim = calculateTitleDimensions(props);\n  const value = alignmentFactors ?? props.value;\n  const valueString = formattedValueToString(value);\n\n  let maxBarHeight = 0;\n  let maxBarWidth = 0;\n  let valueHeight = 0;\n  let valueWidth = 0;\n  let wrapperWidth = 0;\n  let wrapperHeight = 0;\n\n  // measure text with title font size or min 14px\n  const fontSizeToMeasureWith = text?.valueSize ?? Math.max(titleDim.fontSize, 12);\n  const realTextSize = measureText(valueString, fontSizeToMeasureWith);\n  const realValueWidth = realTextSize.width + VALUE_LEFT_PADDING * 2;\n\n  if (isVertical(orientation)) {\n    if (text?.valueSize) {\n      valueHeight = text.valueSize * VALUE_LINE_HEIGHT;\n    } else {\n      valueHeight = Math.min(Math.max(height * 0.1, MIN_VALUE_HEIGHT), MAX_VALUE_HEIGHT);\n    }\n\n    valueWidth = width;\n\n    if (valueDisplayMode === BarGaugeValueMode.Hidden) {\n      valueHeight = 0;\n      valueWidth = 0;\n    }\n\n    maxBarHeight = height - (titleDim.height + valueHeight);\n    maxBarWidth = width;\n    wrapperWidth = width;\n    wrapperHeight = height - titleDim.height;\n  } else {\n    // Calculate the width and the height of the given values\n    if (valueDisplayMode === BarGaugeValueMode.Hidden) {\n      valueHeight = 0;\n      valueWidth = 0;\n    } else {\n      valueHeight = height - titleDim.height;\n      valueWidth = Math.max(Math.min(width * 0.2, MAX_VALUE_WIDTH), realValueWidth);\n    }\n\n    maxBarHeight = height - titleDim.height;\n    maxBarWidth = width - valueWidth - titleDim.width;\n\n    if (titleDim.placement === 'above') {\n      wrapperWidth = width;\n      wrapperHeight = height - titleDim.height;\n    } else {\n      wrapperWidth = width - titleDim.width;\n      wrapperHeight = height;\n    }\n  }\n\n  return {\n    valueWidth,\n    valueHeight,\n    maxBarWidth,\n    maxBarHeight,\n    wrapperHeight,\n    wrapperWidth,\n  };\n}\n\nexport function getCellColor(\n  positionValue: TimeSeriesValue,\n  value: Props['value'],\n  display: Props['display']\n): CellColors {\n  if (positionValue === null) {\n    return {\n      background: FALLBACK_COLOR,\n      border: FALLBACK_COLOR,\n    };\n  }\n\n  const color = display ? display(positionValue).color : null;\n\n  if (color) {\n    // if we are past real value the cell is not \"on\"\n    if (value === null || isNaN(value.numeric) || (positionValue !== null && positionValue > value.numeric)) {\n      return {\n        background: tinycolor(color).setAlpha(0.18).toRgbString(),\n        border: 'transparent',\n        isLit: false,\n      };\n    } else {\n      return {\n        background: tinycolor(color).setAlpha(0.95).toRgbString(),\n        backgroundShade: tinycolor(color).setAlpha(0.55).toRgbString(),\n        border: tinycolor(color).setAlpha(0.9).toRgbString(),\n        isLit: true,\n      };\n    }\n  }\n\n  return {\n    background: FALLBACK_COLOR,\n    border: FALLBACK_COLOR,\n  };\n}\n\nexport function getValuePercent(value: number, minValue: number, maxValue: number): number {\n  // Need special logic for when minValue === maxValue === value to prevent returning NaN\n  const valueRatio = Math.min((value - minValue) / (maxValue - minValue), 1);\n  return isNaN(valueRatio) ? 0 : valueRatio;\n}\n\n/**\n * Only exported to for unit test\n */\nexport function getBasicAndGradientStyles(props: Props): BasicAndGradientStyles {\n  const { displayMode, field, value, alignmentFactors, orientation, theme, text, isOverflow } = props;\n  const { valueWidth, valueHeight, maxBarHeight, maxBarWidth } = calculateBarAndValueDimensions(props);\n\n  const minValue = field.min ?? GAUGE_DEFAULT_MINIMUM;\n  const maxValue = field.max ?? GAUGE_DEFAULT_MAXIMUM;\n  const valuePercent = getValuePercent(value.numeric, minValue, maxValue);\n  const textColor = getTextValueColor(props);\n  const barColor = value.color ?? FALLBACK_COLOR;\n\n  const valueToBaseSizeOn = alignmentFactors ? alignmentFactors : value;\n  const valueStyles = getValueStyles(\n    valueToBaseSizeOn,\n    textColor,\n    valueWidth,\n    valueHeight,\n    orientation,\n    isOverflow,\n    text\n  );\n\n  const isBasic = displayMode === 'basic';\n  const wrapperStyles: CSSProperties = {\n    display: 'flex',\n    flexGrow: 1,\n  };\n\n  const barStyles: CSSProperties = {\n    borderRadius: theme.shape.radius.default,\n    position: 'relative',\n  };\n\n  const emptyBar: CSSProperties = {\n    background: theme.colors.background.secondary,\n    flexGrow: 1,\n    display: 'flex',\n    borderRadius: theme.shape.radius.default,\n    position: 'relative',\n  };\n\n  if (isVertical(orientation)) {\n    const barHeight = Math.max(valuePercent * maxBarHeight, 1);\n\n    // vertical styles\n    wrapperStyles.flexDirection = 'column';\n    wrapperStyles.justifyContent = 'flex-end';\n\n    barStyles.transition = 'height 1s';\n    barStyles.height = `${barHeight}px`;\n    barStyles.width = `${maxBarWidth}px`;\n\n    // adjust so that filled in bar is at the bottom\n    emptyBar.bottom = '-3px';\n\n    //adjust empty region to always have same width as colored bar\n    emptyBar.width = `${valueWidth}px`;\n\n    if (isBasic) {\n      // Basic styles\n      barStyles.background = `${tinycolor(barColor).setAlpha(0.35).toRgbString()}`;\n      barStyles.borderTop = `2px solid ${barColor}`;\n    } else {\n      // Gradient styles\n      barStyles.background = getBarGradient(props, maxBarHeight);\n    }\n  } else {\n    const barWidth = Math.max(valuePercent * maxBarWidth, 1);\n\n    // Custom styles for horizontal orientation\n    wrapperStyles.flexDirection = 'row-reverse';\n    wrapperStyles.justifyContent = 'flex-end';\n    wrapperStyles.alignItems = 'stretch';\n\n    barStyles.transition = 'width 1s';\n    barStyles.height = `${maxBarHeight}px`;\n    barStyles.width = `${barWidth}px`;\n\n    // shift empty region back to fill gaps due to border radius\n    emptyBar.left = '-3px';\n\n    //adjust empty region to always have same height as colored bar\n    emptyBar.height = `${valueHeight}px`;\n\n    if (isBasic) {\n      // Basic styles\n      barStyles.background = `${tinycolor(barColor).setAlpha(0.35).toRgbString()}`;\n      barStyles.borderRight = `2px solid ${barColor}`;\n    } else {\n      // Gradient styles\n      barStyles.background = getBarGradient(props, maxBarWidth);\n    }\n  }\n\n  return {\n    wrapper: wrapperStyles,\n    bar: barStyles,\n    value: valueStyles,\n    emptyBar,\n  };\n}\n\n/**\n * Only exported to for unit test\n */\nexport function getBarGradient(props: Props, maxSize: number): string {\n  const { field, value, orientation, theme } = props;\n  const cssDirection = isVertical(orientation) ? '0deg' : '90deg';\n  const minValue = field.min!;\n  const maxValue = field.max!;\n\n  let gradient = '';\n  let lastpos = 0;\n  let mode = getFieldColorMode(field.color?.mode);\n\n  if (mode.id === FieldColorModeId.Thresholds) {\n    const thresholds = field.thresholds!;\n\n    for (let i = 0; i < thresholds.steps.length; i++) {\n      const threshold = thresholds.steps[i];\n      const color = props.theme.visualization.getColorByName(threshold.color);\n      const valuePercent =\n        thresholds.mode === ThresholdsMode.Percentage\n          ? threshold.value / 100\n          : getValuePercent(threshold.value, minValue, maxValue);\n      const pos = valuePercent * maxSize;\n      const offset = Math.round(pos - (pos - lastpos) / 2);\n      const thresholdValue =\n        thresholds.mode === ThresholdsMode.Percentage\n          ? minValue + (maxValue - minValue) * valuePercent\n          : threshold.value;\n      if (gradient === '') {\n        gradient = `linear-gradient(${cssDirection}, ${color}, ${color}`;\n      } else if (value.numeric < thresholdValue) {\n        break;\n      } else {\n        lastpos = pos;\n        gradient += ` ${offset}px, ${color}`;\n      }\n    }\n\n    return gradient + ')';\n  }\n\n  if (mode.isContinuous && mode.getColors) {\n    const scheme = mode.getColors(theme);\n\n    for (let i = 0; i < scheme.length; i++) {\n      const color = scheme[i];\n\n      if (gradient === '') {\n        gradient = `linear-gradient(${cssDirection}, ${color} 0px`;\n      } else {\n        const valuePercent = i / (scheme.length - 1);\n        const pos = valuePercent * maxSize;\n        gradient += `, ${color} ${pos}px`;\n      }\n    }\n    return gradient + ')';\n  }\n\n  return value.color ?? FALLBACK_COLOR;\n}\n\n/**\n * Only exported to for unit test\n */\nexport function getTextValueColor(props: Props): string {\n  if (props.valueDisplayMode === 'text') {\n    return props.theme.colors.text.primary;\n  }\n\n  const { value } = props;\n  if (value.color) {\n    return value.color;\n  }\n\n  return FALLBACK_COLOR;\n}\n\nfunction getValueStyles(\n  value: FormattedValue,\n  color: string,\n  width: number,\n  height: number,\n  orientation: VizOrientation,\n  isOverflow: boolean,\n  text?: VizTextDisplayOptions\n): CSSProperties {\n  const styles: CSSProperties = {\n    color,\n    height: `${height}px`,\n    maxWidth: `${width}px`,\n    display: 'flex',\n    alignItems: 'center',\n    textWrap: 'nowrap',\n    lineHeight: VALUE_LINE_HEIGHT,\n  };\n\n  // how many pixels in wide can the text be?\n  let textWidth = width;\n  const formattedValueString = formattedValueToString(value);\n\n  if (isVertical(orientation)) {\n    styles.fontSize = text?.valueSize ?? calculateFontSize(formattedValueString, textWidth, height, VALUE_LINE_HEIGHT);\n    styles.justifyContent = `center`;\n  } else {\n    styles.fontSize =\n      text?.valueSize ??\n      calculateFontSize(formattedValueString, textWidth - VALUE_LEFT_PADDING * 2, height, VALUE_LINE_HEIGHT);\n    styles.justifyContent = `flex-end`;\n    styles.paddingLeft = `${VALUE_LEFT_PADDING}px`;\n    styles.paddingRight = `${VALUE_LEFT_PADDING + (isOverflow ? VALUE_RIGHT_OVERFLOW_PADDING : 0)}px`;\n    // Need to remove the left padding from the text width constraints\n    textWidth -= VALUE_LEFT_PADDING;\n  }\n\n  return styles;\n}\n"],"names":["maxTitleHeightRatio","titleHeight"],"mappings":";;;;;;;;;;;AA8BA,MAAM,gBAAmB,GAAA,EAAA;AACzB,MAAM,gBAAmB,GAAA,EAAA;AACzB,MAAM,eAAkB,GAAA,GAAA;AACxB,MAAM,iBAAoB,GAAA,GAAA;AAC1B,MAAM,iBAAoB,GAAA,CAAA;AAC1B,MAAM,kBAAqB,GAAA,EAAA;AAC3B,MAAM,4BAA+B,GAAA,EAAA;AAsB9B,MAAM,iBAAiB,aAAqB,CAAA;AAAA,EAsBjD,MAAS,GAAA;AACP,IAAA,MAAM,EAAE,OAAA,EAAS,SAAW,EAAA,KAAA,KAAU,IAAK,CAAA,KAAA;AAC3C,IAAA,MAAM,EAAE,KAAA,EAAU,GAAA,IAAA,CAAK,KAAM,CAAA,KAAA;AAC7B,IAAM,MAAA,MAAA,GAAS,cAAe,CAAA,IAAA,CAAK,KAAK,CAAA;AAExC,IAAA,IAAI,OAAS,EAAA;AACX,MACE,uBAAA,IAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAK,EAAA,QAAA;AAAA,UACL,OAAO,MAAO,CAAA,OAAA;AAAA,UACd,OAAA;AAAA,UACA,SAAW,EAAA,EAAA,CAAG,iBAAkB,CAAA,KAAK,GAAG,SAAS,CAAA;AAAA,UAEjD,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,KAAI,EAAA,EAAA,KAAA,EAAO,MAAO,CAAA,KAAA,EAAQ,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,YAChC,KAAK,iBAAkB;AAAA;AAAA;AAAA,OAC1B;AAAA;AAIJ,IAAA,uBACG,IAAA,CAAA,KAAA,EAAA,EAAI,KAAO,EAAA,MAAA,CAAO,SAAS,SACzB,EAAA,QAAA,EAAA;AAAA,MAAA,KAAA,oBAAU,GAAA,CAAA,KAAA,EAAA,EAAI,KAAO,EAAA,MAAA,CAAO,OAAQ,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,MAC1C,KAAK,iBAAkB;AAAA,KAC1B,EAAA,CAAA;AAAA;AAEJ,EAEA,iBAAoB,GAAA;AAClB,IAAQ,QAAA,IAAA,CAAK,MAAM,WAAa;AAAA,MAC9B,KAAK,KAAA;AACH,QAAA,OAAO,KAAK,eAAgB,EAAA;AAAA,MAC9B,KAAK,OAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL;AACE,QAAA,OAAO,KAAK,0BAA2B,EAAA;AAAA;AAC3C;AACF,EAEA,0BAAwC,GAAA;AACtC,IAAA,MAAM,EAAE,KAAA,EAAO,YAAc,EAAA,gBAAA,KAAqB,IAAK,CAAA,KAAA;AAEvD,IAAM,MAAA,MAAA,GAAS,yBAA0B,CAAA,IAAA,CAAK,KAAK,CAAA;AAEnD,IAAA,uBACG,IAAA,CAAA,KAAA,EAAA,EAAI,KAAO,EAAA,MAAA,CAAO,OAChB,EAAA,QAAA,EAAA;AAAA,MAAA,gBAAA,KAAqB,kBAAkB,MACtC,oBAAA,GAAA;AAAA,QAAC,qBAAA;AAAA,QAAA;AAAA,UACC,aAAa,EAAA,SAAA,CAAU,UAAW,CAAA,MAAA,CAAO,cAAc,QAAS,CAAA,OAAA;AAAA,UAChE,KAAA;AAAA,UACA,OAAO,MAAO,CAAA;AAAA;AAAA,OAChB;AAAA,MAED,YAAgB,oBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,KAAA,EAAO,OAAO,QAAU,EAAA,CAAA;AAAA,sBAC7C,GAAA,CAAA,KAAA,EAAA,EAAI,KAAO,EAAA,MAAA,CAAO,GAAK,EAAA;AAAA,KAC1B,EAAA,CAAA;AAAA;AAEJ,EAEA,eAA6B,GAAA;AA1I/B,IAAA,IAAA,EAAA,EAAA,EAAA;AA2II,IAAM,MAAA;AAAA,MACJ,OAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA;AAAA,MACA,gBAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,IAAA;AAAA,MACA,gBAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,QACE,IAAK,CAAA,KAAA;AACT,IAAM,MAAA,EAAE,WAAa,EAAA,UAAA,EAAY,YAAc,EAAA,WAAA,EAAa,cAAc,aAAc,EAAA,GACtF,8BAA+B,CAAA,IAAA,CAAK,KAAK,CAAA;AAC3C,IAAM,MAAA,QAAA,GAAA,CAAW,EAAM,GAAA,KAAA,CAAA,GAAA,KAAN,IAAa,GAAA,EAAA,GAAA,qBAAA;AAC9B,IAAM,MAAA,QAAA,GAAA,CAAW,EAAM,GAAA,KAAA,CAAA,GAAA,KAAN,IAAa,GAAA,EAAA,GAAA,qBAAA;AAE9B,IAAM,MAAA,MAAA,GAAS,WAAW,WAAW,CAAA;AACrC,IAAA,MAAM,aAAa,QAAW,GAAA,QAAA;AAC9B,IAAM,MAAA,OAAA,GAAU,SAAS,YAAe,GAAA,WAAA;AACxC,IAAA,MAAM,WAAc,GAAA,WAAA;AACpB,IAAA,MAAM,SAAY,GAAA,IAAA,CAAK,KAAM,CAAA,OAAA,GAAU,YAAa,CAAA;AACpD,IAAA,MAAM,WAAW,IAAK,CAAA,KAAA,CAAA,CAAO,OAAU,GAAA,WAAA,GAAc,aAAa,SAAS,CAAA;AAC3E,IAAM,MAAA,UAAA,GAAa,iBAAkB,CAAA,IAAA,CAAK,KAAK,CAAA;AAE/C,IAAM,MAAA,iBAAA,GAAoB,mBAAmB,gBAAmB,GAAA,KAAA;AAChE,IAAA,MAAM,WAAc,GAAA,cAAA;AAAA,MAClB,iBAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,eAAiC,GAAA;AAAA,MACrC,KAAA,EAAO,GAAG,YAAY,CAAA,EAAA,CAAA;AAAA,MACtB,MAAA,EAAQ,GAAG,aAAa,CAAA,EAAA,CAAA;AAAA,MACxB,OAAS,EAAA;AAAA,KACX;AAEA,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,eAAA,CAAgB,aAAgB,GAAA,gBAAA;AAChC,MAAA,eAAA,CAAgB,UAAa,GAAA,QAAA;AAAA,KACxB,MAAA;AACL,MAAA,eAAA,CAAgB,aAAgB,GAAA,KAAA;AAChC,MAAA,eAAA,CAAgB,UAAa,GAAA,QAAA;AAC7B,MAAA,WAAA,CAAY,cAAiB,GAAA,UAAA;AAAA;AAG/B,IAAA,MAAM,QAAuB,EAAC;AAE9B,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,SAAA,EAAW,CAAK,EAAA,EAAA;AAClC,MAAM,MAAA,YAAA,GAAe,QAAY,GAAA,UAAA,GAAa,SAAa,GAAA,CAAA;AAC3D,MAAA,MAAM,SAAY,GAAA,YAAA,CAAa,YAAc,EAAA,KAAA,EAAO,OAAO,CAAA;AAC3D,MAAA,MAAM,UAA4B,GAAA;AAAA,QAChC,YAAA,EAAc,KAAM,CAAA,KAAA,CAAM,MAAO,CAAA;AAAA,OACnC;AAEA,MAAA,IAAI,UAAU,KAAO,EAAA;AACnB,QAAA,UAAA,CAAW,kBAAkB,CAAmB,gBAAA,EAAA,SAAA,CAAU,UAAU,CAAA,MAAA,EAAS,UAAU,eAAe,CAAA,CAAA,CAAA;AAAA,OACjG,MAAA;AACL,QAAA,UAAA,CAAW,kBAAkB,SAAU,CAAA,UAAA;AAAA;AAGzC,MAAA,IAAI,MAAQ,EAAA;AACV,QAAW,UAAA,CAAA,MAAA,GAAS,GAAG,QAAQ,CAAA,EAAA,CAAA;AAC/B,QAAW,UAAA,CAAA,KAAA,GAAQ,GAAG,WAAW,CAAA,EAAA,CAAA;AACjC,QAAW,UAAA,CAAA,SAAA,GAAY,GAAG,WAAW,CAAA,EAAA,CAAA;AAAA,OAChC,MAAA;AACL,QAAW,UAAA,CAAA,KAAA,GAAQ,GAAG,QAAQ,CAAA,EAAA,CAAA;AAC9B,QAAW,UAAA,CAAA,MAAA,GAAS,GAAG,YAAY,CAAA,EAAA,CAAA;AACnC,QAAW,UAAA,CAAA,WAAA,GAAc,GAAG,WAAW,CAAA,EAAA,CAAA;AAAA;AAGzC,MAAM,KAAA,CAAA,IAAA,qBAAM,KAAuB,EAAA,EAAA,KAAA,EAAO,cAArB,CAAE,CAAA,QAAA,EAA+B,CAAE,CAAA;AAAA;AAG1D,IACE,uBAAA,IAAA,CAAC,KAAI,EAAA,EAAA,KAAA,EAAO,eACT,EAAA,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MACA,gBAAA,KAAqB,kBAAkB,MACtC,oBAAA,GAAA;AAAA,QAAC,qBAAA;AAAA,QAAA;AAAA,UACC,aAAa,EAAA,SAAA,CAAU,UAAW,CAAA,MAAA,CAAO,cAAc,QAAS,CAAA,OAAA;AAAA,UAChE,KAAA;AAAA,UACA,KAAO,EAAA;AAAA;AAAA;AACT,KAEJ,EAAA,CAAA;AAAA;AAGN;AA9Ka,QAAA,CACJ,YAA+B,GAAA;AAAA,EACpC,YAAc,EAAA,EAAA;AAAA,EACd,KAAO,EAAA;AAAA,IACL,IAAM,EAAA,KAAA;AAAA,IACN,OAAS,EAAA;AAAA,GACX;AAAA,EACA,aAAa,mBAAoB,CAAA,QAAA;AAAA,EACjC,aAAa,cAAe,CAAA,UAAA;AAAA,EAC5B,KAAO,EAAA;AAAA,IACL,GAAK,EAAA,CAAA;AAAA,IACL,GAAK,EAAA,GAAA;AAAA,IACL,UAAY,EAAA;AAAA,MACV,MAAM,cAAe,CAAA,QAAA;AAAA,MACrB,OAAO;AAAC;AACV,GACF;AAAA,EACA,WAAa,EAAA,CAAA;AAAA,EACb,YAAc,EAAA,IAAA;AAAA,EACd,UAAY,EAAA;AACd,CAAA;AA0KF,SAAS,WAAW,WAA6B,EAAA;AAC/C,EAAA,OAAO,gBAAgB,cAAe,CAAA,QAAA;AACxC;AAEA,SAAS,yBAAyB,KAA+B,EAAA;AA5PjE,EAAA,IAAA,EAAA,EAAA,EAAA;AA6PE,EAAA,MAAM,EAAE,MAAQ,EAAA,KAAA,EAAO,kBAAkB,WAAa,EAAA,IAAA,EAAM,eAAkB,GAAA,KAAA;AAC9E,EAAA,MAAM,KAAQ,GAAA,gBAAA,GAAmB,gBAAiB,CAAA,KAAA,GAAQ,MAAM,KAAM,CAAA,KAAA;AAEtE,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAO,OAAA,EAAE,UAAU,CAAG,EAAA,KAAA,EAAO,GAAG,MAAQ,EAAA,CAAA,EAAG,WAAW,OAAQ,EAAA;AAAA;AAGhE,EAAI,IAAA,aAAA,KAAkB,sBAAsB,MAAQ,EAAA;AAClD,IAAO,OAAA;AAAA,MACL,QAAU,EAAA,CAAA;AAAA,MACV,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA,CAAA;AAAA,MACR,WAAW,qBAAsB,CAAA;AAAA,KACnC;AAAA;AAGF,EAAI,IAAA,UAAA,CAAW,WAAW,CAAG,EAAA;AAC3B,IAAM,MAAA,QAAA,GAAA,CAAW,EAAM,GAAA,IAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,IAAA,CAAA,SAAA,KAAN,IAAmB,GAAA,EAAA,GAAA,EAAA;AACpC,IAAO,OAAA;AAAA,MACL,QAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAQ,QAAW,GAAA,iBAAA;AAAA,MACnB,SAAW,EAAA;AAAA,KACb;AAAA;AAGF,EAAA,MAAM,0BACH,MAAS,GAAA,EAAA,IAAM,kBAAkB,qBAAsB,CAAA,IAAA,IAAS,kBAAkB,qBAAsB,CAAA,GAAA;AAE3G,EAAA,IAAI,uBAAyB,EAAA;AAC3B,IAAA,IAAI,6BAAM,SAAW,EAAA;AACnB,MAAO,OAAA;AAAA,QACL,UAAU,IAAM,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,IAAA,CAAA,SAAA;AAAA,QAChB,KAAO,EAAA,CAAA;AAAA,QACP,MAAA,EAAQ,KAAK,SAAY,GAAA,iBAAA;AAAA,QACzB,SAAW,EAAA;AAAA,OACb;AAAA;AAGF,IAAA,MAAMA,oBAAsB,GAAA,IAAA;AAC5B,IAAMC,MAAAA,YAAAA,GAAc,KAAK,GAAI,CAAA,IAAA,CAAK,IAAI,MAASD,GAAAA,oBAAAA,EAAqB,gBAAgB,CAAA,EAAG,EAAE,CAAA;AAEzF,IAAO,OAAA;AAAA,MACL,UAAUC,YAAc,GAAA,iBAAA;AAAA,MACxB,KAAO,EAAA,CAAA;AAAA,MACP,MAAQA,EAAAA,YAAAA;AAAA,MACR,SAAW,EAAA;AAAA,KACb;AAAA;AAIF,EAAA,MAAM,mBAAsB,GAAA,GAAA;AAC5B,EAAA,MAAM,WAAc,GAAA,IAAA,CAAK,GAAI,CAAA,MAAA,GAAS,qBAAqB,gBAAgB,CAAA;AAC3E,EAAA,MAAM,gBAAgB,WAAc,GAAA,iBAAA;AACpC,EAAM,MAAA,QAAA,GAAW,WAAY,CAAA,KAAA,EAAO,aAAa,CAAA;AAGjD,EAAA,MAAM,YAAY,IAAK,CAAA,GAAA,CAAI,SAAS,KAAQ,GAAA,EAAA,EAAI,QAAQ,GAAG,CAAA;AAE3D,EAAO,OAAA;AAAA,IACL,QAAA,EAAA,CAAU,EAAM,GAAA,IAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,IAAA,CAAA,SAAA,KAAN,IAAmB,GAAA,EAAA,GAAA,aAAA;AAAA,IAC7B,MAAQ,EAAA,CAAA;AAAA,IACR,KAAO,EAAA,SAAA;AAAA,IACP,SAAW,EAAA;AAAA,GACb;AACF;AAEO,SAAS,eAAe,KAAgE,EAAA;AAC7F,EAAA,MAAM,aAA+B,GAAA;AAAA,IACnC,OAAS,EAAA,MAAA;AAAA,IACT,QAAU,EAAA,QAAA;AAAA,IACV,KAAO,EAAA;AAAA,GACT;AAEA,EAAM,MAAA,QAAA,GAAW,yBAAyB,KAAK,CAAA;AAE/C,EAAA,MAAM,WAA6B,GAAA;AAAA,IACjC,QAAA,EAAU,CAAG,EAAA,QAAA,CAAS,QAAQ,CAAA,EAAA,CAAA;AAAA,IAC9B,UAAY,EAAA,QAAA;AAAA,IACZ,QAAU,EAAA,QAAA;AAAA,IACV,YAAc,EAAA,UAAA;AAAA,IACd,KAAO,EAAA,MAAA;AAAA,IACP,UAAY,EAAA,QAAA;AAAA,IACZ,SAAW,EAAA;AAAA,GACb;AAEA,EAAI,IAAA,QAAA,CAAS,cAAc,QAAU,EAAA;AACnC,IAAA,WAAA,CAAY,OAAU,GAAA,MAAA;AAAA,GACjB,MAAA;AACL,IAAI,IAAA,UAAA,CAAW,KAAM,CAAA,WAAW,CAAG,EAAA;AACjC,MAAA,aAAA,CAAc,aAAgB,GAAA,gBAAA;AAC9B,MAAA,WAAA,CAAY,SAAY,GAAA,QAAA;AAAA,KACnB,MAAA;AACL,MAAI,IAAA,QAAA,CAAS,cAAc,OAAS,EAAA;AAClC,QAAA,aAAA,CAAc,aAAgB,GAAA,QAAA;AAAA,OACzB,MAAA;AACL,QAAA,aAAA,CAAc,aAAgB,GAAA,KAAA;AAE9B,QAAY,WAAA,CAAA,KAAA,GAAQ,CAAG,EAAA,QAAA,CAAS,KAAK,CAAA,EAAA,CAAA;AACrC,QAAA,WAAA,CAAY,SAAY,GAAA,OAAA;AACxB,QAAA,WAAA,CAAY,YAAe,GAAA,MAAA;AAAA;AAC7B;AACF;AAGF,EAAO,OAAA;AAAA,IACL,OAAS,EAAA,aAAA;AAAA,IACT,KAAO,EAAA;AAAA,GACT;AACF;AAsBO,SAAS,+BAA+B,KAAqC,EAAA;AAhYpF,EAAA,IAAA,EAAA;AAiYE,EAAA,MAAM,EAAE,MAAQ,EAAA,KAAA,EAAO,aAAa,IAAM,EAAA,gBAAA,EAAkB,kBAAqB,GAAA,KAAA;AACjF,EAAM,MAAA,QAAA,GAAW,yBAAyB,KAAK,CAAA;AAC/C,EAAM,MAAA,KAAA,GAAQ,8CAAoB,KAAM,CAAA,KAAA;AACxC,EAAM,MAAA,WAAA,GAAc,uBAAuB,KAAK,CAAA;AAEhD,EAAA,IAAI,YAAe,GAAA,CAAA;AACnB,EAAA,IAAI,WAAc,GAAA,CAAA;AAClB,EAAA,IAAI,WAAc,GAAA,CAAA;AAClB,EAAA,IAAI,UAAa,GAAA,CAAA;AACjB,EAAA,IAAI,YAAe,GAAA,CAAA;AACnB,EAAA,IAAI,aAAgB,GAAA,CAAA;AAGpB,EAAM,MAAA,qBAAA,GAAA,CAAwB,kCAAM,SAAN,KAAA,IAAA,GAAA,EAAA,GAAmB,KAAK,GAAI,CAAA,QAAA,CAAS,UAAU,EAAE,CAAA;AAC/E,EAAM,MAAA,YAAA,GAAe,WAAY,CAAA,WAAA,EAAa,qBAAqB,CAAA;AACnE,EAAM,MAAA,cAAA,GAAiB,YAAa,CAAA,KAAA,GAAQ,kBAAqB,GAAA,CAAA;AAEjE,EAAI,IAAA,UAAA,CAAW,WAAW,CAAG,EAAA;AAC3B,IAAA,IAAI,6BAAM,SAAW,EAAA;AACnB,MAAA,WAAA,GAAc,KAAK,SAAY,GAAA,iBAAA;AAAA,KAC1B,MAAA;AACL,MAAc,WAAA,GAAA,IAAA,CAAK,IAAI,IAAK,CAAA,GAAA,CAAI,SAAS,GAAK,EAAA,gBAAgB,GAAG,gBAAgB,CAAA;AAAA;AAGnF,IAAa,UAAA,GAAA,KAAA;AAEb,IAAI,IAAA,gBAAA,KAAqB,kBAAkB,MAAQ,EAAA;AACjD,MAAc,WAAA,GAAA,CAAA;AACd,MAAa,UAAA,GAAA,CAAA;AAAA;AAGf,IAAe,YAAA,GAAA,MAAA,IAAU,SAAS,MAAS,GAAA,WAAA,CAAA;AAC3C,IAAc,WAAA,GAAA,KAAA;AACd,IAAe,YAAA,GAAA,KAAA;AACf,IAAA,aAAA,GAAgB,SAAS,QAAS,CAAA,MAAA;AAAA,GAC7B,MAAA;AAEL,IAAI,IAAA,gBAAA,KAAqB,kBAAkB,MAAQ,EAAA;AACjD,MAAc,WAAA,GAAA,CAAA;AACd,MAAa,UAAA,GAAA,CAAA;AAAA,KACR,MAAA;AACL,MAAA,WAAA,GAAc,SAAS,QAAS,CAAA,MAAA;AAChC,MAAa,UAAA,GAAA,IAAA,CAAK,IAAI,IAAK,CAAA,GAAA,CAAI,QAAQ,GAAK,EAAA,eAAe,GAAG,cAAc,CAAA;AAAA;AAG9E,IAAA,YAAA,GAAe,SAAS,QAAS,CAAA,MAAA;AACjC,IAAc,WAAA,GAAA,KAAA,GAAQ,aAAa,QAAS,CAAA,KAAA;AAE5C,IAAI,IAAA,QAAA,CAAS,cAAc,OAAS,EAAA;AAClC,MAAe,YAAA,GAAA,KAAA;AACf,MAAA,aAAA,GAAgB,SAAS,QAAS,CAAA,MAAA;AAAA,KAC7B,MAAA;AACL,MAAA,YAAA,GAAe,QAAQ,QAAS,CAAA,KAAA;AAChC,MAAgB,aAAA,GAAA,MAAA;AAAA;AAClB;AAGF,EAAO,OAAA;AAAA,IACL,UAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;AAEgB,SAAA,YAAA,CACd,aACA,EAAA,KAAA,EACA,OACY,EAAA;AACZ,EAAA,IAAI,kBAAkB,IAAM,EAAA;AAC1B,IAAO,OAAA;AAAA,MACL,UAAY,EAAA,cAAA;AAAA,MACZ,MAAQ,EAAA;AAAA,KACV;AAAA;AAGF,EAAA,MAAM,KAAQ,GAAA,OAAA,GAAU,OAAQ,CAAA,aAAa,EAAE,KAAQ,GAAA,IAAA;AAEvD,EAAA,IAAI,KAAO,EAAA;AAET,IAAI,IAAA,KAAA,KAAU,IAAQ,IAAA,KAAA,CAAM,KAAM,CAAA,OAAO,KAAM,aAAkB,KAAA,IAAA,IAAQ,aAAgB,GAAA,KAAA,CAAM,OAAU,EAAA;AACvG,MAAO,OAAA;AAAA,QACL,YAAY,SAAU,CAAA,KAAK,EAAE,QAAS,CAAA,IAAI,EAAE,WAAY,EAAA;AAAA,QACxD,MAAQ,EAAA,aAAA;AAAA,QACR,KAAO,EAAA;AAAA,OACT;AAAA,KACK,MAAA;AACL,MAAO,OAAA;AAAA,QACL,YAAY,SAAU,CAAA,KAAK,EAAE,QAAS,CAAA,IAAI,EAAE,WAAY,EAAA;AAAA,QACxD,iBAAiB,SAAU,CAAA,KAAK,EAAE,QAAS,CAAA,IAAI,EAAE,WAAY,EAAA;AAAA,QAC7D,QAAQ,SAAU,CAAA,KAAK,EAAE,QAAS,CAAA,GAAG,EAAE,WAAY,EAAA;AAAA,QACnD,KAAO,EAAA;AAAA,OACT;AAAA;AACF;AAGF,EAAO,OAAA;AAAA,IACL,UAAY,EAAA,cAAA;AAAA,IACZ,MAAQ,EAAA;AAAA,GACV;AACF;AAEgB,SAAA,eAAA,CAAgB,KAAe,EAAA,QAAA,EAAkB,QAA0B,EAAA;AAEzF,EAAA,MAAM,aAAa,IAAK,CAAA,GAAA,CAAA,CAAK,QAAQ,QAAa,KAAA,QAAA,GAAW,WAAW,CAAC,CAAA;AACzE,EAAO,OAAA,KAAA,CAAM,UAAU,CAAA,GAAI,CAAI,GAAA,UAAA;AACjC;AAKO,SAAS,0BAA0B,KAAsC,EAAA;AAnfhF,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAofE,EAAM,MAAA,EAAE,aAAa,KAAO,EAAA,KAAA,EAAO,kBAAkB,WAAa,EAAA,KAAA,EAAO,IAAM,EAAA,UAAA,EAAe,GAAA,KAAA;AAC9F,EAAA,MAAM,EAAE,UAAY,EAAA,WAAA,EAAa,cAAc,WAAY,EAAA,GAAI,+BAA+B,KAAK,CAAA;AAEnG,EAAM,MAAA,QAAA,GAAA,CAAW,EAAM,GAAA,KAAA,CAAA,GAAA,KAAN,IAAa,GAAA,EAAA,GAAA,qBAAA;AAC9B,EAAM,MAAA,QAAA,GAAA,CAAW,EAAM,GAAA,KAAA,CAAA,GAAA,KAAN,IAAa,GAAA,EAAA,GAAA,qBAAA;AAC9B,EAAA,MAAM,YAAe,GAAA,eAAA,CAAgB,KAAM,CAAA,OAAA,EAAS,UAAU,QAAQ,CAAA;AACtE,EAAM,MAAA,SAAA,GAAY,kBAAkB,KAAK,CAAA;AACzC,EAAM,MAAA,QAAA,GAAA,CAAW,EAAM,GAAA,KAAA,CAAA,KAAA,KAAN,IAAe,GAAA,EAAA,GAAA,cAAA;AAEhC,EAAM,MAAA,iBAAA,GAAoB,mBAAmB,gBAAmB,GAAA,KAAA;AAChE,EAAA,MAAM,WAAc,GAAA,cAAA;AAAA,IAClB,iBAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,UAAU,WAAgB,KAAA,OAAA;AAChC,EAAA,MAAM,aAA+B,GAAA;AAAA,IACnC,OAAS,EAAA,MAAA;AAAA,IACT,QAAU,EAAA;AAAA,GACZ;AAEA,EAAA,MAAM,SAA2B,GAAA;AAAA,IAC/B,YAAA,EAAc,KAAM,CAAA,KAAA,CAAM,MAAO,CAAA,OAAA;AAAA,IACjC,QAAU,EAAA;AAAA,GACZ;AAEA,EAAA,MAAM,QAA0B,GAAA;AAAA,IAC9B,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,UAAW,CAAA,SAAA;AAAA,IACpC,QAAU,EAAA,CAAA;AAAA,IACV,OAAS,EAAA,MAAA;AAAA,IACT,YAAA,EAAc,KAAM,CAAA,KAAA,CAAM,MAAO,CAAA,OAAA;AAAA,IACjC,QAAU,EAAA;AAAA,GACZ;AAEA,EAAI,IAAA,UAAA,CAAW,WAAW,CAAG,EAAA;AAC3B,IAAA,MAAM,SAAY,GAAA,IAAA,CAAK,GAAI,CAAA,YAAA,GAAe,cAAc,CAAC,CAAA;AAGzD,IAAA,aAAA,CAAc,aAAgB,GAAA,QAAA;AAC9B,IAAA,aAAA,CAAc,cAAiB,GAAA,UAAA;AAE/B,IAAA,SAAA,CAAU,UAAa,GAAA,WAAA;AACvB,IAAU,SAAA,CAAA,MAAA,GAAS,GAAG,SAAS,CAAA,EAAA,CAAA;AAC/B,IAAU,SAAA,CAAA,KAAA,GAAQ,GAAG,WAAW,CAAA,EAAA,CAAA;AAGhC,IAAA,QAAA,CAAS,MAAS,GAAA,MAAA;AAGlB,IAAS,QAAA,CAAA,KAAA,GAAQ,GAAG,UAAU,CAAA,EAAA,CAAA;AAE9B,IAAA,IAAI,OAAS,EAAA;AAEX,MAAU,SAAA,CAAA,UAAA,GAAa,GAAG,SAAU,CAAA,QAAQ,EAAE,QAAS,CAAA,IAAI,CAAE,CAAA,WAAA,EAAa,CAAA,CAAA;AAC1E,MAAU,SAAA,CAAA,SAAA,GAAY,aAAa,QAAQ,CAAA,CAAA;AAAA,KACtC,MAAA;AAEL,MAAU,SAAA,CAAA,UAAA,GAAa,cAAe,CAAA,KAAA,EAAO,YAAY,CAAA;AAAA;AAC3D,GACK,MAAA;AACL,IAAA,MAAM,QAAW,GAAA,IAAA,CAAK,GAAI,CAAA,YAAA,GAAe,aAAa,CAAC,CAAA;AAGvD,IAAA,aAAA,CAAc,aAAgB,GAAA,aAAA;AAC9B,IAAA,aAAA,CAAc,cAAiB,GAAA,UAAA;AAC/B,IAAA,aAAA,CAAc,UAAa,GAAA,SAAA;AAE3B,IAAA,SAAA,CAAU,UAAa,GAAA,UAAA;AACvB,IAAU,SAAA,CAAA,MAAA,GAAS,GAAG,YAAY,CAAA,EAAA,CAAA;AAClC,IAAU,SAAA,CAAA,KAAA,GAAQ,GAAG,QAAQ,CAAA,EAAA,CAAA;AAG7B,IAAA,QAAA,CAAS,IAAO,GAAA,MAAA;AAGhB,IAAS,QAAA,CAAA,MAAA,GAAS,GAAG,WAAW,CAAA,EAAA,CAAA;AAEhC,IAAA,IAAI,OAAS,EAAA;AAEX,MAAU,SAAA,CAAA,UAAA,GAAa,GAAG,SAAU,CAAA,QAAQ,EAAE,QAAS,CAAA,IAAI,CAAE,CAAA,WAAA,EAAa,CAAA,CAAA;AAC1E,MAAU,SAAA,CAAA,WAAA,GAAc,aAAa,QAAQ,CAAA,CAAA;AAAA,KACxC,MAAA;AAEL,MAAU,SAAA,CAAA,UAAA,GAAa,cAAe,CAAA,KAAA,EAAO,WAAW,CAAA;AAAA;AAC1D;AAGF,EAAO,OAAA;AAAA,IACL,OAAS,EAAA,aAAA;AAAA,IACT,GAAK,EAAA,SAAA;AAAA,IACL,KAAO,EAAA,WAAA;AAAA,IACP;AAAA,GACF;AACF;AAKgB,SAAA,cAAA,CAAe,OAAc,OAAyB,EAAA;AA3lBtE,EAAA,IAAA,EAAA,EAAA,EAAA;AA4lBE,EAAA,MAAM,EAAE,KAAA,EAAO,KAAO,EAAA,WAAA,EAAa,OAAU,GAAA,KAAA;AAC7C,EAAA,MAAM,YAAe,GAAA,UAAA,CAAW,WAAW,CAAA,GAAI,MAAS,GAAA,OAAA;AACxD,EAAA,MAAM,WAAW,KAAM,CAAA,GAAA;AACvB,EAAA,MAAM,WAAW,KAAM,CAAA,GAAA;AAEvB,EAAA,IAAI,QAAW,GAAA,EAAA;AACf,EAAA,IAAI,OAAU,GAAA,CAAA;AACd,EAAA,IAAI,IAAO,GAAA,iBAAA,CAAA,CAAkB,EAAM,GAAA,KAAA,CAAA,KAAA,KAAN,mBAAa,IAAI,CAAA;AAE9C,EAAI,IAAA,IAAA,CAAK,EAAO,KAAA,gBAAA,CAAiB,UAAY,EAAA;AAC3C,IAAA,MAAM,aAAa,KAAM,CAAA,UAAA;AAEzB,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,UAAW,CAAA,KAAA,CAAM,QAAQ,CAAK,EAAA,EAAA;AAChD,MAAM,MAAA,SAAA,GAAY,UAAW,CAAA,KAAA,CAAM,CAAC,CAAA;AACpC,MAAA,MAAM,QAAQ,KAAM,CAAA,KAAA,CAAM,aAAc,CAAA,cAAA,CAAe,UAAU,KAAK,CAAA;AACtE,MAAA,MAAM,YACJ,GAAA,UAAA,CAAW,IAAS,KAAA,cAAA,CAAe,UAC/B,GAAA,SAAA,CAAU,KAAQ,GAAA,GAAA,GAClB,eAAgB,CAAA,SAAA,CAAU,KAAO,EAAA,QAAA,EAAU,QAAQ,CAAA;AACzD,MAAA,MAAM,MAAM,YAAe,GAAA,OAAA;AAC3B,MAAA,MAAM,SAAS,IAAK,CAAA,KAAA,CAAM,GAAO,GAAA,CAAA,GAAA,GAAM,WAAW,CAAC,CAAA;AACnD,MAAM,MAAA,cAAA,GACJ,WAAW,IAAS,KAAA,cAAA,CAAe,aAC/B,QAAY,GAAA,CAAA,QAAA,GAAW,QAAY,IAAA,YAAA,GACnC,SAAU,CAAA,KAAA;AAChB,MAAA,IAAI,aAAa,EAAI,EAAA;AACnB,QAAA,QAAA,GAAW,CAAmB,gBAAA,EAAA,YAAY,CAAK,EAAA,EAAA,KAAK,KAAK,KAAK,CAAA,CAAA;AAAA,OAChE,MAAA,IAAW,KAAM,CAAA,OAAA,GAAU,cAAgB,EAAA;AACzC,QAAA;AAAA,OACK,MAAA;AACL,QAAU,OAAA,GAAA,GAAA;AACV,QAAY,QAAA,IAAA,CAAA,CAAA,EAAI,MAAM,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA;AAAA;AACpC;AAGF,IAAA,OAAO,QAAW,GAAA,GAAA;AAAA;AAGpB,EAAI,IAAA,IAAA,CAAK,YAAgB,IAAA,IAAA,CAAK,SAAW,EAAA;AACvC,IAAM,MAAA,MAAA,GAAS,IAAK,CAAA,SAAA,CAAU,KAAK,CAAA;AAEnC,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,MAAA,CAAO,QAAQ,CAAK,EAAA,EAAA;AACtC,MAAM,MAAA,KAAA,GAAQ,OAAO,CAAC,CAAA;AAEtB,MAAA,IAAI,aAAa,EAAI,EAAA;AACnB,QAAW,QAAA,GAAA,CAAA,gBAAA,EAAmB,YAAY,CAAA,EAAA,EAAK,KAAK,CAAA,IAAA,CAAA;AAAA,OAC/C,MAAA;AACL,QAAM,MAAA,YAAA,GAAe,CAAK,IAAA,MAAA,CAAO,MAAS,GAAA,CAAA,CAAA;AAC1C,QAAA,MAAM,MAAM,YAAe,GAAA,OAAA;AAC3B,QAAY,QAAA,IAAA,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,EAAA,CAAA;AAAA;AAC/B;AAEF,IAAA,OAAO,QAAW,GAAA,GAAA;AAAA;AAGpB,EAAO,OAAA,CAAA,EAAA,GAAA,KAAA,CAAM,UAAN,IAAe,GAAA,EAAA,GAAA,cAAA;AACxB;AAKO,SAAS,kBAAkB,KAAsB,EAAA;AACtD,EAAI,IAAA,KAAA,CAAM,qBAAqB,MAAQ,EAAA;AACrC,IAAO,OAAA,KAAA,CAAM,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA,OAAA;AAAA;AAGjC,EAAM,MAAA,EAAE,OAAU,GAAA,KAAA;AAClB,EAAA,IAAI,MAAM,KAAO,EAAA;AACf,IAAA,OAAO,KAAM,CAAA,KAAA;AAAA;AAGf,EAAO,OAAA,cAAA;AACT;AAEA,SAAS,eACP,KACA,EAAA,KAAA,EACA,OACA,MACA,EAAA,WAAA,EACA,YACA,IACe,EAAA;AA9qBjB,EAAA,IAAA,EAAA,EAAA,EAAA;AA+qBE,EAAA,MAAM,MAAwB,GAAA;AAAA,IAC5B,KAAA;AAAA,IACA,MAAA,EAAQ,GAAG,MAAM,CAAA,EAAA,CAAA;AAAA,IACjB,QAAA,EAAU,GAAG,KAAK,CAAA,EAAA,CAAA;AAAA,IAClB,OAAS,EAAA,MAAA;AAAA,IACT,UAAY,EAAA,QAAA;AAAA,IACZ,QAAU,EAAA,QAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAGA,EAAA,IAAI,SAAY,GAAA,KAAA;AAChB,EAAM,MAAA,oBAAA,GAAuB,uBAAuB,KAAK,CAAA;AAEzD,EAAI,IAAA,UAAA,CAAW,WAAW,CAAG,EAAA;AAC3B,IAAO,MAAA,CAAA,QAAA,GAAA,CAAW,kCAAM,SAAN,KAAA,IAAA,GAAA,EAAA,GAAmB,kBAAkB,oBAAsB,EAAA,SAAA,EAAW,QAAQ,iBAAiB,CAAA;AACjH,IAAA,MAAA,CAAO,cAAiB,GAAA,CAAA,MAAA,CAAA;AAAA,GACnB,MAAA;AACL,IAAO,MAAA,CAAA,QAAA,GAAA,CACL,EAAM,GAAA,IAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,IAAA,CAAA,SAAA,KAAN,IACA,GAAA,EAAA,GAAA,iBAAA,CAAkB,sBAAsB,SAAY,GAAA,kBAAA,GAAqB,CAAG,EAAA,MAAA,EAAQ,iBAAiB,CAAA;AACvG,IAAA,MAAA,CAAO,cAAiB,GAAA,CAAA,QAAA,CAAA;AACxB,IAAO,MAAA,CAAA,WAAA,GAAc,GAAG,kBAAkB,CAAA,EAAA,CAAA;AAC1C,IAAA,MAAA,CAAO,YAAe,GAAA,CAAA,EAAG,kBAAsB,IAAA,UAAA,GAAa,+BAA+B,CAAE,CAAA,CAAA,EAAA,CAAA;AAE7F,IAAa,SAAA,IAAA,kBAAA;AAAA;AAGf,EAAO,OAAA,MAAA;AACT;;;;"}