{"version":3,"file":"TableWidget-D5UVKDsp.mjs","names":[],"sources":["../../widgets/src/widgets/TableWidget.tsx"],"sourcesContent":["import { useState, useMemo, type ComponentProps } from \"react\";\nimport type React from \"react\";\nimport type {\n  BackgroundValue,\n  BorderRadiusOptions,\n  BorderWidthOptions,\n  ColorOptions,\n  FontSizeOptions,\n  PaddingOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n  getBorderRadiusField,\n  getBorderWidthField,\n  getBorderColorField,\n  borderWidthClasses,\n  borderColorClasses,\n  getColorField,\n  getFontSizeField,\n  getPaddingField,\n} from \"../core/fields\";\nimport { Input } from \"@fluid-app/ui-primitives\";\nimport {\n  MediaRenderer,\n  getMediaPropsFromShareable,\n} from \"../components/MediaRenderer\";\nimport { type ShareableItem } from \"@fluid-app/portal-core/types\";\nimport { useWidgetInteraction } from \"../contexts/WidgetInteractionContext\";\n\n/** Plain column definition provided by data sources (no render functions) */\nexport type TableColumnDef = {\n  key: string;\n  label: string;\n  sortable: boolean;\n};\n\n// Internal column definition (includes render function)\ntype ColumnDef = TableColumnDef & {\n  render?: (value: unknown, item: ShareableItem) => React.ReactNode;\n};\n\nconst DEFAULT_DATA: ShareableItem[] = [];\n\n// ---------------------------------------------------------------------------\n// Column cell renderers\n// ---------------------------------------------------------------------------\n\nfunction ImageCellRenderer(_value: unknown, item: ShareableItem) {\n  return (\n    <div className=\"size-10 overflow-hidden rounded\">\n      <MediaRenderer {...getMediaPropsFromShareable(item)} />\n    </div>\n  );\n}\n\nfunction PriceCellRenderer(_value: unknown, item: ShareableItem) {\n  return ((item.display_price as string) ?? item.price) || \"-\";\n}\n\nfunction StatusCellRenderer(value: unknown) {\n  const status = String(value || \"unknown\").toLowerCase();\n  const statusStyles: Record<string, string> = {\n    active: \"bg-primary text-primary-foreground\",\n    paid: \"bg-primary text-primary-foreground\",\n    inactive: \"bg-secondary text-secondary-foreground\",\n    paused: \"bg-secondary text-secondary-foreground\",\n    unknown: \"bg-muted text-muted-foreground\",\n    unpaid: \"bg-destructive text-destructive-foreground\",\n    refunded: \"bg-muted text-muted-foreground\",\n    cancelled: \"bg-destructive text-destructive-foreground\",\n  };\n  return (\n    <span\n      className={`inline-flex rounded-full px-2 py-1 text-xs font-medium ${statusStyles[status] || \"bg-muted text-foreground\"}`}\n    >\n      {String(value || \"Unknown\")}\n    </span>\n  );\n}\n\n/** Map of column keys to custom cell renderers */\nconst CELL_RENDERERS: Partial<\n  Record<string, (value: unknown, item: ShareableItem) => React.ReactNode>\n> = {\n  imageUrl: ImageCellRenderer,\n  price: PriceCellRenderer,\n  display_price: PriceCellRenderer,\n  status: StatusCellRenderer,\n};\n\n/** Resolve plain column definitions from a data source into full ColumnDefs with renderers */\nfunction resolveColumns(columns: TableColumnDef[]): ColumnDef[] {\n  return columns.map((col) => {\n    const render = CELL_RENDERERS[col.key];\n    return render ? { ...col, render } : { ...col };\n  });\n}\n\n// Default columns for product data\nconst defaultColumns: ColumnDef[] = [\n  {\n    key: \"imageUrl\",\n    label: \"Image\",\n    sortable: false,\n    render: ImageCellRenderer,\n  },\n  {\n    key: \"title\",\n    label: \"Title\",\n    sortable: true,\n  },\n  {\n    key: \"price\",\n    label: \"Price\",\n    sortable: true,\n    render: PriceCellRenderer,\n  },\n  {\n    key: \"status\",\n    label: \"Status\",\n    sortable: true,\n    render: StatusCellRenderer,\n  },\n];\n\ntype TableWidgetProps = ComponentProps<\"div\"> & {\n  // Title\n  titleEnabled?: boolean;\n  titleText?: string;\n  titleFontSize?: FontSizeOptions;\n  titleColor?: ColorOptions;\n\n  // Styling\n  background?: BackgroundValue;\n  alternatingColorEnabled?: boolean;\n  textColor?: ColorOptions;\n  headerBackgroundColor?: ColorOptions;\n  headerTextColor?: ColorOptions;\n  padding?: PaddingOptions;\n  borderRadius?: BorderRadiusOptions;\n  borderWidth?: BorderWidthOptions;\n  borderColor?: ColorOptions;\n\n  // Data\n  data?: ShareableItem[];\n  /** Column definitions from a data source (plain data, renderers resolved internally) */\n  columns?: TableColumnDef[];\n\n  // Features\n  filterEnabled?: boolean;\n  sortingEnabled?: boolean;\n  paginationEnabled?: boolean;\n  maxRowsPerPage?: number;\n};\n\nexport function TableWidget({\n  // Title defaults\n  titleEnabled = true,\n  titleText = \"Products\",\n  titleFontSize = \"xl\",\n  titleColor = \"foreground\",\n\n  // Styling defaults\n  background = {\n    type: \"solid\",\n    color: \"background\",\n  },\n  alternatingColorEnabled = true,\n  textColor = \"foreground\",\n  headerBackgroundColor = \"muted\",\n  headerTextColor = \"foreground\",\n  padding = 4,\n  borderRadius = \"md\",\n  borderWidth = \"none\",\n  borderColor = \"muted\",\n\n  // Data\n  data = DEFAULT_DATA,\n  columns: columnsProp,\n\n  // Feature defaults\n  filterEnabled = true,\n  sortingEnabled = true,\n  paginationEnabled = true,\n  maxRowsPerPage = 5,\n\n  className,\n  ...props\n}: TableWidgetProps): React.JSX.Element {\n  const backgroundColor = background.color || \"background\";\n  const isImageBackground = background.type === \"image\";\n  const backgroundImage =\n    (background.resource?.image_url || background.resource?.imageUrl) &&\n    isImageBackground\n      ? `url(${background.resource.image_url || background.resource.imageUrl})`\n      : \"none\";\n  const pageSize = maxRowsPerPage;\n\n  // When using an image or transparent background, inner elements should be\n  // transparent so the image/page shows through. Otherwise use the configured colors.\n  const isTransparentBg = backgroundColor === \"transparent\";\n  const useTransparentInner = isImageBackground || isTransparentBg;\n  const innerBg = useTransparentInner\n    ? \"bg-transparent\"\n    : `bg-${backgroundColor}`;\n  const innerBgAlt = useTransparentInner\n    ? \"bg-black/5\"\n    : `bg-${backgroundColor}/40`;\n  const transparentBorder = isTransparentBg\n    ? \"border-black/20\"\n    : \"border-white/20\";\n  const innerBorder = useTransparentInner\n    ? transparentBorder\n    : `border-${backgroundColor}/60`;\n  const headerBg = useTransparentInner\n    ? \"bg-black/10\"\n    : `bg-${headerBackgroundColor}/40`;\n  const headerBorder = useTransparentInner\n    ? transparentBorder\n    : `border-${headerBackgroundColor}/60`;\n  const paginationBg = useTransparentInner\n    ? \"bg-black/10\"\n    : `bg-${backgroundColor}/40`;\n\n  // State for filtering, sorting, and pagination\n  const [globalFilter, setGlobalFilter] = useState(\"\");\n  const [sortConfig, setSortConfig] = useState<{\n    key: string;\n    direction: \"asc\" | \"desc\";\n  } | null>(null);\n  const [currentPage, setCurrentPage] = useState(1);\n\n  // Only use columns from the data source if they look like valid column defs\n  // (have a `key` string). When transformers return a plain array (e.g. toShareableProps),\n  // use-widget-data maps the same array to ALL targetProps, so `columns` may\n  // receive the data rows instead of column definitions.\n  const firstCol = columnsProp?.[0];\n  const validColumnsProp =\n    firstCol && typeof firstCol.key === \"string\" && firstCol.key !== \"\"\n      ? columnsProp\n      : undefined;\n\n  const columns = useMemo(\n    () =>\n      validColumnsProp ? resolveColumns(validColumnsProp) : defaultColumns,\n    [validColumnsProp],\n  );\n\n  // Filter data\n  const filteredData = useMemo(() => {\n    let result = [...data];\n\n    if (globalFilter) {\n      const lowerFilter = globalFilter.toLowerCase();\n      result = result.filter((item) =>\n        columns.some((col) => {\n          const value = item[col.key];\n          return String(value ?? \"\")\n            .toLowerCase()\n            .includes(lowerFilter);\n        }),\n      );\n    }\n\n    return result;\n  }, [data, globalFilter, columns]);\n\n  // Sort data\n  const sortedData = useMemo(() => {\n    if (!sortConfig) return filteredData;\n\n    return filteredData.toSorted((a, b) => {\n      const aValue = a[sortConfig.key];\n      const bValue = b[sortConfig.key];\n\n      // Handle null/undefined\n      if (aValue == null && bValue == null) return 0;\n      if (aValue == null) return sortConfig.direction === \"asc\" ? 1 : -1;\n      if (bValue == null) return sortConfig.direction === \"asc\" ? -1 : 1;\n\n      // Compare values\n      let comparison = 0;\n      if (typeof aValue === \"number\" && typeof bValue === \"number\") {\n        comparison = aValue - bValue;\n      } else {\n        comparison = String(aValue).localeCompare(String(bValue));\n      }\n\n      return sortConfig.direction === \"asc\" ? comparison : -comparison;\n    });\n  }, [filteredData, sortConfig]);\n\n  // Paginate data\n  const paginatedData = useMemo(() => {\n    if (!paginationEnabled) return sortedData;\n\n    const startIndex = (currentPage - 1) * pageSize;\n    return sortedData.slice(startIndex, startIndex + pageSize);\n  }, [sortedData, currentPage, pageSize, paginationEnabled]);\n\n  const totalPages = Math.ceil(sortedData.length / pageSize);\n\n  // Reset to page 1 when filters change\n  const handleGlobalFilterChange = (value: string) => {\n    setGlobalFilter(value);\n    setCurrentPage(1);\n  };\n\n  // Handle sort\n  const handleSort = (key: string) => {\n    if (!sortingEnabled) return;\n\n    setSortConfig((prev) => {\n      if (prev?.key !== key) return { key, direction: \"asc\" };\n      if (prev.direction === \"asc\") return { key, direction: \"desc\" };\n      return null;\n    });\n  };\n\n  // Get sort indicator\n  const getSortIndicator = (key: string) => {\n    if (sortConfig?.key !== key) return null;\n    return sortConfig.direction === \"asc\" ? \" ↑\" : \" ↓\";\n  };\n\n  const { onItemClick } = useWidgetInteraction();\n\n  return (\n    <div\n      className={`@container overflow-hidden ${paginationEnabled ? \"\" : \"overflow-y-auto\"} rounded-${borderRadius} ${borderWidthClasses[borderWidth]} ${borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\"} bg-${backgroundColor} bg-cover bg-center text-${textColor} ${className}`}\n      style={{ backgroundImage }}\n      {...props}\n    >\n      <div\n        className={`flex items-center justify-between p-${padding} ${innerBg} space-x-2`}\n      >\n        {/* Title */}\n        {titleEnabled && titleText && (\n          <h2\n            className={`text-${titleFontSize === \"md\" ? \"base\" : titleFontSize} font-header font-bold text-${titleColor} min-w-0 truncate`}\n          >\n            {titleText}\n          </h2>\n        )}\n\n        {/* Global Search */}\n        {filterEnabled && (\n          <Input\n            type=\"text\"\n            placeholder=\"Search all columns...\"\n            value={globalFilter}\n            onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n              handleGlobalFilterChange(e.target.value)\n            }\n            className={`w-full rounded-md border ${headerBorder} ${headerBg} ring-offset-muted px-3 py-2 text-sm placeholder:text-${headerTextColor}/40 focus-visible:ring-primary focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none md:w-64`}\n          />\n        )}\n      </div>\n\n      {/* Table */}\n      <div className=\"overflow-x-auto\">\n        <table className=\"w-full border-collapse\">\n          <thead>\n            <tr className={`${headerBg} ${headerBorder} border-y`}>\n              {columns.map((col) => (\n                <th\n                  key={col.key}\n                  className={`px-4 py-3 text-left text-sm font-semibold text-${headerTextColor} ${col.sortable && sortingEnabled ? \"cursor-pointer select-none hover:opacity-80\" : \"\"}`}\n                  {...(col.sortable && sortingEnabled\n                    ? {\n                        role: \"button\" as const,\n                        tabIndex: 0,\n                        onClick: () => handleSort(col.key),\n                        onKeyDown: (e: React.KeyboardEvent) => {\n                          if (e.key === \"Enter\" || e.key === \" \") {\n                            e.preventDefault();\n                            handleSort(col.key);\n                          }\n                        },\n                      }\n                    : {})}\n                >\n                  <div className=\"flex flex-col gap-1\">\n                    <span>\n                      {col.label}\n                      {col.sortable &&\n                        sortingEnabled &&\n                        getSortIndicator(col.key)}\n                    </span>\n                  </div>\n                </th>\n              ))}\n            </tr>\n          </thead>\n          <tbody>\n            {data.length === 0 ? (\n              <tr>\n                <td colSpan={columns.length}>\n                  <div className=\"text-muted-foreground flex min-h-[200px] flex-col items-center justify-center gap-2\">\n                    <div className=\"text-4xl\">📋</div>\n                    <p className=\"text-sm\">No data available</p>\n                    <p className=\"text-muted-foreground/70 text-xs\">\n                      Connect a data source to display table data\n                    </p>\n                  </div>\n                </td>\n              </tr>\n            ) : paginatedData.length === 0 ? (\n              <tr>\n                <td colSpan={columns.length}>\n                  <div className=\"py-8 text-center\">\n                    <p className=\"text-sm\">No results found</p>\n                    <p className=\"text-xs\">Try adjusting your search</p>\n                  </div>\n                </td>\n              </tr>\n            ) : (\n              <>\n                {paginatedData.map((item, index) => (\n                  <tr\n                    key={item.id ?? index}\n                    className={`h-17 border-b ${innerBorder} last:border-none ${innerBg} ${alternatingColorEnabled ? `even:${innerBgAlt}` : \"\"} ${onItemClick ? \"cursor-pointer hover:opacity-80\" : \"\"}`}\n                    {...(onItemClick\n                      ? {\n                          tabIndex: 0,\n                          onClick: () => onItemClick(item),\n                          onKeyDown: (e: React.KeyboardEvent) => {\n                            if (e.key === \"Enter\" || e.key === \" \") {\n                              e.preventDefault();\n                              onItemClick(item);\n                            }\n                          },\n                        }\n                      : {})}\n                  >\n                    {columns.map((col) => (\n                      <td key={col.key} className=\"px-4 py-3 text-sm\">\n                        {col.render\n                          ? col.render(item[col.key], item)\n                          : String(item[col.key] ?? \"-\")}\n                      </td>\n                    ))}\n                  </tr>\n                ))}\n                {/* Empty rows to fill the last page for consistent pagination position */}\n                {paginationEnabled &&\n                  paginatedData.length < pageSize &&\n                  paginatedData.length > 0 &&\n                  Array.from({ length: pageSize - paginatedData.length }).map(\n                    (_, index) => (\n                      <tr\n                        key={`empty-${index}`}\n                        className={`h-17 border-b ${innerBorder} last:border-none ${innerBg} ${alternatingColorEnabled ? `even:${innerBgAlt}` : \"\"}`}\n                      >\n                        {columns.map((col) => (\n                          <td key={col.key} className=\"px-4 py-3 text-sm\">\n                            &nbsp;\n                          </td>\n                        ))}\n                      </tr>\n                    ),\n                  )}\n              </>\n            )}\n          </tbody>\n        </table>\n      </div>\n\n      {/* Pagination */}\n      {paginationEnabled && totalPages > 1 && (\n        <div\n          className={`flex flex-col items-center justify-between gap-2 border-t ${innerBorder} p-${padding} @md:flex-row ${paginationBg} text-${textColor}`}\n        >\n          <p className=\"text-sm\">\n            Showing {(currentPage - 1) * pageSize + 1}-\n            {Math.min(currentPage * pageSize, sortedData.length)} of{\" \"}\n            {sortedData.length} results\n          </p>\n          <div className=\"flex items-center gap-2\">\n            <button\n              onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n              disabled={currentPage === 1}\n              className={`rounded-md border border-${headerBackgroundColor}/60 bg-${headerBackgroundColor} ring-offset-muted placeholder:text-muted-foreground focus-visible:ring-primary px-3 py-1 text-sm transition-opacity hover:opacity-80 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50`}\n            >\n              Previous\n            </button>\n            <span className=\"text-sm\">\n              Page {currentPage} of {totalPages}\n            </span>\n            <button\n              onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}\n              disabled={currentPage === totalPages}\n              className={`rounded-md border border-${headerBackgroundColor}/60 bg-${headerBackgroundColor} ring-offset-muted placeholder:text-muted-foreground focus-visible:ring-primary px-3 py-1 text-sm transition-opacity hover:opacity-80 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50`}\n            >\n              Next\n            </button>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n}\n\nexport const tableWidgetPropertySchema: WidgetPropertySchema = {\n  widgetType: \"TableWidget\",\n  displayName: \"Table Widget\",\n  tabsConfig: [\n    { id: \"styling\", label: \"Styling\" },\n    { id: \"behavior\", label: \"Behavior\" },\n    { id: \"data\", label: \"Data\" },\n  ],\n  dataSourceTargetProps: [\"data\", \"columns\"],\n  fields: [\n    // Content Tab - Title Group\n    {\n      key: \"titleEnabled\",\n      label: \"Widget Title\",\n      type: \"boolean\",\n      description: \"Enable the title displayed above the table\",\n      defaultValue: true,\n      tab: \"styling\",\n      group: \"Title\",\n    },\n    {\n      key: \"titleText\",\n      label: \"Title\",\n      type: \"text\",\n      description: \"Title text displayed above the table\",\n      defaultValue: \"Products\",\n      tab: \"styling\",\n      group: \"Title\",\n      requiresKeyToBeTrue: \"titleEnabled\",\n    },\n    getFontSizeField({\n      label: \"Title Font Size\",\n      defaultValue: \"xl\",\n      key: \"titleFontSize\",\n      description: \"Font size for the widget title\",\n      tab: \"styling\",\n      group: \"Title\",\n      requiresKeyToBeTrue: \"titleEnabled\",\n    }),\n    getColorField({\n      key: \"titleColor\",\n      label: \"Title Color\",\n      description: \"Color for the widget title\",\n      defaultValue: \"foreground\",\n      tab: \"styling\",\n      group: \"Title\",\n      requiresKeyToBeTrue: \"titleEnabled\",\n    }),\n\n    // Styling Tab - Design Group\n    {\n      type: \"background\",\n      key: \"background\",\n      label: \"Background\",\n      description: \"Background for the table container\",\n      defaultValue: { type: \"solid\", color: \"background\" },\n      tab: \"styling\",\n      group: \"Design\",\n    },\n    {\n      key: \"alternatingColorEnabled\",\n      label: \"Enable Alternating Colors\",\n      type: \"boolean\",\n      description: \"Enable alternating colors for table rows\",\n      defaultValue: true,\n      tab: \"styling\",\n      group: \"Design\",\n    },\n    getColorField({\n      key: \"headerBackgroundColor\",\n      label: \"Header Background\",\n      description: \"Background color for the table header\",\n      defaultValue: \"muted\",\n      tab: \"styling\",\n      group: \"Design\",\n    }),\n    getColorField({\n      key: \"textColor\",\n      label: \"Text Color\",\n      description: \"Default text color for table content\",\n      defaultValue: \"foreground\",\n      tab: \"styling\",\n      group: \"Design\",\n    }),\n    getColorField({\n      key: \"headerTextColor\",\n      label: \"Header Text Color\",\n      description: \"Text color for the table header\",\n      defaultValue: \"foreground\",\n      tab: \"styling\",\n      group: \"Design\",\n    }),\n    {\n      key: \"separator\",\n      type: \"separator\",\n      label: \"Separator\",\n      tab: \"styling\",\n      group: \"Design\",\n    },\n    getPaddingField({\n      key: \"padding\",\n      label: \"Padding\",\n      description: \"Padding around the table container\",\n      defaultValue: 4,\n      tab: \"styling\",\n      group: \"Design\",\n    }),\n    getBorderRadiusField({\n      key: \"borderRadius\",\n      label: \"Border Radius\",\n      description: \"Border radius for the table container\",\n      defaultValue: \"md\",\n      tab: \"styling\",\n      group: \"Design\",\n    }),\n    getBorderWidthField({\n      key: \"borderWidth\",\n      label: \"Border Width\",\n      description: \"Border width for the widget\",\n      defaultValue: \"none\",\n      tab: \"styling\",\n      group: \"Design\",\n    }),\n    getBorderColorField({\n      key: \"borderColor\",\n      label: \"Border Color\",\n      description: \"Border color for the widget\",\n      defaultValue: \"muted\",\n      tab: \"styling\",\n      group: \"Design\",\n    }),\n\n    // Behavior Tab - Features Group\n    {\n      key: \"filterEnabled\",\n      label: \"Enable Filters\",\n      type: \"boolean\",\n      description: \"Show global search and column filters\",\n      defaultValue: true,\n      tab: \"behavior\",\n      group: \"Features\",\n    },\n    {\n      key: \"sortingEnabled\",\n      label: \"Enable Sorting\",\n      type: \"boolean\",\n      description: \"Allow sorting by clicking column headers\",\n      defaultValue: true,\n      tab: \"behavior\",\n      group: \"Features\",\n    },\n    {\n      key: \"paginationEnabled\",\n      label: \"Enable Pagination\",\n      type: \"boolean\",\n      description: \"Split data into pages\",\n      defaultValue: true,\n      tab: \"behavior\",\n      group: \"Features\",\n    },\n    {\n      key: \"maxRowsPerPage\",\n      label: \"Max Rows Per Page\",\n      type: \"number\",\n      description: \"Maximum number of rows to display per page\",\n      min: 1,\n      max: 50,\n      step: 1,\n      defaultValue: 5,\n      tab: \"behavior\",\n      group: \"Features\",\n      requiresKeyToBeTrue: \"paginationEnabled\",\n    },\n\n    // Data Tab\n    {\n      key: \"dataSource\",\n      label: \"Data Source\",\n      type: \"dataSource\",\n      description: \"Configure data source for the table\",\n      targetProps: [\n        {\n          key: \"data\",\n          description:\n            \"Rows rendered by the table, usually supplied by a data source.\",\n        },\n        {\n          key: \"columns\",\n          description:\n            \"Column definitions used to label and read values from each row.\",\n        },\n      ],\n      tab: \"data\",\n      group: \"Data Configuration\",\n    },\n  ],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":";;;;;;;;;;;AAyCA,MAAM,eAAgC,EAAE;AAMxC,SAAS,kBAAkB,QAAiB,MAAqB;AAC/D,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,eAAD,EAAe,GAAI,2BAA2B,KAAK,EAAI,CAAA;EACnD,CAAA;;AAIV,SAAS,kBAAkB,QAAiB,MAAqB;AAC/D,SAAS,KAAK,iBAA4B,KAAK,UAAU;;AAG3D,SAAS,mBAAmB,OAAgB;AAY1C,QACE,oBAAC,QAAD;EACE,WAAW,0DAZ8B;GAC3C,QAAQ;GACR,MAAM;GACN,UAAU;GACV,QAAQ;GACR,SAAS;GACT,QAAQ;GACR,UAAU;GACV,WAAW;GACZ,CAVc,OAAO,SAAS,UAAU,CAAC,aAAa,KAa0C;YAE5F,OAAO,SAAS,UAAU;EACtB,CAAA;;;AAKX,MAAM,iBAEF;CACF,UAAU;CACV,OAAO;CACP,eAAe;CACf,QAAQ;CACT;;AAGD,SAAS,eAAe,SAAwC;AAC9D,QAAO,QAAQ,KAAK,QAAQ;EAC1B,MAAM,SAAS,eAAe,IAAI;AAClC,SAAO,SAAS;GAAE,GAAG;GAAK;GAAQ,GAAG,EAAE,GAAG,KAAK;GAC/C;;AAIJ,MAAM,iBAA8B;CAClC;EACE,KAAK;EACL,OAAO;EACP,UAAU;EACV,QAAQ;EACT;CACD;EACE,KAAK;EACL,OAAO;EACP,UAAU;EACX;CACD;EACE,KAAK;EACL,OAAO;EACP,UAAU;EACV,QAAQ;EACT;CACD;EACE,KAAK;EACL,OAAO;EACP,UAAU;EACV,QAAQ;EACT;CACF;AAgCD,SAAgB,YAAY,EAE1B,eAAe,MACf,YAAY,YACZ,gBAAgB,MAChB,aAAa,cAGb,aAAa;CACX,MAAM;CACN,OAAO;CACR,EACD,0BAA0B,MAC1B,YAAY,cACZ,wBAAwB,SACxB,kBAAkB,cAClB,UAAU,GACV,eAAe,MACf,cAAc,QACd,cAAc,SAGd,OAAO,cACP,SAAS,aAGT,gBAAgB,MAChB,iBAAiB,MACjB,oBAAoB,MACpB,iBAAiB,GAEjB,WACA,GAAG,SACmC;CACtC,MAAM,kBAAkB,WAAW,SAAS;CAC5C,MAAM,oBAAoB,WAAW,SAAS;CAC9C,MAAM,mBACH,WAAW,UAAU,aAAa,WAAW,UAAU,aACxD,oBACI,OAAO,WAAW,SAAS,aAAa,WAAW,SAAS,SAAS,KACrE;CACN,MAAM,WAAW;CAIjB,MAAM,kBAAkB,oBAAoB;CAC5C,MAAM,sBAAsB,qBAAqB;CACjD,MAAM,UAAU,sBACZ,mBACA,MAAM;CACV,MAAM,aAAa,sBACf,eACA,MAAM,gBAAgB;CAC1B,MAAM,oBAAoB,kBACtB,oBACA;CACJ,MAAM,cAAc,sBAChB,oBACA,UAAU,gBAAgB;CAC9B,MAAM,WAAW,sBACb,gBACA,MAAM,sBAAsB;CAChC,MAAM,eAAe,sBACjB,oBACA,UAAU,sBAAsB;CACpC,MAAM,eAAe,sBACjB,gBACA,MAAM,gBAAgB;CAG1B,MAAM,CAAC,cAAc,mBAAmB,SAAS,GAAG;CACpD,MAAM,CAAC,YAAY,iBAAiB,SAG1B,KAAK;CACf,MAAM,CAAC,aAAa,kBAAkB,SAAS,EAAE;CAMjD,MAAM,WAAW,cAAc;CAC/B,MAAM,mBACJ,YAAY,OAAO,SAAS,QAAQ,YAAY,SAAS,QAAQ,KAC7D,cACA,KAAA;CAEN,MAAM,UAAU,cAEZ,mBAAmB,eAAe,iBAAiB,GAAG,gBACxD,CAAC,iBAAiB,CACnB;CAGD,MAAM,eAAe,cAAc;EACjC,IAAI,SAAS,CAAC,GAAG,KAAK;AAEtB,MAAI,cAAc;GAChB,MAAM,cAAc,aAAa,aAAa;AAC9C,YAAS,OAAO,QAAQ,SACtB,QAAQ,MAAM,QAAQ;IACpB,MAAM,QAAQ,KAAK,IAAI;AACvB,WAAO,OAAO,SAAS,GAAG,CACvB,aAAa,CACb,SAAS,YAAY;KACxB,CACH;;AAGH,SAAO;IACN;EAAC;EAAM;EAAc;EAAQ,CAAC;CAGjC,MAAM,aAAa,cAAc;AAC/B,MAAI,CAAC,WAAY,QAAO;AAExB,SAAO,aAAa,UAAU,GAAG,MAAM;GACrC,MAAM,SAAS,EAAE,WAAW;GAC5B,MAAM,SAAS,EAAE,WAAW;AAG5B,OAAI,UAAU,QAAQ,UAAU,KAAM,QAAO;AAC7C,OAAI,UAAU,KAAM,QAAO,WAAW,cAAc,QAAQ,IAAI;AAChE,OAAI,UAAU,KAAM,QAAO,WAAW,cAAc,QAAQ,KAAK;GAGjE,IAAI,aAAa;AACjB,OAAI,OAAO,WAAW,YAAY,OAAO,WAAW,SAClD,cAAa,SAAS;OAEtB,cAAa,OAAO,OAAO,CAAC,cAAc,OAAO,OAAO,CAAC;AAG3D,UAAO,WAAW,cAAc,QAAQ,aAAa,CAAC;IACtD;IACD,CAAC,cAAc,WAAW,CAAC;CAG9B,MAAM,gBAAgB,cAAc;AAClC,MAAI,CAAC,kBAAmB,QAAO;EAE/B,MAAM,cAAc,cAAc,KAAK;AACvC,SAAO,WAAW,MAAM,YAAY,aAAa,SAAS;IACzD;EAAC;EAAY;EAAa;EAAU;EAAkB,CAAC;CAE1D,MAAM,aAAa,KAAK,KAAK,WAAW,SAAS,SAAS;CAG1D,MAAM,4BAA4B,UAAkB;AAClD,kBAAgB,MAAM;AACtB,iBAAe,EAAE;;CAInB,MAAM,cAAc,QAAgB;AAClC,MAAI,CAAC,eAAgB;AAErB,iBAAe,SAAS;AACtB,OAAI,MAAM,QAAQ,IAAK,QAAO;IAAE;IAAK,WAAW;IAAO;AACvD,OAAI,KAAK,cAAc,MAAO,QAAO;IAAE;IAAK,WAAW;IAAQ;AAC/D,UAAO;IACP;;CAIJ,MAAM,oBAAoB,QAAgB;AACxC,MAAI,YAAY,QAAQ,IAAK,QAAO;AACpC,SAAO,WAAW,cAAc,QAAQ,OAAO;;CAGjD,MAAM,EAAE,gBAAgB,sBAAsB;AAE9C,QACE,qBAAC,OAAD;EACE,WAAW,8BAA8B,oBAAoB,KAAK,kBAAkB,WAAW,aAAa,GAAG,mBAAmB,aAAa,GAAG,gBAAgB,SAAS,mBAAmB,eAAe,GAAG,MAAM,gBAAgB,2BAA2B,UAAU,GAAG;EAC9Q,OAAO,EAAE,iBAAiB;EAC1B,GAAI;YAHN;GAKE,qBAAC,OAAD;IACE,WAAW,uCAAuC,QAAQ,GAAG,QAAQ;cADvE,CAIG,gBAAgB,aACf,oBAAC,MAAD;KACE,WAAW,QAAQ,kBAAkB,OAAO,SAAS,cAAc,8BAA8B,WAAW;eAE3G;KACE,CAAA,EAIN,iBACC,oBAAC,OAAD;KACE,MAAK;KACL,aAAY;KACZ,OAAO;KACP,WAAW,MACT,yBAAyB,EAAE,OAAO,MAAM;KAE1C,WAAW,4BAA4B,aAAa,GAAG,SAAS,wDAAwD,gBAAgB;KACxI,CAAA,CAEA;;GAGN,oBAAC,OAAD;IAAK,WAAU;cACb,qBAAC,SAAD;KAAO,WAAU;eAAjB,CACE,oBAAC,SAAD,EAAA,UACE,oBAAC,MAAD;MAAI,WAAW,GAAG,SAAS,GAAG,aAAa;gBACxC,QAAQ,KAAK,QACZ,oBAAC,MAAD;OAEE,WAAW,kDAAkD,gBAAgB,GAAG,IAAI,YAAY,iBAAiB,gDAAgD;OACjK,GAAK,IAAI,YAAY,iBACjB;QACE,MAAM;QACN,UAAU;QACV,eAAe,WAAW,IAAI,IAAI;QAClC,YAAY,MAA2B;AACrC,aAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,YAAE,gBAAgB;AAClB,qBAAW,IAAI,IAAI;;;QAGxB,GACD,EAAE;iBAEN,oBAAC,OAAD;QAAK,WAAU;kBACb,qBAAC,QAAD,EAAA,UAAA,CACG,IAAI,OACJ,IAAI,YACH,kBACA,iBAAiB,IAAI,IAAI,CACtB,EAAA,CAAA;QACH,CAAA;OACH,EAxBE,IAAI,IAwBN,CACL;MACC,CAAA,EACC,CAAA,EACR,oBAAC,SAAD,EAAA,UACG,KAAK,WAAW,IACf,oBAAC,MAAD,EAAA,UACE,oBAAC,MAAD;MAAI,SAAS,QAAQ;gBACnB,qBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,oBAAC,OAAD;SAAK,WAAU;mBAAW;SAAQ,CAAA;QAClC,oBAAC,KAAD;SAAG,WAAU;mBAAU;SAAqB,CAAA;QAC5C,oBAAC,KAAD;SAAG,WAAU;mBAAmC;SAE5C,CAAA;QACA;;MACH,CAAA,EACF,CAAA,GACH,cAAc,WAAW,IAC3B,oBAAC,MAAD,EAAA,UACE,oBAAC,MAAD;MAAI,SAAS,QAAQ;gBACnB,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,oBAAC,KAAD;QAAG,WAAU;kBAAU;QAAoB,CAAA,EAC3C,oBAAC,KAAD;QAAG,WAAU;kBAAU;QAA6B,CAAA,CAChD;;MACH,CAAA,EACF,CAAA,GAEL,qBAAA,YAAA,EAAA,UAAA,CACG,cAAc,KAAK,MAAM,UACxB,oBAAC,MAAD;MAEE,WAAW,iBAAiB,YAAY,oBAAoB,QAAQ,GAAG,0BAA0B,QAAQ,eAAe,GAAG,GAAG,cAAc,oCAAoC;MAChL,GAAK,cACD;OACE,UAAU;OACV,eAAe,YAAY,KAAK;OAChC,YAAY,MAA2B;AACrC,YAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,WAAE,gBAAgB;AAClB,qBAAY,KAAK;;;OAGtB,GACD,EAAE;gBAEL,QAAQ,KAAK,QACZ,oBAAC,MAAD;OAAkB,WAAU;iBACzB,IAAI,SACD,IAAI,OAAO,KAAK,IAAI,MAAM,KAAK,GAC/B,OAAO,KAAK,IAAI,QAAQ,IAAI;OAC7B,EAJI,IAAI,IAIR,CACL;MACC,EAtBE,KAAK,MAAM,MAsBb,CACL,EAED,qBACC,cAAc,SAAS,YACvB,cAAc,SAAS,KACvB,MAAM,KAAK,EAAE,QAAQ,WAAW,cAAc,QAAQ,CAAC,CAAC,KACrD,GAAG,UACF,oBAAC,MAAD;MAEE,WAAW,iBAAiB,YAAY,oBAAoB,QAAQ,GAAG,0BAA0B,QAAQ,eAAe;gBAEvH,QAAQ,KAAK,QACZ,oBAAC,MAAD;OAAkB,WAAU;iBAAoB;OAE3C,EAFI,IAAI,IAER,CACL;MACC,EARE,SAAS,QAQX,CAER,CACF,EAAA,CAAA,EAEC,CAAA,CACF;;IACJ,CAAA;GAGL,qBAAqB,aAAa,KACjC,qBAAC,OAAD;IACE,WAAW,6DAA6D,YAAY,KAAK,QAAQ,gBAAgB,aAAa,QAAQ;cADxI,CAGE,qBAAC,KAAD;KAAG,WAAU;eAAb;MAAuB;OACX,cAAc,KAAK,WAAW;MAAE;MACzC,KAAK,IAAI,cAAc,UAAU,WAAW,OAAO;MAAC;MAAI;MACxD,WAAW;MAAO;MACjB;QACJ,qBAAC,OAAD;KAAK,WAAU;eAAf;MACE,oBAAC,UAAD;OACE,eAAe,gBAAgB,MAAM,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC;OACxD,UAAU,gBAAgB;OAC1B,WAAW,4BAA4B,sBAAsB,SAAS,sBAAsB;iBAC7F;OAEQ,CAAA;MACT,qBAAC,QAAD;OAAM,WAAU;iBAAhB;QAA0B;QAClB;QAAY;QAAK;QAClB;;MACP,oBAAC,UAAD;OACE,eAAe,gBAAgB,MAAM,KAAK,IAAI,YAAY,IAAI,EAAE,CAAC;OACjE,UAAU,gBAAgB;OAC1B,WAAW,4BAA4B,sBAAsB,SAAS,sBAAsB;iBAC7F;OAEQ,CAAA;MACL;OACF;;GAEJ;;;AAIV,MAAa,4BAAkD;CAC7D,YAAY;CACZ,aAAa;CACb,YAAY;EACV;GAAE,IAAI;GAAW,OAAO;GAAW;EACnC;GAAE,IAAI;GAAY,OAAO;GAAY;EACrC;GAAE,IAAI;GAAQ,OAAO;GAAQ;EAC9B;CACD,uBAAuB,CAAC,QAAQ,UAAU;CAC1C,QAAQ;EAEN;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB;EACD,iBAAiB;GACf,OAAO;GACP,cAAc;GACd,KAAK;GACL,aAAa;GACb,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB,CAAC;EACF,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB,CAAC;EAGF;GACE,MAAM;GACN,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;IAAE,MAAM;IAAS,OAAO;IAAc;GACpD,KAAK;GACL,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR;EACD,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACF,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACF,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACF;GACE,KAAK;GACL,MAAM;GACN,OAAO;GACP,KAAK;GACL,OAAO;GACR;EACD,gBAAgB;GACd,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACF,qBAAqB;GACnB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACF,oBAAoB;GAClB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACF,oBAAoB;GAClB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EAGF;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,KAAK;GACL,MAAM;GACN,cAAc;GACd,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB;EAGD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,aAAa,CACX;IACE,KAAK;IACL,aACE;IACH,EACD;IACE,KAAK;IACL,aACE;IACH,CACF;GACD,KAAK;GACL,OAAO;GACR;EACF;CACF"}