@prismiq/react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -0
- package/dist/CustomSQLEditor-BXB4rf1q.d.cts +1297 -0
- package/dist/CustomSQLEditor-DYeId0Gp.d.ts +1297 -0
- package/dist/DashboardDialog-B3vYC5Gs.d.ts +1106 -0
- package/dist/DashboardDialog-LHmrtNQU.d.cts +1106 -0
- package/dist/accessibility-2yy5yqRR.d.cts +145 -0
- package/dist/accessibility-2yy5yqRR.d.ts +145 -0
- package/dist/charts/index.cjs +110 -0
- package/dist/charts/index.cjs.map +1 -0
- package/dist/charts/index.d.cts +2 -0
- package/dist/charts/index.d.ts +2 -0
- package/dist/charts/index.js +5 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/chunk-2H5WTH4K.js +2409 -0
- package/dist/chunk-2H5WTH4K.js.map +1 -0
- package/dist/chunk-4AVL6GQK.cjs +470 -0
- package/dist/chunk-4AVL6GQK.cjs.map +1 -0
- package/dist/chunk-EX74SI67.js +455 -0
- package/dist/chunk-EX74SI67.js.map +1 -0
- package/dist/chunk-FEABEF3J.cjs +7543 -0
- package/dist/chunk-FEABEF3J.cjs.map +1 -0
- package/dist/chunk-JTCBZDHY.js +126 -0
- package/dist/chunk-JTCBZDHY.js.map +1 -0
- package/dist/chunk-LMTG3LRC.cjs +326 -0
- package/dist/chunk-LMTG3LRC.cjs.map +1 -0
- package/dist/chunk-MDXGGZSW.cjs +273 -0
- package/dist/chunk-MDXGGZSW.cjs.map +1 -0
- package/dist/chunk-MOAEEF5P.js +7510 -0
- package/dist/chunk-MOAEEF5P.js.map +1 -0
- package/dist/chunk-NK7HKX2J.cjs +2459 -0
- package/dist/chunk-NK7HKX2J.cjs.map +1 -0
- package/dist/chunk-NY6TZLST.cjs +8781 -0
- package/dist/chunk-NY6TZLST.cjs.map +1 -0
- package/dist/chunk-T6STUE7E.js +321 -0
- package/dist/chunk-T6STUE7E.js.map +1 -0
- package/dist/chunk-TRW7DKLP.cjs +141 -0
- package/dist/chunk-TRW7DKLP.cjs.map +1 -0
- package/dist/chunk-UPYINBZU.js +8706 -0
- package/dist/chunk-UPYINBZU.js.map +1 -0
- package/dist/chunk-WWTT2OJ5.js +246 -0
- package/dist/chunk-WWTT2OJ5.js.map +1 -0
- package/dist/components/index.cjs +222 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +207 -0
- package/dist/components/index.d.ts +207 -0
- package/dist/components/index.js +5 -0
- package/dist/components/index.js.map +1 -0
- package/dist/dashboard/index.cjs +140 -0
- package/dist/dashboard/index.cjs.map +1 -0
- package/dist/dashboard/index.d.cts +302 -0
- package/dist/dashboard/index.d.ts +302 -0
- package/dist/dashboard/index.js +7 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/export/index.cjs +32 -0
- package/dist/export/index.cjs.map +1 -0
- package/dist/export/index.d.cts +197 -0
- package/dist/export/index.d.ts +197 -0
- package/dist/export/index.js +3 -0
- package/dist/export/index.js.map +1 -0
- package/dist/index-C-Qcuu4Y.d.cts +821 -0
- package/dist/index-rPc7ijt8.d.ts +821 -0
- package/dist/index.cjs +1486 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1435 -0
- package/dist/index.d.ts +1435 -0
- package/dist/index.js +926 -0
- package/dist/index.js.map +1 -0
- package/dist/ssr/index.cjs +64 -0
- package/dist/ssr/index.cjs.map +1 -0
- package/dist/ssr/index.d.cts +213 -0
- package/dist/ssr/index.d.ts +213 -0
- package/dist/ssr/index.js +3 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/types-WrCbOeAV.d.cts +569 -0
- package/dist/types-WrCbOeAV.d.ts +569 -0
- package/dist/utils/index.cjs +64 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +112 -0
- package/dist/utils/index.d.ts +112 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +110 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/Button.tsx","../src/components/ui/Input.tsx","../src/components/ui/Select.tsx","../src/components/ui/Checkbox.tsx","../src/components/ui/Badge.tsx","../src/components/ui/Tooltip.tsx","../src/components/ui/Dropdown.tsx","../src/components/ui/Icon.tsx","../src/components/ui/Dialog.tsx","../src/components/ui/CollapsibleSection.tsx","../src/components/ui/ColorPaletteSelector.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Skeleton/SkeletonText.tsx","../src/components/Skeleton/SkeletonChart.tsx","../src/components/Skeleton/SkeletonTable.tsx","../src/components/Skeleton/SkeletonMetricCard.tsx","../src/components/ErrorBoundary/ErrorFallback.tsx","../src/components/ErrorBoundary/ErrorBoundary.tsx","../src/components/ErrorBoundary/WidgetErrorBoundary.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/EmptyState/NoData.tsx","../src/components/EmptyState/NoResults.tsx","../src/components/EmptyState/EmptyDashboard.tsx","../src/api/client.ts","../src/context/AnalyticsProvider.tsx","../src/hooks/useSchema.ts","../src/hooks/useQuery.ts","../src/hooks/useChartData.ts","../src/hooks/useDashboards.ts","../src/hooks/useDashboard.ts","../src/hooks/useDashboardMutations.ts","../src/hooks/useDebouncedLayoutSave.ts","../src/hooks/useSavedQueries.ts","../src/hooks/useCustomSQL.ts","../src/hooks/usePinnedDashboards.ts","../src/hooks/usePinMutations.ts","../src/hooks/useDashboardPinStatus.ts","../src/context/CrossFilterContext.tsx","../src/components/SchemaExplorer/ColumnNode.tsx","../src/components/SchemaExplorer/TableNode.tsx","../src/components/SchemaExplorer/SchemaExplorer.tsx","../src/components/ColumnSelector/SelectedColumn.tsx","../src/components/ColumnSelector/ColumnSelector.tsx","../src/components/FilterBuilder/FilterValueInput.tsx","../src/components/FilterBuilder/FilterRow.tsx","../src/components/FilterBuilder/FilterBuilder.tsx","../src/components/SortBuilder/SortRow.tsx","../src/components/SortBuilder/SortBuilder.tsx","../src/components/JoinBuilder/JoinRow.tsx","../src/components/JoinBuilder/JoinBuilder.tsx","../src/components/AggregationPicker/AggregationPicker.tsx","../src/components/ResultsTable/Pagination.tsx","../src/components/ResultsTable/TableHeader.tsx","../src/components/ResultsTable/TableCell.tsx","../src/components/ResultsTable/TableRow.tsx","../src/components/ResultsTable/ResultsTable.tsx","../src/components/CalculatedFieldBuilder/ExpressionEditor.tsx","../src/components/CalculatedFieldBuilder/CalculatedFieldBuilder.tsx","../src/components/SavedQueryPicker/SavedQueryPicker.tsx","../src/components/TimeSeriesConfig/TimeSeriesConfig.tsx","../src/components/QueryBuilder/QueryBuilderToolbar.tsx","../src/components/QueryBuilder/QueryPreview.tsx","../src/components/QueryBuilder/QueryBuilder.tsx","../src/components/AutoSaveIndicator/AutoSaveIndicator.tsx","../src/components/CustomSQLEditor/CustomSQLEditor.tsx","../src/components/TableSelector/TableSelector.tsx"],"names":["Button","baseStyles","sizeStyles","disabledStyles","forwardRef","Input","jsx","jsxs","containerStyles","Checkbox","variantStyles","Badge","Tooltip","useState","useRef","useCallback","useEffect","DropdownItem","DropdownSeparator","Dropdown","createPortal","Icon","contentStyles","DialogHeader","DialogFooter","Dialog","Fragment","_","Component","createContext","useContext","useMemo","error","nodeStyles","selectedStyles","iconStyles","nameStyles","headerStyles","titleStyles","errorStyles","countStyles","removeButtonStyles","emptyStyles","rowStyles","draggingStyles","dragOverStyles","dragHandleStyles","columnSelectStyles","actionsStyles","formatValue","LoadingSkeleton","loadingStyles","dialogStyles","SavedQueryPicker","toolbarStyles","AutoSaveIndicator","statusStyles"],"mappings":";;;;;;AA6BA,IAAM,UAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,GAAA,EAAK,2BAAA;AAAA,EACL,UAAA,EAAY,0BAAA;AAAA,EACZ,UAAA,EAAY,GAAA;AAAA,EACZ,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,uBAAA;AAAA,EACR,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,2DAAA;AAAA,EACZ,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,aAAA,GAAkF;AAAA,EACtF,OAAA,EAAS;AAAA,IACP,eAAA,EAAiB,8BAAA;AAAA,IACjB,KAAA,EAAO,mCAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAAA,EACA,SAAA,EAAW;AAAA,IACT,eAAA,EAAiB,8BAAA;AAAA,IACjB,KAAA,EAAO,2BAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAAA,EACA,KAAA,EAAO;AAAA,IACL,eAAA,EAAiB,aAAA;AAAA,IACjB,KAAA,EAAO,2BAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,eAAA,EAAiB,4BAAA;AAAA,IACjB,KAAA,EAAO,mCAAA;AAAA,IACP,WAAA,EAAa;AAAA;AAEjB,CAAA;AAEA,IAAM,UAAA,GAA4E;AAAA,EAChF,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,qDAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,qDAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,qDAAA;AAAA,IACT,QAAA,EAAU;AAAA;AAEd,CAAA;AAEA,IAAM,cAAA,GAAsC;AAAA,EAC1C,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAoBO,IAAM,MAAA,GAAS,UAAA,CAA2C,SAASA,OAAAA,CACxE;AAAA,EACE,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,aAAa,QAAA,IAAY,OAAA;AAE/B,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,GAAG,UAAA;AAAA,IACH,GAAG,cAAc,OAAO,CAAA;AAAA,IACxB,GAAG,WAAW,IAAI,CAAA;AAAA,IAClB,GAAI,UAAA,GAAa,cAAA,GAAiB,EAAC;AAAA,IACnC,GAAG;AAAA,GACL;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,UAAA;AAAA,MACV,SAAA;AAAA,MACA,KAAA,EAAO,cAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,OAAA,mBACC,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,cAAA;AAAA,cACT,KAAA,EAAO,KAAA;AAAA,cACP,MAAA,EAAQ,KAAA;AAAA,cACR,MAAA,EAAQ,wBAAA;AAAA,cACR,gBAAA,EAAkB,aAAA;AAAA,cAClB,YAAA,EAAc,KAAA;AAAA,cACd,SAAA,EAAW;AAAA;AACb;AAAA,SACF,GAEA,QAAA;AAAA,QAED,QAAA;AAAA,QACA,CAAC,OAAA,IAAW;AAAA;AAAA;AAAA,GACf;AAEJ,CAAC;ACxID,IAAMC,WAAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,OAAA;AAAA,EACT,KAAA,EAAO,MAAA;AAAA,EACP,UAAA,EAAY,0BAAA;AAAA,EACZ,eAAA,EAAiB,iCAAA;AAAA,EACjB,KAAA,EAAO,2BAAA;AAAA,EACP,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY;AACd,CAAA;AAEA,IAAMC,WAAAA,GAAgF;AAAA,EACpF,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,qDAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,qDAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,qDAAA;AAAA,IACT,QAAA,EAAU;AAAA;AAEd,CAAA;AAEA,IAAMC,eAAAA,GAAsC;AAAA,EAC1C,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ,aAAA;AAAA,EACR,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,WAAA,EAAa;AACf,CAAA;AAoBO,IAAM,KAAA,GAAQC,UAAAA,CAAyC,SAASC,MAAAA,CACrE,EAAE,SAAA,GAAY,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,GAAG,KAAA,IAC1D,GAAA,EACA;AACA,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,GAAGJ,WAAAA;AAAA,IACH,GAAGC,YAAW,SAAS,CAAA;AAAA,IACvB,GAAI,QAAA,GAAWC,eAAAA,GAAiB,EAAC;AAAA,IACjC,GAAI,KAAA,GAAQ,WAAA,GAAc,EAAC;AAAA,IAC3B,GAAG;AAAA,GACL;AAEA,EAAA,uBACEG,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA,EAAO,cAAA;AAAA,MACN,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC;AC3CD,IAAM,eAAA,GAAuC;AAAA,EAC3C,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,aAAA,GAAqC;AAAA,EACzC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,KAAA,EAAO,MAAA;AAAA,EACP,UAAA,EAAY,0BAAA;AAAA,EACZ,eAAA,EAAiB,iCAAA;AAAA,EACjB,KAAA,EAAO,2BAAA;AAAA,EACP,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY;AACd,CAAA;AAEA,IAAMJ,WAAAA,GAAqF;AAAA,EACzF,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,qDAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,qDAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,qDAAA;AAAA,IACT,QAAA,EAAU;AAAA;AAEd,CAAA;AAEA,IAAM,cAAA,GAAsC;AAAA,EAC1C,QAAA,EAAU,UAAA;AAAA,EACV,GAAA,EAAK,MAAA;AAAA,EACL,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO,CAAA;AAAA,EACP,SAAA,EAAW,2BAAA;AAAA,EACX,eAAA,EAAiB,iCAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,SAAA,EAAW,0BAAA;AAAA,EACX,MAAA,EAAQ,GAAA;AAAA,EACR,SAAA,EAAW,OAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,YAAA,GAAoC;AAAA,EACxC,OAAA,EAAS,qDAAA;AAAA,EACT,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,iBAAA,GAAyC;AAAA,EAC7C,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,oBAAA,GAA4C;AAAA,EAChD,eAAA,EAAiB,8BAAA;AAAA,EACjB,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,oBAAA,GAA4C;AAAA,EAChD,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,iBAAA,GAAyC;AAAA,EAC7C,KAAA,EAAO;AACT,CAAA;AAwBA,SAAS,WAAA,CACP;AAAA,EACE,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,GAAc,WAAA;AAAA,EACd,QAAA,GAAW,KAAA;AAAA,EACX,UAAA,GAAa,KAAA;AAAA,EACb,IAAA,GAAO,IAAA;AAAA,EACP,SAAA;AAAA,EACA;AACF,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAS,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,QAAA,CAAS,EAAE,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,CAAA;AACtF,EAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,cAAA,GAAiB,OAAyB,IAAI,CAAA;AACpD,EAAA,MAAM,UAAA,GAAa,OAAuB,IAAI,CAAA;AAC9C,EAAA,MAAM,WAAA,GAAc,OAAuB,IAAI,CAAA;AAG/C,EAAA,MAAM,iBAAiB,OAAA,CAAQ,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,UAAU,KAAK,CAAA;AAGhE,EAAA,MAAM,eAAA,GAAkB,aACpB,OAAA,CAAQ,MAAA;AAAA,IAAO,CAAC,QACd,GAAA,CAAI,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,MAAA,CAAO,WAAA,EAAa;AAAA,GACvD,GACA,OAAA;AAGJ,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAsB;AAChD,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AAErB,MAAA,MAAM,iBAAA,GAAoB,YAAA,CAAa,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA;AAC/D,MAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA;AAE7D,MAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,gBAAA,EAAkB;AAC3C,QAAA,SAAA,CAAU,KAAK,CAAA;AACf,QAAA,SAAA,CAAU,EAAE,CAAA;AAAA,MACd;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AACzD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,kBAAkB,CAAA;AAAA,EAC3E,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAA,IAAU,UAAA,IAAc,cAAA,CAAe,OAAA,EAAS;AAClD,MAAA,cAAA,CAAe,QAAQ,KAAA,EAAM;AAAA,IAC/B;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,UAAU,CAAC,CAAA;AAGvB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,EAAE,CAAA;AAAA,EACxB,CAAA,EAAG,CAAC,eAAA,CAAgB,MAAM,CAAC,CAAA;AAG3B,EAAA,MAAM,sBAAA,GAAyB,YAAY,MAAM;AAC/C,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,OAAA,CAAQ,qBAAA,EAAsB;AACtD,MAAA,mBAAA,CAAoB;AAAA,QAClB,GAAA,EAAK,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,OAAA,GAAU,CAAA;AAAA;AAAA,QACpC,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,OAAA;AAAA,QACzB,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,YAAY,MAAM;AACrC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,SAAA,CAAU,CAAC,IAAA,KAAS;AAClB,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,sBAAA,EAAuB;AAAA,QACzB;AACA,QAAA,OAAO,CAAC,IAAA;AAAA,MACV,CAAC,CAAA;AACD,MAAA,SAAA,CAAU,EAAE,CAAA;AACZ,MAAA,mBAAA,CAAoB,EAAE,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,sBAAsB,CAAC,CAAA;AAErC,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,MAAA,KAA4B;AAC3B,MAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,QAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AACrB,QAAA,SAAA,CAAU,KAAK,CAAA;AACf,QAAA,SAAA,CAAU,EAAE,CAAA;AAAA,MACd;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,KAAA,KAAyB;AACxB,MAAA,IAAI,QAAA,EAAU;AAEd,MAAA,QAAQ,MAAM,GAAA;AAAK,QACjB,KAAK,OAAA;AAAA,QACL,KAAK,GAAA;AACH,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,SAAA,CAAU,IAAI,CAAA;AAAA,UAChB,CAAA,MAAA,IAAW,gBAAA,IAAoB,CAAA,IAAK,eAAA,CAAgB,gBAAgB,CAAA,EAAG;AACrE,YAAA,MAAM,MAAA,GAAS,gBAAgB,gBAAgB,CAAA;AAC/C,YAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,QAAA,EAAU;AAC9B,cAAA,YAAA,CAAa,MAAM,CAAA;AAAA,YACrB;AAAA,UACF;AACA,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,SAAA,CAAU,KAAK,CAAA;AACf,UAAA,SAAA,CAAU,EAAE,CAAA;AACZ,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,SAAA,CAAU,IAAI,CAAA;AAAA,UAChB,CAAA,MAAO;AACL,YAAA,mBAAA;AAAA,cAAoB,CAAC,SACnB,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG,eAAA,CAAgB,SAAS,CAAC;AAAA,aAC/C;AAAA,UACF;AACA,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,mBAAA,CAAoB,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,IAAA,GAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AACnD,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,SAAA,CAAU,KAAK,CAAA;AACf,UAAA,SAAA,CAAU,EAAE,CAAA;AACZ,UAAA;AAAA;AACJ,IACF,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,MAAA,EAAQ,gBAAA,EAAkB,iBAAiB,YAAY;AAAA,GACpE;AAEA,EAAA,uBACEK,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,QAAC,aAA+D,OAAA,GAAU,IAAA;AAC1E,QAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,UAAA,GAAA,CAAI,IAAI,CAAA;AAAA,QACV,WAAW,GAAA,EAAK;AACd,UAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AAAA,QAChB;AAAA,MACF,CAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA,EAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,KAAA,EAAM;AAAA,MACtC,SAAA,EAAW,aAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,UAAA;AAAA,YACL,IAAA,EAAK,UAAA;AAAA,YACL,eAAA,EAAe,MAAA;AAAA,YACf,eAAA,EAAc,SAAA;AAAA,YACd,eAAA,EAAe,QAAA;AAAA,YACf,QAAA,EAAU,WAAW,EAAA,GAAK,CAAA;AAAA,YAC1B,OAAA,EAAS,YAAA;AAAA,YACT,KAAA,EAAO;AAAA,cACL,GAAG,aAAA;AAAA,cACH,GAAGL,YAAW,IAAI,CAAA;AAAA,cAClB,GAAI,WAAW,EAAE,OAAA,EAAS,KAAK,MAAA,EAAQ,aAAA,KAAkB;AAAC,aAC5D;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAI,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,GAAiB,KAAK,iBAAA,EAChC,QAAA,EAAA,cAAA,GAAiB,cAAA,CAAe,KAAA,GAAQ,WAAA,EAC3C,CAAA;AAAA,8BACAA,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,UAAA,EAAY,uBAAA;AAAA,oBACZ,WAAA,EAAa,uBAAA;AAAA,oBACb,SAAA,EAAW,wBAAA;AAAA,oBACX,UAAA,EAAY,2BAAA;AAAA,oBACZ,SAAA,EAAW,SAAS,gBAAA,GAAmB,WAAA;AAAA,oBACvC,UAAA,EAAY;AAAA;AACd;AAAA;AACF;AAAA;AAAA,SACF;AAAA,QAEC,MAAA,IAAU,OAAO,QAAA,KAAa,WAAA,IAAe,YAAA;AAAA,0BAC5CC,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,WAAA;AAAA,cACL,KAAA,EAAO;AAAA,gBACL,GAAG,cAAA;AAAA,gBACH,QAAA,EAAU,OAAA;AAAA,gBACV,KAAK,gBAAA,CAAiB,GAAA;AAAA,gBACtB,MAAM,gBAAA,CAAiB,IAAA;AAAA,gBACvB,OAAO,gBAAA,CAAiB,KAAA;AAAA,gBACxB,SAAA,EAAW,CAAA;AAAA,gBACX,QAAA,EAAUL,WAAAA,CAAW,IAAI,CAAA,CAAE;AAAA,eAC7B;AAAA,cACA,IAAA,EAAK,SAAA;AAAA,cAEJ,QAAA,EAAA;AAAA,gBAAA,UAAA,oBACCI,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,2BAAA,IACrB,QAAA,kBAAAA,GAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,GAAA,EAAK,cAAA;AAAA,oBACL,SAAA,EAAU,IAAA;AAAA,oBACV,WAAA,EAAY,WAAA;AAAA,oBACZ,KAAA,EAAO,MAAA;AAAA,oBACP,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,oBACzC,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA;AAAgB;AAAA,iBACpC,EACF,CAAA;AAAA,gBAED,eAAA,CAAgB,MAAA,KAAW,CAAA,mBAC1BA,GAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO;AAAA,sBACL,GAAG,YAAA;AAAA,sBACH,KAAA,EAAO,iCAAA;AAAA,sBACP,MAAA,EAAQ;AAAA,qBACV;AAAA,oBACD,QAAA,EAAA;AAAA;AAAA,oBAID,eAAA,CAAgB,GAAA,CAAI,CAAC,MAAA,EAAQ,0BAC3BA,GAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBAEC,IAAA,EAAK,QAAA;AAAA,oBACL,eAAA,EAAe,OAAO,KAAA,KAAU,KAAA;AAAA,oBAChC,iBAAe,MAAA,CAAO,QAAA;AAAA,oBACtB,OAAA,EAAS,MAAM,YAAA,CAAa,MAAM,CAAA;AAAA,oBAClC,YAAA,EAAc,MAAM,mBAAA,CAAoB,KAAK,CAAA;AAAA,oBAC7C,KAAA,EAAO;AAAA,sBACL,GAAG,YAAA;AAAA,sBACH,GAAI,MAAA,CAAO,KAAA,KAAU,KAAA,GAAQ,uBAAuB,EAAC;AAAA,sBACrD,GAAI,KAAA,KAAU,gBAAA,GAAmB,iBAAA,GAAoB,EAAC;AAAA,sBACtD,GAAI,MAAA,CAAO,QAAA,GAAW,oBAAA,GAAuB;AAAC,qBAChD;AAAA,oBAEC,QAAA,EAAA,MAAA,CAAO;AAAA,mBAAA;AAAA,kBAbH,MAAA,CAAO,OAAO,KAAK;AAAA,iBAe3B;AAAA;AAAA;AAAA,WAEL;AAAA,UACA,QAAA,CAAS;AAAA;AACX;AAAA;AAAA,GACF;AAEJ;AAEO,IAAM,MAAA,GAASF,WAAW,WAAW;AC1X5C,IAAMI,gBAAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,cAAA,GAAsC;AAAA,EAC1C,UAAA,EAAY,MAAA;AAAA,EACZ,gBAAA,EAAkB,MAAA;AAAA,EAClB,aAAA,EAAe,MAAA;AAAA,EACf,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,eAAA,EAAiB,iCAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,4CAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AAEA,IAAMN,WAAAA,GAA8E;AAAA,EAClF,EAAA,EAAI;AAAA,IACF,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,EAAA,EAAI;AAAA,IACF,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,EAAA,EAAI;AAAA,IACF,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ;AAAA;AAEZ,CAAA;AAEA,IAAM,eAAA,GAAmF;AAAA,EACvF,EAAA,EAAI;AAAA,IACF,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,QAAA,EAAU;AAAA;AAEd,CAAA;AAkBO,IAAM,QAAA,GAAWE,UAAAA,CAA4C,SAASK,SAAAA,CAC3E,EAAE,IAAA,GAAO,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,OAAO,SAAA,EAAW,OAAA,EAAS,GAAG,KAAA,IAC9D,GAAA,EACA;AACA,EAAA,MAAM,gBAAgB,IAAA,KAAS,IAAA,GAAO,CAAA,GAAI,IAAA,KAAS,OAAO,EAAA,GAAK,EAAA;AAE/D,EAAA,uBACEF,IAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,GAAGC,gBAAAA;AAAA,QACH,GAAI,WAAW,EAAE,OAAA,EAAS,KAAK,MAAA,EAAQ,aAAA,KAAkB,EAAC;AAAA,QAC1D,GAAG;AAAA,OACL;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,IAAAA,CAAC,UAAK,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,OAAA,EAAS,eAAc,EAC1D,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,GAAA;AAAA,cACA,IAAA,EAAK,UAAA;AAAA,cACL,QAAA;AAAA,cACA,OAAA;AAAA,cACA,KAAA,EAAO;AAAA,gBACL,GAAG,cAAA;AAAA,gBACH,GAAGJ,YAAW,IAAI,CAAA;AAAA,gBAClB,GAAI,OAAA,GACA;AAAA,kBACE,eAAA,EAAiB,8BAAA;AAAA,kBACjB,WAAA,EAAa;AAAA,oBAEf;AAAC,eACP;AAAA,cACC,GAAG;AAAA;AAAA,WACN;AAAA,UACC,2BACCI,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,UAAA;AAAA,cACR,IAAA,EAAK,MAAA;AAAA,cACL,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,UAAA;AAAA,gBACV,GAAA,EAAK,KAAA;AAAA,gBACL,IAAA,EAAM,KAAA;AAAA,gBACN,SAAA,EAAW,uBAAA;AAAA,gBACX,KAAA,EAAO,aAAA;AAAA,gBACP,MAAA,EAAQ,aAAA;AAAA,gBACR,aAAA,EAAe;AAAA,eACjB;AAAA,cAEA,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,CAAA,EAAE,kBAAA;AAAA,kBACF,MAAA,EAAO,mCAAA;AAAA,kBACP,WAAA,EAAY,KAAA;AAAA,kBACZ,aAAA,EAAc,OAAA;AAAA,kBACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AACF,SAAA,EAEJ,CAAA;AAAA,QACC,yBACCA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,0BAAA;AAAA,cACZ,KAAA,EAAO,2BAAA;AAAA,cACP,GAAG,gBAAgB,IAAI;AAAA,aACzB;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,GAEJ;AAEJ,CAAC;ACtID,IAAML,WAAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,UAAA,EAAY,0BAAA;AAAA,EACZ,UAAA,EAAY,GAAA;AAAA,EACZ,YAAA,EAAc,4BAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEA,IAAMS,cAAAA,GAAiF;AAAA,EACrF,OAAA,EAAS;AAAA,IACP,eAAA,EAAiB,8BAAA;AAAA,IACjB,KAAA,EAAO,2BAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,OAAA,EAAS;AAAA,IACP,eAAA,EAAiB,8BAAA;AAAA,IACjB,KAAA,EAAO;AAAA,GACT;AAAA,EACA,OAAA,EAAS;AAAA,IACP,eAAA,EAAiB,8BAAA;AAAA,IACjB,KAAA,EAAO;AAAA,GACT;AAAA,EACA,OAAA,EAAS;AAAA,IACP,eAAA,EAAiB,8BAAA;AAAA,IACjB,KAAA,EAAO;AAAA,GACT;AAAA,EACA,KAAA,EAAO;AAAA,IACL,eAAA,EAAiB,4BAAA;AAAA,IACjB,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,eAAA,EAAiB,2BAAA;AAAA,IACjB,KAAA,EAAO;AAAA;AAEX,CAAA;AAEA,IAAMR,WAAAA,GAA2E;AAAA,EAC/E,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,+BAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,qDAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,qDAAA;AAAA,IACT,QAAA,EAAU;AAAA;AAEd,CAAA;AAeO,IAAM,KAAA,GAAQE,UAAAA,CAAwC,SAASO,MAAAA,CACpE,EAAE,OAAA,GAAU,SAAA,EAAW,IAAA,GAAO,IAAA,EAAM,UAAU,KAAA,EAAO,SAAA,EAAW,GAAG,KAAA,IACnE,GAAA,EACA;AACA,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,GAAGV,WAAAA;AAAA,IACH,GAAGS,eAAc,OAAO,CAAA;AAAA,IACxB,GAAGR,YAAW,IAAI,CAAA;AAAA,IAClB,GAAG;AAAA,GACL;AAEA,EAAA,uBACEI,IAAC,MAAA,EAAA,EAAK,GAAA,EAAU,WAAsB,KAAA,EAAO,cAAA,EAAiB,GAAG,KAAA,EAC9D,QAAA,EACH,CAAA;AAEJ,CAAC;AChED,IAAM,aAAA,GAAqC;AAAA,EACzC,QAAA,EAAU,OAAA;AAAA,EACV,OAAA,EAAS,qDAAA;AAAA,EACT,eAAA,EAAiB,2BAAA;AAAA,EACjB,KAAA,EAAO,iCAAA;AAAA,EACP,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,YAAA,EAAc,0BAAA;AAAA,EACd,SAAA,EAAW,0BAAA;AAAA,EACX,MAAA,EAAQ,IAAA;AAAA,EACR,aAAA,EAAe,MAAA;AAAA,EACf,UAAA,EAAY,QAAA;AAAA,EACZ,QAAA,EAAU,OAAA;AAAA,EACV,QAAA,EAAU;AACZ,CAAA;AAgBO,IAAM,OAAA,GAAUF,UAAAA,CAAyC,SAASQ,QAAAA,CACvE;AAAA,EACE,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,KAAA,GAAQ,GAAA;AAAA,EACR,QAAA,GAAW,KAAA;AAAA,EACX,KAAA;AAAA,EACA;AACF,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,QAAAA,CAAwC;AAAA,IACpF,GAAA,EAAK,CAAA;AAAA,IACL,IAAA,EAAM;AAAA,GACP,CAAA;AAED,EAAA,MAAM,UAAA,GAAaC,OAAoB,IAAI,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAaA,OAAuB,IAAI,CAAA;AAC9C,EAAA,MAAM,UAAA,GAAaA,OAA6C,IAAI,CAAA;AAEpE,EAAA,MAAM,iBAAA,GAAoBC,YAAY,MAAM;AAC1C,IAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,CAAC,WAAW,OAAA,EAAS;AAEhD,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,OAAA,CAAQ,qBAAA,EAAsB;AAC7D,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,OAAA,CAAQ,qBAAA,EAAsB;AAC7D,IAAA,MAAM,GAAA,GAAM,CAAA;AAEZ,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,IAAA,GAAO,CAAA;AAEX,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAK,KAAA;AACH,QAAA,GAAA,GAAM,WAAA,CAAY,GAAA,GAAM,WAAA,CAAY,MAAA,GAAS,GAAA;AAC7C,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA,GAAA,CAAQ,WAAA,CAAY,KAAA,GAAQ,YAAY,KAAA,IAAS,CAAA;AACpE,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,GAAA,GAAM,YAAY,MAAA,GAAS,GAAA;AAC3B,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA,GAAA,CAAQ,WAAA,CAAY,KAAA,GAAQ,YAAY,KAAA,IAAS,CAAA;AACpE,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,GAAA,GAAM,WAAA,CAAY,GAAA,GAAA,CAAO,WAAA,CAAY,MAAA,GAAS,YAAY,MAAA,IAAU,CAAA;AACpE,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA,GAAO,WAAA,CAAY,KAAA,GAAQ,GAAA;AAC9C,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,GAAA,GAAM,WAAA,CAAY,GAAA,GAAA,CAAO,WAAA,CAAY,MAAA,GAAS,YAAY,MAAA,IAAU,CAAA;AACpE,QAAA,IAAA,GAAO,YAAY,KAAA,GAAQ,GAAA;AAC3B,QAAA;AAAA;AAIJ,IAAA,MAAM,gBAAgB,MAAA,CAAO,UAAA;AAC7B,IAAA,MAAM,iBAAiB,MAAA,CAAO,WAAA;AAE9B,IAAA,IAAI,IAAA,GAAO,KAAK,IAAA,GAAO,GAAA;AACvB,IAAA,IAAI,IAAA,GAAO,WAAA,CAAY,KAAA,GAAQ,aAAA,GAAgB,GAAA,EAAK;AAClD,MAAA,IAAA,GAAO,aAAA,GAAgB,YAAY,KAAA,GAAQ,GAAA;AAAA,IAC7C;AACA,IAAA,IAAI,GAAA,GAAM,KAAK,GAAA,GAAM,GAAA;AACrB,IAAA,IAAI,GAAA,GAAM,WAAA,CAAY,MAAA,GAAS,cAAA,GAAiB,GAAA,EAAK;AACnD,MAAA,GAAA,GAAM,cAAA,GAAiB,YAAY,MAAA,GAAS,GAAA;AAAA,IAC9C;AAEA,IAAA,kBAAA,CAAmB,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,IAAA,IAAI,QAAA,EAAU;AAEd,IAAA,UAAA,CAAW,OAAA,GAAU,WAAW,MAAM;AACpC,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,GAAG,KAAK,CAAA;AAAA,EACV,CAAA,EAAG,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAA;AAEpB,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAC/B,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IACvB;AACA,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,EAAW;AAEb,MAAA,qBAAA,CAAsB,iBAAiB,CAAA;AAAA,IACzC;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,iBAAiB,CAAC,CAAA;AAGjC,EAAAA,UAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAAA,MACjC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,OAAA,GAAU,cAAA,CAAwC,QAAQ,CAAA,GAC5D,aAAa,QAAA,EAAU;AAAA,IACrB,GAAA,EAAK,CAAC,IAAA,KAA6B;AACjC,MAAC,WAA0D,OAAA,GAAU,IAAA;AAErE,MAAA,MAAM,WAAY,QAAA,CAA8C,GAAA;AAChE,MAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf,CAAA,MAAA,IAAW,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AACnD,QAAC,SAAwD,OAAA,GAAU,IAAA;AAAA,MACrE;AAAA,IACF,CAAA;AAAA,IACA,YAAA,EAAc,CAAC,CAAA,KAAwB;AACrC,MAAA,gBAAA,EAAiB;AACjB,MAAA,MAAM,YAAA,GAAe,SAAS,KAAA,CAAM,YAAA;AAGpC,MAAA,YAAA,GAAe,CAAC,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,YAAA,EAAc,CAAC,CAAA,KAAwB;AACrC,MAAA,gBAAA,EAAiB;AACjB,MAAA,MAAM,YAAA,GAAe,SAAS,KAAA,CAAM,YAAA;AAGpC,MAAA,YAAA,GAAe,CAAC,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAwB;AAChC,MAAA,gBAAA,EAAiB;AACjB,MAAA,MAAM,OAAA,GAAU,SAAS,KAAA,CAAM,OAAA;AAG/B,MAAA,OAAA,GAAU,CAAC,CAAA;AAAA,IACb,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,CAAA,KAAwB;AAC/B,MAAA,gBAAA,EAAiB;AACjB,MAAA,MAAM,MAAA,GAAS,SAAS,KAAA,CAAM,MAAA;AAG9B,MAAA,MAAA,GAAS,CAAC,CAAA;AAAA,IACZ;AAAA,GACD,CAAA,GACD,QAAA;AAEJ,EAAA,uBACET,KAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,OAAA;AAAA,IACA,6BACCD,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,UAAC,WAA6D,OAAA,GAAU,IAAA;AACxE,UAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,YAAA,GAAA,CAAI,IAAI,CAAA;AAAA,UACV,WAAW,GAAA,EAAK;AACd,YAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AAAA,UAChB;AAAA,QACF,CAAA;AAAA,QACA,IAAA,EAAK,SAAA;AAAA,QACL,SAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,GAAG,aAAA;AAAA,UACH,KAAK,eAAA,CAAgB,GAAA;AAAA,UACrB,MAAM,eAAA,CAAgB,IAAA;AAAA,UACtB,GAAG;AAAA,SACL;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAEJ,CAAC;AC7LD,IAAM,eAAA,GAAkB,cAA2C,IAAI,CAAA;AAMvE,IAAME,gBAAAA,GAAuC;AAAA,EAC3C,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,aAAA,GAAqC;AAAA,EACzC,QAAA,EAAU,OAAA;AAAA,EACV,QAAA,EAAU,OAAA;AAAA,EACV,eAAA,EAAiB,iCAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,SAAA,EAAW,0BAAA;AAAA,EACX,MAAA,EAAQ,GAAA;AAAA,EACR,OAAA,EAAS,6BAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,qDAAA;AAAA,EACT,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,+BAAA;AAAA,EACV,KAAA,EAAO,2BAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,eAAA,GAAuC;AAAA,EAC3C,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,kBAAA,GAA0C;AAAA,EAC9C,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,eAAA,GAAuC;AAAA,EAC3C,MAAA,EAAQ,KAAA;AAAA,EACR,eAAA,EAAiB,6BAAA;AAAA,EACjB,MAAA,EAAQ;AACV,CAAA;AASO,IAAM,YAAA,GAAeJ,UAAAA;AAAA,EAC1B,SAASa,aAAAA,CACP,EAAE,QAAA,GAAW,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,GAAG,KAAA,IAClE,GAAA,EACA;AACA,IAAA,MAAM,OAAA,GAAU,WAAW,eAAe,CAAA;AAC1C,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIJ,SAAS,KAAK,CAAA;AAEhD,IAAA,MAAM,WAAA,GAAcE,WAAAA;AAAA,MAClB,CAAC,CAAA,KAAwC;AACvC,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA;AAAA,QACF;AACA,QAAA,OAAA,GAAU,CAAC,CAAA;AACX,QAAA,OAAA,EAAS,KAAA,EAAM;AAAA,MACjB,CAAA;AAAA,MACA,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO;AAAA,KAC7B;AAEA,IAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,MACpB,CAAC,CAAA,KAAqC;AACpC,QAAA,IAAI,QAAA,EAAU;AACd,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,WAAA,CAAY,CAAgD,CAAA;AAAA,QAC9D;AAAA,MACF,CAAA;AAAA,MACA,CAAC,UAAU,WAAW;AAAA,KACxB;AAEA,IAAA,uBACER,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,UAAA;AAAA,QACL,QAAA,EAAU,WAAW,EAAA,GAAK,CAAA;AAAA,QAC1B,eAAA,EAAe,QAAA;AAAA,QACf,OAAA,EAAS,WAAA;AAAA,QACT,SAAA,EAAW,aAAA;AAAA,QACX,YAAA,EAAc,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,QACrC,YAAA,EAAc,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,QACtC,SAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,GAAG,UAAA;AAAA,UACH,GAAI,SAAA,IAAa,CAAC,QAAA,GAAW,kBAAkB,EAAC;AAAA,UAChD,GAAI,QAAA,GAAW,kBAAA,GAAqB,EAAC;AAAA,UACrC,GAAG;AAAA,SACL;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,IAAA,oBAAQD,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAS,EAAI,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,UACtE;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AASO,IAAM,iBAAA,GAAoBF,UAAAA;AAAA,EAC/B,SAASc,mBAAkB,EAAE,KAAA,EAAO,WAAW,GAAG,KAAA,IAAS,GAAA,EAAK;AAC9D,IAAA,uBACEZ,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,WAAA;AAAA,QACL,SAAA;AAAA,QACA,KAAA,EAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,KAAA,EAAM;AAAA,QACrC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AAqBO,IAAM,WAAWF,UAAAA,CAA0C,SAASe,SAAAA,CACzE,EAAE,SAAS,QAAA,EAAU,KAAA,GAAQ,OAAA,EAAS,QAAA,GAAW,OAAO,KAAA,EAAO,SAAA,EAAW,GAAG,KAAA,IAC7E,GAAA,EACA;AACA,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIN,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA,CAAS,EAAE,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,CAAA;AAC5D,EAAA,MAAM,YAAA,GAAeC,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,OAAA,GAAUA,OAAuB,IAAI,CAAA;AAE3C,EAAA,MAAM,KAAA,GAAQC,YAAY,MAAM;AAC9B,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,SAAA,CAAU,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,IAC3B;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,MAAA,IAAU,aAAa,OAAA,EAAS;AAClC,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,CAAQ,qBAAA,EAAsB;AACxD,MAAA,MAAM,SAAA,GAAY,GAAA;AAElB,MAAA,IAAI,OAAO,KAAA,KAAU,KAAA,GAAQ,IAAA,CAAK,KAAA,GAAQ,YAAY,IAAA,CAAK,IAAA;AAC3D,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,GAAS,CAAA;AAG1B,MAAA,IAAI,IAAA,GAAO,SAAA,GAAY,MAAA,CAAO,UAAA,EAAY;AACxC,QAAA,IAAA,GAAO,MAAA,CAAO,aAAa,SAAA,GAAY,CAAA;AAAA,MACzC;AACA,MAAA,IAAI,OAAO,CAAA,EAAG;AACZ,QAAA,IAAA,GAAO,CAAA;AAAA,MACT;AAEA,MAAA,WAAA,CAAY,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,IAC3B;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAK,CAAC,CAAA;AAGlB,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAsB;AAChD,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,MAAA,IACE,YAAA,CAAa,OAAA,IACb,CAAC,YAAA,CAAa,QAAQ,QAAA,CAAS,MAAM,CAAA,IACrC,OAAA,CAAQ,WACR,CAAC,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAChC;AACA,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AACzD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,kBAAkB,CAAA;AAAA,EAC3E,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,YAAA,EAAc,IAAI,CAAA;AACpD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,cAAc,IAAI,CAAA;AAAA,EACtE,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,MAAM,aAAA,GAAgBD,WAAAA;AAAA,IACpB,CAAC,CAAA,KAAqC;AACpC,MAAA,QAAQ,EAAE,GAAA;AAAK,QACb,KAAK,QAAA;AACH,UAAA,SAAA,CAAU,KAAK,CAAA;AACf,UAAA;AAAA,QACF,KAAK,OAAA;AAAA,QACL,KAAK,GAAA;AACH,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,MAAA,EAAO;AAAA,UACT;AACA,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,SAAA,CAAU,IAAI,CAAA;AAAA,UAChB;AACA,UAAA;AAAA;AACJ,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,MAAM;AAAA,GACjB;AAGA,EAAA,MAAM,WAAA,GAAc,MAAA,IAAU,OAAO,QAAA,KAAa,WAAA,GAAcK,YAAAA;AAAA,oBAC9Dd,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO;AAAA,UACL,GAAG,aAAA;AAAA,UACH,KAAK,QAAA,CAAS,GAAA;AAAA,UACd,MAAM,QAAA,CAAS;AAAA,SACjB;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,IACA,QAAA,CAAS;AAAA,GACX,GAAI,IAAA;AAEJ,EAAA,uBACEA,IAAC,eAAA,CAAgB,QAAA,EAAhB,EAAyB,KAAA,EAAO,EAAE,KAAA,EAAM,EACvC,QAAA,kBAAAC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,QAAC,aAA+D,OAAA,GAAU,IAAA;AAC1E,QAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,UAAA,GAAA,CAAI,IAAI,CAAA;AAAA,QACV,WAAW,GAAA,EAAK;AACd,UAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AAAA,QAChB;AAAA,MACF,CAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA,EAAO,EAAE,GAAGC,gBAAAA,EAAiB,GAAG,KAAA,EAAM;AAAA,MACtC,SAAA,EAAW,aAAA;AAAA,MACV,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAF,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,cAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,cAAA,MAAA,EAAO;AAAA,YACT,CAAA;AAAA,YACA,KAAA,EAAO,EAAE,MAAA,EAAQ,QAAA,GAAW,gBAAgB,SAAA,EAAU;AAAA,YAErD,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAEC;AAAA;AAAA;AAAA,GACH,EACF,CAAA;AAEJ,CAAC;AC5RD,IAAM,SAAA,GAAsC;AAAA,EAC1C,cAAA,EAAgB,cAAA;AAAA,EAChB,YAAA,EAAc,iBAAA;AAAA,EACd,cAAA,EAAgB,iBAAA;AAAA,EAChB,eAAA,EAAiB,eAAA;AAAA,EACjB,GAAA,EAAK,sBAAA;AAAA,EACL,MAAA,EAAQ,kBAAA;AAAA,EACR,OAAA,EAAS,UAAA;AAAA,EACT,OAAA,EAAS,gBAAA;AAAA,EACT,QAAA,EAAU,6CAAA;AAAA,EACV,QAAA,EAAU,kCAAA;AAAA,EACV,UAAA,EAAY,8CAAA;AAAA,EACZ,WAAA,EAAa,6CAAA;AAAA,EACb,MAAA,EAAQ,iBAAA;AAAA,EACR,OAAA,EAAS,gDAAA;AAAA,EACT,QAAA,EAAU,yBAAA;AAAA,EACV,KAAA,EAAO,yDAAA;AAAA,EACP,MAAA,EAAQ,oIAAA;AAAA,EACR,MAAA,EAAQ,mBAAA;AAAA,EACR,SAAA,EAAW,0EAAA;AAAA,EACX,MAAA,EAAQ,sFAAA;AAAA,EACR,OAAA,EAAS,8HAAA;AAAA,EACT,MAAA,EAAQ,4GAAA;AAAA,EACR,MAAA,EAAQ,qEAAA;AAAA,EACR,UAAA,EAAY,4DAAA;AAAA,EACZ,UAAA,EAAY,mcAAA;AAAA,EACZ,KAAA,EAAO,kIAAA;AAAA,EACP,MAAA,EAAQ,6CAAA;AAAA,EACR,MAAA,EAAQ,kDAAA;AAAA,EACR,SAAA,EAAW,sIAAA;AAAA,EACX,OAAA,EAAS,mDAAA;AAAA,EACT,MAAA,EAAQ,uHAAA;AAAA,EACR,QAAA,EAAU,2FAAA;AAAA,EACV,YAAA,EAAc,2FAAA;AAAA,EACd,UAAA,EAAY,yFAAA;AAAA,EACZ,WAAA,EAAa,sMAAA;AAAA,EACb,YAAA,EAAc,0DAAA;AAAA,EACd,WAAA,EAAa,2FAAA;AAAA,EACb,MAAA,EAAQ,qQAAA;AAAA,EACR,eAAA,EAAiB,uHAAA;AAAA,EACjB,QAAA,EAAU,kFAAA;AAAA,EACV,UAAA,EAAY,wFAAA;AAAA,EACZ,cAAA,EAAgB;AAClB,CAAA;AAeO,IAAM,IAAA,GAAOF,UAAAA,CAAqC,SAASiB,KAAAA,CAChE,EAAE,IAAA,EAAM,IAAA,GAAO,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,GAAG,KAAA,IACxC,GAAA,EACA;AACA,EAAA,MAAM,IAAA,GAAO,UAAU,IAAI,CAAA;AAE3B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,EAAS,IAAI,CAAA,WAAA,CAAa,CAAA;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEf,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA;AAAA,MACA,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA,EAAG,GAAG,KAAA,EAAM;AAAA,MACjC,aAAA,EAAY,MAAA;AAAA,MACX,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAG,IAAA,EAAM;AAAA;AAAA,GACjB;AAEJ,CAAC;ACtGD,IAAM,cAAA,GAAsC;AAAA,EAC1C,QAAA,EAAU,OAAA;AAAA,EACV,KAAA,EAAO,CAAA;AAAA,EACP,eAAA,EAAiB,oBAAA;AAAA,EACjB,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,MAAA,EAAQ,GAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,YAAA,GAAoC;AAAA,EACxC,eAAA,EAAiB,iCAAA;AAAA,EACjB,YAAA,EAAc,0BAAA;AAAA,EACd,SAAA,EAAW,0BAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,WAAA,GAA8E;AAAA,EAClF,EAAA,EAAI,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAU,OAAA,EAAQ;AAAA,EACvC,EAAA,EAAI,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAU,OAAA,EAAQ;AAAA,EACvC,EAAA,EAAI,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAU,OAAA,EAAQ;AAAA,EACvC,EAAA,EAAI,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAU,OAAA,EAAQ;AAAA,EACvC,IAAA,EAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAU,oBAAA;AACnC,CAAA;AAEA,IAAM,YAAA,GAAoC;AAAA,EACxC,OAAA,EAAS,2BAAA;AAAA,EACT,YAAA,EAAc,uCAAA;AAAA,EACd,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,YAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,6BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,2BAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,iBAAA,GAAyC;AAAA,EAC7C,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO,iCAAA;AAAA,EACP,MAAA,EAAQ,WAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,iBAAA,GAAyC;AAAA,EAC7C,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,KAAA,EAAO,MAAA;AAAA,EACP,MAAA,EAAQ,MAAA;AAAA,EACR,MAAA,EAAQ,MAAA;AAAA,EACR,UAAA,EAAY,aAAA;AAAA,EACZ,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,iCAAA;AAAA,EACP,UAAA,EAAY;AACd,CAAA;AAEA,IAAMgB,cAAAA,GAAqC;AAAA,EACzC,OAAA,EAAS,2BAAA;AAAA,EACT,QAAA,EAAU,MAAA;AAAA,EACV,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,YAAA,GAAoC;AAAA,EACxC,OAAA,EAAS,2BAAA;AAAA,EACT,SAAA,EAAW,uCAAA;AAAA,EACX,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,UAAA;AAAA,EAChB,GAAA,EAAK;AACP,CAAA;AASO,IAAM,YAAA,GAAelB,UAAAA;AAAA,EAC1B,SAASmB,cAAa,EAAE,QAAA,EAAU,OAAO,GAAG,KAAA,IAAS,GAAA,EAAK;AACxD,IAAA,uBACEjB,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,OAAO,EAAE,GAAG,YAAA,EAAc,cAAA,EAAgB,cAAc,GAAG,KAAA,EAAM,EAAI,GAAG,OACpF,QAAA,EACH,CAAA;AAAA,EAEJ;AACF;AAKO,IAAM,YAAA,GAAeF,UAAAA;AAAA,EAC1B,SAASoB,cAAa,EAAE,QAAA,EAAU,OAAO,GAAG,KAAA,IAAS,GAAA,EAAK;AACxD,IAAA,uBACElB,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,KAAA,EAAO,EAAE,GAAG,YAAA,EAAc,GAAG,KAAA,EAAM,EAAI,GAAG,OACtD,QAAA,EACH,CAAA;AAAA,EAEJ;AACF;AAoCO,IAAM,MAAA,GAASF,UAAAA,CAAwC,SAASqB,OAAAA,CACrE;AAAA,EACE,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB,oBAAA,GAAuB,IAAA;AAAA,EACvB,aAAA,GAAgB,IAAA;AAAA,EAChB,KAAA,GAAQ,IAAA;AAAA,EACR,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,IAAA,EACA;AAEA,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,YAAA,CAAa;AAAA,IACpC,MAAA,EAAQ,IAAA;AAAA,IACR,QAAA,EAAU,gBAAgB,OAAA,GAAU;AAAA,GACrC,CAAA;AAMD,EAAAT,UAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA;AAC7C,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAC/B,MAAA,OAAO,MAAM;AACX,QAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,gBAAA;AAAA,MACjC,CAAA;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,mBAAA,GAAsBD,WAAAA;AAAA,IAC1B,CAAC,CAAA,KAAwB;AACvB,MAAA,IAAI,oBAAA,IAAwB,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,aAAA,EAAe;AACxD,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AAAA,IACA,CAAC,sBAAsB,OAAO;AAAA,GAChC;AAEA,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,gCACJT,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,cAAA;AAAA,MACP,OAAA,EAAS,mBAAA;AAAA,MACT,IAAA,EAAK,cAAA;AAAA,MAEL,QAAA,kBAAAC,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,YAAA;AAAA,UACL,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAW,MAAA;AAAA,UACX,iBAAA,EAAiB,QAAQ,cAAA,GAAiB,MAAA;AAAA,UAC1C,kBAAA,EAAkB,cAAc,oBAAA,GAAuB,MAAA;AAAA,UACvD,QAAA,EAAU,EAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,GAAG,YAAA;AAAA,YACH,GAAG,YAAY,KAAK,CAAA;AAAA,YACpB,GAAG;AAAA,WACL;AAAA,UACC,GAAG,KAAA;AAAA,UAEF,QAAA,EAAA;AAAA,YAAA,CAAA,KAAA,IAAS,eAAA,qBACTA,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,YAAA,EACV,QAAA,EAAA;AAAA,8BAAAA,KAAC,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,gBAAA,KAAA,oBACCD,GAAAA,CAAC,IAAA,EAAA,EAAG,IAAG,cAAA,EAAe,KAAA,EAAO,aAC1B,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,gBAED,WAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,IAAG,oBAAA,EAAqB,KAAA,EAAO,mBAC/B,QAAA,EAAA,WAAA,EACH;AAAA,eAAA,EAEJ,CAAA;AAAA,cACC,mCACCA,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,OAAA;AAAA,kBACT,KAAA,EAAO,iBAAA;AAAA,kBACP,YAAA,EAAW,cAAA;AAAA,kBAEX,QAAA,kBAAAA,GAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAM,IAAA;AAAA,sBACN,MAAA,EAAO,IAAA;AAAA,sBACP,OAAA,EAAQ,WAAA;AAAA,sBACR,IAAA,EAAK,MAAA;AAAA,sBACL,MAAA,EAAO,cAAA;AAAA,sBACP,WAAA,EAAY,GAAA;AAAA,sBACZ,aAAA,EAAc,OAAA;AAAA,sBAEd,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oBAAA,EAAqB;AAAA;AAAA;AAC/B;AAAA;AACF,aAAA,EAEJ,CAAA;AAAA,4BAEFA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOgB,gBAAgB,QAAA,EAAS;AAAA;AAAA;AAAA;AACvC;AAAA,GACF;AAIF,EAAA,OAAOF,YAAAA,CAAa,aAAA,EAAe,QAAA,CAAS,IAAI,CAAA;AAClD,CAAC;ACzRM,SAAS,kBAAA,CAAmB;AAAA,EACjC,KAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,QAAA;AAAA,EACA;AACF,CAAA,EAAyC;AACvC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAC3B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIP,SAAS,WAAW,CAAA;AAEhD,EAAA,MAAM,YAAA,GAAeE,YAAY,MAAM;AACrC,IAAA,SAAA,CAAU,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,EAC3B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAmC;AAAA,IACvC,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,MAAM,OAAA,CAAQ,EAAA;AAAA,IACnB,OAAA,EAAS,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA,EAAA,CAAA;AAAA,IAC5B,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,UAAA,EAAY,GAAA;AAAA,IACZ,KAAA,EAAO,MAAM,MAAA,CAAO,IAAA;AAAA,IACpB,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,MAAM,SAAA,GAAiC;AAAA,IACrC,KAAA,EAAO,MAAM,MAAA,CAAO,SAAA;AAAA,IACpB,UAAA,EAAY,qBAAA;AAAA,IACZ,SAAA,EAAW,SAAS,eAAA,GAAkB;AAAA,GACxC;AAEA,EAAA,MAAM,YAAA,GAAoC;AAAA,IACxC,QAAA,EAAU,QAAA;AAAA,IACV,SAAA,EAAW,SAAS,QAAA,GAAW,GAAA;AAAA,IAC/B,OAAA,EAAS,SAAS,CAAA,GAAI,CAAA;AAAA,IACtB,UAAA,EAAY,yCAAA;AAAA,IACZ,UAAA,EAAY,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,EAAA,GAAK;AAAA,GAC1C;AAEA,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACH,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,YAAA;AAAA,QACT,eAAA,EAAe,MAAA;AAAA,QACf,KAAA,EAAO;AAAA,UACL,GAAG,WAAA;AAAA,UACH,UAAA,EAAY,MAAA;AAAA,UACZ,MAAA,EAAQ,MAAA;AAAA,UACR,KAAA,EAAO,MAAA;AAAA,UACP,SAAA,EAAW;AAAA,SACb;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,SAAA,EACX,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,eAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,CAAA,EACvC,CAAA;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,YAAa,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,KAClC;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAe,QAAA,EAAS;AAAA,GAAA,EACtC,CAAA;AAEJ;AC/EA,SAAS,cAAA,CAAe,OAAe,KAAA,EAAuB;AAE5D,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,IAAA,IAAI,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAGvB,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,MAAA,GAAA,GAAA,CAAO,GAAA,CAAI,CAAC,CAAA,IAAK,EAAA,KAAO,IAAI,CAAC,CAAA,IAAK,EAAA,CAAA,IAAO,GAAA,CAAI,CAAC,CAAA,IAAK,OAAO,GAAA,CAAI,CAAC,KAAK,EAAA,CAAA,IAAO,GAAA,CAAI,CAAC,CAAA,IAAK,EAAA,CAAA,IAAO,GAAA,CAAI,CAAC,CAAA,IAAK,EAAA,CAAA;AAAA,IACxG,CAAA,MAAA,IAAW,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG;AAC3B,MAAA,GAAA,GAAA,CAAO,GAAA,CAAI,CAAC,CAAA,IAAK,EAAA,KAAO,GAAA,CAAI,CAAC,CAAA,IAAK,EAAA,CAAA,IAAO,GAAA,CAAI,CAAC,CAAA,IAAK,EAAA,CAAA,IAAO,IAAI,CAAC,CAAA,IAAK,EAAA,CAAA,IAAO,GAAA,CAAI,CAAC,CAAA,IAAK,EAAA,CAAA,IAAO,GAAA,CAAI,CAAC,CAAA,IAAK,EAAA,CAAA,IAAO,GAAA,CAAI,CAAC,CAAA,IAAK,EAAA,CAAA,IAAO,GAAA,CAAI,CAAC,CAAA,IAAK,EAAA,CAAA;AAAA,IAC1I;AAGA,IAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACtC,IAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACtC,IAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAEtC,IAAA,IAAI,CAAC,KAAA,CAAM,CAAC,CAAA,IAAK,CAAC,KAAA,CAAM,CAAC,CAAA,IAAK,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG;AACvC,MAAA,OAAO,QAAQ,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IACxC;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,+CAA+C,CAAA;AAC5E,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,CAAA,KAAA,EAAQ,QAAA,CAAS,CAAC,CAAC,CAAA,EAAA,EAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAA,EAAK,QAAA,CAAS,CAAC,CAAC,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,EACtE;AAGA,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,6DAA6D,CAAA;AAC3F,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,CAAA,KAAA,EAAQ,SAAA,CAAU,CAAC,CAAC,CAAA,EAAA,EAAK,SAAA,CAAU,CAAC,CAAC,CAAA,EAAA,EAAK,SAAA,CAAU,CAAC,CAAC,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,EACzE;AAGA,EAAA,OAAO,KAAA;AACT;AAmBA,IAAM,QAAA,GAAiD;AAAA,EACrD;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS;AAAA,GACjG;AAAA,EACA;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS;AAAA,GACjG;AAAA,EACA;AAAA,IACE,IAAA,EAAM,OAAA;AAAA,IACN,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS;AAAA,GACjG;AAAA,EACA;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS;AAAA,GACjG;AAAA,EACA;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS;AAAA,GACjG;AAAA,EACA;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS;AAAA,GACjG;AAAA,EACA;AAAA,IACE,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS;AAAA,GACjG;AAAA,EACA;AAAA,IACE,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS;AAAA;AAEnG,CAAA;AASO,SAAS,oBAAA,CAAqB;AAAA,EACnC,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA2C;AACzC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAG3B,EAAA,MAAM,kBAAkB,QAAA,CAAS,IAAA;AAAA,IAC/B,CAAC,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,MAAM,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KACvD,IAAA,IAAQ,QAAA;AAEX,EAAA,MAAM,YAAA,GAAeS,WAAAA;AAAA,IACnB,CAAC,OAAA,KAAqC;AACpC,MAAA,QAAA,CAAS,QAAQ,MAAM,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,QAAA,CAAS,MAAS,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,GAAA,EAAK,MAAM,OAAA,CAAQ;AAAA,GACrB;AAEA,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,UAAA,EAAY,GAAA;AAAA,IACZ,KAAA,EAAO,MAAM,MAAA,CAAO,IAAA;AAAA,IACpB,YAAA,EAAc,MAAM,OAAA,CAAQ;AAAA,GAC9B;AAEA,EAAA,MAAM,gBAAA,GAAwC;AAAA,IAC5C,OAAA,EAAS,MAAA;AAAA,IACT,mBAAA,EAAqB,gBAAA;AAAA,IACrB,GAAA,EAAK,MAAM,OAAA,CAAQ;AAAA,GACrB;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,UAAA,MAA8C;AAAA,IACtE,OAAA,EAAS,MAAM,OAAA,CAAQ,EAAA;AAAA,IACvB,MAAA,EAAQ,aAAa,UAAA,GAAa,KAAA,CAAM,OAAO,OAAA,GAAU,KAAA,CAAM,OAAO,MAAM,CAAA,CAAA;AAAA,IAC5E,YAAA,EAAc,MAAM,MAAA,CAAO,EAAA;AAAA,IAC3B,MAAA,EAAQ,SAAA;AAAA,IACR,iBAAiB,UAAA,GAAa,cAAA,CAAe,MAAM,MAAA,CAAO,OAAA,EAAS,GAAG,CAAA,GAAI,aAAA;AAAA,IAC1E,UAAA,EAAY;AAAA,GACd,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAwC;AAAA,IAC5C,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,KAAA,EAAO,MAAM,MAAA,CAAO,IAAA;AAAA,IACpB,YAAA,EAAc,MAAM,OAAA,CAAQ;AAAA,GAC9B;AAEA,EAAA,MAAM,oBAAA,GAA4C;AAAA,IAChD,OAAA,EAAS,MAAA;AAAA,IACT,GAAA,EAAK,KAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,MAAwC;AAAA,IAC3D,IAAA,EAAM,CAAA;AAAA,IACN,eAAA,EAAiB,KAAA;AAAA,IACjB,YAAA,EAAc;AAAA,GAChB,CAAA;AAEA,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,cAAA,EAChC,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,QAAQ,cAAA,EAAgB,eAAA,EAAiB,UAAA,EAAY,QAAA,EAAS,EACnF,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,UAAA,EAAY,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,MACrC,yBACCA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,WAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,YAC1B,KAAA,EAAO,MAAM,MAAA,CAAO,OAAA;AAAA,YACpB,UAAA,EAAY,MAAA;AAAA,YACZ,MAAA,EAAQ,MAAA;AAAA,YACR,MAAA,EAAQ,SAAA;AAAA,YACR,cAAA,EAAgB;AAAA,WAClB;AAAA,UACD,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EAEJ,CAAA;AAAA,oBAEAA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,kBACT,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,qBACbC,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,YAAA,CAAa,OAAO,CAAA;AAAA,QACnC,KAAA,EAAO,gBAAA,CAAiB,eAAA,KAAoB,OAAA,CAAQ,IAAI,CAAA;AAAA,QAExD,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,gBAAA,EAAmB,kBAAQ,IAAA,EAAK,CAAA;AAAA,0BAC5CA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,oBAAA,EACT,QAAA,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,qBACtCA,GAAAA,CAAC,KAAA,EAAA,EAA0B,KAAA,EAAO,WAAA,CAAY,KAAK,CAAA,EAAA,EAAzC,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAA+B,CACvD,CAAA,EACH;AAAA;AAAA,OAAA;AAAA,MAVK,OAAA,CAAQ;AAAA,KAYhB,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACzLO,SAAS,QAAA,CAAS;AAAA,EACvB,KAAA,GAAQ,MAAA;AAAA,EACR,MAAA,GAAS,EAAA;AAAA,EACT,YAAA,GAAe,KAAA;AAAA,EACf,OAAA,GAAU,IAAA;AAAA,EACV,SAAA;AAAA,EACA;AACF,CAAA,EAAsC;AACpC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAE3B,EAAA,MAAM,kBAAkB,OAAO,KAAA,KAAU,QAAA,GAAW,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA,GAAO,KAAA;AACnE,EAAA,MAAM,mBAAmB,OAAO,MAAA,KAAW,QAAA,GAAW,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA,GAAO,MAAA;AAEtE,EAAA,MAAM,YAAA,GAAoC;AAAA,IACxC,OAAA,EAAS,OAAA;AAAA,IACT,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,gBAAA;AAAA,IACR,YAAA;AAAA,IACA,YAAY,OAAA,GACR,CAAA;AAAA;AAAA,UAAA,EAEI,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,UAAA,EACpB,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA,UAAA,EACnB,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,SAAA,CAAA,GAExB,MAAM,MAAA,CAAO,OAAA;AAAA,IACjB,cAAA,EAAgB,WAAA;AAAA,IAChB,SAAA,EAAW,UAAU,+BAAA,GAAkC,MAAA;AAAA,IACvD,GAAG;AAAA,GACL;AAEA,EAAA,uBACEC,IAAAA,CAAAmB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAApB,IAAC,OAAA,EAAA,EACE,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,EAMH,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,KAAA,EAAO,YAAA;AAAA,QACP,IAAA,EAAK,cAAA;AAAA,QACL,aAAA,EAAY;AAAA;AAAA;AACd,GAAA,EACF,CAAA;AAEJ;ACjDO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA,GAAQ,CAAA;AAAA,EACR,aAAA,GAAgB,KAAA;AAAA,EAChB,UAAA,GAAa,EAAA;AAAA,EACb,GAAA,GAAM,CAAA;AAAA,EACN,OAAA,GAAU,IAAA;AAAA,EACV;AACF,CAAA,EAA0C;AACxC,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,GAAA,EAAK,GAAG,GAAG,CAAA,EAAA;AAAA,GACb;AAEA,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAsB,KAAA,EAAO,cAAA,EAAgB,MAAK,cAAA,EAAe,aAAA,EAAY,MAAA,EAC/E,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAM,EAAG,CAAC,GAAG,KAAA,KAAU;AAC3C,IAAA,MAAM,UAAA,GAAa,UAAU,KAAA,GAAQ,CAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,UAAA,IAAc,KAAA,GAAQ,CAAA,GAAI,aAAA,GAAgB,MAAA;AAExD,IAAA,uBACEA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,KAAA;AAAA,QACA,MAAA,EAAQ,UAAA;AAAA,QACR;AAAA,OAAA;AAAA,MAHK;AAAA,KAIP;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;ACvCO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA;AAAA,EACA,MAAA,GAAS,GAAA;AAAA,EACT,OAAA,GAAU,IAAA;AAAA,EACV;AACF,CAAA,EAA2C;AACzC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAE3B,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,MAAA;AAAA,IACP,MAAA;AAAA,IACA,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,UAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,OAAA,EAAS,MAAA;AAAA,IACT,SAAA,EAAW,YAAA;AAAA,IACX,eAAA,EAAiB,MAAM,MAAA,CAAO,OAAA;AAAA,IAC9B,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAAA,GAC1C;AAEA,EAAA,IAAI,SAAS,KAAA,EAAO;AAElB,IAAA,MAAM,QAAA,GAAW,CAAA;AACjB,IAAA,MAAM,aAAa,CAAC,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAE1C,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,gBAAgB,IAAA,EAAK,cAAA,EAAe,aAAA,EAAY,MAAA,EAChF,QAAA,kBAAAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,UAAA;AAAA,UACZ,GAAA,EAAK,MAAA;AAAA,UACL,MAAA,EAAQ,KAAA;AAAA,UACR,KAAA,EAAO,MAAA;AAAA,UACP,cAAA,EAAgB;AAAA,SAClB;AAAA,QAEC,QAAA,EAAA,UAAA,CAAW,MAAM,CAAA,EAAG,QAAQ,EAAE,GAAA,CAAI,CAAC,aAAA,EAAe,KAAA,qBACjDA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,KAAA,EAAO,EAAA;AAAA,YACP,MAAA,EAAQ,GAAG,aAAa,CAAA,CAAA,CAAA;AAAA,YACxB,YAAA,EAAa,aAAA;AAAA,YACb;AAAA,WAAA;AAAA,UAJK;AAAA,SAMR;AAAA;AAAA,KACH,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,MAAA,EAAQ;AAEtC,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,gBAAgB,IAAA,EAAK,cAAA,EAAe,aAAA,EAAY,MAAA,EAChF,QAAA,kBAAAC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAO,KAAA;AAAA,QACP,OAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAoB,MAAA;AAAA,QACpB,KAAA,EAAO,EAAE,OAAA,EAAS,GAAA,EAAI;AAAA,QAEtB,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EACC,QAAA,kBAAAC,IAAAA,CAAC,oBAAe,EAAA,EAAG,mBAAA,EAAoB,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,MAAA,EAAO,IAAG,IAAA,EAClE,QAAA,EAAA;AAAA,4BAAAD,IAAC,MAAA,EAAA,EAAK,MAAA,EAAO,OAAM,SAAA,EAAW,KAAA,CAAM,OAAO,MAAA,EAAQ,CAAA;AAAA,4BACnDA,IAAC,MAAA,EAAA,EAAK,MAAA,EAAO,OAAM,SAAA,EAAW,KAAA,CAAM,OAAO,YAAA,EAAc,CAAA;AAAA,4BACzDA,IAAC,MAAA,EAAA,EAAK,MAAA,EAAO,OAAM,SAAA,EAAW,KAAA,CAAM,OAAO,MAAA,EAAQ;AAAA,WAAA,EACrD,CAAA,EACF,CAAA;AAAA,UACC,IAAA,KAAS,0BACRA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,CAAA,EAAE,+CAAA;AAAA,cACF,IAAA,EAAM,MAAM,MAAA,CAAO,MAAA;AAAA,cACnB,OAAA,EAAQ;AAAA;AAAA,WACV;AAAA,0BAEFA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,CAAA,EAAE,6BAAA;AAAA,cACF,MAAA,EAAQ,MAAM,MAAA,CAAO,MAAA;AAAA,cACrB,WAAA,EAAY,GAAA;AAAA,cACZ,IAAA,EAAK,MAAA;AAAA,cACL,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,UAEC,CAAC,CAAA,EAAG,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACpC,YAAA,MAAM,CAAA,GAAI,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,EAAE,EAAE,CAAC,CAAA;AAChC,YAAA,uBACEA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,EAAA,EAAI,CAAA;AAAA,gBACJ,EAAA,EAAI,CAAA;AAAA,gBACJ,CAAA,EAAE,GAAA;AAAA,gBACF,IAAA,EAAM,MAAM,MAAA,CAAO;AAAA,eAAA;AAAA,cAJd;AAAA,aAKP;AAAA,UAEJ,CAAC;AAAA;AAAA;AAAA,KACH,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,SAAS,KAAA,EAAO;AAElB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,IAAI,GAAG,CAAA;AAEtC,IAAA,uBACEA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,GAAG,cAAA;AAAA,UACH,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAK,cAAA;AAAA,QACL,aAAA,EAAY,MAAA;AAAA,QAEZ,QAAA,kBAAAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,IAAA;AAAA,cACP,MAAA,EAAQ,IAAA;AAAA,cACR,YAAA,EAAc,KAAA;AAAA,cACd,UAAA,EAAY,CAAA;AAAA,cAAA,EACR,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA,cAAA,EACnB,KAAA,CAAM,OAAO,YAAY,CAAA;AAAA,cAAA,EACzB,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA,cAAA,EACnB,KAAA,CAAM,OAAO,YAAY,CAAA;AAAA,aAAA,CAAA;AAAA,cAE7B,OAAA,EAAS,UAAU,MAAA,GAAY,GAAA;AAAA,cAC/B,SAAA,EAAW,UAAU,+BAAA,GAAkC;AAAA;AACzD;AAAA;AACF;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,IAAI,SAAS,SAAA,EAAW;AAEtB,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG;AAAA,MACf,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG;AAAA,MACf,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG;AAAA,MACf,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG;AAAA,MACf,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAG;AAAA,MAChB,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAG;AAAA,MAChB,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAG;AAAA,MAChB,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,EAAA;AAAG,KAClB;AAEA,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,gBAAgB,IAAA,EAAK,cAAA,EAAe,aAAA,EAAY,MAAA,EAChF,QAAA,kBAAAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAO,KAAA;AAAA,QACP,OAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAoB,MAAA;AAAA,QAEnB,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,sBAClBA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAI,KAAA,CAAM,CAAA;AAAA,YACV,IAAI,KAAA,CAAM,CAAA;AAAA,YACV,CAAA,EAAE,GAAA;AAAA,YACF,IAAA,EAAM,MAAM,MAAA,CAAO,MAAA;AAAA,YACnB,OAAA,EAAS,GAAA,GAAO,CAAA,GAAI,CAAA,GAAK;AAAA,WAAA;AAAA,UALpB;AAAA,SAOR;AAAA;AAAA,KACH,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAsB,KAAA,EAAO,cAAA,EAAgB,MAAK,cAAA,EAAe,aAAA,EAAY,MAAA,EAChF,QAAA,kBAAAA,IAAC,QAAA,EAAA,EAAS,KAAA,EAAM,QAAO,MAAA,EAAO,MAAA,EAAO,SAAkB,CAAA,EACzD,CAAA;AAEJ;AC/KO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA,GAAO,CAAA;AAAA,EACP,OAAA,GAAU,CAAA;AAAA,EACV,UAAA,GAAa,IAAA;AAAA,EACb,SAAA,GAAY,EAAA;AAAA,EACZ,OAAA,GAAU,IAAA;AAAA,EACV;AACF,CAAA,EAA2C;AACzC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAE3B,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,IACxC,YAAA,EAAc,KAAA;AAAA,IACd,QAAA,EAAU,QAAA;AAAA,IACV,eAAA,EAAiB,MAAM,MAAA,CAAO;AAAA,GAChC;AAEA,EAAA,MAAM,QAAA,GAAgC;AAAA,IACpC,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,MAAA,EAAQ,SAAA;AAAA,IACR,OAAA,EAAS,QAAA;AAAA,IACT,GAAA,EAAK,MAAA;AAAA,IACL,YAAA,EAAc,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAAA,GAChD;AAEA,EAAA,MAAM,WAAA,GAAmC;AAAA,IACvC,GAAG,QAAA;AAAA,IACH,eAAA,EAAiB,MAAM,MAAA,CAAO;AAAA,GAChC;AAEA,EAAA,MAAM,SAAA,GAAiC;AAAA,IACrC,IAAA,EAAM,CAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAGA,EAAA,MAAM,eAAe,CAAC,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA,EAAO,OAAO,KAAK,CAAA;AAE9D,EAAA,uBACEC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,cAAA,EAAgB,IAAA,EAAK,cAAA,EAAe,aAAA,EAAY,MAAA,EAC/E,QAAA,EAAA;AAAA,IAAA,UAAA,oBACCD,GAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,WAAA,EACT,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,SAAQ,EAAG,CAAC,GAAG,QAAA,qBACnCA,IAAC,KAAA,EAAA,EAA+B,KAAA,EAAO,WACrC,QAAA,kBAAAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,YAAA,CAAa,QAAA,GAAW,YAAA,CAAa,MAAM,CAAA;AAAA,QAClD,MAAA,EAAQ,EAAA;AAAA,QACR;AAAA;AAAA,KACF,EAAA,EALQ,CAAA,OAAA,EAAU,QAAQ,CAAA,CAM5B,CACD,CAAA,EACH,CAAA;AAAA,IAED,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,MAAK,EAAG,CAAC,CAAA,EAAG,QAAA,qBAChCA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,KAAA,EAAO;AAAA,UACL,GAAG,QAAA;AAAA,UACH,YAAA,EAAc,QAAA,KAAa,IAAA,GAAO,CAAA,GAAI,SAAS,QAAA,CAAS;AAAA,SAC1D;AAAA,QAEC,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,SAAQ,EAAG,CAACqB,EAAAA,EAAG,QAAA,qBACnCrB,GAAAA,CAAC,KAAA,EAAA,EAAyC,KAAA,EAAO,WAC/C,QAAA,kBAAAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,YAAA,CAAA,CAAc,QAAA,GAAW,QAAA,IAAY,aAAa,MAAM,CAAA;AAAA,YAC/D,MAAA,EAAQ,EAAA;AAAA,YACR;AAAA;AAAA,aAJM,CAAA,KAAA,EAAQ,QAAQ,CAAA,CAAA,EAAI,QAAQ,EAMtC,CACD;AAAA,OAAA;AAAA,MAdI,OAAO,QAAQ,CAAA;AAAA,KAgBvB;AAAA,GAAA,EACH,CAAA;AAEJ;AC/EO,SAAS,kBAAA,CAAmB;AAAA,EACjC,aAAA,GAAgB,KAAA;AAAA,EAChB,SAAA,GAAY,IAAA;AAAA,EACZ,OAAA,GAAU,IAAA;AAAA,EACV;AACF,CAAA,EAAgD;AAC9C,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAE3B,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,OAAA,EAAS,MAAA;AAAA,IACT,YAAA,EAAc,KAAA;AAAA,IACd,eAAA,EAAiB,MAAM,MAAA,CAAO,OAAA;AAAA,IAC9B,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,IACxC,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,WAAA,GAAmC;AAAA,IACvC,YAAA,EAAc;AAAA,GAChB;AAEA,EAAA,MAAM,mBAAA,GAA2C;AAAA,IAC/C,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,MAAA;AAAA,IACL,YAAA,EAAc,gBAAgB,MAAA,GAAS;AAAA,GACzC;AAEA,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK;AAAA,GACP;AAEA,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,UAAA;AAAA,IACZ,GAAA,EAAK;AAAA,GACP;AAEA,EAAA,uBACEC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,cAAA,EAAgB,IAAA,EAAK,cAAA,EAAe,aAAA,EAAY,MAAA,EAEhF,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,WAAA,EACV,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,EAAA,EAAI,OAAA,EAAkB,CAAA,EACtD,CAAA;AAAA,oBAGAC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,mBAAA,EAEV,QAAA,EAAA;AAAA,sBAAAD,IAAC,QAAA,EAAA,EAAS,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,IAAI,OAAA,EAAkB,CAAA;AAAA,MAGlD,SAAA,oBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,UAAA,EACV,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,YAAS,KAAA,EAAO,EAAA,EAAI,QAAQ,EAAA,EAAI,YAAA,EAAa,OAAM,OAAA,EAAkB,CAAA;AAAA,wBACtEA,GAAAA,CAAC,QAAA,EAAA,EAAS,OAAO,EAAA,EAAI,MAAA,EAAQ,IAAI,OAAA,EAAkB;AAAA,OAAA,EACrD;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAGAA,GAAAA,CAAC,YAAA,EAAA,EAAa,OAAO,CAAA,EAAG,UAAA,EAAY,IAAI,OAAA,EAAkB,CAAA;AAAA,IAGzD,aAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,cAAA,EACT,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,EAAG,EAAG,CAAC,GAAG,CAAA,KAAM;AACpC,MAAA,MAAM,OAAA,GAAU,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAC/D,MAAA,uBACEA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAO,CAAA;AAAA,UACP,QAAQ,CAAA,EAAG,OAAA,CAAQ,CAAA,GAAI,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA,CAAA;AAAA,UACtC,YAAA,EAAa,KAAA;AAAA,UACb;AAAA,SAAA;AAAA,QAJK;AAAA,OAKP;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACpFO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA,GAAQ,sBAAA;AAAA,EACR,WAAA,GAAc;AAChB,CAAA,EAA2C;AACzC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAC3B,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIO,SAAS,WAAW,CAAA;AAEhE,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,OAAA,EAAS,MAAA;AAAA,IACT,SAAA,EAAW,OAAA;AAAA,IACX,eAAA,EAAiB,MAAM,MAAA,CAAO,OAAA;AAAA,IAC9B,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,IACxC,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,MAAM,SAAA,GAAiC;AAAA,IACrC,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,MAAA;AAAA,IACd,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,GACtB;AAEA,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,MAAA,EAAQ,WAAA;AAAA,IACR,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,UAAA,EAAY,GAAA;AAAA,IACZ,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,GACtB;AAEA,EAAA,MAAM,YAAA,GAAoC;AAAA,IACxC,MAAA,EAAQ,YAAA;AAAA,IACR,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,KAAA,EAAO,MAAM,MAAA,CAAO,SAAA;AAAA,IACpB,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,WAAA,GAAmC;AAAA,IACvC,OAAA,EAAS,UAAA;AAAA,IACT,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,UAAA,EAAY,GAAA;AAAA,IACZ,KAAA,EAAO,MAAM,MAAA,CAAO,WAAA;AAAA,IACpB,eAAA,EAAiB,MAAM,MAAA,CAAO,OAAA;AAAA,IAC9B,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,MAAM,kBAAA,GAA0C;AAAA,IAC9C,GAAG,WAAA;AAAA,IACH,eAAA,EAAiB,aAAA;AAAA,IACjB,KAAA,EAAO,MAAM,MAAA,CAAO,SAAA;AAAA,IACpB,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,MAAM,YAAA,GAAoC;AAAA,IACxC,SAAA,EAAW,MAAA;AAAA,IACX,OAAA,EAAS,MAAA;AAAA,IACT,eAAA,EAAiB,MAAM,MAAA,CAAO,UAAA;AAAA,IAC9B,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,IACxC,SAAA,EAAW,MAAA;AAAA,IACX,QAAA,EAAU,MAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,SAAA,GAAiC;AAAA,IACrC,MAAA,EAAQ,CAAA;AAAA,IACR,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,UAAA,EAAY,MAAM,KAAA,CAAM,IAAA;AAAA,IACxB,KAAA,EAAO,MAAM,MAAA,CAAO,KAAA;AAAA,IACpB,UAAA,EAAY,UAAA;AAAA,IACZ,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,uBACEN,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EAAgB,MAAK,OAAA,EAE/B,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAO,cAAA;AAAA,QACP,WAAA,EAAY,GAAA;AAAA,QACZ,aAAA,EAAc,OAAA;AAAA,QACd,cAAA,EAAe,OAAA;AAAA,QAEf,QAAA,EAAA;AAAA,0BAAAD,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,0BAC/BA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,0BACrCA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,IAAA,EAAK;AAAA;AAAA;AAAA,KAC3C;AAAA,oBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,YAAa,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAC9BA,GAAAA,CAAC,GAAA,EAAA,EAAE,OAAO,YAAA,EAAe,QAAA,EAAA,KAAA,CAAM,WAAW,+BAAA,EAAgC,CAAA;AAAA,oBAE1EC,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,WAAA;AAAA,UACP,OAAA,EAAS,UAAA;AAAA,UACT,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,YAAC,CAAA,CAAE,MAAA,CAA6B,KAAA,CAAM,eAAA,GAAkB,MAAM,MAAA,CAAO,YAAA;AAAA,UACvE,CAAA;AAAA,UACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,YAAC,CAAA,CAAE,MAAA,CAA6B,KAAA,CAAM,eAAA,GAAkB,MAAM,MAAA,CAAO,OAAA;AAAA,UACvE,CAAA;AAAA,UACD,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,kBAAA;AAAA,UACP,OAAA,EAAS,MAAM,iBAAA,CAAkB,CAAC,cAAc,CAAA;AAAA,UAE/C,2BAAiB,cAAA,GAAiB;AAAA;AAAA;AACrC,KAAA,EACF,CAAA;AAAA,IAEC,cAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,YAAA,EACV,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,WACT,QAAA,EAAA,KAAA,CAAM,KAAA,IAAS,GAAG,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,OAAO,IACjD,CAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACjHO,IAAM,aAAA,GAAN,cAA4B,SAAA,CAAkD;AAAA,EACnF,YAAY,KAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA;AA8Bb,IAAA,IAAA,CAAA,UAAA,GAAa,MAAY;AACvB,MAAA,IAAA,CAAK,SAAS,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAAA,IAChD,CAAA;AA/BE,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,QAAA,EAAU,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,EAC9C;AAAA,EAEA,OAAO,yBAAyB,KAAA,EAAkC;AAChE,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM;AAAA,EACjC;AAAA,EAEA,iBAAA,CAAkB,OAAc,SAAA,EAA4B;AAC1D,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,KAAA;AACzB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,mBAAmB,SAAA,EAAqC;AACtD,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,IAAA,CAAK,KAAA;AAC3B,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,IAAA,CAAK,KAAA;AAG1B,IAAA,IAAI,QAAA,IAAY,SAAA,IAAa,SAAA,CAAU,SAAA,EAAW;AAChD,MAAA,MAAM,qBAAqB,SAAA,CAAU,IAAA;AAAA,QACnC,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,KAAQ,SAAA,CAAU,YAAY,KAAK;AAAA,OACrD;AACA,MAAA,IAAI,kBAAA,EAAoB;AACtB,QAAA,IAAA,CAAK,UAAA,EAAW;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA,EAMA,MAAA,GAAoB;AAClB,IAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,IAAA,CAAK,KAAA;AACpC,IAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAI,IAAA,CAAK,KAAA;AAEjC,IAAA,IAAI,YAAY,KAAA,EAAO;AAErB,MAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,QAAA,OAAO,QAAA,CAAS,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA;AAAA,MACxC;AAGA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAO,QAAA;AAAA,MACT;AAGA,MAAA,uBAAOA,GAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAc,UAAA,EAAY,KAAK,UAAA,EAAY,CAAA;AAAA,IACnE;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AClFA,SAAS,mBAAA,CAAoB;AAAA,EAC3B,WAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIuB;AACrB,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAE3B,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,MAAA,EAAQ,MAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,OAAA,EAAS,MAAA;AAAA,IACT,eAAA,EAAiB,MAAM,MAAA,CAAO,OAAA;AAAA,IAC9B,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,IACxC,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,MAAM,SAAA,GAAiC;AAAA,IACrC,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,KAAA;AAAA,IACd,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,GACtB;AAEA,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,MAAA,EAAQ,WAAA;AAAA,IACR,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,UAAA,EAAY,GAAA;AAAA,IACZ,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,GACtB;AAEA,EAAA,MAAM,YAAA,GAAoC;AAAA,IACxC,MAAA,EAAQ,YAAA;AAAA,IACR,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,KAAA,EAAO,MAAM,MAAA,CAAO,SAAA;AAAA,IACpB,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,WAAA,GAAmC;AAAA,IACvC,OAAA,EAAS,UAAA;AAAA,IACT,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,UAAA,EAAY,GAAA;AAAA,IACZ,KAAA,EAAO,MAAM,MAAA,CAAO,WAAA;AAAA,IACpB,eAAA,EAAiB,MAAM,MAAA,CAAO,OAAA;AAAA,IAC9B,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EAAgB,MAAK,OAAA,EAE/B,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAO,cAAA;AAAA,QACP,WAAA,EAAY,GAAA;AAAA,QACZ,aAAA,EAAc,OAAA;AAAA,QACd,cAAA,EAAe,OAAA;AAAA,QAEf,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0FAAA,EAA2F,CAAA;AAAA,0BACnGA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,0BACrCA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,IAAA,EAAK;AAAA;AAAA;AAAA,KAC3C;AAAA,oBAEAA,IAAC,IAAA,EAAA,EAAG,KAAA,EAAO,YACR,QAAA,EAAA,WAAA,GAAc,CAAA,EAAG,WAAW,CAAA,eAAA,CAAA,GAAoB,uBAAA,EACnD,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,OAAO,YAAA,EAAe,QAAA,EAAA,KAAA,CAAM,WAAW,mBAAA,EAAoB,CAAA;AAAA,oBAE9DA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,WAAA;AAAA,QACP,OAAA,EAAS,OAAA;AAAA,QACT,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,UAAC,CAAA,CAAE,MAAA,CAA6B,KAAA,CAAM,eAAA,GAAkB,MAAM,MAAA,CAAO,YAAA;AAAA,QACvE,CAAA;AAAA,QACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,UAAC,CAAA,CAAE,MAAA,CAA6B,KAAA,CAAM,eAAA,GAAkB,MAAM,MAAA,CAAO,OAAA;AAAA,QACvE,CAAA;AAAA,QACD,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EACF,CAAA;AAEJ;AAcO,IAAM,mBAAA,GAAN,cAAkCsB,SAAAA,CAGvC;AAAA,EACA,YAAY,KAAA,EAAiC;AAC3C,IAAA,KAAA,CAAM,KAAK,CAAA;AAmBb,IAAA,IAAA,CAAA,UAAA,GAAa,MAAY;AACvB,MAAA,IAAA,CAAK,SAAS,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAAA,IAChD,CAAA;AApBE,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,QAAA,EAAU,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,EAC9C;AAAA,EAEA,OAAO,yBAAyB,KAAA,EAAwC;AACtE,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM;AAAA,EACjC;AAAA,EAEA,iBAAA,CAAkB,OAAc,SAAA,EAA4B;AAC1D,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,KAAA;AACzB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAEA,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,aAAA,EAAe;AAC1C,MAAA,OAAA,CAAQ,KAAA,CAAM,sCAAA,EAAwC,KAAA,EAAO,SAAS,CAAA;AAAA,IACxE;AAAA,EACF;AAAA,EAMA,MAAA,GAAoB;AAClB,IAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA;AACvC,IAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAI,IAAA,CAAK,KAAA;AAEjC,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,uBACEtB,GAAAA;AAAA,QAAC,mBAAA;AAAA,QAAA;AAAA,UACC,WAAA;AAAA,UACA,KAAA;AAAA,UACA,SAAS,IAAA,CAAK;AAAA;AAAA,OAChB;AAAA,IAEJ;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AC5IO,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAwC;AACtC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAE3B,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,OAAA,EAAS,WAAA;AAAA,IACT,SAAA,EAAW,QAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,MAAM,kBAAA,GAA0C;AAAA,IAC9C,YAAA,EAAc,MAAA;AAAA,IACd,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,GACtB;AAEA,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,MAAA,EAAQ,WAAA;AAAA,IACR,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,UAAA,EAAY,GAAA;AAAA,IACZ,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,GACtB;AAEA,EAAA,MAAM,gBAAA,GAAwC;AAAA,IAC5C,MAAA,EAAQ,YAAA;AAAA,IACR,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,KAAA,EAAO,MAAM,MAAA,CAAO,SAAA;AAAA,IACpB,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,WAAA,GAAmC;AAAA,IACvC,OAAA,EAAS,UAAA;AAAA,IACT,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,UAAA,EAAY,GAAA;AAAA,IACZ,KAAA,EAAO,MAAM,MAAA,CAAO,WAAA;AAAA,IACpB,eAAA,EAAiB,MAAM,MAAA,CAAO,OAAA;AAAA,IAC9B,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ;AAAA,GACV;AAGA,EAAA,MAAM,8BACJC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MAEf,QAAA,EAAA;AAAA,wBAAAD,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,wBAC/BA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,SAAA,EAAU,CAAA;AAAA,wBAClBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,wBACnBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,WAAA,EAAY;AAAA;AAAA;AAAA,GACtB;AAGF,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,cAAA,EAChC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,kBAAA,EACT,kBAAQ,WAAA,EACX,CAAA;AAAA,oBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,YAAa,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAE7B,+BACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,kBAAmB,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,IAG1C,0BACCA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,WAAA;AAAA,QACP,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,UAAC,CAAA,CAAE,MAAA,CAA6B,KAAA,CAAM,eAAA,GAAkB,MAAM,MAAA,CAAO,YAAA;AAAA,QACvE,CAAA;AAAA,QACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,UAAC,CAAA,CAAE,MAAA,CAA6B,KAAA,CAAM,eAAA,GAAkB,MAAM,MAAA,CAAO,OAAA;AAAA,QACvE,CAAA;AAAA,QAEC,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA;AACV,GAAA,EAEJ,CAAA;AAEJ;AC1GO,SAAS,MAAA,CAAO;AAAA,EACrB,OAAA,GAAU,mBAAA;AAAA,EACV,SAAA;AAAA,EACA;AACF,CAAA,EAAoC;AAClC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAE3B,EAAA,MAAM,uBACJC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAQ,MAAM,MAAA,CAAO,SAAA;AAAA,MACrB,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MAGf,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,aAAQ,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBACtCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mCAAA,EAAoC,CAAA;AAAA,wBAC5CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qCAAA,EAAsC,CAAA;AAAA,wBAE9CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,SAAQ,KAAA,EAAM,CAAA;AAAA,wBACjCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,SAAQ,KAAA,EAAM;AAAA;AAAA;AAAA,GACnC;AAGF,EAAA,uBACEA,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA,EAAO,OAAA;AAAA,MACP,WAAA,EAAY,+GAAA;AAAA,MACZ,QAAQ,SAAA,GAAY,EAAE,OAAO,SAAA,EAAW,OAAA,EAAS,WAAU,GAAI;AAAA;AAAA,GACjE;AAEJ;ACrCO,SAAS,SAAA,CAAU;AAAA,EACxB,WAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAAuC;AACrC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAE3B,EAAA,MAAM,uBACJC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAQ,MAAM,MAAA,CAAO,SAAA;AAAA,MACrB,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MAGf,QAAA,EAAA;AAAA,wBAAAD,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,wBAC9BA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mBAAA,EAAoB,CAAA;AAAA,wBAE5BA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,SAAQ,KAAA,EAAM,CAAA;AAAA,wBACjCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa,SAAQ,KAAA,EAAM;AAAA;AAAA;AAAA,GACrC;AAGF,EAAA,MAAM,KAAA,GAAQ,WAAA,GACV,CAAA,gBAAA,EAAmB,WAAW,CAAA,CAAA,CAAA,GAC9B,qBAAA;AAEJ,EAAA,MAAM,WAAA,GAAc,cAChB,yDAAA,GACA,iDAAA;AAEJ,EAAA,uBACEA,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAQ,cAAA,GAAiB,EAAE,OAAO,eAAA,EAAiB,OAAA,EAAS,gBAAe,GAAI;AAAA;AAAA,GACjF;AAEJ;AC9CO,SAAS,cAAA,CAAe;AAAA,EAC7B,WAAA;AAAA,EACA;AACF,CAAA,EAA4C;AAC1C,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAE3B,EAAA,MAAM,uBACJC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAQ,MAAM,MAAA,CAAO,SAAA;AAAA,MACrB,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MAGf,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAC9CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAEhDA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAG,IAAA,EAAK,EAAA,EAAG,MAAK,CAAA,EAAE,GAAA,EAAI,IAAA,EAAM,KAAA,CAAM,OAAO,OAAA,EAAS,MAAA,EAAQ,MAAM,MAAA,CAAO,OAAA,EAAS,aAAY,KAAA,EAAM,CAAA;AAAA,wBAC1GA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,QAAQ,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,WAAA,EAAY,KAAA,EAAM,CAAA;AAAA,wBACnEA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,QAAQ,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,WAAA,EAAY,KAAA,EAAM;AAAA;AAAA;AAAA,GACrE;AAGF,EAAA,uBACEA,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA,EAAM,yBAAA;AAAA,MACN,WAAA,EAAY,yFAAA;AAAA,MACZ,QAAQ,WAAA,GAAc,EAAE,OAAO,YAAA,EAAc,OAAA,EAAS,aAAY,GAAI;AAAA;AAAA,GACxE;AAEJ;;;ACYO,IAAM,YAAA,GAAN,MAAM,aAAA,SAAqB,KAAA,CAAM;AAAA,EACtC,WAAA,CACE,SACgB,UAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAFG,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAEZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,aAAA,CAAa,SAAS,CAAA;AAAA,EACpD;AACF;AAoBO,IAAM,gBAAN,MAAoB;AAAA,EAQzB,YAAY,MAAA,EAAsB;AAEhC,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,OAAO,EAAE,CAAA;AACjD,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,UAAA;AACzB,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,aAAA;AAC5B,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAA,CACZ,IAAA,EACA,OAAA,GAAuB,EAAC,EACZ;AACZ,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,GAAG,IAAI,CAAA,CAAA;AAEnC,IAAA,MAAM,OAAA,GAAuB;AAAA,MAC3B,cAAA,EAAgB,kBAAA;AAAA,MAChB,eAAe,IAAA,CAAK,QAAA;AAAA,MACpB,GAAG,OAAA,CAAQ;AAAA,KACb;AAGA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAC,OAAA,CAAmC,WAAW,CAAA,GAAI,IAAA,CAAK,MAAA;AAAA,IAC1D;AAGA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAC,OAAA,CAAmC,eAAe,CAAA,GAAI,IAAA,CAAK,UAAA;AAAA,IAC9D;AAGA,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA,EAAG;AAC7D,QAAC,OAAA,CAAmC,GAAG,CAAA,GAAI,KAAA;AAAA,MAC7C;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,EAAS;AAClC,MAAC,OAAA,CAAmC,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,IACxE;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,GAAG,OAAA;AAAA,MACH;AAAA,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,IAAI,eAAe,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA;AAEhF,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAa,MAAM,QAAA,CAAS,IAAA,EAAK;AACvC,QAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,UAAA,IAAI,OAAO,SAAA,CAAU,MAAA,KAAW,QAAA,EAAU;AACxC,YAAA,YAAA,GAAe,SAAA,CAAU,MAAA;AAAA,UAC3B,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,MAAM,CAAA,EAAG;AAE1C,YAAA,YAAA,GAAe,UAAU,MAAA,CACtB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA,GAAM,KAAK,CAAA,CAAE,GAAA,CAAI,KAAK,GAAG,CAAC,MAAM,EAAA,CAAG,CAAA,CACzD,KAAK,IAAI,CAAA;AAAA,UACd;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,MAAM,IAAI,YAAA,CAAa,YAAA,EAAc,QAAA,CAAS,MAAM,CAAA;AAAA,IACtD;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,IAAO,IAAA,EAA0B;AACrC,IAAA,OAAO,IAAA,CAAK,QAAW,IAAI,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,IAAA,CAAQ,IAAA,EAAc,IAAA,EAA4B;AACtD,IAAA,OAAO,IAAA,CAAK,QAAW,IAAA,EAAM;AAAA,MAC3B,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,KAAS,MAAA,GAAY,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI;AAAA,KACnD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,GAAA,CAAO,IAAA,EAAc,IAAA,EAA4B;AACrD,IAAA,OAAO,IAAA,CAAK,QAAW,IAAA,EAAM;AAAA,MAC3B,MAAA,EAAQ,KAAA;AAAA,MACR,MAAM,IAAA,KAAS,MAAA,GAAY,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI;AAAA,KACnD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,KAAA,CAAS,IAAA,EAAc,IAAA,EAA4B;AACvD,IAAA,OAAO,IAAA,CAAK,QAAW,IAAA,EAAM;AAAA,MAC3B,MAAA,EAAQ,OAAA;AAAA,MACR,MAAM,IAAA,KAAS,MAAA,GAAY,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI;AAAA,KACnD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAU,IAAA,EAA0B;AACxC,IAAA,OAAO,KAAK,OAAA,CAAW,IAAA,EAAM,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,SAAA,GAAqC;AACzC,IAAA,OAAO,IAAA,CAAK,QAAwB,SAAS,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAA,GAA+B;AACnC,IAAA,OAAO,IAAA,CAAK,QAAkB,SAAS,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAS,SAAA,EAAyC;AACtD,IAAA,OAAO,KAAK,OAAA,CAAqB,CAAA,QAAA,EAAW,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,eAAA,CACJ,SAAA,EACA,UAAA,EACA,QAAgB,CAAA,EACI;AACpB,IAAA,MAAM,IAAA,GAAO,CAAA,QAAA,EAAW,kBAAA,CAAmB,SAAS,CAAC,YAAY,kBAAA,CAAmB,UAAU,CAAC,CAAA,cAAA,EAAiB,KAAK,CAAA,CAAA;AACrH,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAA+B,IAAI,CAAA;AAC7D,IAAA,OAAO,MAAA,CAAO,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,cAAc,KAAA,EAAmD;AACrE,IAAA,OAAO,IAAA,CAAK,QAA0B,iBAAA,EAAmB;AAAA,MACvD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAY,KAAA,EAAyC;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAyB,YAAA,EAAc;AAAA,MAC/D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KAC3B,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,GAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CACJ,KAAA,EACA,WAAA,GAAuB,KAAA,EACD;AACtB,IAAA,OAAO,IAAA,CAAK,QAAqB,gBAAA,EAAkB;AAAA,MACjD,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,YAAA,EAAc,aAAa;AAAA,KAC1D,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CACJ,KAAA,EACA,KAAA,GAAgB,GAAA,EACM;AACtB,IAAA,MAAM,GAAA,GAAM,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAC7D,IAAA,OAAO,IAAA,CAAK,QAAqB,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,YAAY,GAAA,EAA2C;AAC3D,IAAA,OAAO,IAAA,CAAK,QAA6B,qBAAA,EAAuB;AAAA,MAC9D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAK;AAAA,KAC7B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,UAAA,CACJ,GAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,IAAA,GAA0B,EAAE,GAAA,EAAI;AACtC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,IAChB;AACA,IAAA,OAAO,IAAA,CAAK,QAAqB,oBAAA,EAAsB;AAAA,MACrD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,cAAA,GAAuC;AAC3C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAqC,aAAa,CAAA;AAC9E,IAAA,OAAO,QAAA,CAAS,UAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,aAAa,EAAA,EAAgC;AACjD,IAAA,OAAO,KAAK,OAAA,CAAmB,CAAA,YAAA,EAAe,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gBAAgB,IAAA,EAA2C;AAC/D,IAAA,OAAO,IAAA,CAAK,QAAmB,aAAA,EAAe;AAAA,MAC5C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAA,CAAgB,EAAA,EAAY,IAAA,EAA2C;AAC3E,IAAA,OAAO,KAAK,OAAA,CAAmB,CAAA,YAAA,EAAe,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MACtE,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,EAAA,EAA2B;AAC/C,IAAA,MAAM,KAAK,OAAA,CAAc,CAAA,YAAA,EAAe,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MAChE,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,SAAA,CAAU,WAAA,EAAqB,IAAA,EAAqC;AACxE,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,CAAA,YAAA,EAAe,kBAAA,CAAmB,WAAW,CAAC,CAAA,QAAA,CAAA;AAAA,MAC9C;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA;AAC3B,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,YAAA,CACJ,WAAA,EACA,QAAA,EACA,IAAA,EACiB;AACjB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,eAAe,kBAAA,CAAmB,WAAW,CAAC,CAAA,SAAA,EAAY,kBAAA,CAAmB,QAAQ,CAAC,CAAA,CAAA;AAAA,MACtF;AAAA,QACE,MAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA;AAC3B,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAA,CAAa,WAAA,EAAqB,QAAA,EAAiC;AACvE,IAAA,MAAM,IAAA,CAAK,OAAA;AAAA,MACT,eAAe,kBAAA,CAAmB,WAAW,CAAC,CAAA,SAAA,EAAY,kBAAA,CAAmB,QAAQ,CAAC,CAAA,CAAA;AAAA,MACtF;AAAA,QACE,MAAA,EAAQ;AAAA;AACV,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CACJ,WAAA,EACA,SAAA,EACoB;AACpB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,CAAA,YAAA,EAAe,kBAAA,CAAmB,WAAW,CAAC,CAAA,OAAA,CAAA;AAAA,MAC9C;AAAA,QACE,MAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,SAAS;AAAA;AAChC,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,gBAAA,GAA0C;AAC9C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA;AAAA,MAC1B;AAAA,KACF;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAc,EAAA,EAAiC;AACnD,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,CAAA,eAAA,EAAkB,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAiB,IAAA,EAA6C;AAClE,IAAA,OAAO,IAAA,CAAK,QAAoB,gBAAA,EAAkB;AAAA,MAChD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAA,CACJ,EAAA,EACA,IAAA,EACqB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,CAAA,eAAA,EAAkB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA;AAAA,MACxC;AAAA,QACE,MAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA;AAC3B,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAiB,EAAA,EAA2B;AAChD,IAAA,MAAM,IAAA,CAAK,OAAA;AAAA,MACT,CAAA,eAAA,EAAkB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA;AAAA,MACxC;AAAA,QACE,MAAA,EAAQ;AAAA;AACV,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,YAAA,CACJ,WAAA,EACA,OAAA,EACA,QAAA,EAC0B;AAC1B,IAAA,OAAO,IAAA,CAAK,QAAyB,OAAA,EAAS;AAAA,MAC5C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,YAAA,EAAc,WAAA;AAAA,QACd,OAAA;AAAA,QACA;AAAA,OACD;AAAA,KACF,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAA,CAAe,WAAA,EAAqB,OAAA,EAAgC;AACxE,IAAA,MAAM,IAAA,CAAK,QAAc,OAAA,EAAS;AAAA,MAChC,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,YAAA,EAAc,WAAA;AAAA,QACd;AAAA,OACD;AAAA,KACF,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,oBAAoB,OAAA,EAAoD;AAC5E,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,CAAA,cAAA,EAAiB,kBAAA,CAAmB,OAAO,CAAC,CAAA;AAAA,KAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,wBAAwB,WAAA,EAAwC;AACpE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA;AAAA,MAC1B,CAAA,YAAA,EAAe,kBAAA,CAAmB,WAAW,CAAC,CAAA,KAAA;AAAA,KAChD;AACA,IAAA,OAAO,QAAA,CAAS,QAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAA,CAAY,OAAA,EAAiB,YAAA,EAAuC;AACxE,IAAA,MAAM,IAAA,CAAK,QAAc,aAAA,EAAe;AAAA,MACtC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,OAAA;AAAA,QACA,aAAA,EAAe;AAAA,OAChB;AAAA,KACF,CAAA;AAAA,EACH;AACF;ACpnBA,IAAM,gBAAA,GAAmBuB,cAA4C,IAAI,CAAA;AAWzE,IAAM,gBAAA,GAAmBA,aAAAA,CAAkC,EAAE,CAAA;AAMtD,SAAS,qBAAA,GAA4C;AAC1D,EAAA,OAAOC,WAAW,gBAAgB,CAAA;AACpC;AA2BA,IAAI,qBAAA,GAAwB,CAAA;AAErB,SAAS,iBAAA,CAAkB;AAAA,EAChC,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAwC;AAEtC,EAAA,MAAM,aAAA,GAAgBhB,OAAsB,IAAI,CAAA;AAChD,EAAA,IAAI,CAAC,cAAc,OAAA,EAAS;AAC1B,IAAA,qBAAA,EAAA;AACA,IAAA,aAAA,CAAc,OAAA,GAAU,YAAY,qBAAqB,CAAA,CAAA;AACzD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,EAAyC,aAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,EAC9E;AAIA,EAAA,MAAM,SAAA,GAAYA,OAA6B,IAAI,CAAA;AACnD,EAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAsB,aAAA,CAAc,OAAO,CAAA,wBAAA,CAA0B,CAAA;AACjF,IAAA,SAAA,CAAU,OAAA,GAAU,IAAI,aAAA,CAAc;AAAA,MACpC,GAAG,MAAA;AAAA,MACH,QAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AACA,EAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AAGzB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,SAAgC,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AAGrD,EAAA,MAAM,mBAAA,GAAsBC,OAAO,KAAK,CAAA;AAGxC,EAAAE,UAAU,MAAM;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAsB,aAAA,CAAc,OAAO,CAAA,SAAA,CAAW,CAAA;AAClE,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAsB,aAAA,CAAc,OAAO,CAAA,WAAA,CAAa,CAAA;AAAA,IACtE,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,eAAA,GAAkBF,OAAO,YAAY,CAAA;AAC3C,EAAA,MAAM,gBAAA,GAAmBA,OAAO,aAAa,CAAA;AAC7C,EAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAC1B,EAAA,gBAAA,CAAiB,OAAA,GAAU,aAAA;AAG3B,EAAA,MAAM,WAAA,GAAcC,YAAY,YAAY;AAC1C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO,SAAA,EAAU;AAC7C,MAAA,SAAA,CAAU,aAAa,CAAA;AACvB,MAAA,eAAA,CAAgB,UAAU,aAAa,CAAA;AAAA,IACzC,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,WAAA,GAAc,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AACtE,MAAA,QAAA,CAAS,WAAW,CAAA;AACpB,MAAA,gBAAA,CAAiB,UAAU,WAAW,CAAA;AAAA,IACxC,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,MAAM,aAAA,GAAgBA,YAAY,YAAY;AAC5C,IAAA,MAAM,WAAA,EAAY;AAAA,EACpB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,oBAAoB,OAAA,EAAS;AACjC,IAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAC9B,IAAA,KAAK,WAAA,EAAY;AAAA,EACnB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,OAAO;AAAA,MACL,MAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,QAAQ,MAAA,EAAQ,SAAA,EAAW,OAAO,aAAA,EAAe,QAAA,EAAU,QAAQ,UAAU;AAAA,GAChF;AAGA,EAAA,MAAM,SAAA,GAAY,OAAA;AAAA,IAChB,OAAO;AAAA,MACL,cAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,gBAAgB,YAAY;AAAA,GAC/B;AAEA,EAAA,uBACEV,GAAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,YAAA,EAChC,QAAA,kBAAAA,GAAAA,CAAC,iBAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,SAAA,EAC/B,UACH,CAAA,EACF,CAAA;AAEJ;AAyBO,SAAS,YAAA,GAAsC;AACpD,EAAA,MAAM,OAAA,GAAUwB,WAAW,gBAAgB,CAAA;AAE3C,EAAA,IAAI,YAAY,IAAA,EAAM;AACpB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AChOO,SAAS,SAAA,GAA6B;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,KAAU,YAAA,EAAa;AAGlD,EAAA,MAAM,MAAA,GAASC,QAAQ,MAAM,MAAA,EAAQ,UAAU,EAAC,EAAG,CAAC,MAAM,CAAC,CAAA;AAC3D,EAAA,MAAM,aAAA,GAAgBA,QAAQ,MAAM,MAAA,EAAQ,iBAAiB,EAAC,EAAG,CAAC,MAAM,CAAC,CAAA;AAGzE,EAAA,MAAM,QAAA,GAAWhB,WAAAA;AAAA,IACf,CAAC,IAAA,KAA0C;AACzC,MAAA,OAAO,OAAO,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,IAAI,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AC3BA,SAAS,WAAA,CACP,GACA,CAAA,EACS;AACT,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,EAAM,OAAO,KAAA;AACrC,EAAA,OAAO,KAAK,SAAA,CAAU,CAAC,CAAA,KAAM,IAAA,CAAK,UAAU,CAAC,CAAA;AAC/C;AAqDO,SAAS,QAAA,CACd,KAAA,EACA,OAAA,GAA2B,EAAC,EACZ;AAChB,EAAA,MAAM,EAAE,OAAA,GAAU,IAAA,EAAM,UAAU,KAAA,EAAO,YAAA,GAAe,KAAI,GAAI,OAAA;AAEhE,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAGhC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIF,SAA6B,IAAI,CAAA;AACzD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AAGrD,EAAA,MAAM,gBAAA,GAAmBC,OAA+B,IAAI,CAAA;AAC5D,EAAA,MAAM,kBAAA,GAAqBA,OAA+B,IAAI,CAAA;AAG9D,EAAA,MAAM,YAAA,GAAeC,YAAY,YAAY;AAE3C,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,CAAC,OAAA,EAAS;AAC9B,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AAAA,IACnC;AAGA,IAAA,kBAAA,CAAmB,OAAA,GAAU,IAAI,eAAA,EAAgB;AAEjD,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,OAAA,GACX,MAAM,MAAA,CAAO,YAAA,CAAa,KAAA,EAAO,YAAY,CAAA,GAC7C,MAAM,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA;AAGnC,MAAA,IAAI,kBAAA,CAAmB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS;AAC9C,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB,SAAS,GAAA,EAAK;AAEZ,MAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACrD,QAAA;AAAA,MACF;AAEA,MAAA,MAAMiB,MAAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,MAAA,QAAA,CAASA,MAAK,CAAA;AACd,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,OAAO,OAAA,EAAS,OAAA,EAAS,YAAY,CAAC,CAAA;AAGlD,EAAA,MAAM,eAAA,GAAkBlB,OAAO,YAAY,CAAA;AAC3C,EAAAE,UAAU,MAAM;AACd,IAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAAA,EAC5B,CAAC,CAAA;AAGD,EAAA,MAAM,OAAA,GAAUD,YAAY,YAAY;AACtC,IAAA,MAAM,gBAAgB,OAAA,EAAQ;AAAA,EAChC,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAC,UAAU,MAAM;AAEd,IAAA,IAAI,WAAA,CAAY,KAAA,EAAO,gBAAA,CAAiB,OAAO,CAAA,EAAG;AAChD,MAAA;AAAA,IACF;AAEA,IAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAG3B,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,KAAK,gBAAgB,OAAA,EAAQ;AAAA,EAC/B,CAAA,EAAG,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA;AAGnB,EAAAA,UAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,QAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AAAA,MACnC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;ACxMO,SAAS,YAAA,CACd,QACA,OAAA,EACiB;AACjB,EAAA,MAAM,EAAE,SAAS,QAAA,EAAU,WAAA,EAAa,SAAS,MAAA,EAAQ,aAAA,GAAgB,KAAA,EAAO,KAAA,EAAM,GAAI,OAAA;AAE1F,EAAA,OAAOe,QAAQ,MAAM;AAEnB,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,EAAG;AACvC,MAAA,OAAO;AAAA,QACL,YAAY,EAAC;AAAA,QACb,QAAQ,EAAC;AAAA,QACT,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW;AAAA,OACb;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAC7C,IAAA,IAAI,WAAW,EAAA,EAAI;AACjB,MAAA,OAAO;AAAA,QACL,YAAY,EAAC;AAAA,QACb,QAAQ,EAAC;AAAA,QACT,OAAA,EAAS,IAAA;AAAA,QACT,WAAW,MAAA,CAAO;AAAA,OACpB;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,SACd,GAAA,CAAI,CAAC,SAAS,EAAE,IAAA,EAAM,KAAK,KAAA,EAAO,MAAA,CAAO,QAAQ,OAAA,CAAQ,GAAG,GAAE,CAAE,CAAA,CAChE,OAAO,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,KAAU,EAAE,CAAA;AAErC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO;AAAA,QACL,YAAY,EAAC;AAAA,QACb,QAAQ,EAAC;AAAA,QACT,OAAA,EAAS,IAAA;AAAA,QACT,WAAW,MAAA,CAAO;AAAA,OACpB;AAAA,IACF;AAGA,IAAA,MAAM,aAAa,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA,GAAI,EAAA;AAEvE,IAAA,IAAI,eAAe,EAAA,EAAI;AAErB,MAAA,OAAO,mBAAmB,MAAA,EAAQ,MAAA,EAAQ,UAAU,UAAA,EAAY,MAAA,EAAQ,eAAe,KAAK,CAAA;AAAA,IAC9F;AAGA,IAAA,OAAO,oBAAoB,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,eAAe,KAAK,CAAA;AAAA,EACnF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,UAAU,WAAA,EAAa,MAAA,EAAQ,aAAA,EAAe,KAAK,CAAC,CAAA;AAC3E;AAKA,SAAS,oBACP,MAAA,EACA,MAAA,EACA,QAAA,EACA,MAAA,EACA,eACA,KAAA,EACiB;AAEjB,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAI,MAAM,CAAA;AACzB,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO;AACnC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA;AACxB,MAAA,OAAO,QAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,GAAY,IAAA,GAAO,OAAO,GAAG,CAAA;AAAA,IAC9D,CAAC,CAAA;AACD,IAAA,OAAO;AAAA,MACL,CAAA,EAAG,MAAA,KAAW,IAAA,GAAO,EAAA,GAAK,OAAO,MAAM,CAAA;AAAA,MACvC,CAAA,EAAG;AAAA,KACL;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,IAAI,YAAA,GAAe,UAAA;AACnB,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,YAAA,GAAe,CAAC,GAAG,UAAU,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAC5C,MAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,MAAA,IAAI,WAAW,GAAA,EAAK;AAClB,QAAA,UAAA,GAAa,CAAA,CAAE,CAAA,CAAE,aAAA,CAAc,CAAA,CAAE,CAAC,CAAA;AAAA,MACpC,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AAEzB,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA;AACvB,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA;AACvB,QAAA,UAAA,GAAa,IAAA,GAAO,IAAA;AAAA,MACtB;AAEA,MAAA,OAAO,aAAA,KAAkB,MAAA,GAAS,CAAC,UAAA,GAAa,UAAA;AAAA,IAClD,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,gBAAgB,KAAA,GAAQ,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,GAAI,YAAA;AAG7D,EAAA,MAAM,aAAa,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,CAAC,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAwB,QAAA,CAAS,GAAA,CAAI,CAAC,IAAI,WAAA,MAAiB;AAAA,IAC/D,MAAM,EAAA,CAAG,IAAA;AAAA,IACT,IAAA,EAAM,cAAc,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,CAAA,CAAE,WAAW,CAAA,IAAK,IAAI;AAAA,GACzD,CAAE,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,WAAW,MAAA,KAAW,CAAA;AAAA,IAC/B,WAAW,MAAA,CAAO;AAAA,GACpB;AACF;AAKA,SAAS,mBACP,MAAA,EACA,MAAA,EACA,UACA,UAAA,EACA,MAAA,EACA,eACA,KAAA,EACiB;AAEjB,EAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO;AAAA,MACL,YAAY,EAAC;AAAA,MACb,QAAQ,EAAC;AAAA,MACT,OAAA,EAAS,IAAA;AAAA,MACT,WAAW,MAAA,CAAO;AAAA,KACpB;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAwC;AAE7D,EAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC3B,IAAA,MAAM,MAAA,GAAS,IAAI,MAAM,CAAA;AACzB,IAAA,MAAM,UAAA,GAAa,IAAI,UAAU,CAAA;AACjC,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAE9B,IAAA,MAAM,QAAA,GAAW,MAAA,KAAW,IAAA,GAAO,EAAA,GAAK,OAAO,MAAM,CAAA;AACrD,IAAA,MAAM,KAAA,GAAQ,UAAA,KAAe,IAAA,GAAO,EAAA,GAAK,OAAO,UAAU,CAAA;AAC1D,IAAA,MAAM,QAAQ,MAAA,KAAW,IAAA,IAAQ,WAAW,MAAA,GAAY,IAAA,GAAO,OAAO,MAAM,CAAA;AAE5E,IAAA,WAAA,CAAY,IAAI,QAAQ,CAAA;AAExB,IAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,EAAG;AACxB,MAAA,QAAA,CAAS,GAAA,CAAI,KAAA,kBAAO,IAAI,GAAA,EAAK,CAAA;AAAA,IAC/B;AACA,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACpC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,GAAA,CAAI,UAAU,KAAK,CAAA;AAAA,IAC/B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,IAAI,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AACvC,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,UAAA,GAAa,UAAA,CAAW,IAAA;AAAA,MAAK,CAAC,CAAA,EAAG,CAAA,KAC/B,aAAA,KAAkB,MAAA,GAAS,CAAA,CAAE,aAAA,CAAc,CAAC,CAAA,GAAI,CAAA,CAAE,aAAA,CAAc,CAAC;AAAA,KACnE;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,EACxC;AAGA,EAAA,MAAM,aAAa,KAAA,CAAM,IAAA,CAAK,SAAS,IAAA,EAAM,EAAE,IAAA,EAAK;AACpD,EAAA,MAAM,MAAA,GAAwB,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,KAAc;AAC1D,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AACxC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,WAAW,GAAA,CAAI,CAAC,QAAQ,SAAA,EAAW,GAAA,CAAI,GAAG,CAAA,IAAK,IAAI;AAAA,KAC3D;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACvC,IAAA,MAAM,WAAA,GAAc,OAAO,CAAC,CAAA;AAC5B,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,UAAU,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAC,CAAA;AAC1C,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AACpC,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AACpC,QAAA,MAAM,aAAa,IAAA,GAAO,IAAA;AAC1B,QAAA,OAAO,aAAA,KAAkB,MAAA,GAAS,CAAC,UAAA,GAAa,UAAA;AAAA,MAClD,CAAC,CAAA;AAED,MAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAmB,MAAM,MAAS,CAAA;AACrG,MAAA,UAAA,GAAa,gBAAA;AACb,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM;AACpB,QAAA,CAAA,CAAE,IAAA,GAAO,QAAQ,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,IAAK,IAAI,CAAA;AAAA,MAC/C,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,WAAW,MAAA,KAAW,CAAA;AAAA,IAC/B,WAAW,MAAA,CAAO;AAAA,GACpB;AACF;AC7KO,SAAS,aAAA,CACd,OAAA,GAAgC,EAAC,EACZ;AACrB,EAAA,MAAM,EAAE,OAAA,GAAU,IAAA,EAAK,GAAI,OAAA;AAE3B,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAEhC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIlB,SAA6B,IAAI,CAAA;AACzD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AAGrD,EAAA,MAAM,aAAA,GAAgBC,OAAO,KAAK,CAAA;AAGlC,EAAA,MAAM,SAAA,GAAYA,OAAO,MAAM,CAAA;AAC/B,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAEpB,EAAA,MAAM,eAAA,GAAkBC,YAAY,YAAY;AAC9C,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,OAAA,CAAQ,cAAA,EAAe;AACtD,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,UAAA,GAAa,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AACrE,MAAA,QAAA,CAAS,UAAU,CAAA;AACnB,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,OAAA,GAAUA,YAAY,YAAY;AACtC,IAAA,MAAM,eAAA,EAAgB;AAAA,EACxB,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAGpB,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,aAAA,CAAc,OAAA,EAAS;AACvC,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,IAAA,KAAK,eAAA,EAAgB;AAAA,EACvB,CAAA,EAAG,CAAC,OAAA,EAAS,eAAe,CAAC,CAAA;AAE7B,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AC1CO,SAAS,YAAA,CACd,WAAA,EACA,OAAA,GAA+B,EAAC,EACZ;AACpB,EAAA,MAAM,EAAE,OAAA,GAAU,IAAA,EAAK,GAAI,OAAA;AAE3B,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAEhC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIH,SAA2B,IAAI,CAAA;AACvD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AAGrD,EAAA,MAAM,aAAA,GAAgBC,OAAsB,IAAI,CAAA;AAEhD,EAAA,MAAM,cAAA,GAAiBC,YAAY,YAAY;AAC7C,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,WAAA,EAAa;AAE9B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,YAAA,CAAa,WAAW,CAAA;AACpD,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAMiB,MAAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,MAAA,QAAA,CAASA,MAAK,CAAA;AACd,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,WAAA,EAAa,OAAO,CAAC,CAAA;AAEjC,EAAA,MAAM,OAAA,GAAUjB,YAAY,YAAY;AACtC,IAAA,MAAM,cAAA,EAAe;AAAA,EACvB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAMnB,EAAA,MAAM,yBAAA,GAA4BA,WAAAA;AAAA,IAChC,CAAC,SAAA,KAAuE;AACtE,MAAA,OAAA,CAAQ,CAAC,WAAA,KAAgB;AACvB,QAAA,IAAI,CAAC,aAAa,OAAO,WAAA;AAGzB,QAAA,MAAM,WAAA,GAA8C,MAAM,OAAA,CAAQ,SAAS,IACvE,SAAA,CAAU,MAAA,CAAO,CAAC,GAAA,EAAK,MAAA,KAAW;AAChC,UAAA,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA,CAAO,QAAA;AAC/B,UAAA,OAAO,GAAA;AAAA,QACT,CAAA,EAAG,EAAoC,CAAA,GACvC,SAAA;AAGJ,QAAA,MAAM,cAAA,GAA2B,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACnE,UAAA,MAAM,WAAA,GAAc,WAAA,CAAY,MAAA,CAAO,EAAE,CAAA;AACzC,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,OAAO;AAAA,cACL,GAAG,MAAA;AAAA,cACH,QAAA,EAAU;AAAA,gBACR,GAAG,MAAA,CAAO,QAAA;AAAA,gBACV,GAAG,WAAA,CAAY,CAAA;AAAA,gBACf,GAAG,WAAA,CAAY,CAAA;AAAA,gBACf,GAAG,WAAA,CAAY,CAAA;AAAA,gBACf,GAAG,WAAA,CAAY;AAAA;AACjB,aACF;AAAA,UACF;AACA,UAAA,OAAO,MAAA;AAAA,QACT,CAAC,CAAA;AAED,QAAA,OAAO;AAAA,UACL,GAAG,WAAA;AAAA,UACH,OAAA,EAAS;AAAA,SACX;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAAC,UAAU,MAAM;AAEd,IAAA,IAAI,WAAA,KAAgB,cAAc,OAAA,EAAS;AACzC,MAAA,aAAA,CAAc,OAAA,GAAU,WAAA;AAExB,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,KAAK,cAAA,EAAe;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,OAAA,EAAS,cAAc,CAAC,CAAA;AAEzC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;ACrFO,SAAS,qBAAA,GAAqD;AACnE,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAEhC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,QAAAA,CAAwB;AAAA,IAChD,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO;AAAA,GACR,CAAA;AAKD,EAAA,MAAM,YAAA,GAAeE,WAAAA;AAAA,IACnB,OAAU,SAAA,KAA4C;AACpD,MAAA,QAAA,CAAS,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACzC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,QAAA,QAAA,CAAS,EAAE,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAC1C,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,QAAA,QAAA,CAAS,EAAE,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,CAAA;AACpC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA;AAAC,GACH;AAGA,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACtB,OAAO,IAAA,KAA8C;AACnD,MAAA,OAAO,YAAA,CAAa,MAAM,MAAA,CAAO,eAAA,CAAgB,IAAI,CAAC,CAAA;AAAA,IACxD,CAAA;AAAA,IACA,CAAC,QAAQ,YAAY;AAAA,GACvB;AAEA,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACtB,OAAO,IAAY,IAAA,KAA8C;AAC/D,MAAA,OAAO,aAAa,MAAM,MAAA,CAAO,eAAA,CAAgB,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,IAC5D,CAAA;AAAA,IACA,CAAC,QAAQ,YAAY;AAAA,GACvB;AAEA,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACtB,OAAO,EAAA,KAA8B;AACnC,MAAA,OAAO,YAAA,CAAa,MAAM,MAAA,CAAO,eAAA,CAAgB,EAAE,CAAC,CAAA;AAAA,IACtD,CAAA;AAAA,IACA,CAAC,QAAQ,YAAY;AAAA,GACvB;AAGA,EAAA,MAAM,SAAA,GAAYA,WAAAA;AAAA,IAChB,OAAO,aAAqB,IAAA,KAAwC;AAClE,MAAA,OAAO,aAAa,MAAM,MAAA,CAAO,SAAA,CAAU,WAAA,EAAa,IAAI,CAAC,CAAA;AAAA,IAC/D,CAAA;AAAA,IACA,CAAC,QAAQ,YAAY;AAAA,GACvB;AAEA,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,OACE,WAAA,EACA,QAAA,EACA,IAAA,KACoB;AACpB,MAAA,OAAO,YAAA;AAAA,QAAa,MAClB,MAAA,CAAO,YAAA,CAAa,WAAA,EAAa,UAAU,IAAI;AAAA,OACjD;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,YAAY;AAAA,GACvB;AAEA,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,OAAO,aAAqB,QAAA,KAAoC;AAC9D,MAAA,OAAO,aAAa,MAAM,MAAA,CAAO,YAAA,CAAa,WAAA,EAAa,QAAQ,CAAC,CAAA;AAAA,IACtE,CAAA;AAAA,IACA,CAAC,QAAQ,YAAY;AAAA,GACvB;AAEA,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,OACE,aACA,SAAA,KACuB;AACvB,MAAA,OAAO,aAAa,MAAM,MAAA,CAAO,YAAA,CAAa,WAAA,EAAa,SAAS,CAAC,CAAA;AAAA,IACvE,CAAA;AAAA,IACA,CAAC,QAAQ,YAAY;AAAA,GACvB;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AC5GO,SAAS,sBAAA,CAAuB;AAAA,EACrC,WAAA;AAAA,EACA,UAAA,GAAa,GAAA;AAAA,EACb,eAAA,GAAkB,GAAA;AAAA,EAClB,MAAA;AAAA,EACA;AACF,CAAA,EAAgE;AAC9D,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,qBAAA,EAAsB;AAE/C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIF,SAAqB,MAAM,CAAA;AACvD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AAGrD,EAAA,MAAM,UAAA,GAAaC,OAAsC,IAAI,CAAA;AAC7D,EAAA,MAAM,UAAA,GAAaA,OAA6C,IAAI,CAAA;AACpE,EAAA,MAAM,eAAA,GAAkBA,OAA6C,IAAI,CAAA;AAGzE,EAAAE,UAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,UAAA,CAAW,OAAA,EAAS,YAAA,CAAa,UAAA,CAAW,OAAO,CAAA;AACvD,MAAA,IAAI,eAAA,CAAgB,OAAA,EAAS,YAAA,CAAa,eAAA,CAAgB,OAAO,CAAA;AAAA,IACnE,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,IAAA,GAAOD,WAAAA;AAAA,IACX,OAAO,SAAA,KAAsC;AAC3C,MAAA,SAAA,CAAU,QAAQ,CAAA;AAClB,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,CAAa,aAAa,SAAS,CAAA;AAEzC,QAAA,SAAA,CAAU,OAAO,CAAA;AACjB,QAAA,MAAA,IAAS;AAGT,QAAA,eAAA,CAAgB,OAAA,GAAU,WAAW,MAAM;AACzC,UAAA,SAAA,CAAU,MAAM,CAAA;AAAA,QAClB,GAAG,eAAe,CAAA;AAAA,MACpB,SAAS,CAAA,EAAG;AACV,QAAA,MAAM,MAAM,CAAA,YAAa,KAAA,GAAQ,CAAA,GAAI,IAAI,MAAM,uBAAuB,CAAA;AACtE,QAAA,SAAA,CAAU,OAAO,CAAA;AACjB,QAAA,QAAA,CAAS,GAAG,CAAA;AACZ,QAAA,OAAA,GAAU,GAAG,CAAA;AAAA,MACf;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,YAAA,EAAc,eAAA,EAAiB,QAAQ,OAAO;AAAA,GAC9D;AAGA,EAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,IAClB,CAAC,SAAA,KAAsC;AACrC,MAAA,UAAA,CAAW,OAAA,GAAU,SAAA;AACrB,MAAA,SAAA,CAAU,SAAS,CAAA;AAGnB,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAAA,MACjC;AAGA,MAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,QAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA;AAAA,MACtC;AAGA,MAAA,UAAA,CAAW,OAAA,GAAU,WAAW,MAAM;AACpC,QAAA,IAAI,WAAW,OAAA,EAAS;AACtB,UAAA,IAAA,CAAK,WAAW,OAAO,CAAA;AACvB,UAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,QACvB;AAAA,MACF,GAAG,UAAU,CAAA;AAAA,IACf,CAAA;AAAA,IACA,CAAC,YAAY,IAAI;AAAA,GACnB;AAGA,EAAA,MAAM,KAAA,GAAQA,YAAY,YAAY;AACpC,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAC/B,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IACvB;AAEA,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,MAAM,YAAY,UAAA,CAAW,OAAA;AAC7B,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,MAAA,MAAM,KAAK,SAAS,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAC/B,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IACvB;AACA,IAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,IAAA,SAAA,CAAU,MAAM,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AC5HO,SAAS,eAAA,CACd,OAAA,GAAkC,EAAC,EACZ;AACvB,EAAA,MAAM,EAAE,OAAA,GAAU,IAAA,EAAK,GAAI,OAAA;AAE3B,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAEhC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIF,SAA8B,IAAI,CAAA;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AAErD,EAAA,MAAM,iBAAA,GAAoBE,YAAY,YAAY;AAChD,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,gBAAA,EAAiB;AAC7C,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAMiB,MAAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,MAAA,QAAA,CAASA,MAAK,CAAA;AACd,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAEpB,EAAA,MAAM,OAAA,GAAUjB,YAAY,YAAY;AACtC,IAAA,MAAM,iBAAA,EAAkB;AAAA,EAC1B,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,IAClB,OAAO,UAAA,KAAsD;AAC3D,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,gBAAA,CAAiB,UAAU,CAAA;AAExD,MAAA,MAAM,iBAAA,EAAkB;AACxB,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,QAAQ,iBAAiB;AAAA,GAC5B;AAEA,EAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,IAClB,OAAO,IAAY,UAAA,KAAsD;AACvE,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,gBAAA,CAAiB,IAAI,UAAU,CAAA;AAE5D,MAAA,OAAA;AAAA,QAAQ,CAAC,IAAA,KACP,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,EAAA,GAAK,OAAA,GAAU,CAAE,CAAA,GAAI;AAAA,OACxD;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,IAClB,OAAO,EAAA,KAA8B;AACnC,MAAA,MAAM,MAAA,CAAO,iBAAiB,EAAE,CAAA;AAEhC,MAAA,OAAA,CAAQ,CAAC,IAAA,KAAU,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,GAAI,IAAK,CAAA;AAAA,IACnE,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAK,iBAAA,EAAkB;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,iBAAiB,CAAC,CAAA;AAE/B,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;ACnDO,SAAS,YAAA,CACd,GAAA,EACA,OAAA,GAA+B,EAAC,EACZ;AACpB,EAAA,MAAM,EAAE,OAAA,GAAU,IAAA,EAAM,MAAA,EAAQ,aAAA,GAAgB,MAAK,GAAI,OAAA;AAEzD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAGhC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIH,SAA6B,IAAI,CAAA;AACzD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAqC,IAAI,CAAA;AAC7E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AAGtD,EAAA,MAAM,cAAA,GAAiBC,OAAsB,IAAI,CAAA;AACjD,EAAA,MAAM,iBAAA,GAAoBA,OAA4C,MAAS,CAAA;AAC/E,EAAA,MAAM,kBAAA,GAAqBA,OAA+B,IAAI,CAAA;AAG9D,EAAA,MAAM,WAAA,GAAcC,YAAY,YAA0C;AACxE,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,MAAA,GAA8B;AAAA,QAClC,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,CAAC,iBAAiB,CAAA;AAAA,QAC1B,QAAQ;AAAC,OACX;AACA,MAAA,aAAA,CAAc,MAAM,CAAA;AACpB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,WAAA,CAAY,GAAG,CAAA;AAC3C,MAAA,aAAA,CAAc,MAAM,CAAA;AACpB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,WAAA,GAAmC;AAAA,QACvC,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,CAAC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,QACzD,QAAQ;AAAC,OACX;AACA,MAAA,aAAA,CAAc,WAAW,CAAA;AACzB,MAAA,OAAO,WAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,GAAG,CAAC,CAAA;AAGhB,EAAA,MAAM,YAAA,GAAeA,YAAY,YAAY;AAE3C,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,CAAC,OAAA,EAAS;AAC5B,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,gBAAA,GAAmB,MAAM,WAAA,EAAY;AAC3C,MAAA,IAAI,CAAC,iBAAiB,KAAA,EAAO;AAC3B,QAAA,QAAA,CAAS,IAAI,KAAA,CAAM,gBAAA,CAAiB,OAAO,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA;AACtD,QAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,QAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AAAA,IACnC;AAGA,IAAA,kBAAA,CAAmB,OAAA,GAAU,IAAI,eAAA,EAAgB;AAEjD,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,UAAA,CAAW,KAAK,MAAM,CAAA;AAGlD,MAAA,IAAI,kBAAA,CAAmB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS;AAC9C,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB,SAAS,GAAA,EAAK;AAEZ,MAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACrD,QAAA;AAAA,MACF;AAEA,MAAA,MAAMiB,MAAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,MAAA,QAAA,CAASA,MAAK,CAAA;AACd,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,GAAA,EAAK,QAAQ,OAAA,EAAS,aAAA,EAAe,WAAW,CAAC,CAAA;AAG7D,EAAA,MAAM,OAAA,GAAUjB,YAAY,YAAY;AACtC,IAAA,MAAM,YAAA,EAAa;AAAA,EACrB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,IAAI,MAAA,KAAW,iBAAA,CAAkB,OAAA,EAAS,OAAO,KAAA;AACjD,IAAA,IAAI,MAAA,KAAW,MAAA,IAAa,iBAAA,CAAkB,OAAA,KAAY,MAAA,EAAW;AACnE,MAAA,OAAO,WAAW,iBAAA,CAAkB,OAAA;AAAA,IACtC;AACA,IAAA,OAAO,KAAK,SAAA,CAAU,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,kBAAkB,OAAO,CAAA;AAAA,EAC5E,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAAC,UAAU,MAAM;AAEd,IAAA,MAAM,UAAA,GAAa,QAAQ,cAAA,CAAe,OAAA;AAC1C,IAAA,MAAM,oBAAoB,aAAA,EAAc;AAExC,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,iBAAA,EAAmB;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,cAAA,CAAe,OAAA,GAAU,GAAA;AACzB,IAAA,iBAAA,CAAkB,OAAA,GAAU,MAAA;AAG5B,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,KAAK,YAAA,EAAa;AAAA,EACpB,GAAG,CAAC,GAAA,EAAK,QAAQ,OAAA,EAAS,YAAA,EAAc,aAAa,CAAC,CAAA;AAGtD,EAAAA,UAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,QAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AAAA,MACnC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AACF;AC9LO,SAAS,oBACd,OAAA,EAC2B;AAC3B,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,GAAU,IAAA,EAAK,GAAI,OAAA;AAEpC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAEhC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIH,SAA6B,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAmC,IAAI,CAAA;AAC/D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AAErD,EAAA,MAAM,qBAAA,GAAwBE,YAAY,YAAY;AACpD,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS;AAE1B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,mBAAA,CAAoB,OAAO,CAAA;AACvD,MAAA,aAAA,CAAc,OAAO,UAAU,CAAA;AAC/B,MAAA,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,IACrB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAMiB,MAAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,MAAA,QAAA,CAASA,MAAK,CAAA;AACd,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAC,CAAA;AAE7B,EAAA,MAAM,OAAA,GAAUjB,YAAY,YAAY;AACtC,IAAA,MAAM,qBAAA,EAAsB;AAAA,EAC9B,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,KAAK,qBAAA,EAAsB;AAAA,IAC7B;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,OAAA,EAAS,qBAAqB,CAAC,CAAA;AAE5C,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AClCO,SAAS,eAAA,GAAyC;AACvD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAEhC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,QAAAA,CAA2B;AAAA,IACnD,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,MAAM,GAAA,GAAME,WAAAA;AAAA,IACV,OACE,WAAA,EACA,OAAA,EACA,QAAA,KAC6B;AAC7B,MAAA,QAAA,CAAS,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAEzC,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,MAAA,CAAO,YAAA,CAAa,WAAA,EAAa,SAAS,QAAQ,CAAA;AACvE,QAAA,QAAA,CAAS,EAAE,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAC1C,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,QAAA,QAAA,CAAS,EAAE,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,CAAA;AACpC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,KAAA,GAAQA,WAAAA;AAAA,IACZ,OAAO,aAAqB,OAAA,KAAmC;AAC7D,MAAA,QAAA,CAAS,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAEzC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAO,cAAA,CAAe,WAAA,EAAa,OAAO,CAAA;AAChD,QAAA,QAAA,CAAS,EAAE,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAAA,MAC5C,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,QAAA,QAAA,CAAS,EAAE,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,CAAA;AACpC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,OAAA,GAAUA,WAAAA;AAAA,IACd,OAAO,SAAiB,YAAA,KAA0C;AAChE,MAAA,QAAA,CAAS,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAEzC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAO,WAAA,CAAY,OAAA,EAAS,YAAY,CAAA;AAC9C,QAAA,QAAA,CAAS,EAAE,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAAA,MAC5C,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,QAAA,QAAA,CAAS,EAAE,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,CAAA;AACpC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,QAAA,CAAS,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,MAAK,CAAE,CAAA;AAAA,EAC/C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,GAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AC1EO,SAAS,sBACd,OAAA,EAC6B;AAC7B,EAAA,MAAM,EAAE,WAAA,EAAa,QAAA,EAAU,cAAA,EAAgB,OAAA,GAAU,MAAK,GAAI,OAAA;AAElE,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAEhC,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIF,SAA0B,IAAI,CAAA;AAC1E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AAErD,EAAA,MAAM,cAAA,GAAiBE,WAAAA;AAAA,IACrB,OAAO,MAAA,KAAyB;AAC9B,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,WAAA,EAAa;AAE9B,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,uBAAA,CAAwB,WAAW,CAAA;AAEpE,QAAA,IAAI,QAAQ,OAAA,EAAS;AAErB,QAAA,MAAM,gBAAA,GAAmB,cAAA,GACrB,WAAA,CAAY,MAAA,CAAO,CAAC,QAAQ,cAAA,CAAe,QAAA,CAAS,GAAG,CAAC,CAAA,GACxD,WAAA;AACJ,QAAA,iBAAA,CAAkB,gBAAgB,CAAA;AAAA,MACpC,SAAS,GAAA,EAAK;AAEZ,QAAA,IAAI,QAAQ,OAAA,EAAS;AACrB,QAAA,MAAMiB,MAAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,QAAA,QAAA,CAASA,MAAK,CAAA;AACd,QAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,MACxB,CAAA,SAAE;AAEA,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,WAAA,EAAa,cAAA,EAAgB,OAAO;AAAA,GAC/C;AAEA,EAAA,MAAM,OAAA,GAAUjB,YAAY,YAAY;AACtC,IAAA,MAAM,cAAA,EAAe;AAAA,EACvB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,MAAM,QAAA,GAAWgB,QAAQ,MAAM;AAC7B,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,cAAA,IAAkB,EAAE,CAAA;AAC/C,IAAA,OAAO,CAAC,OAAA,KAA6B,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAAA,EAC7D,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAAf,UAAU,MAAM;AACd,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,KAAK,cAAA,CAAe,WAAW,MAAM,CAAA;AACrC,MAAA,OAAO,MAAM,WAAW,KAAA,EAAM;AAAA,IAChC;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,WAAA,EAAa,cAAc,CAAC,CAAA;AAEzC,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AC9FA,IAAM,kBAAA,GAAqBa,cAA8C,IAAI,CAAA;AA2BtE,SAAS,mBAAA,CAAoB;AAAA,EAClC;AACF,CAAA,EAA0C;AACxC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIhB,QAAAA,CAAwB,EAAE,CAAA;AAExD,EAAA,MAAM,SAAA,GAAYE,WAAAA,CAAY,CAAC,MAAA,KAAwB;AACrD,IAAA,UAAA,CAAW,CAAC,IAAA,KAAS;AAEnB,MAAA,MAAM,WAAW,IAAA,CAAK,MAAA;AAAA,QACpB,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,KAAmB,MAAA,CAAO;AAAA,OACrC;AACA,MAAA,OAAO,CAAC,GAAG,QAAA,EAAU,MAAM,CAAA;AAAA,IAC7B,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,WAAAA,CAAY,CAAC,cAAA,KAA2B;AAC3D,IAAA,UAAA;AAAA,MAAW,CAAC,SACV,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,mBAAmB,cAAc;AAAA,KACxD;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,WAAAA,CAAY,CAAC,MAAA,KAAwB;AACxD,IAAA,UAAA,CAAW,CAAC,IAAA,KAAS;AACnB,MAAA,MAAM,WAAW,IAAA,CAAK,IAAA;AAAA,QACpB,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,KAAmB,MAAA,CAAO;AAAA,OACrC;AAGA,MAAA,IAAI,QAAA,IAAY,QAAA,CAAS,KAAA,KAAU,MAAA,CAAO,KAAA,EAAO;AAC/C,QAAA,OAAO,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,cAAA,KAAmB,OAAO,cAAc,CAAA;AAAA,MACtE;AAGA,MAAA,MAAM,WAAW,IAAA,CAAK,MAAA;AAAA,QACpB,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,KAAmB,MAAA,CAAO;AAAA,OACrC;AACA,MAAA,OAAO,CAAC,GAAG,QAAA,EAAU,MAAM,CAAA;AAAA,IAC7B,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,YAAY,MAAM;AACrC,IAAA,UAAA,CAAW,EAAE,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAYA,WAAAA;AAAA,IAChB,CAAC,aAAqB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,mBAAmB,QAAQ,CAAA;AAAA,IACvE,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,cAAA,GAAiBA,WAAAA;AAAA,IACrB,CAAC,aAAqB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,mBAAmB,QAAQ,CAAA;AAAA,IACvE,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,gBAAA,GAAmB,QAAQ,MAAA,GAAS,CAAA;AAE1C,EAAA,MAAM,KAAA,GAAQgB,OAAAA;AAAA,IACZ,OAAgC;AAAA,MAC9B,OAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,OAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,uBACEzB,GAAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,OAC1B,QAAA,EACH,CAAA;AAEJ;AA0CO,SAAS,sBAAA,GAAyD;AACvE,EAAA,OAAOwB,WAAW,kBAAkB,CAAA;AACtC;ACvLA,IAAM,UAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,qDAAA;AAAA,EACT,WAAA,EAAa,2BAAA;AAAA,EACb,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,uBAAA;AAAA,EACZ,UAAA,EAAY,MAAA;AAAA,EACZ,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,cAAA,GAAsC;AAAA,EAC1C,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,KAAA,EAAO,iCAAA;AAAA,EACP,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO,2BAAA;AAAA,EACP,QAAA,EAAU,QAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY,0BAAA;AAAA,EACZ,OAAA,EAAS,SAAA;AAAA,EACT,YAAA,EAAc,KAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAGA,IAAM,WAAA,GAA4D;AAAA,EAChE,OAAA,EAAS,EAAE,EAAA,EAAI,0BAAA,EAA4B,MAAM,mBAAA,EAAoB;AAAA;AAAA,EACrE,MAAA,EAAQ,EAAE,EAAA,EAAI,yBAAA,EAA2B,MAAM,kBAAA,EAAmB;AAAA;AAAA,EAClE,QAAA,EAAU,EAAE,EAAA,EAAI,0BAAA,EAA4B,MAAM,mBAAA,EAAoB;AAAA;AAAA,EACtE,OAAA,EAAS,EAAE,EAAA,EAAI,0BAAA,EAA4B,MAAM,mBAAA,EAAoB;AAAA;AAAA,EACrE,IAAA,EAAM,EAAE,EAAA,EAAI,0BAAA,EAA4B,MAAM,mBAAA,EAAoB;AAAA;AAAA,EAClE,KAAA,EAAO,EAAE,EAAA,EAAI,2BAAA,EAA6B,MAAM,oBAAA;AAAqB;AACvE,CAAA;AAGA,IAAM,oBAAA,GAA4C;AAAA,EAChD,QAAA,EAAU,UAAA;AAAA,EACV,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,SAAA,EAAW,kBAAA;AAAA,EACX,UAAA,EAAY,KAAA;AAAA,EACZ,OAAA,EAAS,UAAA;AAAA,EACT,eAAA,EAAiB,8BAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,SAAA,EAAW,gCAAA;AAAA,EACX,MAAA,EAAQ,GAAA;AAAA,EACR,QAAA,EAAU,OAAA;AAAA,EACV,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,mBAAA,GAA2C;AAAA,EAC/C,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,iCAAA;AAAA,EACP,YAAA,EAAc,KAAA;AAAA,EACd,aAAA,EAAe,WAAA;AAAA,EACf,aAAA,EAAe;AACjB,CAAA;AAEA,IAAM,kBAAA,GAA0C;AAAA,EAC9C,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY,0BAAA;AAAA,EACZ,KAAA,EAAO,2BAAA;AAAA,EACP,OAAA,EAAS,OAAA;AAAA,EACT,QAAA,EAAU,QAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,oBAAA,GAA4C;AAAA,EAChD,QAAA,EAAU,MAAA;AAAA,EACV,KAAA,EAAO,iCAAA;AAAA,EACP,SAAA,EAAW;AACb,CAAA;AASA,SAAS,cAAc,MAAA,EAAiD;AACtE,EAAA,IAAI,MAAA,CAAO,gBAAgB,OAAO,KAAA;AAElC,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,eAAe,QAAA,EAA0B;AAEhD,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,mBAAA,EAAqB,SAAA;AAAA,IACrB,6BAAA,EAA+B,WAAA;AAAA,IAC/B,0BAAA,EAA4B,aAAA;AAAA,IAC5B,kBAAA,EAAoB,QAAA;AAAA,IACpB,SAAA,EAAW,MAAA;AAAA,IACX,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd;AACA,EAAA,OAAO,OAAA,CAAQ,QAAQ,CAAA,IAAK,QAAA;AAC9B;AAKA,SAAS,gBAAgB,QAAA,EAA4C;AACnE,EAAA,MAAM,SAAA,GAAY,SAAS,WAAA,EAAY;AAGvC,EAAA,IACE,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,IACxB,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,IAC5B,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,IAC5B,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,IACzB,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,IAC3B,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,IAC3B,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,EAC1B;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAGA,EAAA,IACE,SAAA,CAAU,QAAA,CAAS,WAAW,CAAA,IAC9B,UAAU,QAAA,CAAS,MAAM,CAAA,IACzB,SAAA,CAAU,SAAS,MAAM,CAAA,IACzB,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,EAC7B;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAGA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9B,IAAA,OAAO,SAAA;AAAA,EACT;AAGA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9B,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IACE,UAAU,QAAA,CAAS,MAAM,KACzB,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,IACzB,SAAA,CAAU,SAAS,SAAS,CAAA,IAC5B,UAAU,QAAA,CAAS,MAAM,KACzB,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAC3B;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,kBAAkB,KAAA,EAAwB;AACjD,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,MAAA;AAClD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,IAAA,OAAO,KAAA,CAAM,MAAA,GAAS,EAAA,GAAK,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,IAAA,CAAA,GAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAAA,EACrE;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,QAAQ,MAAA,GAAS,OAAA;AACxD,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AASO,SAAS,UAAA,CAAW;AAAA,EACzB,MAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,OAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAAiC;AAC/B,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAChC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIjB,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAA2B,IAAI,CAAA;AACvE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,eAAA,GAAkBC,OAA6C,IAAI,CAAA;AACzE,EAAA,MAAM,UAAA,GAAaA,OAAO,KAAK,CAAA;AAE/B,EAAA,MAAM,WAAA,GAAcC,WAAAA;AAAA,IAClB,CAAC,CAAA,KAAkB;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,OAAA,GAAU,OAAO,MAAM,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,KAAA,EAAO,MAAM;AAAA,GACzB;AAEA,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACtB,CAAC,CAAA,KAAiB;AAChB,MAAA,CAAA,CAAE,YAAA,CAAa,OAAA;AAAA,QACb,4BAAA;AAAA,QACA,IAAA,CAAK,UAAU,EAAE,KAAA,EAAO,MAAM,IAAA,EAAM,MAAA,EAAQ,MAAA,CAAO,IAAA,EAAM;AAAA,OAC3D;AACA,MAAA,CAAA,CAAE,aAAa,aAAA,GAAgB,MAAA;AAC/B,MAAA,WAAA,GAAc,OAAO,MAAM,CAAA;AAAA,IAC7B,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,KAAA,EAAO,MAAM;AAAA,GAC7B;AAEA,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AAEzC,IAAA,eAAA,CAAgB,OAAA,GAAU,WAAW,YAAY;AAC/C,MAAA,cAAA,CAAe,IAAI,CAAA;AAGnB,MAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,CAAC,SAAA,EAAW;AACrC,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB,MAAM,IAAA,EAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AACtE,UAAA,eAAA,CAAgB,MAAM,CAAA;AACtB,UAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,QACvB,CAAA,CAAA,MAAQ;AAEN,UAAA,eAAA,CAAgB,EAAE,CAAA;AAAA,QACpB,CAAA,SAAE;AACA,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB;AAAA,MACF;AAAA,IACF,GAAG,GAAG,CAAA;AAAA,EACR,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAA,CAAM,MAAM,MAAA,CAAO,IAAA,EAAM,SAAS,CAAC,CAAA;AAE/C,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AAEzC,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,MAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA;AACpC,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,IAC5B;AACA,IAAA,cAAA,CAAe,KAAK,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AACrC,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,MAAA,CAAO,SAAS,CAAA;AACrD,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,MAAA,CAAO,SAAS,CAAA;AACrD,EAAA,MAAM,YAAA,GAAe,EAAE,EAAA,EAAI,2BAAA,EAA6B,MAAM,oBAAA,EAAqB;AACnF,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,YAAY,CAAA,IAAK,YAAA;AAE/C,EAAA,uBACER,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,UAAA;AAAA,MACL,eAAA,EAAe,UAAA;AAAA,MACf,QAAA,EAAU,CAAA;AAAA,MACV,SAAA;AAAA,MACA,SAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,WAAA;AAAA,MACT,WAAA,EAAa,eAAA;AAAA,MACb,YAAA,EAAc,gBAAA;AAAA,MACd,YAAA,EAAc,gBAAA;AAAA,MACd,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,OAAA,GAAU,OAAO,MAAM,CAAA;AAAA,QACzB;AAAA,MACF,CAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,GAAG,UAAA;AAAA,QACH,GAAI,UAAA,GAAa,cAAA,GAAiB;AAAC,OACrC;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,SACE,MAAA,CAAO,cAAA,GACH,aAAA,GACA,MAAA,CAAO,cACL,iBAAA,GACA,iBAAA;AAAA,YAER,QAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,GAAA;AAAA,YAEP,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,UAAA,EACX,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,EAAA,EAAI,CAAA,EAClC;AAAA;AAAA,SACF;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,UAAA,EAAa,iBAAO,IAAA,EAAK,CAAA;AAAA,wBACtCA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,GAAG,UAAA;AAAA,cACH,iBAAiB,SAAA,CAAU,EAAA;AAAA,cAC3B,OAAO,SAAA,CAAU;AAAA,aACnB;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAGC,WAAA,oBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,oBAAA,EACV,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,mBAAA,EAAqB,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,UAC7C,4BACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,sBAAsB,QAAA,EAAA,YAAA,EAAU,CAAA,GAC1C,YAAA,IAAgB,YAAA,CAAa,SAAS,CAAA,GACxC,YAAA,CAAa,GAAA,CAAI,CAAC,OAAO,CAAA,qBACvBA,GAAAA,CAAC,KAAA,EAAA,EAAY,OAAO,kBAAA,EAAoB,KAAA,EAAO,MAAA,CAAO,KAAK,GACxD,QAAA,EAAA,iBAAA,CAAkB,KAAK,CAAA,EAAA,EADhB,CAEV,CACD,CAAA,mBAEDA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,sBAAsB,QAAA,EAAA,SAAA,EAAO;AAAA,SAAA,EAE7C;AAAA;AAAA;AAAA,GAEJ;AAEJ;ACrUA,IAAM2B,WAAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,2BAAA;AAAA,EACT,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,uBAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AAEA,IAAMC,eAAAA,GAAsC;AAAA,EAC1C,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,aAAA,GAAqC;AAAA,EACzC,KAAA,EAAO,iCAAA;AAAA,EACP,UAAA,EAAY,iBAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AAEA,IAAMC,WAAAA,GAAkC;AAAA,EACtC,KAAA,EAAO,8BAAA;AAAA,EACP,UAAA,EAAY;AACd,CAAA;AAEA,IAAMC,WAAAA,GAAkC;AAAA,EACtC,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU,+BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,2BAAA;AAAA,EACP,QAAA,EAAU,QAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,sBAAA,GAA8C;AAAA,EAClD,QAAA,EAAU;AACZ,CAAA;AASO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,kBAAkB,EAAC;AAAA,EACnB,YAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA,GAAc,IAAA;AAAA,EACd,eAAA,GAAkB,KAAA;AAAA,EAClB,YAAA,GAAe,EAAA;AAAA,EACf;AACF,CAAA,EAAgC;AAC9B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIvB,SAAS,eAAe,CAAA;AAG5D,EAAA,MAAM,eAAA,GAAkB,YAAA,GACpB,KAAA,CAAM,OAAA,CAAQ,MAAA;AAAA,IAAO,CAAC,QACpB,GAAA,CAAI,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,YAAA,CAAa,WAAA,EAAa;AAAA,MAE5D,KAAA,CAAM,OAAA;AAGV,EAAA,MAAM,kBAAA,GACJ,CAAC,YAAA,IAAgB,KAAA,CAAM,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,YAAA,CAAa,WAAA,EAAa,CAAA;AAG/E,EAAA,MAAM,YAAA,GAAe,YAAA,GACjB,eAAA,CAAgB,MAAA,GAAS,KAAK,kBAAA,GAC9B,UAAA;AAEJ,EAAA,MAAM,WAAA,GAAcE,WAAAA;AAAA,IAClB,CAAC,CAAA,KAAkB;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,aAAA,CAAc,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,MAC/B;AACA,MAAA,YAAA,GAAe,KAAK,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,YAAA,EAAc,KAAK;AAAA,GACnC;AAEA,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,CAAA,KAAqB;AACpB,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,aAAA,CAAc,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,QAC/B;AACA,QAAA,YAAA,GAAe,KAAK,CAAA;AAAA,MACtB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,YAAA,IAAgB,CAAC,UAAA,EAAY;AAChD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,UAAA,EAAY;AAC9C,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,aAAA,CAAc,KAAK,CAAA;AAAA,MACrB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,YAAA,EAAc,KAAA,EAAO,UAAU;AAAA,GAC/C;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,UAAA,KACxB,eAAA,CAAgB,IAAA;AAAA,IACd,CAAC,GAAA,KAAQ,GAAA,CAAI,UAAU,KAAA,CAAM,IAAA,IAAQ,IAAI,MAAA,KAAW;AAAA,GACtD;AAGF,EAAA,IAAI,YAAA,IAAgB,CAAC,kBAAA,IAAsB,eAAA,CAAgB,WAAW,CAAA,EAAG;AACvE,IAAA,uBAAOT,GAAAA,CAAAoB,QAAAA,EAAA,EAAE,CAAA;AAAA,EACX;AAEA,EAAA,uBACEnB,IAAAA,CAAC,KAAA,EAAA,EAAI,MAAK,UAAA,EAAW,eAAA,EAAe,cAAc,SAAA,EAChD,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,CAAA;AAAA,QACV,OAAA,EAAS,WAAA;AAAA,QACT,SAAA,EAAW,aAAA;AAAA,QACX,KAAA,EAAO;AAAA,UACL,GAAG0B,WAAAA;AAAA,UACH,GAAI,UAAA,GAAaC,eAAAA,GAAiB;AAAC,SACrC;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,WAAA,oBACC5B,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,GAAG,aAAA;AAAA,gBACH,SAAA,EAAW,eAAe,eAAA,GAAkB;AAAA,eAC9C;AAAA,cAEA,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,eAAA,EAAgB,MAAM,EAAA,EAAI;AAAA;AAAA,WACvC;AAAA,0BAEFA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO6B,WAAAA,EACX,QAAA,kBAAA7B,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,CAAA,EAC/B,CAAA;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO8B,WAAAA,EAAa,gBAAM,IAAA,EAAK,CAAA;AAAA,0BACrC9B,GAAAA,CAAC,MAAA,EAAA,EAAK,OAAO,WAAA,EACV,QAAA,EAAA,KAAA,CAAM,aAAa,IAAA,GAChB,CAAA,EAAG,KAAA,CAAM,SAAA,CAAU,gBAAgB,CAAA,KAAA,CAAA,GACnC,GAAG,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,KAAA,CAAA,EAC7B;AAAA;AAAA;AAAA,KACF;AAAA,IAEC,YAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,OAAA,EAAQ,KAAA,EAAO,sBAAA,EACtB,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,MAAA,qBACpBA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QAEC,MAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA,EAAY,gBAAA,CAAiB,MAAA,CAAO,IAAI,CAAA;AAAA,QACxC,OAAA,EAAS,aAAA;AAAA,QACT,WAAA,EAAa;AAAA,OAAA;AAAA,MALR,MAAA,CAAO;AAAA,KAOf,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AC1KA,IAAME,gBAAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,MAAA,EAAQ,MAAA;AAAA,EACR,eAAA,EAAiB,iCAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM6B,aAAAA,GAAoC;AAAA,EACxC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,2BAAA;AAAA,EACT,YAAA,EAAc,uCAAA;AAAA,EACd,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAMC,YAAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,6BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,qBAAA,GAA6C;AAAA,EACjD,OAAA,EAAS,2BAAA;AAAA,EACT,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,mBAAA,GAA2C;AAAA,EAC/C,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;AAEA,IAAMC,YAAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,2BAAA;AAAA,EACT,KAAA,EAAO,4BAAA;AAAA,EACP,QAAA,EAAU,6BAAA;AAAA,EACV,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,2BAAA;AAAA,EACT,KAAA,EAAO,iCAAA;AAAA,EACP,QAAA,EAAU,6BAAA;AAAA,EACV,SAAA,EAAW;AACb,CAAA;AAMA,SAAS,eAAA,GAA+B;AACtC,EAAA,uBACEjC,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,2BAAA,EAA4B,EAChD,QAAA,EAAA,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,sBACdC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAEC,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAK,2BAAA;AAAA,QACL,OAAA,EAAS,2BAAA;AAAA,QACT,YAAA,EAAc;AAAA,OAChB;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,EAAA;AAAA,cACP,MAAA,EAAQ,EAAA;AAAA,cACR,eAAA,EAAiB,8BAAA;AAAA,cACjB,YAAA,EAAc,0BAAA;AAAA,cACd,SAAA,EAAW;AAAA;AACb;AAAA,SACF;AAAA,wBACAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,CAAA;AAAA,cACN,MAAA,EAAQ,EAAA;AAAA,cACR,eAAA,EAAiB,8BAAA;AAAA,cACjB,YAAA,EAAc,0BAAA;AAAA,cACd,SAAA,EAAW;AAAA;AACb;AAAA;AACF;AAAA,KAAA;AAAA,IA1BK;AAAA,GA4BR,CAAA,EACH,CAAA;AAEJ;AAmBO,SAAS,cAAA,CAAe;AAAA,EAC7B,aAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAkB,EAAC;AAAA,EACnB,UAAA,GAAa,IAAA;AAAA,EACb,WAAA,GAAc,IAAA;AAAA,EACd,SAAA;AAAA,EACA;AACF,CAAA,EAAqC;AACnC,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,KAAU,SAAA,EAAU;AAC/C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIO,SAAS,EAAE,CAAA;AAEjD,EAAA,MAAM,gBAAA,GAAmBE,WAAAA;AAAA,IACvB,CAAC,KAAA,KAAuB;AACtB,MAAA,aAAA,GAAgB,KAAK,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,CAAC,aAAa;AAAA,GAChB;AAEA,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACxB,CAAC,OAAoB,MAAA,KAAyB;AAC5C,MAAA,cAAA,GAAiB,OAAO,MAAM,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,qBAAA,GAAwBA,WAAAA;AAAA,IAC5B,CAAC,OAAoB,MAAA,KAAyB;AAC5C,MAAA,iBAAA,GAAoB,OAAO,MAAM,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,CAAC,iBAAiB;AAAA,GACpB;AAGA,EAAA,MAAM,cAAA,GAAiB,cACnB,MAAA,CAAO,MAAA;AAAA,IACL,CAAC,KAAA,KACC,KAAA,CAAM,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,WAAA,CAAY,WAAA,EAAa,CAAA,IAC3D,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,MAAK,CAAC,QAClB,GAAA,CAAI,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,WAAA,CAAY,WAAA,EAAa;AAAA;AAC3D,GACJ,GACA,MAAA;AAEJ,EAAA,uBACER,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,EAAE,GAAGC,gBAAAA,EAAiB,GAAG,KAAA,EAAM;AAAA,MACtC,IAAA,EAAK,MAAA;AAAA,MACL,YAAA,EAAW,iBAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO8B,aAAAA,EACV,QAAA,EAAA;AAAA,0BAAA/B,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,IAAA,EAAM,IAAI,KAAA,EAAO,EAAE,KAAA,EAAO,8BAAA,EAA+B,EAAG,CAAA;AAAA,0BAC/EA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAOgC,cAAa,QAAA,EAAA,iBAAA,EAAe;AAAA,SAAA,EAC3C,CAAA;AAAA,QAEC,8BACChC,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,uBACV,QAAA,kBAAAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,IAAA;AAAA,YACV,WAAA,EAAY,8BAAA;AAAA,YACZ,KAAA,EAAO,WAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC9C,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA;AAAO;AAAA,SACzB,EACF,CAAA;AAAA,wBAGFA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,qBACT,QAAA,EAAA,SAAA,mBACCA,GAAAA,CAAC,eAAA,EAAA,EAAgB,IACf,KAAA,mBACFC,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAOgC,YAAAA,EACV,QAAA,EAAA;AAAA,0BAAAjC,GAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAM,EAAA;AAAA,cACN,KAAA,EAAO,EAAE,YAAA,EAAc,2BAAA;AAA4B;AAAA,WACrD;AAAA,0BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,QAAA,EAAA,uBAAA,EAAqB,CAAA;AAAA,0BAC1BA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,6BAAA,EAA+B,SAAA,EAAW,CAAA,EAAE,EACjE,QAAA,EAAA,KAAA,CAAM,OAAA,EACT;AAAA,SAAA,EACF,CAAA,GACE,cAAA,CAAe,MAAA,KAAW,CAAA,mBAC5BA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,WAAA,EACT,QAAA,EAAA,WAAA,mBACCC,IAAAA,CAAAmB,UAAA,EAAE,QAAA,EAAA;AAAA,UAAA,8BAAA;AAAA,UAA6B,WAAA;AAAA,UAAY;AAAA,SAAA,EAAC,CAAA,mBAE5CpB,GAAAA,CAAAoB,QAAAA,EAAA,EAAE,QAAA,EAAA,qBAAA,EAAmB,CAAA,EAEzB,CAAA,GAEA,cAAA,CAAe,GAAA,CAAI,CAAC,KAAA,qBAClBpB,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YAEC,KAAA;AAAA,YACA,UAAA,EAAY,kBAAkB,KAAA,CAAM,IAAA;AAAA,YACpC,eAAA;AAAA,YACA,YAAA,EAAc,gBAAA;AAAA,YACd,aAAA,EAAe,iBAAA;AAAA,YACf,iBAAA,EAAmB,qBAAA;AAAA,YACnB,WAAA;AAAA,YACA,iBAAiB,CAAC,WAAA;AAAA,YAClB,YAAA,EAAc;AAAA,WAAA;AAAA,UATT,KAAA,CAAM;AAAA,SAWd,CAAA,EAEL;AAAA;AAAA;AAAA,GACF;AAEJ;AChOA,IAAME,gBAAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,8BAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,MAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,cAAA,GAAsC;AAAA,EAC1C,OAAA,EAAS,GAAA;AAAA,EACT,WAAA,EAAa;AACf,CAAA;AAEA,IAAM,cAAA,GAAsC;AAAA,EAC1C,WAAA,EAAa,8BAAA;AAAA,EACb,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,gBAAA,GAAwC;AAAA,EAC5C,KAAA,EAAO,iCAAA;AAAA,EACP,MAAA,EAAQ,MAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,gBAAA,GAAwC;AAAA,EAC5C,IAAA,EAAM,CAAA;AAAA,EACN,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK,KAAA;AAAA,EACL,QAAA,EAAU,CAAA;AAAA,EACV,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,gBAAA,GAAwC;AAAA,EAC5C,QAAA,EAAU,+BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,2BAAA;AAAA,EACP,QAAA,EAAU,QAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,eAAA,GAAuC;AAAA,EAC3C,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,iBAAA,GAAyC;AAAA,EAC7C,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,eAAA,GAAuC;AAAA,EAC3C,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,kBAAA,GAA0C;AAAA,EAC9C,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,aAAA;AAAA,EACjB,MAAA,EAAQ,MAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,KAAA,EAAO,iCAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,aAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AAMA,IAAM,kBAAA,GAAsD;AAAA,EAC1D,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC/B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EAC7B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,SAAA,EAAU;AAAA,EACjC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,EACjC,EAAE,KAAA,EAAO,gBAAA,EAAkB,KAAA,EAAO,gBAAA,EAAiB;AAAA,EACnD,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EAC7B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA;AACzB,CAAA;AAEA,IAAM,gBAAA,GAA2D;AAAA,EAC/D,EAAE,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,aAAA,EAAc;AAAA,EAClC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC/B,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,EACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,EACjC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC/B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA;AACzB,CAAA;AAKA,SAAS,aAAa,QAAA,EAAuC;AAC3D,EAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,EAAA,MAAM,IAAA,GAAO,SAAS,WAAA,EAAY;AAClC,EAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,IAAA,CAAK,SAAS,MAAM,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA;AACpF;AAKA,SAAS,sBAAsB,QAAA,EAA+D;AAC5F,EAAA,IAAI,CAAC,UAAU,OAAO,kBAAA;AAEtB,EAAA,MAAM,IAAA,GAAO,SAAS,WAAA,EAAY;AAGlC,EAAA,IACE,IAAA,CAAK,SAAS,KAAK,CAAA,IACnB,KAAK,QAAA,CAAS,SAAS,CAAA,IACvB,IAAA,CAAK,QAAA,CAAS,SAAS,KACvB,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IACrB,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IACtB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EACpB;AACA,IAAA,OAAO,kBAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AAChF,IAAA,OAAO,kBAAA,CAAmB,MAAA;AAAA,MAAO,CAAC,GAAA,KAChC,CAAC,MAAA,EAAQ,OAAA,EAAS,gBAAA,EAAkB,KAAA,EAAO,KAAK,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,KAAK;AAAA,KACtE;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,KAAS,SAAA,IAAa,IAAA,KAAS,MAAA,EAAQ;AACzC,IAAA,OAAO,kBAAA,CAAmB,MAAA;AAAA,MAAO,CAAC,QAChC,CAAC,MAAA,EAAQ,SAAS,gBAAgB,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,KAAK;AAAA,KACxD;AAAA,EACF;AAGA,EAAA,OAAO,kBAAA,CAAmB,MAAA;AAAA,IAAO,CAAC,QAChC,CAAC,MAAA,EAAQ,SAAS,gBAAgB,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,KAAK;AAAA,GACxD;AACF;AASO,SAAS,cAAA,CAAe;AAAA,EAC7B,MAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAqC;AACnC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIK,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAGlD,EAAA,MAAM,YAAA,GAAe,aAAa,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAA,CAAO,MAAM,CAAA;AAC9E,EAAA,MAAM,qBAAA,GAAwB,qBAAA,CAAsB,YAAA,EAAc,SAAS,CAAA;AAE3E,EAAA,MAAM,eAAA,GAAkBE,WAAAA;AAAA,IACtB,CAAC,CAAA,KAAiB;AAChB,MAAA,CAAA,CAAE,YAAA,CAAa,OAAA,CAAQ,YAAA,EAAc,MAAA,CAAO,KAAK,CAAC,CAAA;AAClD,MAAA,CAAA,CAAE,aAAa,aAAA,GAAgB,MAAA;AAC/B,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiBA,WAAAA,CAAY,CAAC,CAAA,KAAiB;AACnD,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,aAAa,UAAA,GAAa,MAAA;AAC5B,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBA,YAAY,MAAM;AACxC,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACjB,CAAC,CAAA,KAAiB;AAChB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,MAAM,YAAY,QAAA,CAAS,CAAA,CAAE,aAAa,OAAA,CAAQ,YAAY,GAAG,EAAE,CAAA;AACnE,MAAA,IAAI,CAAC,KAAA,CAAM,SAAS,CAAA,IAAK,cAAc,KAAA,EAAO;AAC5C,QAAA,SAAA,CAAU,WAAW,KAAK,CAAA;AAAA,MAC5B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAO,SAAS;AAAA,GACnB;AAEA,EAAA,MAAM,uBAAA,GAA0BA,WAAAA;AAAA,IAC9B,CAAC,WAAA,KAAiC;AAChC,MAAA,QAAA,CAAS,EAAE,GAAG,MAAA,EAAQ,WAAA,EAAa,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,GACnB;AAEA,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACxB,CAAC,CAAA,KAA2C;AAC1C,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,MAAA,CAAO,KAAA,IAAS,MAAA;AAChC,MAAA,QAAA,CAAS,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,IAC/B,CAAA;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,GACnB;AAEA,EAAA,MAAM,qBAAA,GAAwBA,WAAAA;AAAA,IAC5B,CAAC,KAAA,KAAkC;AACjC,MAAA,MAAM,aAAa,KAAA,IAAS,MAAA;AAC5B,MAAA,QAAA,CAAS,EAAE,GAAG,MAAA,EAAQ,UAAA,EAAY,CAAA;AAAA,IACpC,CAAA;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,GACnB;AAGA,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,YAAA,EAAc,SAAS,CAAA;AAEnD,EAAA,uBACER,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,SAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa,eAAA;AAAA,MACb,SAAA,EAAW,aAAA;AAAA,MACX,UAAA,EAAY,cAAA;AAAA,MACZ,WAAA,EAAa,eAAA;AAAA,MACb,MAAA,EAAQ,UAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACL,GAAGC,gBAAAA;AAAA,QACH,GAAI,UAAA,GAAa,cAAA,GAAiB,EAAC;AAAA,QACnC,GAAI,UAAA,GAAa,cAAA,GAAiB;AAAC,OACrC;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,gBAAA,EACX,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,MAAA,EAAO,IAAA,EAAM,EAAA,EAAI,CAAA,EAC9B,CAAA;AAAA,wBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,gBAAA,EACV,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,gBAAA,EAAmB,iBAAO,MAAA,EAAO,CAAA;AAAA,0BAC9CA,IAAC,MAAA,EAAA,EAAK,KAAA,EAAO,iBAAkB,QAAA,EAAA,KAAA,CAAM,KAAA,IAAS,MAAM,IAAA,EAAK;AAAA,SAAA,EAC3D,CAAA;AAAA,QAEC,YAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAM,MAAK,IAAA,EAAK,OAAA,EAAQ,SAAA,EACtB,QAAA,EAAA,YAAA,CAAa,SAAA,EAChB,CAAA;AAAA,wBAGFA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,mBACV,QAAA,kBAAAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAO,MAAA,CAAO,WAAA;AAAA,YACd,QAAA,EAAU,uBAAA;AAAA,YACV,OAAA,EAAS,qBAAA;AAAA,YACT,IAAA,EAAK;AAAA;AAAA,SACP,EACF,CAAA;AAAA,QAEC,0BACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,iBACV,QAAA,kBAAAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,OAAO,UAAA,IAAc,EAAA;AAAA,YAC5B,QAAA,EAAU,qBAAA;AAAA,YACV,OAAA,EAAS,gBAAA;AAAA,YACT,IAAA,EAAK,IAAA;AAAA,YACL,aAAA,EAAY;AAAA;AAAA,SACd,EACF,CAAA;AAAA,wBAGFA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,aACV,QAAA,kBAAAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,IAAA;AAAA,YACV,WAAA,EAAY,OAAA;AAAA,YACZ,KAAA,EAAO,OAAO,KAAA,IAAS,EAAA;AAAA,YACvB,QAAA,EAAU;AAAA;AAAA,SACZ,EACF,CAAA;AAAA,wBAEAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,QAAA;AAAA,YACT,KAAA,EAAO,kBAAA;AAAA,YACP,YAAA,EAAY,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,YAEnC,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,GAAA,EAAI,MAAM,EAAA,EAAI;AAAA;AAAA;AAC3B;AAAA;AAAA,GACF;AAEJ;ACnTA,IAAME,gBAAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK;AACP,CAAA;AAEA,IAAM6B,aAAAA,GAAoC;AAAA,EACxC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,YAAA,EAAc;AAChB,CAAA;AAEA,IAAMC,YAAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,6BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAA;AAEA,IAAME,YAAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,cAAA,GAAsC;AAAA,EAC1C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,2BAAA;AAAA,EACT,MAAA,EAAQ,wCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,eAAA,EAAiB,8BAAA;AAAA,EACjB,KAAA,EAAO,iCAAA;AAAA,EACP,QAAA,EAAU,6BAAA;AAAA,EACV,SAAA,EAAW,QAAA;AAAA,EACX,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK;AACP,CAAA;AAmBO,SAAS,cAAA,CAAe;AAAA,EAC7B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAqC;AAEnC,EAAA,MAAM,cAAA,GAAiBzB,WAAAA;AAAA,IACrB,CAAC,OAAA,KAAoB;AACnB,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACjD,MAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,MAAA,OAAO,MAAA,CAAO,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAM,IAAI,CAAA;AAAA,IACxD,CAAA;AAAA,IACA,CAAC,QAAQ,MAAM;AAAA,GACjB;AAGA,EAAA,MAAM,QAAA,GAAWA,WAAAA;AAAA,IACf,CAAC,OAAA,KAAoB;AACnB,MAAA,OAAO,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,IAC5C,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAGA,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,CAAC,KAAA,KAAkB;AACjB,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,OAAO,CAAA;AAC9B,MAAA,UAAA,CAAW,MAAA,CAAO,OAAO,CAAC,CAAA;AAC1B,MAAA,QAAA,CAAS,UAAU,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,SAAS,QAAQ;AAAA,GACpB;AAGA,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,CAAC,OAAe,MAAA,KAA4B;AAC1C,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,OAAO,CAAA;AAC9B,MAAA,UAAA,CAAW,KAAK,CAAA,GAAI,MAAA;AACpB,MAAA,QAAA,CAAS,UAAU,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,SAAS,QAAQ;AAAA,GACpB;AAGA,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,WAAmB,OAAA,KAAoB;AACtC,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,OAAO,CAAA;AAC9B,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,UAAA,CAAW,MAAA,CAAO,WAAW,CAAC,CAAA;AAChD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,UAAA,CAAW,MAAA,CAAO,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA;AACrC,QAAA,QAAA,CAAS,UAAU,CAAA;AAAA,MACrB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAS,QAAQ;AAAA,GACpB;AAGA,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACjB,CAAC,CAAA,KAAiB;AAChB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,YAAA,CAAa,OAAA,CAAQ,4BAA4B,CAAA;AAChE,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,OAAO,SAAA,EAAW,MAAA,EAAQ,YAAW,GAAI,IAAA,CAAK,MAAM,IAAI,CAAA;AAMhE,QAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA;AACrD,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAU,SAAS,CAAA,qBAAA,CAAuB,CAAA;AACvD,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,kBAAkB,OAAA,CAAQ,IAAA;AAAA,UAC9B,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,KAAA,CAAM,EAAA,IAAM,EAAE,MAAA,KAAW;AAAA,SACjD;AACA,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,SAAA,GAA6B;AAAA,UACjC,UAAU,KAAA,CAAM,EAAA;AAAA,UAChB,MAAA,EAAQ,UAAA;AAAA,UACR,WAAA,EAAa;AAAA,SACf;AACA,QAAA,QAAA,CAAS,CAAC,GAAG,OAAA,EAAS,SAAS,CAAC,CAAA;AAAA,MAClC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,OAAA,EAAS,QAAQ;AAAA,GAC5B;AAEA,EAAA,MAAM,cAAA,GAAiBA,WAAAA,CAAY,CAAC,CAAA,KAAiB;AACnD,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,aAAa,UAAA,GAAa,MAAA;AAAA,EAC9B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAA,KAAW,CAAA;AAEnC,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAGC,gBAAAA,EAAiB,GAAG,KAAA,EAAM,EAC/D,QAAA,EAAA;AAAA,oBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO8B,aAAAA,EACV,QAAA,EAAA;AAAA,sBAAA9B,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO+B,YAAAA,EACX,QAAA,EAAA;AAAA,wBAAAhC,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAM,EAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,WAAA,EAAa,2BAAA;AAAA,cACb,aAAA,EAAe;AAAA;AACjB;AAAA,SACF;AAAA,QAAE;AAAA,OAAA,EAEJ,CAAA;AAAA,sBACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAOiC,YAAAA,EAAc,QAAA,EAAA;AAAA,QAAA,OAAA,CAAQ,MAAA;AAAA,QAAO;AAAA,OAAA,EAAQ;AAAA,KAAA,EACpD,CAAA;AAAA,IAEC,0BACCjC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,UAAA;AAAA,QACR,UAAA,EAAY,cAAA;AAAA,QACZ,KAAA,EAAO,cAAA;AAAA,QAEP,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,QAAA,EAAS,MAAM,EAAA,EAAI,CAAA;AAAA,0BAC9BA,GAAAA,CAAC,KAAA,EAAA,EAAI,QAAA,EAAA,4CAAA,EAA0C,CAAA;AAAA,0BAC/CA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,6BAAA,IAAiC,QAAA,EAAA,iCAAA,EAEzD;AAAA;AAAA;AAAA,KACF,mBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,UAAA,EACT,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,KAAU;AAC9B,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA;AACtC,QAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,CAAO,QAAQ,CAAA;AAElD,QAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,QAAA,uBACED,GAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YAEC,MAAA;AAAA,YACA,KAAA;AAAA,YACA,WAAA;AAAA,YACA,KAAA;AAAA,YACA,QAAA,EAAU,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,YAClC,QAAA,EAAU,CAAC,OAAA,KAAY,YAAA,CAAa,OAAO,OAAO,CAAA;AAAA,YAClD,SAAA,EAAW;AAAA,WAAA;AAAA,UAPN,GAAG,MAAA,CAAO,QAAQ,IAAI,MAAA,CAAO,MAAM,IAAI,KAAK,CAAA;AAAA,SAQnD;AAAA,MAEJ,CAAC,CAAA;AAAA,sBAGDA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,UAAA;AAAA,UACR,UAAA,EAAY,cAAA;AAAA,UACZ,KAAA,EAAO;AAAA,YACL,GAAG,cAAA;AAAA,YACH,OAAA,EAAS,2BAAA;AAAA,YACT,SAAA,EAAW;AAAA,WACb;AAAA,UAEA,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,yBAAA,EAAuB;AAAA;AAAA;AAC/B,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACjPA,IAAME,gBAAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA;AASA,SAAS,UAAA,CAAW,OAAe,QAAA,EAA4B;AAC7D,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,EAAA,MAAM,IAAA,GAAO,QAAA,EAAU,WAAA,EAAY,IAAK,EAAA;AAGxC,EAAA,IACE,IAAA,CAAK,SAAS,KAAK,CAAA,IACnB,KAAK,QAAA,CAAS,SAAS,CAAA,IACvB,IAAA,CAAK,QAAA,CAAS,SAAS,KACvB,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IACrB,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IACtB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EACpB;AACA,IAAA,MAAM,GAAA,GAAM,WAAW,KAAK,CAAA;AAC5B,IAAA,OAAO,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA,GAAQ,GAAA;AAAA,EAC9B;AAGA,EAAA,IAAI,IAAA,KAAS,SAAA,IAAa,IAAA,KAAS,MAAA,EAAQ;AACzC,IAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAChC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,GAAA,EAAK,OAAO,IAAA;AAC9C,IAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,GAAA,EAAK,OAAO,KAAA;AAC/C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,EAAA;AAClD,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAChD,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAKA,SAAS,aAAa,QAAA,EAA+C;AACnE,EAAA,MAAM,IAAA,GAAO,QAAA,EAAU,WAAA,EAAY,IAAK,EAAA;AAExC,EAAA,IACE,IAAA,CAAK,SAAS,KAAK,CAAA,IACnB,KAAK,QAAA,CAAS,SAAS,CAAA,IACvB,IAAA,CAAK,QAAA,CAAS,SAAS,KACvB,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IACrB,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IACtB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EACpB;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,SAAS,MAAM,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACnD,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AASO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAAuC;AACrC,EAAA,MAAM,SAAA,GAAY,aAAa,QAAQ,CAAA;AAGvC,EAAA,IAAI,QAAA,KAAa,SAAA,IAAa,QAAA,KAAa,aAAA,EAAe;AACxD,IAAA,uBAAOF,GAAAA,CAAAoB,QAAAA,EAAA,EAAE,CAAA;AAAA,EACX;AAGA,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,MAAA,EAAW,MAAS,CAAA;AAEvE,IAAA,uBACEnB,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAOC,gBAAAA,EAChC,QAAA,EAAA;AAAA,sBAAAF,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,IAAA;AAAA,UACV,IAAA,EAAM,SAAA;AAAA,UACN,WAAA,EAAY,KAAA;AAAA,UACZ,KAAA,EAAO,YAAY,GAAG,CAAA;AAAA,UACtB,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,YAAA,MAAM,MAAA,GAAS,UAAA,CAAW,CAAA,CAAE,MAAA,CAAO,OAAO,QAAQ,CAAA;AAClD,YAAA,QAAA,CAAS,CAAC,MAAA,EAAQ,GAAG,CAAC,CAAA;AAAA,UACxB,CAAA;AAAA,UACA,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA;AAAE;AAAA,OACnB;AAAA,sBACAA,IAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,iCAAA,IAAqC,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,sBAC9DA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,IAAA;AAAA,UACV,IAAA,EAAM,SAAA;AAAA,UACN,WAAA,EAAY,KAAA;AAAA,UACZ,KAAA,EAAO,YAAY,GAAG,CAAA;AAAA,UACtB,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,YAAA,MAAM,MAAA,GAAS,UAAA,CAAW,CAAA,CAAE,MAAA,CAAO,OAAO,QAAQ,CAAA;AAClD,YAAA,QAAA,CAAS,CAAC,GAAA,EAAK,MAAM,CAAC,CAAA;AAAA,UACxB,CAAA;AAAA,UACA,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA;AAAE;AAAA;AACnB,KAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,QAAA,KAAa,KAAA,IAAS,QAAA,KAAa,QAAA,IAAY,aAAa,YAAA,EAAc;AAC5E,IAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAA2C;AACpE,MAAA,MAAM,MAAA,GAAS,EAAE,MAAA,CAAO,KAAA,CACrB,MAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CACnB,MAAA,CAAO,OAAO,CAAA,CACd,GAAA,CAAI,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,EAAG,QAAQ,CAAC,CAAA;AACrC,MAAA,QAAA,CAAS,MAAM,CAAA;AAAA,IACjB,CAAA;AAEA,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAOE,kBAChC,QAAA,kBAAAF,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAK,MAAA;AAAA,QACL,WAAA,EAAY,qBAAA;AAAA,QACZ,KAAA,EAAO,YAAY,KAAK,CAAA;AAAA,QACxB,QAAA;AAAA,QACA,QAAA,EAAU,iBAAA;AAAA,QACV,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA;AAAE;AAAA,KACnB,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAOE,kBAChC,QAAA,kBAAAF,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAY,OAAA;AAAA,MACZ,KAAA,EAAO,YAAY,KAAK,CAAA;AAAA,MACxB,QAAA;AAAA,MACA,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,WAAW,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,MAC9D,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA;AAAE;AAAA,GACnB,EACF,CAAA;AAEJ;ACrKA,IAAM,SAAA,GAAiC;AAAA,EACrC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,8BAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,kBAAA,GAA0C;AAAA,EAC9C,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,oBAAA,GAA4C;AAAA,EAChD,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,gBAAA,GAAwC;AAAA,EAC5C,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;AAEA,IAAMmC,mBAAAA,GAA0C;AAAA,EAC9C,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,aAAA;AAAA,EACjB,MAAA,EAAQ,MAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,KAAA,EAAO,iCAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,aAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AAMA,IAAM,YAAA,GAA2D;AAAA,EAC/D,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,GAAA,EAAI;AAAA,EAC1B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,IAAA,EAAK;AAAA,EAC5B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,GAAA,EAAI;AAAA,EAC1B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,IAAA,EAAK;AAAA,EAC5B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,GAAA,EAAI;AAAA,EAC1B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,IAAA,EAAK;AAAA,EAC5B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC/B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,EACjC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACvC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY;AAAA,EACzC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,IAAA,EAAK;AAAA,EAC5B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,YAAA,EAAa;AAAA,EAC3C,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,EACrC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,EACrC,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,aAAA;AACjC,CAAA;AAKA,SAAS,oBAAoB,QAAA,EAAmD;AAC9E,EAAA,IAAI,CAAC,UAAU,OAAO,YAAA;AAEtB,EAAA,MAAM,IAAA,GAAO,SAAS,WAAA,EAAY;AAGlC,EAAA,IACE,IAAA,CAAK,SAAS,KAAK,CAAA,IACnB,KAAK,QAAA,CAAS,SAAS,CAAA,IACvB,IAAA,CAAK,QAAA,CAAS,SAAS,KACvB,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IACrB,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IACtB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EACpB;AACA,IAAA,OAAO,YAAA,CAAa,MAAA;AAAA,MAAO,CAAC,EAAA,KAC1B,CAAC,MAAM,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,cAAc,SAAA,EAAW,SAAA,EAAW,aAAa,CAAA,CAAE,QAAA,CAAS,GAAG,KAAK;AAAA,KAC/H;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AAChF,IAAA,OAAO,YAAA,CAAa,MAAA;AAAA,MAAO,CAAC,EAAA,KAC1B,CAAC,MAAM,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,cAAc,SAAA,EAAW,SAAA,EAAW,aAAa,CAAA,CAAE,QAAA,CAAS,GAAG,KAAK;AAAA,KAC/H;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,KAAS,SAAA,IAAa,IAAA,KAAS,MAAA,EAAQ;AACzC,IAAA,OAAO,YAAA,CAAa,MAAA;AAAA,MAAO,CAAC,EAAA,KAC1B,CAAC,IAAA,EAAM,KAAA,EAAO,WAAW,aAAa,CAAA,CAAE,QAAA,CAAS,EAAA,CAAG,KAAK;AAAA,KAC3D;AAAA,EACF;AAGA,EAAA,OAAO,YAAA;AACT;AASO,SAAS,SAAA,CAAU;AAAA,EACxB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAgC;AAE9B,EAAA,MAAM,aAAA,GAAgBV,QAAQ,MAAM;AAClC,IAAA,MAAM,UAAkC,EAAC;AAEzC,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,MAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,KAAA,CAAM,IAAI,CAAA;AACnE,MAAA,IAAI,CAAC,WAAA,EAAa;AAElB,MAAA,WAAA,CAAY,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AACtC,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,OAAO,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,CAAA;AAAA,UACjC,KAAA,EAAO,GAAG,KAAA,CAAM,KAAA,IAAS,MAAM,IAAI,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA;AAAA,SACnD,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAGnB,EAAA,MAAM,mBAAA,GAAsBA,QAAQ,MAAM;AACxC,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,OAAO,QAAQ,CAAA;AACzD,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,IAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,KAAA,CAAM,IAAI,CAAA;AACnE,IAAA,IAAI,CAAC,aAAa,OAAO,MAAA;AAEzB,IAAA,OAAO,WAAA,CAAY,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,OAAO,MAAM,CAAA;AAAA,EACjE,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,QAAA,EAAU,MAAA,CAAO,MAAM,CAAC,CAAA;AAEnD,EAAA,MAAM,eAAA,GAAkBA,OAAAA;AAAA,IACtB,MAAM,mBAAA,CAAoB,mBAAA,EAAqB,SAAS,CAAA;AAAA,IACxD,CAAC,mBAAmB;AAAA,GACtB;AAEA,EAAA,MAAM,kBAAA,GAAqBhB,WAAAA;AAAA,IACzB,CAAC,QAAA,KAAqB;AACpB,MAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,QAAA,CAAS,MAAM,GAAG,CAAA;AAChD,MAAA,IAAI,WAAW,UAAA,EAAY;AACzB,QAAA,QAAA,CAAS;AAAA,UACP,GAAG,MAAA;AAAA,UACH,QAAA,EAAU,OAAA;AAAA,UACV,MAAA,EAAQ,UAAA;AAAA;AAAA,UAER,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,GACnB;AAEA,EAAA,MAAM,oBAAA,GAAuBA,WAAAA;AAAA,IAC3B,CAAC,QAAA,KAA6B;AAE5B,MAAA,MAAM,QAAQ,QAAA,KAAa,SAAA,IAAa,QAAA,KAAa,aAAA,GAAgB,SAAY,MAAA,CAAO,KAAA;AACxF,MAAA,QAAA,CAAS,EAAE,GAAG,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,GACnB;AAEA,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACxB,CAAC,KAAA,KAAmB;AAClB,MAAA,QAAA,CAAS,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,IAC/B,CAAA;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,GACnB;AAEA,EAAA,MAAM,kBAAkB,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,CAAA;AAE3D,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,SAAA,EAChC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,kBAAA,EACV,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,eAAA;AAAA,QACP,QAAA,EAAU,kBAAA;AAAA,QACV,OAAA,EAAS,aAAA;AAAA,QACT,WAAA,EAAY,eAAA;AAAA,QACZ,IAAA,EAAK,IAAA;AAAA,QACL,UAAA,EAAU;AAAA;AAAA,KACZ,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,sBACV,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAO,MAAA,CAAO,QAAA;AAAA,QACd,QAAA,EAAU,oBAAA;AAAA,QACV,OAAA,EAAS,eAAA;AAAA,QACT,IAAA,EAAK;AAAA;AAAA,KACP,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,kBACV,QAAA,kBAAAA,GAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,QAAA,EAAU,iBAAA;AAAA,QACV,UAAU,mBAAA,EAAqB;AAAA;AAAA,KACjC,EACF,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,QAAA;AAAA,QACT,KAAA,EAAOmC,mBAAAA;AAAA,QACP,YAAA,EAAW,eAAA;AAAA,QAEX,0BAAAnC,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,GAAA,EAAI,MAAM,EAAA,EAAI;AAAA;AAAA;AAC3B,GAAA,EACF,CAAA;AAEJ;ACrOA,IAAME,gBAAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK;AACP,CAAA;AAEA,IAAM6B,aAAAA,GAAoC;AAAA,EACxC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,YAAA,EAAc;AAChB,CAAA;AAEA,IAAMC,YAAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,6BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAA;AAEA,IAAME,YAAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAEA,IAAME,YAAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,2BAAA;AAAA,EACT,SAAA,EAAW,QAAA;AAAA,EACX,KAAA,EAAO,iCAAA;AAAA,EACP,QAAA,EAAU,6BAAA;AAAA,EACV,eAAA,EAAiB,8BAAA;AAAA,EACjB,MAAA,EAAQ,wCAAA;AAAA,EACR,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,iBAAA,GAAyC;AAAA,EAC7C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,aAAA,GAAqC;AAAA,EACzC,OAAA,EAAS,MAAA;AAAA,EACT,GAAA,EAAK;AACP,CAAA;AAmBO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAoC;AAElC,EAAA,MAAM,gBAAA,GAAmB3B,YAAY,MAA+B;AAClE,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,IAAA,MAAM,UAAA,GAAa,OAAO,CAAC,CAAA;AAC3B,IAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,IAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAA,CAAW,IAAI,CAAA;AACxE,IAAA,MAAM,WAAA,GAAc,WAAA,EAAa,OAAA,CAAQ,CAAC,CAAA;AAE1C,IAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AAEzB,IAAA,OAAO;AAAA,MACL,UAAU,UAAA,CAAW,EAAA;AAAA,MACrB,QAAQ,WAAA,CAAY,IAAA;AAAA,MACpB,QAAA,EAAU,IAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAEnB,EAAA,MAAM,eAAA,GAAkBA,YAAY,MAAM;AACxC,IAAA,MAAM,gBAAgB,gBAAA,EAAiB;AACvC,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,QAAA,CAAS,CAAC,GAAG,OAAA,EAAS,aAAa,CAAC,CAAA;AAAA,IACtC;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAExC,EAAA,MAAM,kBAAA,GAAqBA,WAAAA;AAAA,IACzB,CAAC,OAAe,MAAA,KAA6B;AAC3C,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,OAAO,CAAA;AAC9B,MAAA,UAAA,CAAW,KAAK,CAAA,GAAI,MAAA;AACpB,MAAA,QAAA,CAAS,UAAU,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,SAAS,QAAQ;AAAA,GACpB;AAEA,EAAA,MAAM,kBAAA,GAAqBA,WAAAA;AAAA,IACzB,CAAC,KAAA,KAAkB;AACjB,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,OAAO,CAAA;AAC9B,MAAA,UAAA,CAAW,MAAA,CAAO,OAAO,CAAC,CAAA;AAC1B,MAAA,QAAA,CAAS,UAAU,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,SAAS,QAAQ;AAAA,GACpB;AAEA,EAAA,MAAM,cAAA,GAAiBA,YAAY,MAAM;AACvC,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAA,KAAW,CAAA;AACnC,EAAA,MAAM,WAAA,GAAc,OAAO,MAAA,KAAW,CAAA;AAEtC,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAGC,gBAAAA,EAAiB,GAAG,KAAA,EAAM,EAC/D,QAAA,EAAA;AAAA,oBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO8B,aAAAA,EACV,QAAA,EAAA;AAAA,sBAAA9B,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO+B,YAAAA,EACX,QAAA,EAAA;AAAA,wBAAAhC,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAM,EAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,WAAA,EAAa,2BAAA;AAAA,cACb,aAAA,EAAe;AAAA;AACjB;AAAA,SACF;AAAA,QAAE;AAAA,OAAA,EAEJ,CAAA;AAAA,sBACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAOiC,YAAAA,EACV,QAAA,EAAA;AAAA,QAAA,OAAA,CAAQ,MAAA;AAAA,QAAO,GAAA;AAAA,QAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,GAAI,QAAA,GAAW;AAAA,OAAA,EACtD;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,OAAA,mBACClC,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOoC,YAAAA,EACT,QAAA,EAAA,WAAA,mBACCpC,GAAAA,CAAAoB,QAAAA,EAAA,EAAE,QAAA,EAAA,qCAAA,EAAmC,oBAErCpB,GAAAA,CAAAoB,QAAAA,EAAA,EAAE,QAAA,EAAA,2DAAA,EAAyD,CAAA,EAE/D,CAAA,mBAEApB,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,iBAAA,EACT,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,0BACpBA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QAEC,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA,EAAU,CAAC,OAAA,KAAY,kBAAA,CAAmB,OAAO,OAAO,CAAA;AAAA,QACxD,QAAA,EAAU,MAAM,kBAAA,CAAmB,KAAK;AAAA,OAAA;AAAA,MALnC,GAAG,MAAA,CAAO,QAAQ,IAAI,MAAA,CAAO,MAAM,IAAI,KAAK,CAAA;AAAA,KAOpD,CAAA,EACH,CAAA;AAAA,oBAGFC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,aAAA,EACV,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,WAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,0BAAUA,GAAAA,CAAC,QAAK,IAAA,EAAK,MAAA,EAAO,MAAM,EAAA,EAAI,CAAA;AAAA,UACtC,OAAA,EAAS,eAAA;AAAA,UACT,QAAA,EAAU,WAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,MACC,CAAC,2BACAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,0BAAUA,GAAAA,CAAC,QAAK,IAAA,EAAK,OAAA,EAAQ,MAAM,EAAA,EAAI,CAAA;AAAA,UACvC,OAAA,EAAS,cAAA;AAAA,UACV,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;ACtLA,IAAMqC,UAAAA,GAAiC;AAAA,EACrC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,8BAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,MAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAMC,eAAAA,GAAsC;AAAA,EAC1C,OAAA,EAAS,GAAA;AAAA,EACT,WAAA,EAAa;AACf,CAAA;AAEA,IAAMC,eAAAA,GAAsC;AAAA,EAC1C,WAAA,EAAa,8BAAA;AAAA,EACb,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,cAAA,GAAsC;AAAA,EAC1C,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,KAAA,EAAO,MAAA;AAAA,EACP,MAAA,EAAQ,MAAA;AAAA,EACR,eAAA,EAAiB,8BAAA;AAAA,EACjB,KAAA,EAAO,mCAAA;AAAA,EACP,YAAA,EAAc,4BAAA;AAAA,EACd,QAAA,EAAU,6BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AAEA,IAAMC,iBAAAA,GAAwC;AAAA,EAC5C,KAAA,EAAO,iCAAA;AAAA,EACP,MAAA,EAAQ,MAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAMC,mBAAAA,GAA0C;AAAA,EAC9C,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,qBAAA,GAA6C;AAAA,EACjD,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,qDAAA;AAAA,EACT,eAAA,EAAiB,iCAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,KAAA,EAAO,2BAAA;AAAA,EACP,QAAA,EAAU,6BAAA;AAAA,EACV,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,wBAAA;AAAA,EACZ,UAAA,EAAY,CAAA;AAAA,EACZ,QAAA,EAAU;AACZ,CAAA;AAEA,IAAMN,mBAAAA,GAA0C;AAAA,EAC9C,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,aAAA;AAAA,EACjB,MAAA,EAAQ,MAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,KAAA,EAAO,iCAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,aAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AASO,SAAS,OAAA,CAAQ;AAAA,EACtB,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI5B,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAGlD,EAAA,MAAM,aAAA,GAAgBkB,QAAQ,MAAM;AAClC,IAAA,MAAM,UAAkC,EAAC;AAEzC,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,MAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,KAAA,CAAM,IAAI,CAAA;AACnE,MAAA,IAAI,CAAC,WAAA,EAAa;AAElB,MAAA,WAAA,CAAY,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AACtC,QAAA,MAAM,SAAS,WAAA,CAAY,IAAA;AAAA,UACzB,CAAC,IAAA,KACC,IAAA,CAAK,QAAA,KAAa,KAAA,CAAM,MACxB,IAAA,CAAK,MAAA,KAAW,MAAA,CAAO,IAAA,IACvB,EAAE,IAAA,CAAK,QAAA,KAAa,MAAM,EAAA,IAAM,IAAA,CAAK,WAAW,MAAA,CAAO,IAAA;AAAA,SAC3D;AAEA,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,OAAO,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,CAAA;AAAA,UACjC,KAAA,EAAO,GAAG,KAAA,CAAM,KAAA,IAAS,MAAM,IAAI,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,CAAA;AAAA,UAClD,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAA,EAAQ,aAAa,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAC,CAAA;AAE5D,EAAA,MAAM,kBAAA,GAAqBhB,WAAAA;AAAA,IACzB,CAAC,QAAA,KAAqB;AACpB,MAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,QAAA,CAAS,MAAM,GAAG,CAAA;AAChD,MAAA,IAAI,WAAW,UAAA,EAAY;AACzB,QAAA,QAAA,CAAS;AAAA,UACP,GAAG,IAAA;AAAA,UACH,QAAA,EAAU,OAAA;AAAA,UACV,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM,QAAQ;AAAA,GACjB;AAEA,EAAA,MAAM,qBAAA,GAAwBA,YAAY,MAAM;AAC9C,IAAA,MAAM,YAAA,GAA8B,IAAA,CAAK,SAAA,KAAc,KAAA,GAAQ,MAAA,GAAS,KAAA;AACxE,IAAA,QAAA,CAAS,EAAE,GAAG,IAAA,EAAM,SAAA,EAAW,cAAc,CAAA;AAAA,EAC/C,CAAA,EAAG,CAAC,IAAA,EAAM,QAAQ,CAAC,CAAA;AAEnB,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACtB,CAAC,CAAA,KAAiB;AAChB,MAAA,CAAA,CAAE,YAAA,CAAa,OAAA,CAAQ,YAAA,EAAc,MAAA,CAAO,KAAK,CAAC,CAAA;AAClD,MAAA,CAAA,CAAE,aAAa,aAAA,GAAgB,MAAA;AAC/B,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiBA,WAAAA,CAAY,CAAC,CAAA,KAAiB;AACnD,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,aAAa,UAAA,GAAa,MAAA;AAC5B,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBA,YAAY,MAAM;AACxC,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACjB,CAAC,CAAA,KAAiB;AAChB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,MAAM,YAAY,QAAA,CAAS,CAAA,CAAE,aAAa,OAAA,CAAQ,YAAY,GAAG,EAAE,CAAA;AACnE,MAAA,IAAI,CAAC,KAAA,CAAM,SAAS,CAAA,IAAK,cAAc,KAAA,EAAO;AAC5C,QAAA,SAAA,CAAU,WAAW,KAAK,CAAA;AAAA,MAC5B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAO,SAAS;AAAA,GACnB;AAEA,EAAA,MAAM,kBAAkB,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,KAAK,MAAM,CAAA,CAAA;AAEvD,EAAA,uBACER,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,SAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa,eAAA;AAAA,MACb,SAAA,EAAW,aAAA;AAAA,MACX,UAAA,EAAY,cAAA;AAAA,MACZ,WAAA,EAAa,eAAA;AAAA,MACb,MAAA,EAAQ,UAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACL,GAAGoC,UAAAA;AAAA,QACH,GAAI,UAAA,GAAaC,eAAAA,GAAiB,EAAC;AAAA,QACnC,GAAI,UAAA,GAAaC,eAAAA,GAAiB;AAAC,OACrC;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAvC,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAiB,kBAAQ,CAAA,EAAE,CAAA;AAAA,wBAExCA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAOwC,iBAAAA,EACX,QAAA,kBAAAxC,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,MAAA,EAAO,IAAA,EAAM,EAAA,EAAI,CAAA,EAC9B,CAAA;AAAA,wBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOyC,qBACV,QAAA,kBAAAzC,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,eAAA;AAAA,YACP,QAAA,EAAU,kBAAA;AAAA,YACV,OAAA,EAAS,aAAA;AAAA,YACT,WAAA,EAAY,eAAA;AAAA,YACZ,IAAA,EAAK,IAAA;AAAA,YACL,UAAA,EAAU;AAAA;AAAA,SACZ,EACF,CAAA;AAAA,wBAEAC,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,qBAAA;AAAA,YACT,KAAA,EAAO,qBAAA;AAAA,YAEP,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,QAAK,IAAA,EAAM,IAAA,CAAK,cAAc,KAAA,GAAQ,UAAA,GAAa,WAAA,EAAa,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,cAC1E,IAAA,CAAK;AAAA;AAAA;AAAA,SACR;AAAA,wBAEAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,QAAA;AAAA,YACT,KAAA,EAAOmC,mBAAAA;AAAA,YACP,YAAA,EAAW,aAAA;AAAA,YAEX,0BAAAnC,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,GAAA,EAAI,MAAM,EAAA,EAAI;AAAA;AAAA;AAC3B;AAAA;AAAA,GACF;AAEJ;ACzOA,IAAME,gBAAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK;AACP,CAAA;AAEA,IAAM6B,aAAAA,GAAoC;AAAA,EACxC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,YAAA,EAAc;AAChB,CAAA;AAEA,IAAMC,YAAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,6BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAA;AAEA,IAAME,YAAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAEA,IAAME,YAAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,2BAAA;AAAA,EACT,SAAA,EAAW,QAAA;AAAA,EACX,KAAA,EAAO,iCAAA;AAAA,EACP,QAAA,EAAU,6BAAA;AAAA,EACV,eAAA,EAAiB,8BAAA;AAAA,EACjB,MAAA,EAAQ,wCAAA;AAAA,EACR,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,eAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK;AACP,CAAA;AAEA,IAAMM,cAAAA,GAAqC;AAAA,EACzC,OAAA,EAAS,MAAA;AAAA,EACT,GAAA,EAAK;AACP,CAAA;AAoBO,SAAS,WAAA,CAAY;AAAA,EAC1B,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,GAAW,CAAA;AAAA,EACX,SAAA;AAAA,EACA;AACF,CAAA,EAAkC;AAEhC,EAAA,MAAM,WAAA,GAAcjB,OAAAA;AAAA,IAClB,MAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,CAAA;AAAA,IACnE,CAAC,KAAK;AAAA,GACR;AAGA,EAAA,MAAM,cAAA,GAAiBhB,YAAY,MAA6B;AAC9D,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAGhC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,KAAA,CAAM,IAAI,CAAA;AACnE,MAAA,IAAI,CAAC,WAAA,EAAa;AAElB,MAAA,KAAA,MAAW,MAAA,IAAU,YAAY,OAAA,EAAS;AACxC,QAAA,MAAM,SAAS,WAAA,CAAY,IAAA;AAAA,UACzB,CAAC,SAAS,IAAA,CAAK,QAAA,KAAa,MAAM,EAAA,IAAM,IAAA,CAAK,WAAW,MAAA,CAAO;AAAA,SACjE;AAEA,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAO;AAAA,YACL,UAAU,KAAA,CAAM,EAAA;AAAA,YAChB,QAAQ,MAAA,CAAO,IAAA;AAAA,YACf,SAAA,EAAW;AAAA,WACb;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAA,EAAQ,WAAW,CAAC,CAAA;AAEhC,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,MAAM,cAAc,cAAA,EAAe;AACnC,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,QAAA,CAAS,CAAC,GAAG,KAAA,EAAO,WAAW,CAAC,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,QAAA,EAAU,cAAc,CAAC,CAAA;AAEpC,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,CAAC,OAAe,IAAA,KAAyB;AACvC,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,KAAK,CAAA;AAC1B,MAAA,QAAA,CAAS,KAAK,CAAA,GAAI,IAAA;AAClB,MAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,OAAO,QAAQ;AAAA,GAClB;AAEA,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,CAAC,KAAA,KAAkB;AACjB,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,KAAK,CAAA;AAC1B,MAAA,QAAA,CAAS,MAAA,CAAO,OAAO,CAAC,CAAA;AACxB,MAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,OAAO,QAAQ;AAAA,GAClB;AAEA,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,WAAmB,OAAA,KAAoB;AACtC,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,KAAK,CAAA;AAC1B,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,QAAA,CAAS,MAAA,CAAO,WAAW,CAAC,CAAA;AAC9C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,QAAA,CAAS,MAAA,CAAO,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA;AACnC,QAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAO,QAAQ;AAAA,GAClB;AAEA,EAAA,MAAM,cAAA,GAAiBA,YAAY,MAAM;AACvC,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,KAAW,CAAA;AACjC,EAAA,MAAM,WAAA,GAAc,OAAO,MAAA,KAAW,CAAA;AACtC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,GAAS,QAAA,IAAY,gBAAe,KAAM,IAAA;AAEnE,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAGC,gBAAAA,EAAiB,GAAG,KAAA,EAAM,EAC/D,QAAA,EAAA;AAAA,oBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO8B,aAAAA,EACV,QAAA,EAAA;AAAA,sBAAA9B,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO+B,YAAAA,EACX,QAAA,EAAA;AAAA,wBAAAhC,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,IAAA,EAAM,EAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,WAAA,EAAa,2BAAA;AAAA,cACb,aAAA,EAAe;AAAA;AACjB;AAAA,SACF;AAAA,QAAE;AAAA,OAAA,EAEJ,CAAA;AAAA,sBACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAOiC,YAAAA,EACV,QAAA,EAAA;AAAA,QAAA,KAAA,CAAM,MAAA;AAAA,QAAO,KAAA;AAAA,QAAI,QAAA;AAAA,QAAS;AAAA,OAAA,EAC7B;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,OAAA,mBACClC,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOoC,YAAAA,EACT,QAAA,EAAA,WAAA,mBACCpC,GAAAA,CAAAoB,QAAAA,EAAA,EAAE,QAAA,EAAA,qCAAA,EAAmC,oBAErCpB,GAAAA,CAAAoB,QAAAA,EAAA,EAAE,QAAA,EAAA,wDAAA,EAAsD,CAAA,EAE5D,CAAA,mBAEApB,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,eAAA,EACT,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,0BAChBA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QAEC,IAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA,EAAU,CAAC,OAAA,KAAY,gBAAA,CAAiB,OAAO,OAAO,CAAA;AAAA,QACtD,QAAA,EAAU,MAAM,gBAAA,CAAiB,KAAK,CAAA;AAAA,QACtC,SAAA,EAAW,aAAA;AAAA,QACX;AAAA,OAAA;AAAA,MARK,GAAG,IAAA,CAAK,QAAQ,IAAI,IAAA,CAAK,MAAM,IAAI,KAAK,CAAA;AAAA,KAUhD,CAAA,EACH,CAAA;AAAA,oBAGFC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOyC,cAAAA,EACV,QAAA,EAAA;AAAA,sBAAA1C,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,WAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,0BAAUA,GAAAA,CAAC,QAAK,IAAA,EAAK,MAAA,EAAO,MAAM,EAAA,EAAI,CAAA;AAAA,UACtC,OAAA,EAAS,aAAA;AAAA,UACT,UAAU,CAAC,UAAA;AAAA,UACZ,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,MACC,CAAC,2BACAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,0BAAUA,GAAAA,CAAC,QAAK,IAAA,EAAK,OAAA,EAAQ,MAAM,EAAA,EAAI,CAAA;AAAA,UACvC,OAAA,EAAS,cAAA;AAAA,UACV,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AC7NA,IAAMqC,UAAAA,GAAiC;AAAA,EACrC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,8BAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,mBAAA,GAA2C;AAAA,EAC/C,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO,iCAAA;AAAA,EACP,UAAA,EAAY;AACd,CAAA;AAMA,IAAM,iBAAA,GAA+D;AAAA,EACnE,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,YAAA,EAAa;AAAA,EACtC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAY;AAAA,EACpC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,YAAA,EAAa;AAAA,EACtC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,WAAA;AAC1B,CAAA;AASO,SAAS,OAAA,CAAQ;AAAA,EACtB,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAE5B,EAAA,MAAM,YAAA,GAAeZ,QAAQ,MAAM;AACjC,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACxB,OAAO,CAAA,CAAE,EAAA;AAAA,MACT,KAAA,EAAO,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE;AAAA,KACtB,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,MAAM,iBAAA,GAAoBA,QAAQ,MAAM;AACtC,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,KAAK,aAAa,CAAA;AAC5D,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAEpB,IAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,KAAA,CAAM,IAAI,CAAA;AACnE,IAAA,IAAI,CAAC,WAAA,EAAa,OAAO,EAAC;AAE1B,IAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MACvC,OAAO,GAAA,CAAI,IAAA;AAAA,MACX,OAAO,GAAA,CAAI;AAAA,KACb,CAAE,CAAA;AAAA,EACJ,GAAG,CAAC,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,aAAa,CAAC,CAAA;AAGvC,EAAA,MAAM,eAAA,GAAkBA,QAAQ,MAAM;AACpC,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,KAAK,WAAW,CAAA;AAC1D,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAEpB,IAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,KAAA,CAAM,IAAI,CAAA;AACnE,IAAA,IAAI,CAAC,WAAA,EAAa,OAAO,EAAC;AAE1B,IAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MACvC,OAAO,GAAA,CAAI,IAAA;AAAA,MACX,OAAO,GAAA,CAAI;AAAA,KACb,CAAE,CAAA;AAAA,EACJ,GAAG,CAAC,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,WAAW,CAAC,CAAA;AAErC,EAAA,MAAM,qBAAA,GAAwBhB,WAAAA;AAAA,IAC5B,CAAC,KAAA,KAAkB;AACjB,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAC/C,MAAA,MAAM,WAAA,GAAc,KAAA,GAChB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,KAAA,CAAM,IAAI,CAAA,GAC/C,IAAA;AACJ,MAAA,MAAM,WAAA,GAAc,WAAA,EAAa,OAAA,CAAQ,CAAC,GAAG,IAAA,IAAQ,EAAA;AAErD,MAAA,QAAA,CAAS;AAAA,QACP,GAAG,IAAA;AAAA,QACH,aAAA,EAAe,KAAA;AAAA,QACf,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,MAAM;AAAA,GACjC;AAEA,EAAA,MAAM,sBAAA,GAAyBA,WAAAA;AAAA,IAC7B,CAAC,KAAA,KAAkB;AACjB,MAAA,QAAA,CAAS,EAAE,GAAG,IAAA,EAAM,WAAA,EAAa,OAAO,CAAA;AAAA,IAC1C,CAAA;AAAA,IACA,CAAC,MAAM,QAAQ;AAAA,GACjB;AAEA,EAAA,MAAM,mBAAA,GAAsBA,WAAAA;AAAA,IAC1B,CAAC,KAAA,KAAkB;AACjB,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAC/C,MAAA,MAAM,WAAA,GAAc,KAAA,GAChB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,KAAA,CAAM,IAAI,CAAA,GAC/C,IAAA;AACJ,MAAA,MAAM,WAAA,GAAc,WAAA,EAAa,OAAA,CAAQ,CAAC,GAAG,IAAA,IAAQ,EAAA;AAErD,MAAA,QAAA,CAAS;AAAA,QACP,GAAG,IAAA;AAAA,QACH,WAAA,EAAa,KAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,MAAM;AAAA,GACjC;AAEA,EAAA,MAAM,oBAAA,GAAuBA,WAAAA;AAAA,IAC3B,CAAC,KAAA,KAAkB;AACjB,MAAA,QAAA,CAAS,EAAE,GAAG,IAAA,EAAM,SAAA,EAAW,OAAO,CAAA;AAAA,IACxC,CAAA;AAAA,IACA,CAAC,MAAM,QAAQ;AAAA,GACjB;AAEA,EAAA,MAAM,oBAAA,GAAuBA,WAAAA;AAAA,IAC3B,CAAC,KAAA,KAAkB;AACjB,MAAA,QAAA,CAAS,EAAE,GAAG,IAAA,EAAM,SAAA,EAAW,OAAmB,CAAA;AAAA,IACpD,CAAA;AAAA,IACA,CAAC,MAAM,QAAQ;AAAA,GACjB;AAEA,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOoC,UAAAA,EACV,QAAA,EAAA;AAAA,oBAAApC,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,WAAA,EAAc,QAAA,EAAA;AAAA,MAAA,KAAA,GAAQ,CAAA;AAAA,MAAE;AAAA,KAAA,EAAC,CAAA;AAAA,oBAGtCD,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,qBACV,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAO,IAAA,CAAK,SAAA;AAAA,QACZ,OAAA,EAAS,iBAAA;AAAA,QACT,QAAA,EAAU,oBAAA;AAAA,QACV,IAAA,EAAK;AAAA;AAAA,KACP,EACF,CAAA;AAAA,oBAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,qBACV,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAO,IAAA,CAAK,aAAA;AAAA,QACZ,OAAA,EAAS,YAAA;AAAA,QACT,QAAA,EAAU,qBAAA;AAAA,QACV,WAAA,EAAY,YAAA;AAAA,QACZ,IAAA,EAAK;AAAA;AAAA,KACP,EACF,CAAA;AAAA,oBAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,qBACV,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAO,IAAA,CAAK,WAAA;AAAA,QACZ,OAAA,EAAS,iBAAA;AAAA,QACT,QAAA,EAAU,sBAAA;AAAA,QACV,WAAA,EAAY,QAAA;AAAA,QACZ,IAAA,EAAK;AAAA;AAAA,KACP,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,aAAa,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,oBAG3BA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,qBACV,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAO,IAAA,CAAK,WAAA;AAAA,QACZ,OAAA,EAAS,YAAA;AAAA,QACT,QAAA,EAAU,mBAAA;AAAA,QACV,WAAA,EAAY,UAAA;AAAA,QACZ,IAAA,EAAK;AAAA;AAAA,KACP,EACF,CAAA;AAAA,oBAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,qBACV,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAO,IAAA,CAAK,SAAA;AAAA,QACZ,OAAA,EAAS,eAAA;AAAA,QACT,QAAA,EAAU,oBAAA;AAAA,QACV,WAAA,EAAY,QAAA;AAAA,QACZ,IAAA,EAAK;AAAA;AAAA,KACP,EACF,CAAA;AAAA,oBAGAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAS,QAAA;AAAA,QACT,YAAA,EAAW,aAAA;AAAA,QACX,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAO;AAAA,QAE5B,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,GAAA,EAAI,MAAM,EAAA,EAAI;AAAA;AAAA;AAC3B,GAAA,EACF,CAAA;AAEJ;AC/MA,IAAME,iBAAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK;AACP,CAAA;AAEA,IAAM6B,aAAAA,GAAoC;AAAA,EACxC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,YAAA,EAAc;AAChB,CAAA;AAEA,IAAMC,YAAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,6BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAA;AAEA,IAAME,YAAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAEA,IAAME,YAAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,2BAAA;AAAA,EACT,SAAA,EAAW,QAAA;AAAA,EACX,KAAA,EAAO,iCAAA;AAAA,EACP,QAAA,EAAU,6BAAA;AAAA,EACV,eAAA,EAAiB,8BAAA;AAAA,EACjB,MAAA,EAAQ,wCAAA;AAAA,EACR,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,eAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK;AACP,CAAA;AAEA,IAAMM,cAAAA,GAAqC;AAAA,EACzC,OAAA,EAAS,MAAA;AAAA,EACT,GAAA,EAAK;AACP,CAAA;AAoBO,SAAS,WAAA,CAAY;AAAA,EAC1B,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,GAAW,EAAA;AAAA,EACX,SAAA;AAAA,EACA;AACF,CAAA,EAAkC;AAEhC,EAAA,MAAM,UAAA,GAAajB,QAAQ,MAAM;AAC/B,IAAA,OAAO,MAAA,CAAO,MAAA,IAAU,CAAA,IAAK,KAAA,CAAM,MAAA,GAAS,QAAA;AAAA,EAC9C,GAAG,CAAC,MAAA,CAAO,QAAQ,KAAA,CAAM,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAG1C,EAAA,MAAM,cAAA,GAAiBhB,YAAY,MAA6B;AAC9D,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAE9B,IAAA,MAAM,SAAA,GAAY,OAAO,CAAC,CAAA;AAC1B,IAAA,MAAM,OAAA,GAAU,OAAO,CAAC,CAAA;AACxB,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,OAAA,EAAS,OAAO,IAAA;AAEnC,IAAA,MAAM,eAAA,GAAkB,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,SAAA,CAAU,IAAI,CAAA;AAC3E,IAAA,MAAM,aAAA,GAAgB,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,OAAA,CAAQ,IAAI,CAAA;AAEvE,IAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,aAAA,EAAe,OAAO,IAAA;AAG/C,IAAA,IAAI,UAAA,GAAa,eAAA,CAAgB,OAAA,CAAQ,CAAC,GAAG,IAAA,IAAQ,EAAA;AACrD,IAAA,IAAI,QAAA,GAAW,aAAA,CAAc,OAAA,CAAQ,CAAC,GAAG,IAAA,IAAQ,EAAA;AAGjD,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,MAAM,EAAE,CAAA;AACjD,IAAA,MAAM,SAAA,GAAY,GAAG,WAAW,CAAA,GAAA,CAAA;AAGhC,IAAA,MAAM,QAAA,GAAW,gBAAgB,OAAA,CAAQ,IAAA;AAAA,MACvC,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,aAAa,CAAA,CAAE,IAAA,KAAS,GAAG,WAAW,CAAA,EAAA;AAAA,KAC1D;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,UAAA,GAAa,QAAA,CAAS,IAAA;AACtB,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AAGA,IAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,MAAM,EAAE,CAAA;AACrD,IAAA,MAAM,gBAAA,GAAmB,GAAG,aAAa,CAAA,GAAA,CAAA;AACzC,IAAA,MAAM,eAAA,GAAkB,cAAc,OAAA,CAAQ,IAAA;AAAA,MAC5C,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,oBAAoB,CAAA,CAAE,IAAA,KAAS,GAAG,aAAa,CAAA,EAAA;AAAA,KACnE;AACA,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,QAAA,GAAW,eAAA,CAAgB,IAAA;AAAA,IAC7B;AAEA,IAAA,OAAO;AAAA,MACL,eAAe,SAAA,CAAU,EAAA;AAAA,MACzB,WAAA,EAAa,UAAA;AAAA,MACb,aAAa,OAAA,CAAQ,EAAA;AAAA,MACrB,SAAA,EAAW,QAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAEnB,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,MAAM,cAAc,cAAA,EAAe;AACnC,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,QAAA,CAAS,CAAC,GAAG,KAAA,EAAO,WAAW,CAAC,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,QAAA,EAAU,cAAc,CAAC,CAAA;AAEpC,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,CAAC,OAAe,IAAA,KAAyB;AACvC,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,KAAK,CAAA;AAC1B,MAAA,QAAA,CAAS,KAAK,CAAA,GAAI,IAAA;AAClB,MAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,OAAO,QAAQ;AAAA,GAClB;AAEA,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,CAAC,KAAA,KAAkB;AACjB,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,KAAK,CAAA;AAC1B,MAAA,QAAA,CAAS,MAAA,CAAO,OAAO,CAAC,CAAA;AACxB,MAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,OAAO,QAAQ;AAAA,GAClB;AAEA,EAAA,MAAM,cAAA,GAAiBA,YAAY,MAAM;AACvC,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,KAAW,CAAA;AACjC,EAAA,MAAM,eAAA,GAAkB,OAAO,MAAA,GAAS,CAAA;AAExC,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAGC,iBAAAA,EAAiB,GAAG,KAAA,EAAM,EAC/D,QAAA,EAAA;AAAA,oBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO8B,aAAAA,EACV,QAAA,EAAA;AAAA,sBAAA9B,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO+B,YAAAA,EACX,QAAA,EAAA;AAAA,wBAAAhC,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,IAAA,EAAM,EAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,WAAA,EAAa,2BAAA;AAAA,cACb,aAAA,EAAe;AAAA;AACjB;AAAA,SACF;AAAA,QAAE;AAAA,OAAA,EAEJ,CAAA;AAAA,sBACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAOiC,YAAAA,EACV,QAAA,EAAA;AAAA,QAAA,KAAA,CAAM,MAAA;AAAA,QAAO,KAAA;AAAA,QAAI,QAAA;AAAA,QAAS;AAAA,OAAA,EAC7B;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,OAAA,mBACClC,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOoC,YAAAA,EACT,QAAA,EAAA,eAAA,mBACCpC,GAAAA,CAAAoB,QAAAA,EAAA,EAAE,QAAA,EAAA,uCAAA,EAAqC,oBAEvCpB,GAAAA,CAAAoB,QAAAA,EAAA,EAAE,QAAA,EAAA,uDAAA,EAAqD,CAAA,EAE3D,CAAA,mBAEApB,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,eAAA,EACT,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,0BAChBA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QAEC,IAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA,EAAU,CAAC,OAAA,KAAY,gBAAA,CAAiB,OAAO,OAAO,CAAA;AAAA,QACtD,QAAA,EAAU,MAAM,gBAAA,CAAiB,KAAK;AAAA,OAAA;AAAA,MANjC,GAAG,IAAA,CAAK,aAAa,IAAI,IAAA,CAAK,WAAW,IAAI,KAAK,CAAA;AAAA,KAQ1D,CAAA,EACH,CAAA;AAAA,oBAGFC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOyC,cAAAA,EACV,QAAA,EAAA;AAAA,sBAAA1C,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,WAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,0BAAUA,GAAAA,CAAC,QAAK,IAAA,EAAK,MAAA,EAAO,MAAM,EAAA,EAAI,CAAA;AAAA,UACtC,OAAA,EAAS,aAAA;AAAA,UACT,UAAU,CAAC,UAAA;AAAA,UACZ,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,MACC,CAAC,2BACAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,0BAAUA,GAAAA,CAAC,QAAK,IAAA,EAAK,OAAA,EAAQ,MAAM,EAAA,EAAI,CAAA;AAAA,UACvC,OAAA,EAAS,cAAA;AAAA,UACV,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AC3NA,IAAM,eAAA,GAAqC;AAAA,EACzC;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,WAAA,EAAa,uCAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAO,KAAA;AAAA,IACP,WAAA,EAAa,iCAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,WAAA,EAAa,4CAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAA,EAAO,OAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,WAAA,EAAa,0BAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,KAAA,EAAO,gBAAA;AAAA,IACP,WAAA,EAAa,mCAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAO,KAAA;AAAA,IACP,WAAA,EAAa,wBAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAO,KAAA;AAAA,IACP,WAAA,EAAa,wBAAA;AAAA,IACb,IAAA,EAAM;AAAA;AAEV,CAAA;AAKA,SAAS,yBAAyB,QAAA,EAAqC;AACrE,EAAA,MAAM,IAAA,GAAO,SAAS,WAAA,EAAY;AAGlC,EAAA,IACE,IAAA,CAAK,SAAS,KAAK,CAAA,IACnB,KAAK,QAAA,CAAS,SAAS,CAAA,IACvB,IAAA,CAAK,QAAA,CAAS,SAAS,KACvB,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IACrB,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IACtB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EACpB;AACA,IAAA,OAAO,CAAC,MAAA,EAAQ,KAAA,EAAO,OAAO,OAAA,EAAS,gBAAA,EAAkB,OAAO,KAAK,CAAA;AAAA,EACvE;AAGA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AAChF,IAAA,OAAO,CAAC,MAAA,EAAQ,OAAA,EAAS,gBAAA,EAAkB,OAAO,KAAK,CAAA;AAAA,EACzD;AAGA,EAAA,IAAI,IAAA,KAAS,SAAA,IAAa,IAAA,KAAS,MAAA,EAAQ;AACzC,IAAA,OAAO,CAAC,MAAA,EAAQ,OAAA,EAAS,gBAAgB,CAAA;AAAA,EAC3C;AAGA,EAAA,OAAO,CAAC,MAAA,EAAQ,OAAA,EAAS,gBAAgB,CAAA;AAC3C;AAMA,IAAME,iBAAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK;AACP,CAAA;AAkBO,SAAS,iBAAA,CAAkB;AAAA,EAChC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,IAAA,GAAO,IAAA;AAAA,EACP,SAAA;AAAA,EACA;AACF,CAAA,EAAwC;AAEtC,EAAA,MAAM,qBAAA,GAAwBuB,OAAAA;AAAA,IAC5B,MAAM,yBAAyB,UAAU,CAAA;AAAA,IACzC,CAAC,UAAU;AAAA,GACb;AAGA,EAAA,MAAM,OAAA,GAA2CA,OAAAA;AAAA,IAC/C,MACE,eAAA,CACG,MAAA,CAAO,CAAC,IAAA,KAAS,qBAAA,CAAsB,QAAA,CAAS,IAAA,CAAK,KAAK,CAAC,CAAA,CAC3D,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACd,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,OAAO,IAAA,CAAK;AAAA,KACd,CAAE,CAAA;AAAA,IACN,CAAC,qBAAqB;AAAA,GACxB;AAGA,EAAA,MAAM,cAAc,eAAA,CAAgB,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,UAAU,KAAK,CAAA;AAEvE,EAAA,uBACExB,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAGC,iBAAAA,EAAiB,GAAG,KAAA,EAAM,EAC/D,QAAA,EAAA;AAAA,oBAAAF,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,aAAa,WAAA,IAAe,oBAAA;AAAA,QACrC,QAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,GAAA;AAAA,QAEP,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,aAAA,IACtB,QAAA,kBAAAA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,aAAa,IAAA,IAAQ,OAAA;AAAA,YAC3B,IAAA,EAAM,EAAA;AAAA,YACN,KAAA,EAAO,EAAE,KAAA,EAAO,iCAAA;AAAkC;AAAA,SACpD,EACF;AAAA;AAAA,KACF;AAAA,oBACAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACnKA,IAAME,iBAAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,QAAA,EAAU,MAAA;AAAA,EACV,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,qDAAA;AAAA,EACT,SAAA,EAAW,uCAAA;AAAA,EACX,eAAA,EAAiB,8BAAA;AAAA,EACjB,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,cAAA,GAAsC;AAAA,EAC1C,UAAA,EAAY,QAAA;AAAA,EACZ,WAAA,EAAa;AACf,CAAA;AASO,SAAS,UAAA,CAAW;AAAA,EACzB,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA,GAAkB,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,GAAG,CAAA;AAAA,EAClC,SAAA;AAAA,EACA;AACF,CAAA,EAAiC;AAC/B,EAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,UAAA,GAAa,QAAQ,CAAC,CAAA;AAC/D,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAA,CAAK,cAAc,CAAA,IAAK,QAAA,GAAW,GAAG,UAAU,CAAA;AACvE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,WAAA,GAAc,UAAU,UAAU,CAAA;AAE3D,EAAA,MAAM,qBAAA,GAAgDuB,OAAAA;AAAA,IACpD,MACE,eAAA,CAAgB,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC7B,KAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAO,GAAG,IAAI,CAAA,OAAA;AAAA,KAChB,CAAE,CAAA;AAAA,IACJ,CAAC,eAAe;AAAA,GAClB;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,cAAc,CAAA,EAAG;AACnB,MAAA,YAAA,CAAa,cAAc,CAAC,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,MAAA,YAAA,CAAa,cAAc,CAAC,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,YAAA,CAAa,CAAC,CAAA;AAAA,EAChB,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,YAAA,CAAa,UAAU,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,uBACExB,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAGC,iBAAAA,EAAiB,GAAG,KAAA,EAAM,EAC/D,QAAA,EAAA;AAAA,oBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,UAAA,EACV,QAAA,EAAA;AAAA,sBAAAA,KAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,UAAS,EAAG,QAAA,EAAA;AAAA,QAAA,UAAA;AAAA,QAC5B,SAAA;AAAA,QAAU,KAAA;AAAA,QAAI,OAAA;AAAA,QAAQ,MAAA;AAAA,QAAK,WAAW,cAAA,EAAe;AAAA,QAAE;AAAA,OAAA,EAClE,CAAA;AAAA,MACC,oCACCD,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,QAAA;AAAA,UACP,QAAA,EAAU,gBAAA;AAAA,UACV,OAAA,EAAS,qBAAA;AAAA,UACT,IAAA,EAAK;AAAA;AAAA;AACP,KAAA,EAEJ,CAAA;AAAA,oBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,WAAA,EACV,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QACrB,WAAA;AAAA,QAAY,MAAA;AAAA,QAAK;AAAA,OAAA,EACzB,CAAA;AAAA,sBAEAA,IAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAS,WAAA;AAAA,UACT,UAAU,WAAA,KAAgB,CAAA;AAAA,UAC1B,YAAA,EAAW,YAAA;AAAA,UAEX,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,cAAA,EAAe,MAAM,EAAA,EAAI,CAAA;AAAA,4BACpCA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,cAAA,EAAe,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAO,EAAG;AAAA;AAAA;AAAA,OACrE;AAAA,sBAEAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAS,cAAA;AAAA,UACT,UAAU,WAAA,KAAgB,CAAA;AAAA,UAC1B,YAAA,EAAW,eAAA;AAAA,UAEX,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,cAAA,EAAe,MAAM,EAAA,EAAI;AAAA;AAAA,OACtC;AAAA,sBAEAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,UAAU,WAAA,KAAgB,UAAA;AAAA,UAC1B,YAAA,EAAW,WAAA;AAAA,UAEX,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,eAAA,EAAgB,MAAM,EAAA,EAAI;AAAA;AAAA,OACvC;AAAA,sBAEAC,IAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,UAAU,WAAA,KAAgB,UAAA;AAAA,UAC1B,YAAA,EAAW,WAAA;AAAA,UAEX,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,eAAA,EAAgB,MAAM,EAAA,EAAI,CAAA;AAAA,4BACrCA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,eAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAO,EAAG;AAAA;AAAA;AAAA;AACtE,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACvJA,IAAM,eAAA,GAAuC;AAAA,EAC3C,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,gBAAA,GAAwC;AAAA,EAC5C,OAAA,EAAS,qDAAA;AAAA,EACT,YAAA,EAAc,uCAAA;AAAA,EACd,QAAA,EAAU,6BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,2BAAA;AAAA,EACP,SAAA,EAAW,MAAA;AAAA,EACX,UAAA,EAAY,QAAA;AAAA,EACZ,QAAA,EAAU,QAAA;AAAA,EACV,GAAA,EAAK,CAAA;AAAA,EACL,eAAA,EAAiB,8BAAA;AAAA,EACjB,MAAA,EAAQ,EAAA;AAAA;AAAA,EAER,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,cAAA,GAAsC;AAAA,EAC1C,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,mBAAA,GAA2C;AAAA,EAC/C,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,cAAA,GAAsC;AAAA,EAC1C,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,oBAAA,GAA4C;AAAA,EAChD,KAAA,EAAO;AACT,CAAA;AASO,SAAS,WAAA,CAAY;AAAA,EAC1B,OAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,UAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAkC;AAChC,EAAA,MAAM,iBAAA,GAAoB,CAAC,MAAA,KAAmB;AAC5C,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,MAAA,EAAQ;AAG1B,IAAA,MAAM,YAAA,GACJ,UAAA,KAAe,MAAA,IAAU,aAAA,KAAkB,QAAQ,MAAA,GAAS,KAAA;AAC9D,IAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,uBACEA,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EACL,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,eAAA,EACR,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,IAAA,MAAM,WAAW,UAAA,KAAe,MAAA;AAEhC,IAAA,uBACEA,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,OAAA,EAAS,MAAM,iBAAA,CAAkB,MAAM,CAAA;AAAA,QACvC,KAAA,EAAO;AAAA,UACL,GAAG,gBAAA;AAAA,UACH,GAAI,QAAA,GAAW,cAAA,GAAiB;AAAC,SACnC;AAAA,QAEA,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,mBAAA,EACV,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,UAAM,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,UACb,4BACCA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,WAAW,oBAAA,GAAuB,cAAA;AAAA,cAExC,qCACCA,GAAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAM,aAAA,KAAkB,KAAA,GAAQ,UAAA,GAAa,WAAA;AAAA,kBAC7C,IAAA,EAAM;AAAA;AAAA,eACR,mBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,UAAA,EAAW,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,GAAA,EAAI,EAAG;AAAA;AAAA;AAE7D,SAAA,EAEJ;AAAA,OAAA;AAAA,MAvBK;AAAA,KAwBP;AAAA,EAEJ,CAAC,GACH,CAAA,EACF,CAAA;AAEJ;ACrGA,IAAM,UAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,qDAAA;AAAA,EACT,YAAA,EAAc,uCAAA;AAAA,EACd,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO,2BAAA;AAAA,EACP,aAAA,EAAe,QAAA;AAAA,EACf,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,KAAA,EAAO,iCAAA;AAAA,EACP,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,YAAA,GAAoC;AAAA,EACxC,UAAA,EAAY,0BAAA;AAAA,EACZ,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,eAAA,GAAuC;AAAA,EAC3C,QAAA,EAAU,OAAA;AAAA,EACV,QAAA,EAAU,QAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AASA,SAAS2C,YAAAA,CAAY,OAAgB,UAAA,EAA6B;AAChE,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,OAAO,QAAQ,MAAA,GAAS,OAAA;AAAA,EAC1B;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,IAAA,IAAI,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAC3B,MAAA,OAAO,MAAM,cAAA,EAAe;AAAA,IAC9B;AACA,IAAA,OAAO,KAAA,CAAM,eAAe,MAAA,EAAW;AAAA,MACrC,qBAAA,EAAuB,CAAA;AAAA,MACvB,qBAAA,EAAuB;AAAA,KACxB,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,IAAA,OAAO,MAAM,WAAA,EAAY;AAAA,EAC3B;AAGA,EAAA,IAAI,YAAY,QAAA,CAAS,WAAW,KAAK,UAAA,EAAY,QAAA,CAAS,MAAM,CAAA,EAAG;AACrE,IAAA,MAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,OAAO,CAAA;AAC7B,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG;AAC1B,QAAA,IAAI,UAAA,EAAY,QAAA,CAAS,MAAM,CAAA,EAAG;AAChC,UAAA,OAAO,KAAK,cAAA,EAAe;AAAA,QAC7B;AACA,QAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,MACjC;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAKA,SAAS,cAAc,UAAA,EAA8B;AACnD,EAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AACxB,EAAA,MAAM,IAAA,GAAO,WAAW,WAAA,EAAY;AACpC,EAAA,OACE,IAAA,CAAK,SAAS,KAAK,CAAA,IACnB,KAAK,QAAA,CAAS,SAAS,CAAA,IACvB,IAAA,CAAK,QAAA,CAAS,SAAS,KACvB,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IACrB,IAAA,CAAK,SAAS,QAAQ,CAAA,IACtB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAExB;AASO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA,GAAW,GAAA;AAAA,EACX,OAAA;AAAA,EACA;AACF,CAAA,EAAgC;AAC9B,EAAA,MAAM,MAAA,GAAS,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,cAAc,UAAU,CAAA;AAE1C,EAAA,MAAM,cAAA,GAAiBlB,QAAQ,MAAM;AACnC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB;AACA,IAAA,OAAOkB,YAAAA,CAAY,OAAO,UAAU,CAAA;AAAA,EACtC,CAAA,EAAG,CAAC,KAAA,EAAO,UAAA,EAAY,SAAS,CAAC,CAAA;AAEjC,EAAA,MAAM,eAAA,GAAkB,eAAe,MAAA,GAAS,EAAA;AAEhD,EAAA,MAAM,8BACJ3C,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,GAAG,UAAA;AAAA,QACH,GAAI,MAAA,GAAS,UAAA,GAAa,EAAC;AAAA,QAC3B,GAAI,SAAA,GAAY,YAAA,GAAe,EAAC;AAAA,QAChC,GAAI,eAAA,GAAkB,EAAE,GAAG,eAAA,EAAiB,QAAA,KAAa,EAAC;AAAA,QAC1D,GAAI,OAAA,GAAU,EAAE,MAAA,EAAQ,SAAA,KAAc;AAAC,OACzC;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAGF,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,uBACEA,IAAC,OAAA,EAAA,EAAQ,OAAA,EAAS,gBAAgB,QAAA,EAAS,KAAA,EAAM,KAAA,EAAO,GAAA,EACrD,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,OAAO,WAAA;AACT;ACvJA,IAAMqC,UAAAA,GAAiC;AAAA,EACrC,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAMT,eAAAA,GAAsC;AAAA,EAC1C,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,eAAA,GAAuC;AAAA,EAC3C,MAAA,EAAQ;AACV,CAAA;AASO,SAAS,QAAA,CAAS;AAAA,EACvB,GAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb;AACF,CAAA,EAA+B;AAC7B,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,UAAA,GAAa,KAAK,KAAK,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,EAAgB,WAAA,KAAwB;AAC/D,IAAA,WAAA,GAAc,KAAA,EAAO,aAAa,KAAK,CAAA;AAAA,EACzC,CAAA;AAEA,EAAA,uBACE5B,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,OAAA,EAAS,aAAa,cAAA,GAAiB,MAAA;AAAA,MACvC,KAAA,EAAO;AAAA,QACL,GAAGqC,UAAAA;AAAA,QACH,GAAI,UAAA,GAAaT,eAAAA,GAAiB,EAAC;AAAA,QACnC,GAAI,UAAA,GAAa,eAAA,GAAkB;AAAC,OACtC;AAAA,MACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,CAAA,CAAE,aAAA,CAAc,KAAA,CAAM,eAAA,GAAkB,WAAA,CAAY,eAAmB;AAAA,QACzE;AAAA,MACF,CAAA;AAAA,MACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,CAAA,CAAE,aAAA,CAAc,MAAM,eAAA,GAAkB,EAAA;AAAA,QAC1C;AAAA,MACF,CAAA;AAAA,MAEC,QAAA,EAAA,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,EAAM,8BACd5B,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAO,IAAA;AAAA,UACP,UAAA,EAAY,cAAc,SAAS,CAAA;AAAA,UACnC,SAAA,EAAW,aAAa,SAAS,CAAA;AAAA,UACjC,SAAS,WAAA,GAAc,MAAM,eAAA,CAAgB,IAAA,EAAM,SAAS,CAAA,GAAI;AAAA,SAAA;AAAA,QAJ3D;AAAA,OAMR;AAAA;AAAA,GACH;AAEJ;ACtFA,SAAS,eAAe,KAAA,EAAwB;AAC9C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AAExB,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,IAAK,IAAI,QAAA,CAAS,GAAG,CAAA,IAAK,GAAA,CAAI,SAAS,IAAI,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AACtF,IAAA,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,GAAA;AACT;AAKA,SAAS,aAAa,MAAA,EAA6B;AACjD,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,IAAA,CAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAGvD,EAAA,KAAA,MAAW,GAAA,IAAO,OAAO,IAAA,EAAM;AAC7B,IAAA,KAAA,CAAM,KAAK,GAAA,CAAI,GAAA,CAAI,cAAc,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EAC9C;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,YAAA,CAAa,OAAA,EAAiB,QAAA,EAAkB,QAAA,EAAwB;AAC/E,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,OAAO,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,EAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AACZ,EAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,EAAA,IAAA,CAAK,KAAA,EAAM;AACX,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,EAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AACzB;AAqCA,IAAME,iBAAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,eAAA,EAAiB,iCAAA;AAAA,EACjB,QAAA,EAAU,QAAA;AAAA,EACV,MAAA,EAAQ;AAAA;AACV,CAAA;AAEA,IAAM,oBAAA,GAA4C;AAAA,EAChD,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU;AAAA;AAEZ,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,KAAA,EAAO,MAAA;AAAA,EACP,cAAA,EAAgB,UAAA;AAAA,EAChB,aAAA,EAAe,CAAA;AAAA,EACf,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,aAAA,GAAqC;AAAA,EACzC,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,OAAA,EAAS,2BAAA;AAAA,EACT,KAAA,EAAO,iCAAA;AAAA,EACP,GAAA,EAAK;AACP,CAAA;AAEA,IAAM+B,YAAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,OAAA,EAAS,2BAAA;AAAA,EACT,KAAA,EAAO,4BAAA;AAAA,EACP,GAAA,EAAK,2BAAA;AAAA,EACL,SAAA,EAAW;AACb,CAAA;AAEA,IAAMG,YAAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,OAAA,EAAS,2BAAA;AAAA,EACT,KAAA,EAAO,iCAAA;AAAA,EACP,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,sBAAA,GAA8C;AAAA,EAClD,OAAA,EAAS,qDAAA;AAAA,EACT,eAAA,EAAiB,8BAAA;AAAA,EACjB,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,EAAU,6BAAA;AAAA,EACV,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,aAAA,GAAqC;AAAA,EACzC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,OAAA,EAAS,qDAAA;AAAA,EACT,YAAA,EAAc,uCAAA;AAAA,EACd,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,iBAAA,GAAyC;AAAA,EAC7C,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,kBAAA,GAA0C;AAAA,EAC9C,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK;AACP,CAAA;AAMA,SAASQ,gBAAAA,GAA+B;AACtC,EAAA,uBACE3C,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,aAAA,EACV,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,EAAA;AAAA,UACP,MAAA,EAAQ,EAAA;AAAA,UACR,MAAA,EAAQ,uCAAA;AAAA,UACR,cAAA,EAAgB,8BAAA;AAAA,UAChB,YAAA,EAAc,KAAA;AAAA,UACd,SAAA,EAAW;AAAA;AACb;AAAA,KACF;AAAA,oBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,oBAAA,EAAkB;AAAA,GAAA,EAC1B,CAAA;AAEJ;AAsBO,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,KAAA,GAAQ,IAAA;AAAA,EACR,UAAU,eAAA,GAAkB,EAAA;AAAA,EAC5B,QAAA,GAAW,KAAA;AAAA,EACX,MAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAmC;AACjC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIO,SAAS,CAAC,CAAA;AAChD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,eAAe,CAAA;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,QAAAA,EAA6B;AACjE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAyB,KAAK,CAAA;AAGxE,EAAA,MAAM,UAAA,GAAaE,WAAAA;AAAA,IACjB,CAAC,QAAgB,SAAA,KAA8B;AAC7C,MAAA,aAAA,CAAc,MAAM,CAAA;AACpB,MAAA,gBAAA,CAAiB,SAAS,CAAA;AAC1B,MAAA,MAAA,GAAS,QAAQ,SAAS,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAGA,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACtB,CAAC,KAAA,EAAgB,WAAA,EAAqB,QAAA,KAAqB;AACzD,MAAA,IAAI,CAAC,WAAA,IAAe,CAAC,MAAA,EAAQ;AAC7B,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA;AACzC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,WAAA,CAAY,KAAA,EAAO,QAAQ,QAAQ,CAAA;AAAA,MACrC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAa,MAAM;AAAA,GACtB;AAGA,EAAA,MAAM,iBAAA,GAAoBgB,QAAQ,MAAM;AACtC,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,MAAA,EAAQ,OAAO,MAAA;AACnC,IAAA,MAAM,UAAsD,EAAC;AAC7D,IAAA,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,KAAA,KAAU;AACxC,MAAA,IAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AACtB,QAAA,OAAA,CAAQ,KAAK,CAAA,GAAI,UAAA,CAAW,MAAM,CAAA;AAAA,MACpC;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,UAAA,EAAY,MAAM,CAAC,CAAA;AAGvB,EAAA,MAAM,aAAA,GAAgBA,QAAQ,MAAM;AAClC,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AAGrB,IAAA,IAAI,aAAa,MAAA,CAAO,IAAA;AACxB,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA;AACrD,MAAA,IAAI,eAAe,CAAA,EAAG;AACpB,QAAA,UAAA,GAAa,CAAC,GAAG,MAAA,CAAO,IAAI,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAC3C,UAAA,MAAM,IAAA,GAAO,EAAE,WAAW,CAAA;AAC1B,UAAA,MAAM,IAAA,GAAO,EAAE,WAAW,CAAA;AAG1B,UAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW,OAAO,CAAA;AAChD,UAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW,OAAO,EAAA;AAGhD,UAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,SAAS,QAAA,EAAU;AACxD,YAAA,OAAO,aAAA,KAAkB,KAAA,GAAQ,IAAA,GAAO,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,UACxD;AAGA,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAI,CAAA,CAAE,WAAA,EAAY;AACtC,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAI,CAAA,CAAE,WAAA,EAAY;AACtC,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAC1C,UAAA,OAAO,aAAA,KAAkB,KAAA,GAAQ,UAAA,GAAa,CAAC,UAAA;AAAA,QACjD,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAA,CAAc,cAAc,CAAA,IAAK,QAAA;AACvC,IAAA,OAAO,UAAA,CAAW,KAAA,CAAM,UAAA,EAAY,UAAA,GAAa,QAAQ,CAAA;AAAA,EAC3D,GAAG,CAAC,MAAA,EAAQ,aAAa,QAAA,EAAU,UAAA,EAAY,aAAa,CAAC,CAAA;AAG7D,EAAAf,UAAU,MAAM;AACd,IAAA,cAAA,CAAe,CAAC,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAGtB,EAAA,MAAM,oBAAA,GAAuBD,WAAAA,CAAY,CAAC,WAAA,KAAwB;AAChE,IAAA,WAAA,CAAY,WAAW,CAAA;AACvB,IAAA,cAAA,CAAe,CAAC,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,eAAA,GAAkBA,YAAY,MAAM;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,GAAA,GAAM,aAAa,MAAM,CAAA;AAC/B,IAAA,MAAM,SAAA,GAAA,qBAAgB,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACtD,IAAA,YAAA,CAAa,GAAA,EAAK,CAAA,OAAA,EAAU,SAAS,CAAA,IAAA,CAAA,EAAQ,yBAAyB,CAAA;AAAA,EACxE,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACpC,MAAA,MAAM,MAA+B,EAAC;AACtC,MAAA,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AACjC,QAAA,GAAA,CAAI,GAAG,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA;AAAA,MAClB,CAAC,CAAA;AACD,MAAA,OAAO,GAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAC,CAAA;AACzC,IAAA,MAAM,SAAA,GAAA,qBAAgB,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACtD,IAAA,YAAA,CAAa,IAAA,EAAM,CAAA,OAAA,EAAU,SAAS,CAAA,KAAA,CAAA,EAAS,kBAAkB,CAAA;AAAA,EACnE,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACET,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,EAAE,GAAGE,iBAAAA,EAAiB,GAAG,OAAM,EAC/D,QAAA,kBAAAF,GAAAA,CAAC4C,gBAAAA,EAAA,EAAgB,CAAA,EACnB,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACE5C,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,EAAE,GAAGE,iBAAAA,EAAiB,GAAG,OAAM,EAC/D,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAOgC,YAAAA,EACV,QAAA,EAAA;AAAA,sBAAAjC,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,MAAM,EAAA,EAAI,CAAA;AAAA,sBAC7BA,GAAAA,CAAC,KAAA,EAAA,EACC,0BAAAA,GAAAA,CAAC,QAAA,EAAA,EAAO,yBAAW,CAAA,EACrB,CAAA;AAAA,sBACAA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,6BAAA,EAA8B,EACnD,QAAA,EAAA,KAAA,CAAM,OAAA,EACT;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,EAAE,GAAGE,iBAAAA,EAAiB,GAAG,OAAM,EAC/D,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAOmC,YAAAA,EACV,QAAA,EAAA;AAAA,sBAAApC,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,MAAM,EAAA,EAAI,CAAA;AAAA,sBAC7BA,GAAAA,CAAC,KAAA,EAAA,EAAI,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,sBACfA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,6BAAA,IAAiC,QAAA,EAAA,gCAAA,EAEzD;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,MAAA,CAAO,cAAc,CAAA,EAAG;AAC1B,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,EAAE,GAAGE,iBAAAA,EAAiB,GAAG,OAAM,EAC/D,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAOmC,YAAAA,EACV,QAAA,EAAA;AAAA,sBAAApC,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,MAAM,EAAA,EAAI,CAAA;AAAA,sBAC7BA,GAAAA,CAAC,KAAA,EAAA,EAAI,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,sBACrBA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,6BAAA,IAAiC,QAAA,EAAA,sDAAA,EAEzD;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAGC,iBAAAA,EAAiB,GAAG,KAAA,EAAM,EAC9D,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,SAAA,oBACND,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,sBAAA,EAAwB,QAAA,EAAA;AAAA,MAAA,6BAAA;AAAA,MACN,MAAA,CAAO,UAAU,cAAA,EAAe;AAAA,MAAE;AAAA,KAAA,EAChE,CAAA;AAAA,oBAIFA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,aAAA,EACV,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,iBAAA,EACV,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,MAAM,EAAA,EAAI,CAAA;AAAA,wBAC7BC,KAAC,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,MAAA,CAAO,UAAU,cAAA,EAAe;AAAA,UAAE,MAAA;AAAA,UAAK,MAAA,CAAO,SAAA,KAAc,CAAA,GAAI,GAAA,GAAM,EAAA;AAAA,UACtE,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,SAAM,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,OAAA,EAAU,MAAA,CAAO,OAAA,CAAQ,MAAA,KAAW,CAAA,GAAI,MAAM,EAAE,CAAA;AAAA,SAAA,EAC3G,CAAA;AAAA,QACC,MAAA,CAAO,iBAAA,KAAsB,MAAA,oBAC5BD,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,uCAAA,EAAyC,WAAA,EAAa,2BAAA,IAC9E,QAAA,EAAA,MAAA,CAAO,iBAAA,GAAoB,GAAA,GACxB,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,iBAAiB,CAAC,CAAA,EAAA,CAAA,GACvC,CAAA,EAAA,CAAI,MAAA,CAAO,iBAAA,GAAoB,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,EACrD;AAAA,OAAA,EAEJ,CAAA;AAAA,sBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,kBAAA,EACV,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,UAAO,OAAA,EAAQ,OAAA,EAAQ,MAAK,IAAA,EAAK,OAAA,EAAS,eAAA,EAAiB,KAAA,EAAM,eAAA,EAChE,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,UAAA,EAAW,MAAM,EAAA,EAAI,CAAA;AAAA,0BAChCA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,KAAA,EAAG;AAAA,SAAA,EACX,CAAA;AAAA,wBACAC,IAAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,OAAA,EAAQ,MAAK,IAAA,EAAK,OAAA,EAAS,gBAAA,EAAkB,KAAA,EAAM,gBAAA,EACjE,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,UAAA,EAAW,MAAM,EAAA,EAAI,CAAA;AAAA,0BAChCA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,MAAA,EAAI;AAAA,SAAA,EACZ;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,sBACV,QAAA,kBAAAC,IAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,WAAA,EACZ,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,aAAa,MAAA,CAAO,YAAA;AAAA,UACpB,QAAA;AAAA,UACA,UAAA;AAAA,UACA,aAAA;AAAA,UACA,MAAA,EAAQ;AAAA;AAAA,OACV;AAAA,sBACAA,IAAC,OAAA,EAAA,EACE,QAAA,EAAA,aAAA,CAAc,IAAI,CAAC,GAAA,EAAK,0BACvBA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,GAAA;AAAA,UACA,KAAA,EAAA,CAAQ,WAAA,GAAc,CAAA,IAAK,QAAA,GAAW,KAAA;AAAA,UACtC,aAAa,MAAA,CAAO,YAAA;AAAA,UACpB,UAAA,EAAY,iBAAA;AAAA,UACZ,UAAA;AAAA,UACA,WAAA,EAAa,cAAc,eAAA,GAAkB;AAAA,SAAA;AAAA,QANxC;AAAA,OAQR,CAAA,EACH;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,WAAA;AAAA,QACA,YAAY,MAAA,CAAO,SAAA;AAAA,QACnB,QAAA;AAAA,QACA,YAAA,EAAc,cAAA;AAAA,QACd,gBAAA,EAAkB;AAAA;AAAA;AACpB,GAAA,EACF,CAAA;AAEJ;AC/aA,IAAM,SAAA,GAAY;AAAA,EAChB,EAAE,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,oCAAA,EAAsC,aAAa,wBAAA,EAAyB;AAAA,EACrG,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,aAAa,eAAA,EAAgB;AAAA,EACpE,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,aAAa,mBAAA,EAAoB;AAAA,EACxE,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,aAAA,EAAe,aAAa,iBAAA,EAAkB;AAAA,EAC1E,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,aAAa,eAAA,EAAgB;AAAA,EACpE,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,aAAa,eAAA,EAAgB;AAAA,EACpE,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,YAAA,EAAc,aAAa,wBAAA,EAAyB;AAAA,EAC/E,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,aAAA,EAAe,aAAa,yBAAA,EAA0B;AAAA,EAClF,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,aAAa,uBAAA,EAAwB;AAAA,EAC5E,EAAE,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,wBAAA,EAA0B,aAAa,oBAAA,EAAqB;AAAA,EAC3F,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,aAAa,cAAA,EAAe;AAAA,EACnE,EAAE,IAAA,EAAM,aAAA,EAAe,SAAA,EAAW,8BAAA,EAAgC,aAAa,cAAA;AACjF,CAAA;AAEA,IAAM,SAAA,GAAY;AAAA,EAChB,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,UAAA,EAAW;AAAA,EACvC,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,aAAA,EAAc;AAAA,EAC1C,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,gBAAA,EAAiB;AAAA,EAC7C,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,UAAA,EAAW;AAAA,EACvC,EAAE,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAa,QAAA,EAAS;AAAA,EACtC,EAAE,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAa,YAAA,EAAa;AAAA,EAC1C,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,cAAA,EAAe;AAAA,EAC3C,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,WAAA,EAAY;AAAA,EACxC,EAAE,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAa,kBAAA,EAAmB;AAAA,EAChD,EAAE,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAa,eAAA;AAC/B,CAAA;AASO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA,GAAc,6CAAA;AAAA,EACd,QAAA,GAAW;AACb,CAAA,EAAuC;AACrC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAC3B,EAAA,MAAM,QAAA,GAAWQ,OAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAID,SAAS,KAAK,CAAA;AAG9C,EAAA,MAAM,UAAA,GAAaE,WAAAA;AAAA,IACjB,CAAC,IAAA,KAAiB;AAChB,MAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AACrB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,cAAA,IAAkB,KAAA,CAAM,MAAA;AAC5C,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,MAAA;AACxC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,GAAI,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAC/D,MAAA,QAAA,CAAS,QAAQ,CAAA;AAGjB,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,KAAA,CAAM,cAAA,GAAiB,KAAA,CAAM,YAAA,GAAe,KAAA,GAAQ,IAAA,CAAK,MAAA;AACzD,QAAA,KAAA,CAAM,KAAA,EAAM;AAAA,MACd,GAAG,CAAC,CAAA;AAAA,IACN,CAAA;AAAA,IACA,CAAC,OAAO,QAAQ;AAAA,GAClB;AAGA,EAAA,MAAM,cAAA,GAAiBA,WAAAA;AAAA,IACrB,CAAC,SAAiB,MAAA,KAAmB;AACnC,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACjD,MAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,KAAA,EAAO;AAC9B,QAAA,UAAA,CAAW,IAAI,KAAA,CAAM,KAAA,IAAS,MAAM,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,MACvD,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,UAAU;AAAA,GACrB;AAGA,EAAA,MAAM,cAAA,GAAiBA,WAAAA;AAAA,IACrB,CAAC,EAAA,KAA8B;AAC7B,MAAA,UAAA,CAAW,GAAG,SAAS,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAGA,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,GAAA,EAAK,MAAM,OAAA,CAAQ;AAAA,GACrB;AAEA,EAAA,MAAM,aAAA,GAAqC;AAAA,IACzC,OAAA,EAAS,MAAA;AAAA,IACT,GAAA,EAAK,MAAM,OAAA,CAAQ,EAAA;AAAA,IACnB,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,MAAM,SAAA,GAAiC;AAAA,IACrC,OAAA,EAAS,MAAM,OAAA,CAAQ,EAAA;AAAA,IACvB,eAAA,EAAiB,MAAM,MAAA,CAAO,OAAA;AAAA,IAC9B,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,IACxC,YAAA,EAAc,MAAM,MAAA,CAAO,EAAA;AAAA,IAC3B,QAAA,EAAU,MAAM,SAAA,CAAU;AAAA,GAC5B;AAEA,EAAA,MAAM,YAAA,GAAoC;AAAA,IACxC,YAAA,EAAc,MAAM,OAAA,CAAQ;AAAA,GAC9B;AAEA,EAAA,MAAM,iBAAA,GAAyC;AAAA,IAC7C,UAAA,EAAY,GAAA;AAAA,IACZ,YAAA,EAAc,MAAM,OAAA,CAAQ,EAAA;AAAA,IAC5B,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,GACtB;AAEA,EAAA,MAAM,SAAA,GAAiC;AAAA,IACrC,OAAA,EAAS,MAAA;AAAA,IACT,QAAA,EAAU,MAAA;AAAA,IACV,GAAA,EAAK,MAAM,OAAA,CAAQ,EAAA;AAAA,IACnB,MAAA,EAAQ,CAAA;AAAA,IACR,OAAA,EAAS,CAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,MAAM,SAAA,GAAiC;AAAA,IACrC,OAAA,EAAS,GAAG,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,KAAA,CAAM,QAAQ,EAAE,CAAA,CAAA;AAAA,IAChD,eAAA,EAAiB,MAAM,MAAA,CAAO,UAAA;AAAA,IAC9B,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,IACxC,YAAA,EAAc,MAAM,MAAA,CAAO,EAAA;AAAA,IAC3B,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,MAAM,SAAA,CAAU;AAAA,GAC5B;AAEA,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,aAAA,EACV,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,KAAA;AAAA,UACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,WAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,YAAY,WAAA;AAAY;AAAA,OAC5C;AAAA,sBAGAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,kBACEA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAQ,WAAA,EAAY,IAAA,EAAK,MAAK,QAAA,EAAU,QAAA,IAAY,OAAO,MAAA,KAAW,CAAA,EAC5E,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,MAAK,OAAA,EAAQ,IAAA,EAAM,IAAI,CAAA,EAC/B,CAAA;AAAA,UAGD,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACzB,YAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,KAAA,CAAM,IAAI,CAAA;AACnE,YAAA,IAAI,CAAC,WAAA,EAAa,OAAO,EAAC;AAE1B,YAAA,OAAO;AAAA,8BACLA,GAAAA,CAAC,YAAA,EAAA,EAAwC,QAAA,EAAQ,IAAA,EAC9C,QAAA,EAAA,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,IAAA,EAAA,EADL,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,CAAA,CAErC,CAAA;AAAA,cACA,GAAG,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,wBAC1BC,IAAAA;AAAA,gBAAC,YAAA;AAAA,gBAAA;AAAA,kBAEC,SAAS,MAAM,cAAA,CAAe,KAAA,CAAM,EAAA,EAAI,IAAI,IAAI,CAAA;AAAA,kBAE/C,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAI,IAAA;AAAA,oCACLA,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,SAAA,EAAW,UAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,IAAG,EAAG,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,sBAC1E,GAAA,CAAI,SAAA;AAAA,sBAAU;AAAA,qBAAA,EAClB;AAAA;AAAA,iBAAA;AAAA,gBANK,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA;AAAA,eAQ/B,CAAA;AAAA,8BACDD,GAAAA,CAAC,iBAAA,EAAA,EAAA,EAAuB,CAAA,IAAA,EAAO,KAAA,CAAM,EAAE,CAAA,CAAI;AAAA,aAC7C;AAAA,UACF,CAAC;AAAA;AAAA,OACH;AAAA,sBAGAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,yBACEA,GAAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,aAAY,IAAA,EAAK,IAAA,EAAK,QAAA,EACpC,QAAA,kBAAAA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,UAAA,EAAW,IAAA,EAAM,IAAI,CAAA,EAClC,CAAA;AAAA,UAGD,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,qBACdC,IAAAA,CAAC,YAAA,EAAA,EAA2B,OAAA,EAAS,MAAM,cAAA,CAAe,EAAE,CAAA,EAC1D,QAAA,EAAA;AAAA,4BAAAA,KAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,aAAY,EAAI,QAAA,EAAA;AAAA,cAAA,EAAA,CAAG,IAAA;AAAA,cAAK;AAAA,aAAA,EAAE,CAAA;AAAA,4BACrDD,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,SAAA,EAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,EAAA,EAAG,EACxE,aAAG,WAAA,EACN;AAAA,WAAA,EAAA,EAJiB,EAAA,CAAG,IAKtB,CACD;AAAA;AAAA,OACH;AAAA,sBAGAA,IAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,SAAQ,IAAA,EAAK,IAAA,EAAK,SAAS,MAAM,WAAA,CAAY,CAAC,QAAQ,CAAA,EACpE,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,MAAK,MAAA,EAAO,IAAA,EAAM,IAAI,CAAA,EAC9B;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,QAAA,oBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,SAAA,EACV,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EACV,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAmB,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,wBAC/CC,IAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,SAAA,EAAU,EAAG,QAAA,EAAA;AAAA,UAAA,MAAA;AAAA,0BAClDD,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,UAAO,2BAAA;AAAA,UAA0B,GAAA;AAAA,0BACvDA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,UAAO;AAAA,SAAA,EAC5B;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EACV,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAmB,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,wBACxCA,IAAC,IAAA,EAAA,EAAG,KAAA,EAAO,WACR,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,qBACdA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,KAAA,EAAO,SAAA;AAAA,YACP,SAAS,MAAM,UAAA,CAAW,CAAA,CAAA,EAAI,EAAA,CAAG,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,YAC1C,OAAO,EAAA,CAAG,WAAA;AAAA,YAET,QAAA,EAAA,EAAA,CAAG;AAAA,WAAA;AAAA,UALC,EAAA,CAAG;AAAA,SAOX,CAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EACV,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAmB,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,wBACxCA,IAAC,IAAA,EAAA,EAAG,KAAA,EAAO,WACR,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,qBACdC,IAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,KAAA,EAAO,SAAA;AAAA,YACP,OAAA,EAAS,MAAM,cAAA,CAAe,EAAE,CAAA;AAAA,YAChC,OAAO,EAAA,CAAG,WAAA;AAAA,YAET,QAAA,EAAA;AAAA,cAAA,EAAA,CAAG,IAAA;AAAA,cAAK;AAAA;AAAA,WAAA;AAAA,UALJ,EAAA,CAAG;AAAA,SAOX,CAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAmB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,wBACvCC,IAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,WAAA,EAAa,KAAA,CAAM,QAAQ,EAAA,EAAI,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,WAAU,EACnF,QAAA,EAAA;AAAA,0BAAAA,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,UAAK,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,YAAO;AAAA,WAAA,EAAmB,CAAA;AAAA,0BACtDC,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,UAAK,QAAA,EAAA,gCAAA,EAA8B,CAAA;AAAA,YAAO;AAAA,WAAA,EAAoB,CAAA;AAAA,0BACnEC,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,UAAK,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,YAAO;AAAA,WAAA,EAAe,CAAA;AAAA,0BAClDC,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,UAAK,QAAA,EAAA,iCAAA,EAA+B,CAAA;AAAA,YAAO;AAAA,WAAA,EAAmB;AAAA,SAAA,EACrE;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACxQA,IAAM,iBAAA,GAAoB;AAAA,EACxB,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,MAAA,EAAO;AAAA,EACjC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC/B,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA;AAC7B,CAAA;AASO,SAAS,sBAAA,CAAuB;AAAA,EACrC,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAA6C;AAC3C,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAG3B,EAAA,MAAM,SAAA,GAAYQ,OAAO,CAAC,CAAA;AAE1B,EAAA,MAAM,YAAA,GAAeA,MAAAA,iBAA4B,IAAI,GAAA,EAAK,CAAA;AAM1D,EAAA,MAAM,UAAA,GAAaC,WAAAA,CAAY,CAAC,KAAA,EAAwB,KAAA,KAA0B;AAEhF,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA;AAE1E,IAAA,IAAI,EAAA,GAAK,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,EAAA,GAAK,CAAA,MAAA,EAAS,EAAE,SAAA,CAAU,OAAO,CAAA,CAAA;AACjC,MAAA,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,EAAE,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,EAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAWA,YAAY,MAAM;AACjC,IAAA,IAAI,MAAA,CAAO,UAAU,SAAA,EAAW;AAEhC,IAAA,MAAM,QAAA,GAA4B;AAAA,MAChC,IAAA,EAAM,CAAA,WAAA,EAAc,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,CAAA;AAAA,MACrC,UAAA,EAAY,EAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACb;AACA,IAAA,QAAA,CAAS,CAAC,GAAG,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAS,CAAC,CAAA;AAGhC,EAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,IAClB,CAAC,OAAe,OAAA,KAAsC;AACpD,MAAA,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,MAAO,CAAA,KAAM,KAAA,GAAQ,EAAE,GAAG,CAAA,EAAG,GAAG,OAAA,EAAQ,GAAI,CAAE,CAAC,CAAA;AAAA,IACzE,CAAA;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,GACnB;AAGA,EAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,IAClB,CAAC,KAAA,KAAkB;AACjB,MAAA,QAAA,CAAS,OAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,KAAM,KAAK,CAAC,CAAA;AAAA,IAC/C,CAAA;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,GACnB;AAGA,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,GAAA,EAAK,MAAM,OAAA,CAAQ;AAAA,GACrB;AAEA,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,OAAA,EAAS,MAAM,OAAA,CAAQ,EAAA;AAAA,IACvB,eAAA,EAAiB,MAAM,MAAA,CAAO,OAAA;AAAA,IAC9B,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,IACxC,YAAA,EAAc,MAAM,MAAA,CAAO;AAAA,GAC7B;AAEA,EAAA,MAAM,gBAAA,GAAwC;AAAA,IAC5C,OAAA,EAAS,MAAA;AAAA,IACT,cAAA,EAAgB,eAAA;AAAA,IAChB,UAAA,EAAY,QAAA;AAAA,IACZ,YAAA,EAAc,MAAM,OAAA,CAAQ;AAAA,GAC9B;AAEA,EAAA,MAAM,eAAA,GAAuC;AAAA,IAC3C,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,KAAA,EAAO,MAAM,MAAA,CAAO,SAAA;AAAA,IACpB,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,MAAM,aAAA,GAAqC;AAAA,IACzC,OAAA,EAAS,MAAA;AAAA,IACT,GAAA,EAAK,MAAM,OAAA,CAAQ,EAAA;AAAA,IACnB,YAAA,EAAc,MAAM,OAAA,CAAQ;AAAA,GAC9B;AAEA,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,OAAA,EAAS,OAAA;AAAA,IACT,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,KAAA,EAAO,MAAM,MAAA,CAAO,SAAA;AAAA,IACpB,YAAA,EAAc,MAAM,OAAA,CAAQ;AAAA,GAC9B;AAEA,EAAA,MAAM,aAAA,GAAqC;AAAA,IACzC,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,GACtB;AAEA,EAAA,MAAM,eAAA,GAAuC;AAAA,IAC3C,OAAA,EAAS,MAAM,OAAA,CAAQ,EAAA;AAAA,IACvB,SAAA,EAAW,QAAA;AAAA,IACX,KAAA,EAAO,MAAM,MAAA,CAAO,SAAA;AAAA,IACpB,MAAA,EAAQ,CAAA,WAAA,EAAc,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,IACzC,YAAA,EAAc,MAAM,MAAA,CAAO;AAAA,GAC7B;AAEA,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACT,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,WAAW,CAAA,mBACjBA,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,eAAA,EACV,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,EAAA,EAAG,EAAG,QAAA,EAAA,8BAAA,EAEzD,CAAA;AAAA,sBACAC,KAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,GAAG,aAAA,EAAe,MAAA,EAAQ,CAAA,EAAE,EAAG,QAAA,EAAA;AAAA,QAAA,iDAAA;AAAA,wBACMD,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,oBAAA,EAAkB;AAAA,OAAA,EACzE;AAAA,KAAA,EACF,CAAA,GAEA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,0BACjBC,IAAAA,CAAC,KAAA,EAAA,EAAmC,KAAA,EAAO,cAAA,EACzC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,gBAAA,EACV,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,eAAA,EAAiB,QAAA,EAAA;AAAA,UAAA,oBAAA;AAAA,UAAmB,KAAA,GAAQ;AAAA,SAAA,EAAE,CAAA;AAAA,wBAC3DD,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAQ,OAAA,EAAQ,IAAA,EAAK,MAAK,OAAA,EAAS,MAAM,YAAY,KAAK,CAAA,EAChE,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,MAAK,OAAA,EAAQ,IAAA,EAAM,IAAI,CAAA,EAC/B;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,aAAA,EACV,QAAA,EAAA;AAAA,wBAAAA,KAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,GAAE,EACpB,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,UAAA,EAAY,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,0BAC9BA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,OAAO,KAAA,CAAM,IAAA;AAAA,cACb,QAAA,EAAU,CAAC,CAAA,KAAM,WAAA,CAAY,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,cAC5D,WAAA,EAAY;AAAA;AAAA;AACd,SAAA,EACF,CAAA;AAAA,wBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,SAAQ,EAC3B,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,UAAA,EAAY,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,0BACnCA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,MAAM,SAAA,IAAa,QAAA;AAAA,cAC1B,QAAA,EAAU,CAAC,KAAA,KAAU,WAAA,CAAY,OAAO,EAAE,SAAA,EAAW,OAAO,CAAA;AAAA,cAC5D,OAAA,EAAS;AAAA;AAAA;AACX,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAC,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,UAAA,EAAY,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,wBACpCA,GAAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,OAAO,KAAA,CAAM,UAAA;AAAA,YACb,UAAU,CAAC,UAAA,KAAe,YAAY,KAAA,EAAO,EAAE,YAAY,CAAA;AAAA,YAC3D,MAAA;AAAA,YACA;AAAA;AAAA;AACF,OAAA,EACF;AAAA,KAAA,EAAA,EAnCQ,UAAA,CAAW,KAAA,EAAO,KAAK,CAoCjC,CACD,CAAA;AAAA,IAGF,MAAA,CAAO,MAAA,GAAS,SAAA,oBACfC,IAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,WAAA;AAAA,QACR,OAAA,EAAS,QAAA;AAAA,QACT,KAAA,EAAO,EAAE,SAAA,EAAW,YAAA,EAAa;AAAA,QAEjC,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,MAAA,EAAO,MAAM,EAAA,EAAI,CAAA;AAAA,0BAC5BA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,YAAY,KAAA,CAAM,OAAA,CAAQ,EAAA,EAAG,EAAG,QAAA,EAAA,sBAAA,EAAoB;AAAA;AAAA;AAAA,KACrE;AAAA,IAGD,OAAO,MAAA,IAAU,SAAA,oBAChBC,IAAAA,CAAC,MAAA,EAAA,EAAK,OAAO,aAAA,EAAe,QAAA,EAAA;AAAA,MAAA,aAAA;AAAA,MACd,SAAA;AAAA,MAAU;AAAA,KAAA,EACxB;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACjMA,IAAMC,iBAAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,eAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK,KAAA;AAAA,EACL,OAAA,EAAS,qDAAA;AAAA,EACT,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,eAAA,GAAuC;AAAA,EAC3C,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,+BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,eAAA,GAAuC;AAAA,EAC3C,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO,iCAAA;AAAA,EACP,UAAA,EAAY,QAAA;AAAA,EACZ,QAAA,EAAU,QAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,QAAA,EAAU;AACZ,CAAA;AAEA,IAAMkC,YAAAA,GAAmC;AAAA,EACvC,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO,iCAAA;AAAA,EACP,OAAA,EAAS,2BAAA;AAAA,EACT,SAAA,EAAW;AACb,CAAA;AAEA,IAAMS,cAAAA,GAAqC;AAAA,EACzC,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO,iCAAA;AAAA,EACP,OAAA,EAAS,2BAAA;AAAA,EACT,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,mBAAA,GAA2C;AAAA,EAC/C,QAAA,EAAU,OAAA;AAAA,EACV,KAAA,EAAO,CAAA;AAAA,EACP,eAAA,EAAiB,oBAAA;AAAA,EACjB,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,MAAA,EAAQ;AACV,CAAA;AAEA,IAAMC,aAAAA,GAAoC;AAAA,EACxC,eAAA,EAAiB,iCAAA;AAAA,EACjB,YAAA,EAAc,0BAAA;AAAA,EACd,OAAA,EAAS,2BAAA;AAAA,EACT,QAAA,EAAU,OAAA;AAAA,EACV,QAAA,EAAU,OAAA;AAAA,EACV,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,iBAAA,GAAyC;AAAA,EAC7C,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,2BAAA;AAAA,EACP,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,KAAA,EAAO,MAAA;AAAA,EACP,OAAA,EAAS,2BAAA;AAAA,EACT,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,+BAAA;AAAA,EACV,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,YAAA,EAAc,2BAAA;AAAA,EACd,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,mBAAA,GAA2C;AAAA,EAC/C,OAAA,EAAS,MAAA;AAAA,EACT,cAAA,EAAgB,UAAA;AAAA,EAChB,GAAA,EAAK,2BAAA;AAAA,EACL,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,iBAAA,GAAyC;AAAA,EAC7C,OAAA,EAAS,cAAA;AAAA,EACT,QAAA,EAAU,MAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,eAAA,EAAiB,8BAAA;AAAA,EACjB,KAAA,EAAO,mCAAA;AAAA,EACP,YAAA,EAAc,0BAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAaA,SAAS,WAAW,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,UAAS,EAAoB;AAC1E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIvC,SAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE9C,EAAA,MAAM,YAAA,GAAeE,YAAY,MAAM;AACrC,IAAA,IAAI,IAAA,CAAK,MAAK,EAAG;AACf,MAAA,MAAA,CAAO,KAAK,IAAA,EAAK,EAAG,WAAA,CAAY,IAAA,IAAQ,QAAQ,CAAA;AAAA,IAClD;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,WAAA,EAAa,QAAA,EAAU,MAAM,CAAC,CAAA;AAExC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,uBACET,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,mBAAA,EAAqB,SAAS,OAAA,EACxC,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO6C,aAAAA,EAAc,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAgB,EAC1D,QAAA,EAAA;AAAA,oBAAA9C,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAmB,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,oBACzCA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,WAAA,EAAY,YAAA;AAAA,QACZ,KAAA,EAAO,IAAA;AAAA,QACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACvC,KAAA,EAAO,WAAA;AAAA,QACP,SAAA,EAAS;AAAA;AAAA,KACX;AAAA,oBACAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAY,wBAAA;AAAA,QACZ,KAAA,EAAO,WAAA;AAAA,QACP,UAAU,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAC9C,IAAA,EAAM,CAAA;AAAA,QACN,KAAA,EAAO,EAAE,GAAG,WAAA,EAAa,QAAQ,UAAA;AAAW;AAAA,KAC9C;AAAA,oBACAC,IAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,GAAA,EAAK,2BAAA;AAAA,UACL,UAAA,EAAY,0BAAA;AAAA,UACZ,QAAA,EAAU,6BAAA;AAAA,UACV,MAAA,EAAQ;AAAA,SACV;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,OAAA,EAAS,QAAA;AAAA,cACT,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,OAAO;AAAA;AAAA,WAC/C;AAAA,UAAE;AAAA;AAAA;AAAA,KAEJ;AAAA,oBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,mBAAA,EACV,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,UAAO,OAAA,EAAQ,WAAA,EAAY,SAAS,OAAA,EAAS,QAAA,EAAU,UAAU,QAAA,EAAA,QAAA,EAElE,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,YAAA;AAAA,UACT,QAAA,EAAU,CAAC,IAAA,CAAK,IAAA,EAAK,IAAK,QAAA;AAAA,UAC1B,OAAA,EAAS,QAAA;AAAA,UACV,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAkBO,IAAM,gBAAA,GAAmBF,UAAAA;AAAA,EAC9B,SAASiD,iBAAAA,CACP;AAAA,IACE,YAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA,GAAW,IAAA;AAAA,IACX,OAAA;AAAA,IACA,KAAA,GAAQ,eAAA;AAAA,IACR,KAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,EACA;AACA,IAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,WAAA,KAAgB,eAAA,EAAgB;AACzD,IAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIxC,SAAS,KAAK,CAAA;AAC9D,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE9C,IAAA,MAAM,YAAA,GAAeE,WAAAA;AAAA,MACnB,CAAC,KAAA,KAAsB;AACrB,QAAA,QAAA,GAAW,KAAK,CAAA;AAAA,MAClB,CAAA;AAAA,MACA,CAAC,QAAQ;AAAA,KACX;AAEA,IAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,MACjB,OAAO,IAAA,EAAc,WAAA,EAAqB,QAAA,KAAsB;AAC9D,QAAA,IAAI,CAAC,YAAA,EAAc;AAEnB,QAAA,WAAA,CAAY,IAAI,CAAA;AAChB,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,CAAY;AAAA,YAC9B,IAAA;AAAA,YACA,aAAa,WAAA,IAAe,KAAA,CAAA;AAAA,YAC5B,KAAA,EAAO,YAAA;AAAA,YACP,SAAA,EAAW;AAAA,WACZ,CAAA;AACD,UAAA,MAAA,GAAS,KAAK,CAAA;AACd,UAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,QAC3B,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAAA,QAC9C,CAAA,SAAE;AACA,UAAA,WAAA,CAAY,KAAK,CAAA;AAAA,QACnB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,YAAA,EAAc,WAAA,EAAa,MAAM;AAAA,KACpC;AAEA,IAAA,MAAM,cAAA,GAAiB,2BACrBT,GAAAA,CAAC,UAAO,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,IAAA,EAC9B,QAAA,EAAA,KAAA,EACH,CAAA;AAGF,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO6C,gBAAe,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,MAC9C;AAEA,MAAA,MAAM,OAAA,GAAU,QAAQ,EAAC;AACzB,MAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,GAAS,CAAA;AAEpC,MAAA,uBACE5C,IAAAA,CAAAmB,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,CAAC,8BAAcpB,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOoC,cAAa,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,QAExD,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,qBACZpC,GAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,YACjC,KAAA,EAAO,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,YAEpB,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,eAAA,EACV,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,eAAA,EACT,QAAA,EAAA;AAAA,gBAAA,KAAA,CAAM,IAAA;AAAA,gBACN,MAAM,SAAA,oBAAaD,IAAC,MAAA,EAAA,EAAK,KAAA,EAAO,mBAAmB,QAAA,EAAA,QAAA,EAAM;AAAA,eAAA,EAC5D,CAAA;AAAA,cACC,KAAA,CAAM,+BACLA,GAAAA,CAAC,SAAI,KAAA,EAAO,eAAA,EAAkB,gBAAM,WAAA,EAAY;AAAA,aAAA,EAEpD;AAAA,WAAA;AAAA,UAZK,KAAA,CAAM;AAAA,SAcd,CAAA;AAAA,QAEA,QAAA,IAAY,YAAA,oBACXC,IAAAA,CAAAmB,UAAA,EACG,QAAA,EAAA;AAAA,UAAA,UAAA,oBAAcpB,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,0BAClCA,IAAC,YAAA,EAAA,EAAa,OAAA,EAAS,MAAM,mBAAA,CAAoB,IAAI,GAAG,QAAA,EAAA,uBAAA,EAExD;AAAA,SAAA,EACF;AAAA,OAAA,EAEJ,CAAA;AAAA,IAEJ,CAAA;AAEA,IAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,KAAA,EAAO,EAAE,GAAGC,iBAAAA,EAAiB,GAAG,KAAA,EAAM,EAAG,SAAA,EAAuB,GAAG,KAAA,EAChF,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAS,cAAA,EAAiB,yBAAc,EAAE,CAAA;AAAA,sBAEpDA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,gBAAA;AAAA,UACR,OAAA,EAAS,MAAM,mBAAA,CAAoB,KAAK,CAAA;AAAA,UACxC,MAAA,EAAQ,UAAA;AAAA,UACR;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;AC7SA,IAAM,gBAAA,GAAmE;AAAA,EACvE,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EAC7B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC/B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,EACjC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,EACrC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAC1B,CAAA;AASA,SAAS,WAAW,QAAA,EAA2B;AAC7C,EAAA,MAAM,IAAA,GAAO,SAAS,WAAA,EAAY;AAClC,EAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,IAAA,CAAK,SAAS,MAAM,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA;AACpF;AASO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAuC;AACrC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAC3B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIO,SAAwB,IAAI,CAAA;AAGtD,EAAA,MAAM,iBAAA,GAAoBkB,QAAQ,MAAM;AACtC,IAAA,MAAM,UAA+D,EAAC;AAEtE,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,KAAA,CAAM,IAAI,CAAA;AACnE,MAAA,IAAI,CAAC,WAAA,EAAa;AAElB,MAAA,KAAA,MAAW,GAAA,IAAO,YAAY,OAAA,EAAS;AACrC,QAAA,IAAI,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA,EAAG;AAC7B,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,OAAO,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAAA,YAC9B,KAAA,EACE,MAAA,CAAO,MAAA,GAAS,CAAA,GACZ,CAAA,EAAG,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,IAAI,KACxC,GAAA,CAAI,IAAA;AAAA,YACV,SAAS,KAAA,CAAM;AAAA,WAChB,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAA,CAAO,MAAM,CAAC,CAAA;AAG1B,EAAA,MAAM,YAAY,MAAA,KAAW,MAAA;AAC7B,EAAA,MAAM,iBAAA,GAAoB,SACtB,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,WAAW,CAAA,CAAA,GACxC,kBAAA,GACE,GAAG,kBAAA,CAAmB,QAAQ,IAAI,kBAAA,CAAmB,MAAM,KAC3D,iBAAA,CAAkB,CAAC,GAAG,KAAA,IAAS,EAAA;AACrC,EAAA,MAAM,eAAA,GAAkB,QAAQ,QAAA,IAAY,KAAA;AAC5C,EAAA,MAAM,WAAA,GAAc,QAAQ,YAAA,IAAgB,KAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,QAAQ,UAAA,IAAc,CAAA;AAGxC,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAqC;AACzD,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AACrB,MAAA,QAAA,CAAS,MAAS,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,QAAA,CAAS,iEAAiE,CAAA;AAC1E,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,iBAAA,EAAmB,IAAI,CAAA;AACrD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,QAAA,CAAS,mEAAmE,CAAA;AAC5E,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS;AAAA,MACP,UAAU,MAAA,CAAO,OAAA;AAAA,MACjB,aAAa,MAAA,CAAO,MAAA;AAAA,MACpB,QAAA,EAAU,KAAA;AAAA,MACV,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,sBAAA,GAAyB,CAAC,KAAA,KAAkB;AAChD,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,KAAA,EAAO;AAEvB,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,EAAO,MAAA,CAAO,QAAQ,CAAA;AACpD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,QAAA,CAAS,8DAA8D,CAAA;AACvE,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,QAAA,CAAS;AAAA,MACP,GAAG,MAAA;AAAA,MACH,UAAU,MAAA,CAAO,OAAA;AAAA,MACjB,aAAa,MAAA,CAAO;AAAA,KACrB,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAkB;AAC9C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,QAAA,CAAS;AAAA,MACP,GAAG,MAAA;AAAA,MACH,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,uBAAA,GAA0B,CAAC,CAAA,KAAqC;AACpE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,QAAA,CAAS;AAAA,MACP,GAAG,MAAA;AAAA,MACH,YAAA,EAAc,EAAE,MAAA,CAAO,OAAA;AAAA,MACvB,YAAY,CAAA,CAAE,MAAA,CAAO,OAAA,GAAW,MAAA,CAAO,cAAc,CAAA,GAAK;AAAA,KAC3D,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,qBAAA,GAAwB,CAAC,CAAA,KAAqC;AAClE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACvC,IAAA,QAAA,CAAS;AAAA,MACP,GAAG,MAAA;AAAA,MACH,UAAA,EAAY,KAAA,CAAM,KAAK,CAAA,GAAI,CAAA,GAAI;AAAA,KAChC,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,GAAA,EAAK,MAAM,OAAA,CAAQ;AAAA,GACrB;AAEA,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,GAAA,EAAK,MAAM,OAAA,CAAQ;AAAA,GACrB;AAEA,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,GACtB;AAEA,EAAA,MAAM,aAAA,GAAqC;AAAA,IACzC,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,GACtB;AAEA,EAAA,MAAM,QAAA,GAAgC;AAAA,IACpC,OAAA,EAAS,MAAA;AAAA,IACT,GAAA,EAAK,MAAM,OAAA,CAAQ,EAAA;AAAA,IACnB,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,KAAA,EAAO,MAAM,MAAA,CAAO,KAAA;AAAA,IACpB,SAAA,EAAW,MAAM,OAAA,CAAQ;AAAA,GAC3B;AAGA,EAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAClC,IAAA,uBACEzB,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,aAAA,EAAe,QAAA,EAAA,wDAAA,EAE5B,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EAEV,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,yBAAA;AAAA,QACN,OAAA,EAAS,SAAA;AAAA,QACT,QAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,eAAe,QAAA,EAAA,qEAAA,EAE5B,CAAA;AAAA,IACC,yBAASA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,YAAa,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAEzC,SAAA,oBACCC,IAAAA,CAAAmB,QAAAA,EAAA,EAEE,QAAA,EAAA;AAAA,sBAAAnB,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,UAAA,EACV,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,UAAA,EAAY,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,wBACrCA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,iBAAA;AAAA,YACP,QAAA,EAAU,sBAAA;AAAA,YACV,OAAA,EAAS;AAAA;AAAA;AACX,OAAA,EACF,CAAA;AAAA,sBAGAC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,UAAA,EACV,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,UAAA,EAAY,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,wBACvCA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,eAAA;AAAA,YACP,QAAA,EAAU,oBAAA;AAAA,YACV,OAAA,EAAS;AAAA;AAAA,SACX;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,eAAe,QAAA,EAAA,sCAAA,EAE5B;AAAA,OAAA,EACF,CAAA;AAAA,sBAGAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,sBAAA;AAAA,UACN,OAAA,EAAS,WAAA;AAAA,UACT,QAAA,EAAU;AAAA;AAAA,OACZ;AAAA,MAGC,WAAA,oBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,UAAA,EACV,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,UAAA,EAAY,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,wBACpCC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,QAAA,EACV,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO,OAAO,SAAS,CAAA;AAAA,cACvB,QAAA,EAAU,qBAAA;AAAA,cACV,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA;AAAQ;AAAA,WAC1B;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,eAAe,QAAA,EAAA,gCAAA,EAE5B;AAAA,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACjRA,IAAMgD,cAAAA,GAAqC;AAAA,EACzC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,6BAAA;AAAA,EACT,SAAA,EAAW,uCAAA;AAAA,EACX,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,eAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,YAAA,GAAoC;AAAA,EACxC,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,SAAA,GAAiC;AAAA,EACrC,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,KAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY,0BAAA;AAAA,EACZ,eAAA,EAAiB,8BAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,KAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAGA,IAAM,QAAQ,OAAO,SAAA,KAAc,eAAe,sBAAA,CAAuB,IAAA,CAAK,UAAU,QAAQ,CAAA;AAChG,IAAM,MAAA,GAAS,QAAQ,QAAA,GAAM,MAAA;AAStB,SAAS,mBAAA,CAAoB;AAAA,EAClC,WAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA0C;AACxC,EAAA,uBACE/C,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAG+C,cAAAA,EAAe,GAAG,KAAA,EAAM,EAC7D,QAAA,EAAA;AAAA,oBAAA/C,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,eAAA,EACV,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,0BAAUA,GAAAA,CAAC,QAAK,IAAA,EAAK,MAAA,EAAO,MAAM,EAAA,EAAI,CAAA;AAAA,UACtC,OAAA,EAAS,SAAA;AAAA,UACT,UAAU,CAAC,UAAA;AAAA,UACX,OAAA,EAAS,WAAA;AAAA,UACT,KAAA,EAAO,kBAAkB,MAAM,CAAA,OAAA,CAAA;AAAA,UAChC,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBAEAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,WAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,0BAAUA,GAAAA,CAAC,QAAK,IAAA,EAAK,QAAA,EAAS,MAAM,EAAA,EAAI,CAAA;AAAA,UACxC,OAAA,EAAS,SAAA;AAAA,UACT,QAAA,EAAU,CAAC,UAAA,IAAc,WAAA;AAAA,UACzB,KAAA,EAAM,wBAAA;AAAA,UACP,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBAEAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,0BAAUA,GAAAA,CAAC,QAAK,IAAA,EAAK,OAAA,EAAQ,MAAM,EAAA,EAAI,CAAA;AAAA,UACvC,OAAA,EAAS,OAAA;AAAA,UACT,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAM,aAAA;AAAA,UACP,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EAAc,CAAA;AAAA,oBAE1BC,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,UAAA,EACX,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,SAAA,EAAY,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,sBAC/BA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,WAAW,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBACxBA,IAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,KAAA,IAAS,QAAA,EAAA,YAAA,EAAU;AAAA,KAAA,EAChD;AAAA,GAAA,EACF,CAAA;AAEJ;ACxGA,IAAME,iBAAAA,GAAuC;AAAA,EAC3C,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM6B,aAAAA,GAAoC;AAAA,EACxC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,OAAA,EAAS,qDAAA;AAAA,EACT,eAAA,EAAiB,8BAAA;AAAA,EACjB,YAAA,EAAc,uCAAA;AAAA,EACd,MAAA,EAAQ;AACV,CAAA;AAEA,IAAMC,YAAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,QAAA,EAAU,6BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAA;AAEA,IAAMU,cAAAA,GAAqC;AAAA,EACzC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK;AACP,CAAA;AAEA,IAAM1B,cAAAA,GAAqC;AAAA,EACzC,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,iCAAA;AAAA,EACjB,QAAA,EAAU,MAAA;AAAA,EACV,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO,2BAAA;AAAA,EACP,UAAA,EAAY,UAAA;AAAA,EACZ,SAAA,EAAW,YAAA;AAAA,EACX,MAAA,EAAQ;AACV,CAAA;AAEA,IAAMoB,YAAAA,GAAmC;AAAA,EACvC,KAAA,EAAO,iCAAA;AAAA,EACP,SAAA,EAAW;AACb,CAAA;AAEA,IAAMH,YAAAA,GAAmC;AAAA,EACvC,KAAA,EAAO;AACT,CAAA;AASO,SAAS,YAAA,CAAa;AAAA,EAC3B,GAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,KAAA,GAAQ,IAAA;AAAA,EACR,WAAA,GAAc,IAAA;AAAA,EACd,gBAAA,GAAmB,KAAA;AAAA,EACnB,SAAA;AAAA,EACA;AACF,CAAA,EAAmC;AACjC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI1B,SAAS,gBAAgB,CAAA;AAE/D,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,GAAG,CAAA;AAAA,MACzC,CAAA,CAAA,MAAQ;AAEN,QAAA,OAAA,CAAQ,KAAK,6BAA6B,CAAA;AAAA,MAC5C;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,cAAA,CAAe,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,IAChC;AAAA,EACF,CAAA;AAEA,EAAA,uBACEN,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAGC,iBAAAA,EAAiB,GAAG,KAAA,EAAM,EAC/D,QAAA,EAAA;AAAA,oBAAAD,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO8B,aAAAA;AAAA,QACP,OAAA,EAAS,YAAA;AAAA,QACT,IAAA,EAAK,QAAA;AAAA,QACL,QAAA,EAAU,CAAA;AAAA,QACV,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,UAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,YAAA,EAAa;AAAA,UACf;AAAA,QACF,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA9B,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO+B,YAAAA,EACV,QAAA,EAAA;AAAA,YAAA,WAAA,oBACChC,GAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,eAAA;AAAA,gBACL,IAAA,EAAM,EAAA;AAAA,gBACN,KAAA,EAAO;AAAA,kBACL,SAAA,EAAW,cAAc,cAAA,GAAiB,eAAA;AAAA,kBAC1C,UAAA,EAAY;AAAA;AACd;AAAA,aACF;AAAA,4BAEFA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,QAAA,EAAS,MAAM,EAAA,EAAI,CAAA;AAAA,YAAE;AAAA,WAAA,EAElC,CAAA;AAAA,0BAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0C,cAAAA,EAAe,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB,EAC3D,QAAA,kBAAA1C,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,OAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,0BAAUA,GAAAA,CAAC,QAAK,IAAA,EAAK,MAAA,EAAO,MAAM,EAAA,EAAI,CAAA;AAAA,cACtC,OAAA,EAAS,UAAA;AAAA,cACT,QAAA,EAAU,CAAC,GAAA,IAAO,OAAA;AAAA,cACnB,QAAA,EAAA;AAAA;AAAA,WAED,EACF;AAAA;AAAA;AAAA,KACF;AAAA,IAEC,CAAC,WAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,OAAOgB,cAAAA,EACT,QAAA,EAAA,OAAA,mBACChB,GAAAA,CAAC,UAAK,KAAA,EAAOoC,YAAAA,EAAa,QAAA,EAAA,mBAAA,EAAiB,CAAA,GACzC,wBACFpC,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAOiC,cAAc,QAAA,EAAA,KAAA,EAAM,CAAA,GAC/B,GAAA,mBACFjC,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,UAAA,EAAa,QAAA,EAAA,GAAA,EAAI,oBAE7BA,GAAAA,CAAC,UAAK,KAAA,EAAOoC,YAAAA,EAAa,kDAE1B,CAAA,EAEJ;AAAA,GAAA,EAEJ,CAAA;AAEJ;AClGA,IAAMlC,iBAAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK,2BAAA;AAAA,EACL,MAAA,EAAQ,MAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,sBAAA,GAA8C;AAAA,EAClD,OAAA,EAAS,MAAA;AAAA,EACT,GAAA,EAAK,2BAAA;AAAA,EACL,IAAA,EAAM,CAAA;AAAA,EACN,SAAA,EAAW,CAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,aAAA,GAAqC;AAAA,EACzC,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY,CAAA;AAAA,EACZ,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,IAAA,EAAM,CAAA;AAAA,EACN,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK,2BAAA;AAAA,EACL,QAAA,EAAU,CAAA;AAAA,EACV,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,oBAAA,GAA4C;AAAA,EAChD,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,aAAA,GAAqC;AAAA,EACzC,IAAA,EAAM,CAAA;AAAA,EACN,SAAA,EAAW,CAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAA;AAMA,IAAM,qBAAqB,OAAwB;AAAA,EACjD,QAAQ,EAAC;AAAA,EACT,SAAS,EAAC;AAAA,EACV,SAAS,EAAC;AAAA,EACV,UAAU;AACZ,CAAA,CAAA;AAmBO,SAAS,YAAA,CAAa;AAAA,EAC3B,YAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,gBAAA,GAAmB,GAAA;AAAA,EACnB,cAAA,GAAiB,IAAA;AAAA,EACjB,gBAAA,GAAmB,IAAA;AAAA,EACnB,gBAAA,GAAmB,KAAA;AAAA,EACnB,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,MAAA,GAAS,YAAA;AAAA,EACT,SAAA;AAAA,EACA;AACF,CAAA,EAAmC;AAEjC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAChC,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,aAAA,KAAkB,SAAA,EAAU;AAGvD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIK,QAAAA;AAAA,IACxB,gBAAgB,kBAAA;AAAmB,GACrC;AACA,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,QAAAA,EAA6B;AACvE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAG5D,EAAAG,UAAU,MAAM;AACd,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,QAAA,CAAS,YAAY,CAAA;AAErB,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA;AACxC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,gBAAA,CAAiB,WAAW,IAAI,CAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIH,SAAiC,IAAI,CAAA;AAC7E,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,WAAA,EAAa,OAAM,GAAI,QAAA;AAAA,IACtD,YAAA;AAAA,IACA,EAAE,OAAA,EAAS,YAAA,KAAiB,IAAA;AAAK,GACnC;AAGA,EAAA,MAAM,qBAAA,GAAwBC,OAA6C,IAAI,CAAA;AAG/E,EAAA,MAAM,eAAA,GAAkBiB,OAAAA;AAAA,IACtB,MACE,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACzB,MAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,GAAA,CAAI,QAAQ,CAAA;AAC5D,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,OAAO,IAAA,IAAQ,EAAA;AAAA,QACtB,QAAQ,GAAA,CAAI;AAAA,OACd;AAAA,IACF,CAAC,CAAA;AAAA,IACH,CAAC,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,MAAM;AAAA,GAC9B;AAGA,EAAA,MAAM,UAAA,GAAaA,QAAQ,MAAM;AAC/B,IAAA,OAAO,MAAM,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,QAAQ,MAAA,GAAS,CAAA;AAAA,EAC3D,CAAA,EAAG,CAAC,KAAA,CAAM,MAAA,CAAO,QAAQ,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAC,CAAA;AAG9C,EAAAf,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,kBAAkB,YAAY;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAY,KAAK,CAAA;AAC1C,QAAA,aAAA,CAAc,GAAG,CAAA;AACjB,QAAA,WAAA,CAAY,IAAI,CAAA;AAAA,MAClB,SAAS,GAAA,EAAK;AACZ,QAAA,WAAA,CAAY,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAwB,CAAA;AACzE,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAEA,IAAA,KAAK,eAAA,EAAgB;AAAA,EACvB,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAC,CAAA;AAG9B,EAAA,MAAM,gBAAA,GAAmBF,OAAO,aAAa,CAAA;AAC7C,EAAA,MAAM,YAAA,GAAeA,OAAO,SAAS,CAAA;AACrC,EAAA,MAAM,UAAA,GAAaA,OAAO,OAAO,CAAA;AAGjC,EAAAE,UAAU,MAAM;AACd,IAAA,gBAAA,CAAiB,OAAA,GAAU,aAAA;AAC3B,IAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AACvB,IAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAAA,EACvB,CAAC,CAAA;AAGD,EAAAA,UAAU,MAAM;AACd,IAAA,gBAAA,CAAiB,UAAU,KAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,YAAA,CAAa,UAAU,MAAM,CAAA;AAAA,IAC/B;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,UAAA,CAAW,UAAU,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAEjC,IAAA,IAAI,sBAAsB,OAAA,EAAS;AACjC,MAAA,YAAA,CAAa,sBAAsB,OAAO,CAAA;AAAA,IAC5C;AAEA,IAAA,qBAAA,CAAsB,OAAA,GAAU,WAAW,MAAM;AAC/C,MAAA,eAAA,CAAgB,EAAE,GAAG,KAAA,EAAO,CAAA;AAAA,IAC9B,GAAG,gBAAgB,CAAA;AAEnB,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,sBAAsB,OAAA,EAAS;AACjC,QAAA,YAAA,CAAa,sBAAsB,OAAO,CAAA;AAAA,MAC5C;AAAA,IACF,CAAA;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,WAAA,EAAa,gBAAA,EAAkB,UAAU,CAAC,CAAA;AAGrD,EAAA,MAAM,aAAA,GAAgBD,YAAY,MAAM;AACtC,IAAA,eAAA,CAAgB,EAAE,GAAG,KAAA,EAAO,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAA,CAAK,EAAE,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,QAAQ,OAAA,EAAS;AACjD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,UAAA,IAAc,CAAC,WAAA,EAAa;AAC9B,UAAA,aAAA,EAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,UAAA,EAAY,WAAA,EAAa,aAAa,CAAC,CAAA;AAG3C,EAAA,MAAM,iBAAA,GAAoBD,WAAAA,CAAY,CAAC,KAAA,KAAuB;AAC5D,IAAA,gBAAA,CAAiB,MAAM,IAAI,CAAA;AAE3B,IAAA,QAAA,CAAS,CAAC,IAAA,KAAS;AAEjB,MAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,KAAA,CAAM,IAAI,CAAA;AACnE,MAAA,IAAI,eAAe,OAAO,IAAA;AAG1B,MAAA,MAAM,QAAA,GAAW;AAAA,QACf,EAAA,EAAI,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA;AAAA,QAC9B,MAAM,KAAA,CAAM;AAAA,OACd;AAEA,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,MAAA,EAAQ,CAAC,GAAG,IAAA,CAAK,QAAQ,QAAQ;AAAA,OACnC;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,kBAAA,GAAqBA,WAAAA,CAAY,CAAC,KAAA,EAAoB,MAAA,KAAyB;AACnF,IAAA,QAAA,CAAS,CAAC,IAAA,KAAS;AAEjB,MAAA,IAAI,UAAA,GAAa,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,KAAA,CAAM,IAAI,CAAA;AAE9D,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,UAAA,GAAa;AAAA,UACX,EAAA,EAAI,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA;AAAA,UAC9B,MAAM,KAAA,CAAM;AAAA,SACd;AAAA,MACF;AAGA,MAAA,MAAM,eAAA,GAAkB,KAAK,OAAA,CAAQ,IAAA;AAAA,QACnC,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,WAAY,EAAA,IAAM,CAAA,CAAE,WAAW,MAAA,CAAO;AAAA,OAC9D;AAEA,MAAA,IAAI,iBAAiB,OAAO,IAAA;AAG5B,MAAA,MAAM,SAAA,GAA6B;AAAA,QACjC,UAAU,UAAA,CAAW,EAAA;AAAA,QACrB,QAAQ,MAAA,CAAO,IAAA;AAAA,QACf,WAAA,EAAa;AAAA,OACf;AAEA,MAAA,MAAM,YAAY,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,KAAA,CAAM,IAAI,IAC3D,IAAA,CAAK,MAAA,GACL,CAAC,GAAG,IAAA,CAAK,QAAQ,UAAU,CAAA;AAE/B,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS,CAAC,GAAG,IAAA,CAAK,SAAS,SAAS;AAAA,OACtC;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,mBAAA,GAAsBA,WAAAA,CAAY,CAAC,OAAA,KAA+B;AACtE,IAAA,QAAA,CAAS,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,SAAQ,CAAE,CAAA;AAAA,EAC3C,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,mBAAA,GAAsBA,WAAAA,CAAY,CAAC,OAAA,KAAgC;AACvE,IAAA,QAAA,CAAS,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,SAAQ,CAAE,CAAA;AAAA,EAC3C,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,iBAAA,GAAoBA,WAAAA,CAAY,CAAC,KAAA,KAA4B;AACjE,IAAA,QAAA,CAAS,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,OAAM,CAAE,CAAA;AAAA,EACnD,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,sBAAA,GAAyBA,WAAAA;AAAA,IAC7B,CAAC,UAAA,KAAiD;AAChD,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,WAAA,EAAa,YAAW,CAAE,CAAA;AAAA,IAC3D,CAAA;AAAA,IACA;AAAC,GACH;AAGA,EAAA,MAAM,4BAAA,GAA+BA,WAAAA;AAAA,IACnC,CAAC,gBAAA,KAAwC;AACvC,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,iBAAA,EAAmB,gBAAA,CAAiB,MAAA,GAAS,CAAA,GAAI,gBAAA,GAAmB;AAAA,OACtE,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IACA;AAAC,GACH;AAGA,EAAA,MAAM,iBAAA,GAAoBA,WAAAA,CAAY,CAAC,KAAA,KAA4B;AACjE,IAAA,QAAA,CAAS,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,OAAM,CAAE,CAAA;AAAA,EACzC,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,eAAA,CAAgB,EAAE,GAAG,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,QAAA,CAAS,oBAAoB,CAAA;AAC7B,IAAA,gBAAA,CAAiB,MAAS,CAAA;AAC1B,IAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,sBAAA,GAAyBA,WAAAA;AAAA,IAC7B,CAAC,UAAA,KAA2B;AAC1B,MAAA,QAAA,CAAS,WAAW,KAAK,CAAA;AACzB,MAAA,gBAAA,CAAiB,UAAA,CAAW,KAAA,CAAM,MAAA,CAAO,CAAC,GAAG,IAAI,CAAA;AACjD,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,gBAAA,GAAmB,UAAU,CAAA;AAAA,IAC/B,CAAA;AAAA,IACA,CAAC,gBAAgB;AAAA,GACnB;AAGA,EAAA,MAAM,oBAAA,GAAuBA,WAAAA;AAAA,IAC3B,CAAC,UAAA,KAA2B;AAC1B,MAAA,gBAAA,GAAmB,UAAU,CAAA;AAAA,IAC/B,CAAA;AAAA,IACA,CAAC,gBAAgB;AAAA,GACnB;AAEA,EAAA,IAAI,aAAA,IAAiB,CAAC,MAAA,EAAQ;AAC5B,IAAA,uBACET,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAGE,iBAAAA,EAAiB,GAAG,KAAA,EAAM,EAC/D,QAAA,kBAAAF,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,MAAA,EAAQ,MAAA;AAAA,UACR,KAAA,EAAO;AAAA,SACT;AAAA,QACD,QAAA,EAAA;AAAA;AAAA,KAED,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,EAAE,GAAGE,iBAAAA,EAAiB,GAAG,OAAM,EAC/D,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,sBAAA,EACT,QAAA,EAAA;AAAA,IAAA,MAAA,KAAW,gCACVD,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,eACV,QAAA,kBAAAA,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,aAAA;AAAA,QACA,eAAA;AAAA,QACA,aAAA,EAAe,iBAAA;AAAA,QACf,cAAA,EAAgB,kBAAA;AAAA,QAChB,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA;AAAO;AAAA,KAC1B,EACF,CAAA;AAAA,oBAGFC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,UAAA,EACV,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,oBAAA,EACV,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,QAAQ,KAAA,CAAM,MAAA;AAAA,YACd,SAAS,KAAA,CAAM,OAAA;AAAA,YACf,QAAA,EAAU,mBAAA;AAAA,YACV;AAAA;AAAA,SACF;AAAA,wBAEAA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,QAAQ,KAAA,CAAM,MAAA;AAAA,YACd,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,EAAC;AAAA,YACvB,QAAA,EAAU,iBAAA;AAAA,YACV;AAAA;AAAA,SACF;AAAA,wBAEAA,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,QAAQ,KAAA,CAAM,MAAA;AAAA,YACd,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,EAAC;AAAA,YAC3B,QAAA,EAAU,mBAAA;AAAA,YACV;AAAA;AAAA,SACF;AAAA,wBAEAA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,QAAQ,KAAA,CAAM,MAAA;AAAA,YACd,KAAA,EAAO,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,YAC1B,QAAA,EAAU,iBAAA;AAAA,YACV;AAAA;AAAA,SACF;AAAA,wBAEAA,GAAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,mBAAA;AAAA,YACN,WAAA,EAAA,CAAc,KAAA,CAAM,iBAAA,EAAmB,MAAA,IAAU,CAAA,IAAK,CAAA;AAAA,YAEtD,QAAA,kBAAAA,GAAAA;AAAA,cAAC,sBAAA;AAAA,cAAA;AAAA,gBACC,MAAA,EAAQ,KAAA,CAAM,iBAAA,IAAqB,EAAC;AAAA,gBACpC,QAAA,EAAU,4BAAA;AAAA,gBACV,QAAQ,KAAA,CAAM,MAAA;AAAA,gBACd;AAAA;AAAA;AACF;AAAA,SACF;AAAA,wBAEAA,GAAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,aAAA;AAAA,YACN,WAAA,EAAa,MAAM,WAAA,KAAgB,MAAA;AAAA,YAEnC,QAAA,kBAAAA,GAAAA;AAAA,cAAC,gBAAA;AAAA,cAAA;AAAA,gBACC,MAAA;AAAA,gBACA,QAAQ,KAAA,CAAM,MAAA;AAAA,gBACd,QAAQ,KAAA,CAAM,WAAA;AAAA,gBACd,QAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AACF,OAAA,EACF,CAAA;AAAA,sBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,2BAAA,EAA4B,EACpF,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,mBAAA;AAAA,UAAA;AAAA,YACC,WAAA;AAAA,YACA,UAAA;AAAA,YACA,SAAA,EAAW,aAAA;AAAA,YACX,SAAA,EAAW,aAAA;AAAA,YACX,OAAA,EAAS,WAAA;AAAA,YACT,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA;AAAE;AAAA,SACnB;AAAA,QACC,oCACCA,GAAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAc,aAAa,KAAA,GAAQ,IAAA;AAAA,YACnC,QAAA,EAAU,sBAAA;AAAA,YACV,MAAA,EAAQ;AAAA;AAAA;AACV,OAAA,EAEJ,CAAA;AAAA,MAEC,kCACCA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,UAAA;AAAA,UACL,KAAA,EAAO,QAAA;AAAA,UACP,WAAA,EAAW,IAAA;AAAA,UACX,gBAAA,EAAkB;AAAA;AAAA,OACpB;AAAA,MAGD,oCACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,eACV,QAAA,kBAAAA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,OAAA,EAAS,WAAA;AAAA,UACT,KAAA;AAAA,UACA,QAAA,EAAQ,IAAA;AAAA,UACR,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA;AAAO;AAAA,OAC1B,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;ACviBA,IAAML,WAAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,KAAA;AAAA,EACL,OAAA,EAAS,UAAA;AAAA,EACT,YAAA,EAAc,KAAA;AAAA,EACd,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,YAAA,GAAyE;AAAA,EAC7E,OAAA,EAAS;AAAA,IACP,eAAA,EAAiB,kDAAA;AAAA,IACjB,KAAA,EAAO;AAAA,GACT;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,eAAA,EAAiB,+CAAA;AAAA,IACjB,KAAA,EAAO;AAAA,GACT;AAAA,EACA,KAAA,EAAO;AAAA,IACL,eAAA,EAAiB,kDAAA;AAAA,IACjB,KAAA,EAAO;AAAA,GACT;AAAA,EACA,KAAA,EAAO;AAAA,IACL,eAAA,EAAiB,gDAAA;AAAA,IACjB,KAAA,EAAO;AAAA;AAEX,CAAA;AAEA,IAAM,SAAA,GAAiC;AAAA,EACrC,KAAA,EAAO,KAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,YAAA,EAAc,KAAA;AAAA,EACd,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,aAAA,GAAqC;AAAA,EACzC,KAAA,EAAO,MAAA;AAAA,EACP,MAAA,EAAQ,MAAA;AAAA,EACR,MAAA,EAAQ,wBAAA;AAAA,EACR,cAAA,EAAgB,aAAA;AAAA,EAChB,YAAA,EAAc,KAAA;AAAA,EACd,SAAA,EAAW;AACb,CAAA;AAEA,IAAMkC,WAAAA,GAAkC;AAAA,EACtC,UAAA,EAAY,MAAA;AAAA,EACZ,QAAA,EAAU;AACZ,CAAA;AAmBO,IAAM,iBAAA,GAAoB/B,UAAAA,CAG/B,SAASmD,kBAAAA,CAAkB,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,EAAK;AAEpE,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEhD,IAAAA,CAAAmB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAApB,IAAC,OAAA,EAAA,EACE,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,EAOH,CAAA;AAAA,oBACAC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,aAAA,EAAY,gBAAA;AAAA,QACZ,IAAA,EAAK,QAAA;AAAA,QACL,WAAA,EAAU,QAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,GAAGN,WAAAA;AAAA,UACH,GAAG,aAAa,MAAM,CAAA;AAAA,UACtB,GAAG;AAAA,SACL;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,MAAA,KAAW,SAAA,oBACVM,IAAAA,CAAAmB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAApB,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,SAAA,EAAW,eAAY,MAAA,EAAO,CAAA;AAAA,4BAC3CA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,iBAAA,EAAe;AAAA,WAAA,EACvB,CAAA;AAAA,UAGD,MAAA,KAAW,QAAA,oBACVC,IAAAA,CAAAmB,UAAA,EACE,QAAA,EAAA;AAAA,4BAAApB,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,aAAA,EAAe,eAAY,MAAA,EAAO,CAAA;AAAA,4BAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,WAAA,EAAS;AAAA,WAAA,EACjB,CAAA;AAAA,UAGD,MAAA,KAAW,OAAA,oBACVC,IAAAA,CAAAmB,UAAA,EACE,QAAA,EAAA;AAAA,4BAAApB,IAAC,MAAA,EAAA,EAAK,KAAA,EAAO6B,WAAAA,EAAY,aAAA,EAAY,QAAO,QAAA,EAAA,QAAA,EAE5C,CAAA;AAAA,4BACA7B,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,OAAA,EAAK;AAAA,WAAA,EACb,CAAA;AAAA,UAGD,MAAA,KAAW,OAAA,oBACVC,IAAAA,CAAAmB,UAAA,EACE,QAAA,EAAA;AAAA,4BAAApB,IAAC,MAAA,EAAA,EAAK,KAAA,EAAO6B,WAAAA,EAAY,aAAA,EAAY,QAAO,QAAA,EAAA,GAAA,EAE5C,CAAA;AAAA,4BACA7B,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,KAAA,EAAO,SAAS,QAAA,EAAA,cAAA,EAAY;AAAA,WAAA,EAC3C;AAAA;AAAA;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ,CAAC;AC1HD,IAAME,iBAAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK,iCAAA;AAAA,EACL,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,mBAAA,GAA2C;AAAA,EAC/C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,cAAA,GAAsC;AAAA,EAC1C,KAAA,EAAO,MAAA;AAAA,EACP,OAAA,EAAS,iCAAA;AAAA,EACT,UAAA,EAAY,mEAAA;AAAA,EACZ,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY,KAAA;AAAA,EACZ,eAAA,EAAiB,uCAAA;AAAA,EACjB,KAAA,EAAO,oCAAA;AAAA,EACP,MAAA,EAAQ,gDAAA;AAAA,EACR,YAAA,EAAc,+BAAA;AAAA,EACd,MAAA,EAAQ,UAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,mBAAA,GAA2C;AAAA,EAC/C,WAAA,EAAa,uCAAA;AAAA,EACb,SAAA,EAAW;AACb,CAAA;AAEA,IAAM8C,cAAAA,GAAqC;AAAA,EACzC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,YAAA,GAAoC;AAAA,EACxC,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,gCAAA;AAAA,EACL,OAAA,EAAS,gEAAA;AAAA,EACT,UAAA,EAAY,SAAA;AAAA,EACZ,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,OAAA;AAAA,EACP,eAAA,EAAiB,uCAAA;AAAA,EACjB,MAAA,EAAQ,MAAA;AAAA,EACR,YAAA,EAAc,+BAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,oBAAA,GAA4C;AAAA,EAChD,eAAA,EAAiB,qCAAA;AAAA,EACjB,MAAA,EAAQ;AACV,CAAA;AAEA,IAAMf,YAAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,iCAAA;AAAA,EACT,eAAA,EAAiB,wCAAA;AAAA,EACjB,KAAA,EAAO,qCAAA;AAAA,EACP,YAAA,EAAc,+BAAA;AAAA,EACd,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,qBAAA,GAA6C;AAAA,EACjD,OAAA,EAAS,gEAAA;AAAA,EACT,eAAA,EAAiB,0CAAA;AAAA,EACjB,KAAA,EAAO,uCAAA;AAAA,EACP,YAAA,EAAc,+BAAA;AAAA,EACd,QAAA,EAAU;AACZ,CAAA;AAEA,IAAMiB,aAAAA,GAAoC;AAAA,EACxC,QAAA,EAAU,MAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,gBAAA,GAAwC;AAAA,EAC5C,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,gCAAA;AAAA,EACL,QAAA,EAAU,MAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,cAAA,GAAsC;AAAA,EAC1C,OAAA,EAAS,SAAA;AAAA,EACT,eAAA,EAAiB,uCAAA;AAAA,EACjB,YAAA,EAAc,+BAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,sBAAA,GAA8C;AAAA,EAClD,IAAA,EAAM,CAAA;AAAA,EACN,SAAA,EAAW,CAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAA;AAkBO,SAAS,eAAA,CAAgB;AAAA,EAC9B,UAAA,GAAa,EAAA;AAAA,EACb,WAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,GAAc,oCAAA;AAAA,EACd,WAAA,GAAc,IAAA;AAAA,EACd,MAAA,GAAS,GAAA;AAAA,EACT,SAAA;AAAA,EACA;AACF,CAAA,EAAsC;AAEpC,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI3C,SAAS,UAAU,CAAA;AACzC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAG1E,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAI,aAAa,eAAA,EAAiB;AAAA,IAChC,OAAA,EAAS,cAAA;AAAA,IACT,aAAA,EAAe;AAAA,GAChB,CAAA;AAGD,EAAA,MAAM,YAAA,GAAeE,WAAAA;AAAA,IACnB,CAAC,CAAA,KAA8C;AAC7C,MAAA,MAAM,MAAA,GAAS,EAAE,MAAA,CAAO,KAAA;AACxB,MAAA,MAAA,CAAO,MAAM,CAAA;AACb,MAAA,WAAA,GAAc,MAAM,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAGA,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,IAAI,CAAC,GAAA,CAAI,IAAA,EAAK,EAAG;AACjB,IAAA,kBAAA,CAAmB,GAAG,CAAA;AACtB,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,SAAA,GAAY,GAAG,CAAA;AAAA,EACjB,CAAA,EAAG,CAAC,GAAA,EAAK,SAAS,CAAC,CAAA;AAGnB,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,CAAA,KAAgD;AAE/C,MAAA,IAAA,CAAK,EAAE,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,QAAQ,OAAA,EAAS;AACjD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,aAAA,EAAc;AAAA,MAChB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAa;AAAA,GAChB;AAGA,EAAA,MAAM,UAAA,GAAa,IAAI,IAAA,EAAK,CAAE,SAAS,CAAA,IAAK,CAAC,aAAa,CAAC,YAAA;AAG3D,EAAA,MAAM,oBAAA,GAA4C;AAAA,IAChD,GAAG,cAAA;AAAA,IACH,MAAA;AAAA,IACA,GAAI,SAAA,GAAY,mBAAA,GAAsB;AAAC,GACzC;AAEA,EAAA,MAAM,kBAAA,GAA0C;AAAA,IAC9C,GAAG,YAAA;AAAA,IACH,GAAI,UAAA,GAAa,EAAC,GAAI;AAAA,GACxB;AAEA,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAGC,iBAAAA,EAAiB,GAAG,KAAA,EAAM,EAC/D,QAAA,EAAA;AAAA,oBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,mBAAA,EACV,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,GAAA;AAAA,UACP,QAAA,EAAU,YAAA;AAAA,UACV,SAAA,EAAW,aAAA;AAAA,UACX,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,UAChC,MAAA,EAAQ,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,UAChC,WAAA;AAAA,UACA,KAAA,EAAO,oBAAA;AAAA,UACP,UAAA,EAAY,KAAA;AAAA,UACZ,YAAA,EAAa,KAAA;AAAA,UACb,cAAA,EAAe;AAAA;AAAA,OACjB;AAAA,MAEC,UAAA,IAAc,CAAC,UAAA,CAAW,KAAA,oBACzBC,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,qBAAA,EACV,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,YAAO,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,wBAC1BA,IAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,cAAA,EAAgB,OAAA,EAAS,CAAA,EAAE,EAC7C,QAAA,EAAA,UAAA,CAAW,OAAO,GAAA,CAAI,CAAC,KAAK,CAAA,qBAC3BA,IAAC,IAAA,EAAA,EAAY,QAAA,EAAA,GAAA,EAAA,EAAJ,CAAQ,CAClB,CAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,sBAGFC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO+C,cAAAA,EACV,QAAA,EAAA;AAAA,wBAAA/C,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOiD,aAAAA,EACT,QAAA,EAAA;AAAA,UAAA,YAAA,IAAgB,eAAA;AAAA,UAChB,SAAA,IAAa,cAAA;AAAA,UACb,CAAC,YAAA,IAAgB,CAAC,SAAA,IAAa,UAAA,EAAY,yBAC1CjD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,gBAAA,EAAkB,QAAA,EAAA;AAAA,YAAA,SAAA;AAAA,YACpB,GAAA;AAAA,YACP,UAAA,CAAW,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,qBACtBD,GAAAA,CAAC,MAAA,EAAA,EAAiB,KAAA,EAAO,cAAA,EACtB,QAAA,EAAA,KAAA,EAAA,EADQ,KAEX,CACD;AAAA,WAAA,EACH;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAEAC,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,aAAA;AAAA,YACT,UAAU,CAAC,UAAA;AAAA,YACX,KAAA,EAAO,kBAAA;AAAA,YACP,IAAA,EAAK,QAAA;AAAA,YAEJ,QAAA,EAAA;AAAA,cAAA,SAAA,GAAY,cAAA,GAAiB,WAAA;AAAA,8BAC9BD,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAU,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAI,EAAG,QAAA,EAAA,aAAA,EAAW;AAAA;AAAA;AAAA;AAC9D,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,KAAA,oBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAOgC,YAAAA,EACV,QAAA,EAAA;AAAA,sBAAAjC,GAAAA,CAAC,YAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,MAAS,GAAA;AAAA,MAAE,KAAA,CAAM;AAAA,KAAA,EACjC,CAAA;AAAA,IAGD,eAAe,IAAA,oBACdA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,wBACV,QAAA,kBAAAA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,IAAA;AAAA,QACR,OAAA,EAAS,SAAA;AAAA,QACT,QAAA,EAAQ,IAAA;AAAA,QACR,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA;AAAO;AAAA,KAC1B,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACxQA,SAAS,gBAAgB,MAAA,EAA8B;AACrD,EAAA,IAAI,EAAA,GAAK,OAAO,MAAA,GAAS,CAAA;AACzB,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACnD,EAAA,OAAO,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,EAAI,EAAE,EAAE,CAAA,EAAG;AAChC,IAAA,EAAA,EAAA;AAAA,EACF;AACA,EAAA,OAAO,IAAI,EAAE,CAAA,CAAA;AACf;AASO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,CAAA;AAAA,EACZ,iBAAA,GAAoB,IAAA;AAAA,EACpB;AACF,CAAA,EAAoC;AAClC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAG3B,EAAA,MAAM,qBAAA,GAAwByB,QAAQ,MAAM;AAC1C,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACvD,IAAA,OAAO,MAAA,CAAO,MAAA,CACX,MAAA,CAAO,CAAC,MAAM,CAAC,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA,CACxC,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACX,OAAO,CAAA,CAAE,IAAA;AAAA,MACT,OAAO,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,QAAQ,MAAM,CAAA,MAAA;AAAA,KACvC,CAAE,CAAA;AAAA,EACN,CAAA,EAAG,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,CAAC,CAAA;AAG1B,EAAA,MAAM,eAAA,GAAkBA,QAAQ,MAAM;AACpC,IAAA,IAAI,CAAC,iBAAA,IAAqB,MAAA,CAAO,MAAA,KAAW,CAAA,SAAU,EAAC;AAEvD,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACvD,IAAA,MAAM,cAAyD,EAAC;AAEhE,IAAA,KAAA,MAAW,GAAA,IAAO,OAAO,aAAA,EAAe;AAEtC,MAAA,IAAI,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA,IAAK,CAAC,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,EAAG;AACzE,QAAA,MAAM,QAAA,GAAW,YAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,IAAI,QAAQ,CAAA;AACjE,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,WAAA,CAAY,IAAA,CAAK;AAAA,YACf,OAAO,GAAA,CAAI,QAAA;AAAA,YACX,cAAc,CAAA,IAAA,EAAO,GAAA,CAAI,UAAU,CAAA,CAAA,EAAI,IAAI,WAAW,CAAA;AAAA,WACvD,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAC,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA,EAAG;AACzE,QAAA,MAAM,QAAA,GAAW,YAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,IAAI,UAAU,CAAA;AACnE,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,WAAA,CAAY,IAAA,CAAK;AAAA,YACf,OAAO,GAAA,CAAI,UAAA;AAAA,YACX,cAAc,CAAA,IAAA,EAAO,GAAA,CAAI,QAAQ,CAAA,CAAA,EAAI,IAAI,SAAS,CAAA;AAAA,WACnD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,EAC/B,GAAG,CAAC,MAAA,CAAO,aAAA,EAAe,MAAA,EAAQ,iBAAiB,CAAC,CAAA;AAEpD,EAAA,MAAM,cAAA,GAAiBhB,WAAAA;AAAA,IACrB,CAAC,SAAA,KAAsB;AACrB,MAAA,IAAI,CAAC,SAAA,IAAa,MAAA,CAAO,MAAA,IAAU,SAAA,EAAW;AAE9C,MAAA,MAAM,QAAA,GAAuB;AAAA,QAC3B,EAAA,EAAI,gBAAgB,MAAM,CAAA;AAAA,QAC1B,IAAA,EAAM;AAAA,OACR;AACA,MAAA,QAAA,CAAS,CAAC,GAAG,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAS;AAAA,GAC9B;AAEA,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACxB,CAAC,OAAA,KAAoB;AACnB,MAAA,QAAA,CAAS,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,OAAO,CAAC,CAAA;AAAA,IACjD,CAAA;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,GACnB;AAGA,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,GAAA,EAAK,MAAM,OAAA,CAAQ;AAAA,GACrB;AAEA,EAAA,MAAM,mBAAA,GAA2C;AAAA,IAC/C,OAAA,EAAS,MAAA;AAAA,IACT,QAAA,EAAU,MAAA;AAAA,IACV,GAAA,EAAK,MAAM,OAAA,CAAQ;AAAA,GACrB;AAEA,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,MAAM,OAAA,CAAQ,EAAA;AAAA,IACnB,OAAA,EAAS,GAAG,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,KAAA,CAAM,QAAQ,EAAE,CAAA,CAAA;AAAA,IAChD,eAAA,EAAiB,MAAM,MAAA,CAAO,OAAA;AAAA,IAC9B,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,IACxC,YAAA,EAAc,MAAM,MAAA,CAAO,EAAA;AAAA,IAC3B,QAAA,EAAU,MAAM,SAAA,CAAU;AAAA,GAC5B;AAEA,EAAA,MAAM,iBAAA,GAAyC;AAAA,IAC7C,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,OAAA,EAAS,KAAA;AAAA,IACT,eAAA,EAAiB,aAAA;AAAA,IACjB,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,MAAM,MAAA,CAAO,EAAA;AAAA,IAC3B,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,GACtB;AAEA,EAAA,MAAM,eAAA,GAAuC;AAAA,IAC3C,OAAA,EAAS,MAAA;AAAA,IACT,GAAA,EAAK,MAAM,OAAA,CAAQ,EAAA;AAAA,IACnB,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,MAAM,gBAAA,GAAwC;AAAA,IAC5C,OAAA,EAAS,MAAA;AAAA,IACT,QAAA,EAAU,MAAA;AAAA,IACV,GAAA,EAAK,MAAM,OAAA,CAAQ,EAAA;AAAA,IACnB,SAAA,EAAW,MAAM,OAAA,CAAQ;AAAA,GAC3B;AAEA,EAAA,MAAM,mBAAA,GAA2C;AAAA,IAC/C,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,MAAM,OAAA,CAAQ,EAAA;AAAA,IACnB,OAAA,EAAS,GAAG,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,KAAA,CAAM,QAAQ,EAAE,CAAA,CAAA;AAAA,IAChD,eAAA,EAAiB,CAAA,EAAG,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,EAAA,CAAA;AAAA,IACxC,MAAA,EAAQ,CAAA,WAAA,EAAc,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,CAAA;AAAA,IAC1C,YAAA,EAAc,MAAM,MAAA,CAAO,EAAA;AAAA,IAC3B,QAAA,EAAU,MAAM,SAAA,CAAU,EAAA;AAAA,IAC1B,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,GACtB;AAEA,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,GAAS,SAAA,IAAa,sBAAsB,MAAA,GAAS,CAAA;AAE/E,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,cAAA,EAE/B,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,SAAS,CAAA,oBACfD,GAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,mBAAA,EACT,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,KAAA,qBAClBC,IAAAA,CAAC,KAAA,EAAA,EAAmB,OAAO,cAAA,EACzB,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,MAAM,EAAA,EAAI,CAAA;AAAA,sBAC7BA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,CAAM,IAAA,EAAK,CAAA;AAAA,MACjB,KAAA,KAAU,qBAAKA,GAAAA,CAAC,SAAM,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,SAAA,EAAU,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,MACzD,MAAA,CAAO,MAAA,GAAS,CAAA,oBACfA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,KAAA,EAAO,iBAAA;AAAA,UACP,OAAA,EAAS,MAAM,iBAAA,CAAkB,KAAA,CAAM,EAAE,CAAA;AAAA,UACzC,YAAA,EAAY,CAAA,OAAA,EAAU,KAAA,CAAM,IAAI,CAAA,CAAA;AAAA,UAEhC,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,GAAA,EAAI,MAAM,EAAA,EAAI;AAAA;AAAA;AAC3B,KAAA,EAAA,EAZM,KAAA,CAAM,EAchB,CACD,CAAA,EACH,CAAA;AAAA,IAID,UAAA,oBACCC,IAAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,eAAA,EACV,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,EAAA;AAAA,YACN,QAAA,EAAU,cAAA;AAAA,YACV,OAAA,EAAS,CAAC,EAAE,KAAA,EAAO,IAAI,KAAA,EAAO,sBAAA,EAAuB,EAAG,GAAG,qBAAqB,CAAA;AAAA,YAChF,KAAA,EAAO,EAAE,QAAA,EAAU,OAAA;AAAQ;AAAA,SAC7B;AAAA,wBACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,KAAA,CAAM,SAAA,CAAU,EAAA,EAAI,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,WAAU,EACxE,QAAA,EAAA;AAAA,UAAA,MAAA,CAAO,MAAA;AAAA,UAAO,KAAA;AAAA,UAAI,SAAA;AAAA,UAAU;AAAA,SAAA,EAC/B;AAAA,OAAA,EACF,CAAA;AAAA,MAGC,gBAAgB,MAAA,GAAS,CAAA,oBACxBA,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,gBAAA,EACV,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,KAAA,CAAM,SAAA,CAAU,EAAA,EAAI,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,SAAA,IAAa,QAAA,EAAA,UAAA,EAE9E,CAAA;AAAA,QACC,eAAA,CAAgB,GAAA,CAAI,CAAC,UAAA,qBACpBC,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAO,mBAAA;AAAA,YACP,OAAA,EAAS,MAAM,cAAA,CAAe,UAAA,CAAW,KAAK,CAAA;AAAA,YAC9C,OAAO,UAAA,CAAW,YAAA;AAAA,YAElB,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,MAAA,EAAO,MAAM,EAAA,EAAI,CAAA;AAAA,cAC3B,UAAA,CAAW;AAAA;AAAA,WAAA;AAAA,UAPP,UAAA,CAAW;AAAA,SASnB;AAAA,OAAA,EACH;AAAA,KAAA,EAEJ;AAAA,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-UPYINBZU.js","sourcesContent":["/**\n * Button component.\n */\n\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n /** Button visual style. */\n variant?: 'primary' | 'secondary' | 'ghost' | 'danger';\n /** Button size. */\n size?: 'sm' | 'md' | 'lg';\n /** Whether the button is in a loading state. */\n loading?: boolean;\n /** Icon to display before the label. */\n leftIcon?: ReactNode;\n /** Icon to display after the label. */\n rightIcon?: ReactNode;\n /** Button content. */\n children: ReactNode;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst baseStyles: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontWeight: 500,\n borderRadius: 'var(--prismiq-radius-md)',\n border: '1px solid transparent',\n cursor: 'pointer',\n transition: 'background-color 0.15s, border-color 0.15s, opacity 0.15s',\n outline: 'none',\n};\n\nconst variantStyles: Record<NonNullable<ButtonProps['variant']>, React.CSSProperties> = {\n primary: {\n backgroundColor: 'var(--prismiq-color-primary)',\n color: 'var(--prismiq-color-text-inverse)',\n borderColor: 'var(--prismiq-color-primary)',\n },\n secondary: {\n backgroundColor: 'var(--prismiq-color-surface)',\n color: 'var(--prismiq-color-text)',\n borderColor: 'var(--prismiq-color-border)',\n },\n ghost: {\n backgroundColor: 'transparent',\n color: 'var(--prismiq-color-text)',\n borderColor: 'transparent',\n },\n danger: {\n backgroundColor: 'var(--prismiq-color-error)',\n color: 'var(--prismiq-color-text-inverse)',\n borderColor: 'var(--prismiq-color-error)',\n },\n};\n\nconst sizeStyles: Record<NonNullable<ButtonProps['size']>, React.CSSProperties> = {\n sm: {\n padding: 'var(--prismiq-spacing-xs) var(--prismiq-spacing-sm)',\n fontSize: 'var(--prismiq-font-size-sm)',\n },\n md: {\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontSize: 'var(--prismiq-font-size-base)',\n },\n lg: {\n padding: 'var(--prismiq-spacing-md) var(--prismiq-spacing-lg)',\n fontSize: 'var(--prismiq-font-size-lg)',\n },\n};\n\nconst disabledStyles: React.CSSProperties = {\n opacity: 0.5,\n cursor: 'not-allowed',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Button component with multiple variants and sizes.\n *\n * @example\n * ```tsx\n * <Button variant=\"primary\" onClick={() => console.log('clicked')}>\n * Click me\n * </Button>\n *\n * <Button variant=\"secondary\" size=\"sm\" leftIcon={<Icon name=\"plus\" />}>\n * Add item\n * </Button>\n * ```\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = 'primary',\n size = 'md',\n disabled,\n loading,\n leftIcon,\n rightIcon,\n children,\n style,\n className,\n ...props\n },\n ref\n) {\n const isDisabled = disabled || loading;\n\n const combinedStyles: React.CSSProperties = {\n ...baseStyles,\n ...variantStyles[variant],\n ...sizeStyles[size],\n ...(isDisabled ? disabledStyles : {}),\n ...style,\n };\n\n return (\n <button\n ref={ref}\n type=\"button\"\n disabled={isDisabled}\n className={className}\n style={combinedStyles}\n {...props}\n >\n {loading ? (\n <span\n style={{\n display: 'inline-block',\n width: '1em',\n height: '1em',\n border: '2px solid currentColor',\n borderRightColor: 'transparent',\n borderRadius: '50%',\n animation: 'prismiq-spin 0.6s linear infinite',\n }}\n />\n ) : (\n leftIcon\n )}\n {children}\n {!loading && rightIcon}\n </button>\n );\n});\n","/**\n * Input component.\n */\n\nimport { forwardRef, type InputHTMLAttributes } from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n /** Input size. */\n inputSize?: 'sm' | 'md' | 'lg';\n /** Whether the input has an error. */\n error?: boolean;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst baseStyles: React.CSSProperties = {\n display: 'block',\n width: '100%',\n fontFamily: 'var(--prismiq-font-sans)',\n backgroundColor: 'var(--prismiq-color-background)',\n color: 'var(--prismiq-color-text)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n outline: 'none',\n transition: 'border-color 0.15s, box-shadow 0.15s',\n};\n\nconst sizeStyles: Record<NonNullable<InputProps['inputSize']>, React.CSSProperties> = {\n sm: {\n padding: 'var(--prismiq-spacing-xs) var(--prismiq-spacing-sm)',\n fontSize: 'var(--prismiq-font-size-sm)',\n },\n md: {\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontSize: 'var(--prismiq-font-size-base)',\n },\n lg: {\n padding: 'var(--prismiq-spacing-md) var(--prismiq-spacing-lg)',\n fontSize: 'var(--prismiq-font-size-lg)',\n },\n};\n\nconst disabledStyles: React.CSSProperties = {\n opacity: 0.5,\n cursor: 'not-allowed',\n backgroundColor: 'var(--prismiq-color-surface)',\n};\n\nconst errorStyles: React.CSSProperties = {\n borderColor: 'var(--prismiq-color-error)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Input component with multiple sizes and error state.\n *\n * @example\n * ```tsx\n * <Input\n * placeholder=\"Enter your name\"\n * value={name}\n * onChange={(e) => setName(e.target.value)}\n * />\n *\n * <Input inputSize=\"sm\" error placeholder=\"Invalid value\" />\n * ```\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n { inputSize = 'md', disabled, error, style, className, ...props },\n ref\n) {\n const combinedStyles: React.CSSProperties = {\n ...baseStyles,\n ...sizeStyles[inputSize],\n ...(disabled ? disabledStyles : {}),\n ...(error ? errorStyles : {}),\n ...style,\n };\n\n return (\n <input\n ref={ref}\n disabled={disabled}\n className={className}\n style={combinedStyles}\n {...props}\n />\n );\n});\n","/**\n * Select component.\n */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Input } from './Input';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SelectOption<T> {\n /** Option value. */\n value: T;\n /** Display label. */\n label: string;\n /** Whether the option is disabled. */\n disabled?: boolean;\n}\n\nexport interface SelectProps<T> {\n /** Currently selected value. */\n value: T | null;\n /** Callback when value changes. */\n onChange: (value: T) => void;\n /** Available options. */\n options: SelectOption<T>[];\n /** Placeholder text when no value selected. */\n placeholder?: string;\n /** Whether the select is disabled. */\n disabled?: boolean;\n /** Whether to show a search input. */\n searchable?: boolean;\n /** Select size. */\n size?: 'sm' | 'md' | 'lg';\n /** Additional class name. */\n className?: string;\n /** Additional styles. */\n style?: React.CSSProperties;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n position: 'relative',\n display: 'inline-block',\n width: '100%',\n};\n\nconst triggerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n fontFamily: 'var(--prismiq-font-sans)',\n backgroundColor: 'var(--prismiq-color-background)',\n color: 'var(--prismiq-color-text)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n cursor: 'pointer',\n outline: 'none',\n transition: 'border-color 0.15s',\n};\n\nconst sizeStyles: Record<NonNullable<SelectProps<unknown>['size']>, React.CSSProperties> = {\n sm: {\n padding: 'var(--prismiq-spacing-xs) var(--prismiq-spacing-sm)',\n fontSize: 'var(--prismiq-font-size-sm)',\n },\n md: {\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontSize: 'var(--prismiq-font-size-base)',\n },\n lg: {\n padding: 'var(--prismiq-spacing-md) var(--prismiq-spacing-lg)',\n fontSize: 'var(--prismiq-font-size-lg)',\n },\n};\n\nconst dropdownStyles: React.CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n right: 0,\n marginTop: 'var(--prismiq-spacing-xs)',\n backgroundColor: 'var(--prismiq-color-background)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n boxShadow: 'var(--prismiq-shadow-md)',\n zIndex: 1000,\n maxHeight: '200px',\n overflow: 'auto',\n};\n\nconst optionStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n cursor: 'pointer',\n transition: 'background-color 0.1s',\n};\n\nconst optionHoverStyles: React.CSSProperties = {\n backgroundColor: 'var(--prismiq-color-surface-hover)',\n};\n\nconst optionSelectedStyles: React.CSSProperties = {\n backgroundColor: 'var(--prismiq-color-surface)',\n fontWeight: 500,\n};\n\nconst optionDisabledStyles: React.CSSProperties = {\n opacity: 0.5,\n cursor: 'not-allowed',\n};\n\nconst placeholderStyles: React.CSSProperties = {\n color: 'var(--prismiq-color-text-muted)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Select component with optional search functionality.\n *\n * @example\n * ```tsx\n * const [value, setValue] = useState<string | null>(null);\n *\n * <Select\n * value={value}\n * onChange={setValue}\n * options={[\n * { value: 'a', label: 'Option A' },\n * { value: 'b', label: 'Option B' },\n * ]}\n * placeholder=\"Select an option\"\n * />\n * ```\n */\nfunction SelectInner<T>(\n {\n value,\n onChange,\n options,\n placeholder = 'Select...',\n disabled = false,\n searchable = false,\n size = 'md',\n className,\n style,\n }: SelectProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>\n) {\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0, width: 0 });\n const containerRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Find the selected option\n const selectedOption = options.find((opt) => opt.value === value);\n\n // Filter options based on search\n const filteredOptions = searchable\n ? options.filter((opt) =>\n opt.label.toLowerCase().includes(search.toLowerCase())\n )\n : options;\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n // Check if click is inside container or dropdown portal\n const isInsideContainer = containerRef.current?.contains(target);\n const isInsideDropdown = dropdownRef.current?.contains(target);\n\n if (!isInsideContainer && !isInsideDropdown) {\n setIsOpen(false);\n setSearch('');\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Focus search input when opening\n useEffect(() => {\n if (isOpen && searchable && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen, searchable]);\n\n // Reset highlighted index when options change\n useEffect(() => {\n setHighlightedIndex(-1);\n }, [filteredOptions.length]);\n\n // Update dropdown position when opening\n const updateDropdownPosition = useCallback(() => {\n if (triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n setDropdownPosition({\n top: rect.bottom + window.scrollY + 4, // 4px gap\n left: rect.left + window.scrollX,\n width: rect.width,\n });\n }\n }, []);\n\n const handleToggle = useCallback(() => {\n if (!disabled) {\n setIsOpen((prev) => {\n if (!prev) {\n updateDropdownPosition();\n }\n return !prev;\n });\n setSearch('');\n setHighlightedIndex(-1);\n }\n }, [disabled, updateDropdownPosition]);\n\n const handleSelect = useCallback(\n (option: SelectOption<T>) => {\n if (!option.disabled) {\n onChange(option.value);\n setIsOpen(false);\n setSearch('');\n }\n },\n [onChange]\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (disabled) return;\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else if (highlightedIndex >= 0 && filteredOptions[highlightedIndex]) {\n const option = filteredOptions[highlightedIndex];\n if (option && !option.disabled) {\n handleSelect(option);\n }\n }\n break;\n case 'Escape':\n setIsOpen(false);\n setSearch('');\n break;\n case 'ArrowDown':\n event.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else {\n setHighlightedIndex((prev) =>\n Math.min(prev + 1, filteredOptions.length - 1)\n );\n }\n break;\n case 'ArrowUp':\n event.preventDefault();\n setHighlightedIndex((prev) => Math.max(prev - 1, 0));\n break;\n case 'Tab':\n setIsOpen(false);\n setSearch('');\n break;\n }\n },\n [disabled, isOpen, highlightedIndex, filteredOptions, handleSelect]\n );\n\n return (\n <div\n ref={(node) => {\n (containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }}\n className={className}\n style={{ ...containerStyles, ...style }}\n onKeyDown={handleKeyDown}\n >\n <div\n ref={triggerRef}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n onClick={handleToggle}\n style={{\n ...triggerStyles,\n ...sizeStyles[size],\n ...(disabled ? { opacity: 0.5, cursor: 'not-allowed' } : {}),\n }}\n >\n <span style={selectedOption ? {} : placeholderStyles}>\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n <span\n style={{\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderTop: '5px solid currentColor',\n marginLeft: 'var(--prismiq-spacing-sm)',\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0)',\n transition: 'transform 0.15s',\n }}\n />\n </div>\n\n {isOpen && typeof document !== 'undefined' && createPortal(\n <div\n ref={dropdownRef}\n style={{\n ...dropdownStyles,\n position: 'fixed',\n top: dropdownPosition.top,\n left: dropdownPosition.left,\n width: dropdownPosition.width,\n marginTop: 0,\n fontSize: sizeStyles[size].fontSize,\n }}\n role=\"listbox\"\n >\n {searchable && (\n <div style={{ padding: 'var(--prismiq-spacing-sm)' }}>\n <Input\n ref={searchInputRef}\n inputSize=\"sm\"\n placeholder=\"Search...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n />\n </div>\n )}\n {filteredOptions.length === 0 ? (\n <div\n style={{\n ...optionStyles,\n color: 'var(--prismiq-color-text-muted)',\n cursor: 'default',\n }}\n >\n No options\n </div>\n ) : (\n filteredOptions.map((option, index) => (\n <div\n key={String(option.value)}\n role=\"option\"\n aria-selected={option.value === value}\n aria-disabled={option.disabled}\n onClick={() => handleSelect(option)}\n onMouseEnter={() => setHighlightedIndex(index)}\n style={{\n ...optionStyles,\n ...(option.value === value ? optionSelectedStyles : {}),\n ...(index === highlightedIndex ? optionHoverStyles : {}),\n ...(option.disabled ? optionDisabledStyles : {}),\n }}\n >\n {option.label}\n </div>\n ))\n )}\n </div>,\n document.body\n )}\n </div>\n );\n}\n\nexport const Select = forwardRef(SelectInner) as <T>(\n props: SelectProps<T> & { ref?: React.ForwardedRef<HTMLDivElement> }\n) => JSX.Element;\n","/**\n * Checkbox component.\n */\n\nimport { forwardRef, type InputHTMLAttributes } from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CheckboxProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {\n /** Checkbox size. */\n size?: 'sm' | 'md' | 'lg';\n /** Label text. */\n label?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n cursor: 'pointer',\n};\n\nconst checkboxStyles: React.CSSProperties = {\n appearance: 'none',\n WebkitAppearance: 'none',\n MozAppearance: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'var(--prismiq-color-background)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-sm)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, border-color 0.15s',\n flexShrink: 0,\n};\n\nconst sizeStyles: Record<NonNullable<CheckboxProps['size']>, React.CSSProperties> = {\n sm: {\n width: '14px',\n height: '14px',\n },\n md: {\n width: '18px',\n height: '18px',\n },\n lg: {\n width: '22px',\n height: '22px',\n },\n};\n\nconst labelSizeStyles: Record<NonNullable<CheckboxProps['size']>, React.CSSProperties> = {\n sm: {\n fontSize: 'var(--prismiq-font-size-sm)',\n },\n md: {\n fontSize: 'var(--prismiq-font-size-base)',\n },\n lg: {\n fontSize: 'var(--prismiq-font-size-lg)',\n },\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Checkbox component with optional label.\n *\n * @example\n * ```tsx\n * <Checkbox\n * checked={isChecked}\n * onChange={(e) => setIsChecked(e.target.checked)}\n * label=\"Remember me\"\n * />\n * ```\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n { size = 'md', label, disabled, style, className, checked, ...props },\n ref\n) {\n const checkmarkSize = size === 'sm' ? 8 : size === 'md' ? 10 : 12;\n\n return (\n <label\n className={className}\n style={{\n ...containerStyles,\n ...(disabled ? { opacity: 0.5, cursor: 'not-allowed' } : {}),\n ...style,\n }}\n >\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <input\n ref={ref}\n type=\"checkbox\"\n disabled={disabled}\n checked={checked}\n style={{\n ...checkboxStyles,\n ...sizeStyles[size],\n ...(checked\n ? {\n backgroundColor: 'var(--prismiq-color-primary)',\n borderColor: 'var(--prismiq-color-primary)',\n }\n : {}),\n }}\n {...props}\n />\n {checked && (\n <svg\n viewBox=\"0 0 10 8\"\n fill=\"none\"\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: checkmarkSize,\n height: checkmarkSize,\n pointerEvents: 'none',\n }}\n >\n <path\n d=\"M1 4L3.5 6.5L9 1\"\n stroke=\"var(--prismiq-color-text-inverse)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n {label && (\n <span\n style={{\n fontFamily: 'var(--prismiq-font-sans)',\n color: 'var(--prismiq-color-text)',\n ...labelSizeStyles[size],\n }}\n >\n {label}\n </span>\n )}\n </label>\n );\n});\n","/**\n * Badge component.\n */\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n /** Badge visual style. */\n variant?: 'default' | 'primary' | 'success' | 'warning' | 'error' | 'info';\n /** Badge size. */\n size?: 'sm' | 'md' | 'lg';\n /** Badge content. */\n children: ReactNode;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst baseStyles: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: 'var(--prismiq-font-sans)',\n fontWeight: 500,\n borderRadius: 'var(--prismiq-radius-full)',\n whiteSpace: 'nowrap',\n};\n\nconst variantStyles: Record<NonNullable<BadgeProps['variant']>, React.CSSProperties> = {\n default: {\n backgroundColor: 'var(--prismiq-color-surface)',\n color: 'var(--prismiq-color-text)',\n border: '1px solid var(--prismiq-color-border)',\n },\n primary: {\n backgroundColor: 'var(--prismiq-color-primary)',\n color: 'var(--prismiq-color-text-inverse)',\n },\n success: {\n backgroundColor: 'var(--prismiq-color-success)',\n color: 'var(--prismiq-color-text-inverse)',\n },\n warning: {\n backgroundColor: 'var(--prismiq-color-warning)',\n color: '#000000',\n },\n error: {\n backgroundColor: 'var(--prismiq-color-error)',\n color: 'var(--prismiq-color-text-inverse)',\n },\n info: {\n backgroundColor: 'var(--prismiq-color-info)',\n color: 'var(--prismiq-color-text-inverse)',\n },\n};\n\nconst sizeStyles: Record<NonNullable<BadgeProps['size']>, React.CSSProperties> = {\n sm: {\n padding: '2px var(--prismiq-spacing-xs)',\n fontSize: 'var(--prismiq-font-size-xs)',\n },\n md: {\n padding: 'var(--prismiq-spacing-xs) var(--prismiq-spacing-sm)',\n fontSize: 'var(--prismiq-font-size-sm)',\n },\n lg: {\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontSize: 'var(--prismiq-font-size-base)',\n },\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Badge component for status indicators and labels.\n *\n * @example\n * ```tsx\n * <Badge variant=\"success\">Active</Badge>\n * <Badge variant=\"error\" size=\"sm\">Error</Badge>\n * ```\n */\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { variant = 'default', size = 'md', children, style, className, ...props },\n ref\n) {\n const combinedStyles: React.CSSProperties = {\n ...baseStyles,\n ...variantStyles[variant],\n ...sizeStyles[size],\n ...style,\n };\n\n return (\n <span ref={ref} className={className} style={combinedStyles} {...props}>\n {children}\n </span>\n );\n});\n","/**\n * Tooltip component.\n */\n\nimport {\n cloneElement,\n forwardRef,\n isValidElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n type ReactElement,\n type ReactNode,\n} from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TooltipProps {\n /** The content to show in the tooltip. */\n content: ReactNode;\n /** The element that triggers the tooltip. */\n children: ReactElement;\n /** Position of the tooltip relative to the trigger. */\n position?: 'top' | 'bottom' | 'left' | 'right';\n /** Delay before showing tooltip (ms). */\n delay?: number;\n /** Whether the tooltip is disabled. */\n disabled?: boolean;\n /** Additional class name for the tooltip element. */\n className?: string;\n /** Additional styles for the tooltip element. */\n style?: React.CSSProperties;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst tooltipStyles: React.CSSProperties = {\n position: 'fixed',\n padding: 'var(--prismiq-spacing-xs) var(--prismiq-spacing-sm)',\n backgroundColor: 'var(--prismiq-color-text)',\n color: 'var(--prismiq-color-background)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n borderRadius: 'var(--prismiq-radius-md)',\n boxShadow: 'var(--prismiq-shadow-md)',\n zIndex: 9999,\n pointerEvents: 'none',\n whiteSpace: 'nowrap',\n maxWidth: '250px',\n wordWrap: 'break-word',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Tooltip component that shows content on hover.\n *\n * @example\n * ```tsx\n * <Tooltip content=\"This is a tooltip\">\n * <Button>Hover me</Button>\n * </Tooltip>\n * ```\n */\nexport const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(function Tooltip(\n {\n content,\n children,\n position = 'top',\n delay = 200,\n disabled = false,\n style,\n className,\n },\n ref\n) {\n const [isVisible, setIsVisible] = useState(false);\n const [tooltipPosition, setTooltipPosition] = useState<{ top: number; left: number }>({\n top: 0,\n left: 0,\n });\n\n const triggerRef = useRef<HTMLElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const calculatePosition = useCallback(() => {\n if (!triggerRef.current || !tooltipRef.current) return;\n\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n const gap = 8;\n\n let top = 0;\n let left = 0;\n\n switch (position) {\n case 'top':\n top = triggerRect.top - tooltipRect.height - gap;\n left = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2;\n break;\n case 'bottom':\n top = triggerRect.bottom + gap;\n left = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2;\n break;\n case 'left':\n top = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2;\n left = triggerRect.left - tooltipRect.width - gap;\n break;\n case 'right':\n top = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2;\n left = triggerRect.right + gap;\n break;\n }\n\n // Ensure tooltip stays within viewport\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n if (left < gap) left = gap;\n if (left + tooltipRect.width > viewportWidth - gap) {\n left = viewportWidth - tooltipRect.width - gap;\n }\n if (top < gap) top = gap;\n if (top + tooltipRect.height > viewportHeight - gap) {\n top = viewportHeight - tooltipRect.height - gap;\n }\n\n setTooltipPosition({ top, left });\n }, [position]);\n\n const handleMouseEnter = useCallback(() => {\n if (disabled) return;\n\n timeoutRef.current = setTimeout(() => {\n setIsVisible(true);\n }, delay);\n }, [delay, disabled]);\n\n const handleMouseLeave = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n setIsVisible(false);\n }, []);\n\n // Calculate position when tooltip becomes visible\n useEffect(() => {\n if (isVisible) {\n // Small delay to ensure tooltip is rendered\n requestAnimationFrame(calculatePosition);\n }\n }, [isVisible, calculatePosition]);\n\n // Clean up timeout on unmount\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n // Clone the child element and add event handlers\n const trigger = isValidElement<Record<string, unknown>>(children)\n ? cloneElement(children, {\n ref: (node: HTMLElement | null) => {\n (triggerRef as React.MutableRefObject<HTMLElement | null>).current = node;\n // Handle child's ref if it exists\n const childRef = (children as { ref?: React.Ref<HTMLElement> }).ref;\n if (typeof childRef === 'function') {\n childRef(node);\n } else if (childRef && typeof childRef === 'object') {\n (childRef as React.MutableRefObject<HTMLElement | null>).current = node;\n }\n },\n onMouseEnter: (e: React.MouseEvent) => {\n handleMouseEnter();\n const onMouseEnter = children.props.onMouseEnter as\n | ((e: React.MouseEvent) => void)\n | undefined;\n onMouseEnter?.(e);\n },\n onMouseLeave: (e: React.MouseEvent) => {\n handleMouseLeave();\n const onMouseLeave = children.props.onMouseLeave as\n | ((e: React.MouseEvent) => void)\n | undefined;\n onMouseLeave?.(e);\n },\n onFocus: (e: React.FocusEvent) => {\n handleMouseEnter();\n const onFocus = children.props.onFocus as\n | ((e: React.FocusEvent) => void)\n | undefined;\n onFocus?.(e);\n },\n onBlur: (e: React.FocusEvent) => {\n handleMouseLeave();\n const onBlur = children.props.onBlur as\n | ((e: React.FocusEvent) => void)\n | undefined;\n onBlur?.(e);\n },\n })\n : children;\n\n return (\n <>\n {trigger}\n {isVisible && (\n <div\n ref={(node) => {\n (tooltipRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }}\n role=\"tooltip\"\n className={className}\n style={{\n ...tooltipStyles,\n top: tooltipPosition.top,\n left: tooltipPosition.left,\n ...style,\n }}\n >\n {content}\n </div>\n )}\n </>\n );\n});\n","/**\n * Dropdown component.\n */\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DropdownProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /** The element that triggers the dropdown. */\n trigger: ReactNode;\n /** The dropdown content. */\n children: ReactNode;\n /** Alignment of the dropdown relative to the trigger. */\n align?: 'start' | 'end';\n /** Whether the dropdown is disabled. */\n disabled?: boolean;\n}\n\nexport interface DropdownItemProps extends HTMLAttributes<HTMLDivElement> {\n /** Whether the item is disabled. */\n disabled?: boolean;\n /** Icon to display before the label. */\n icon?: ReactNode;\n /** Item content. */\n children: ReactNode;\n}\n\nexport interface DropdownSeparatorProps extends HTMLAttributes<HTMLDivElement> {}\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface DropdownContextValue {\n close: () => void;\n}\n\nconst DropdownContext = createContext<DropdownContextValue | null>(null);\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n position: 'relative',\n display: 'inline-block',\n};\n\nconst contentStyles: React.CSSProperties = {\n position: 'fixed',\n minWidth: '160px',\n backgroundColor: 'var(--prismiq-color-background)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n boxShadow: 'var(--prismiq-shadow-md)',\n zIndex: 10000,\n padding: 'var(--prismiq-spacing-xs) 0',\n overflow: 'hidden',\n};\n\nconst itemStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-base)',\n color: 'var(--prismiq-color-text)',\n cursor: 'pointer',\n transition: 'background-color 0.1s',\n};\n\nconst itemHoverStyles: React.CSSProperties = {\n backgroundColor: 'var(--prismiq-color-surface-hover)',\n};\n\nconst itemDisabledStyles: React.CSSProperties = {\n opacity: 0.5,\n cursor: 'not-allowed',\n};\n\nconst separatorStyles: React.CSSProperties = {\n height: '1px',\n backgroundColor: 'var(--prismiq-color-border)',\n margin: 'var(--prismiq-spacing-xs) 0',\n};\n\n// ============================================================================\n// DropdownItem Component\n// ============================================================================\n\n/**\n * An item within a dropdown menu.\n */\nexport const DropdownItem = forwardRef<HTMLDivElement, DropdownItemProps>(\n function DropdownItem(\n { disabled = false, icon, children, onClick, style, className, ...props },\n ref\n ) {\n const context = useContext(DropdownContext);\n const [isHovered, setIsHovered] = useState(false);\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n if (disabled) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n context?.close();\n },\n [disabled, onClick, context]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClick(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n },\n [disabled, handleClick]\n );\n\n return (\n <div\n ref={ref}\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n className={className}\n style={{\n ...itemStyles,\n ...(isHovered && !disabled ? itemHoverStyles : {}),\n ...(disabled ? itemDisabledStyles : {}),\n ...style,\n }}\n {...props}\n >\n {icon && <span style={{ display: 'flex', alignItems: 'center' }}>{icon}</span>}\n {children}\n </div>\n );\n }\n);\n\n// ============================================================================\n// DropdownSeparator Component\n// ============================================================================\n\n/**\n * A separator line within a dropdown menu.\n */\nexport const DropdownSeparator = forwardRef<HTMLDivElement, DropdownSeparatorProps>(\n function DropdownSeparator({ style, className, ...props }, ref) {\n return (\n <div\n ref={ref}\n role=\"separator\"\n className={className}\n style={{ ...separatorStyles, ...style }}\n {...props}\n />\n );\n }\n);\n\n// ============================================================================\n// Dropdown Component\n// ============================================================================\n\n/**\n * Dropdown menu component.\n *\n * @example\n * ```tsx\n * <Dropdown\n * trigger={<Button>Open menu</Button>}\n * >\n * <DropdownItem onClick={() => console.log('Edit')}>Edit</DropdownItem>\n * <DropdownItem onClick={() => console.log('Delete')}>Delete</DropdownItem>\n * <DropdownSeparator />\n * <DropdownItem disabled>Disabled</DropdownItem>\n * </Dropdown>\n * ```\n */\nexport const Dropdown = forwardRef<HTMLDivElement, DropdownProps>(function Dropdown(\n { trigger, children, align = 'start', disabled = false, style, className, ...props },\n ref\n) {\n const [isOpen, setIsOpen] = useState(false);\n const [position, setPosition] = useState({ top: 0, left: 0 });\n const containerRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const close = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const toggle = useCallback(() => {\n if (!disabled) {\n setIsOpen((prev) => !prev);\n }\n }, [disabled]);\n\n // Update position when dropdown opens\n useLayoutEffect(() => {\n if (isOpen && containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const menuWidth = 160; // min-width from styles\n\n let left = align === 'end' ? rect.right - menuWidth : rect.left;\n const top = rect.bottom + 4; // 4px gap\n\n // Keep menu within viewport\n if (left + menuWidth > window.innerWidth) {\n left = window.innerWidth - menuWidth - 8;\n }\n if (left < 8) {\n left = 8;\n }\n\n setPosition({ top, left });\n }\n }, [isOpen, align]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n containerRef.current &&\n !containerRef.current.contains(target) &&\n menuRef.current &&\n !menuRef.current.contains(target)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen]);\n\n // Close on scroll\n useEffect(() => {\n if (!isOpen) return;\n\n const handleScroll = () => {\n setIsOpen(false);\n };\n\n window.addEventListener('scroll', handleScroll, true);\n return () => window.removeEventListener('scroll', handleScroll, true);\n }, [isOpen]);\n\n // Handle keyboard navigation\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n switch (e.key) {\n case 'Escape':\n setIsOpen(false);\n break;\n case 'Enter':\n case ' ':\n if (!isOpen) {\n e.preventDefault();\n toggle();\n }\n break;\n case 'ArrowDown':\n if (!isOpen) {\n e.preventDefault();\n setIsOpen(true);\n }\n break;\n }\n },\n [isOpen, toggle]\n );\n\n // Render menu in a portal at body level\n const menuContent = isOpen && typeof document !== 'undefined' ? createPortal(\n <div\n ref={menuRef}\n role=\"menu\"\n style={{\n ...contentStyles,\n top: position.top,\n left: position.left,\n }}\n >\n {children}\n </div>,\n document.body\n ) : null;\n\n return (\n <DropdownContext.Provider value={{ close }}>\n <div\n ref={(node) => {\n (containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }}\n className={className}\n style={{ ...containerStyles, ...style }}\n onKeyDown={handleKeyDown}\n {...props}\n >\n <div\n onClick={(e) => {\n e.stopPropagation();\n toggle();\n }}\n style={{ cursor: disabled ? 'not-allowed' : 'pointer' }}\n >\n {trigger}\n </div>\n\n {menuContent}\n </div>\n </DropdownContext.Provider>\n );\n});\n","/**\n * Icon component.\n *\n * Provides a set of commonly used icons as SVG components.\n */\n\nimport { forwardRef, type SVGAttributes } from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type IconName =\n | 'chevron-down'\n | 'chevron-up'\n | 'chevron-left'\n | 'chevron-right'\n | 'x'\n | 'plus'\n | 'minus'\n | 'check'\n | 'search'\n | 'filter'\n | 'sort-asc'\n | 'sort-desc'\n | 'drag'\n | 'table'\n | 'column'\n | 'key'\n | 'link'\n | 'play'\n | 'refresh'\n | 'sync'\n | 'trash'\n | 'edit'\n | 'copy'\n | 'download'\n | 'settings'\n | 'sun'\n | 'moon'\n | 'info'\n | 'warning'\n | 'error'\n | 'more'\n | 'more-vertical'\n | 'expand'\n | 'fullscreen'\n | 'minimize'\n | 'chart-bar'\n | 'chart-line'\n | 'chart-pie'\n | 'grid'\n | 'layout'\n | 'calendar'\n | 'alert-circle';\n\nexport interface IconProps extends SVGAttributes<SVGSVGElement> {\n /** Icon name. */\n name: IconName;\n /** Icon size in pixels. */\n size?: number;\n}\n\n// ============================================================================\n// Icon Paths\n// ============================================================================\n\nconst iconPaths: Record<IconName, string> = {\n 'chevron-down': 'M6 9l6 6 6-6',\n 'chevron-up': 'M18 15l-6-6-6 6',\n 'chevron-left': 'M15 18l-6-6 6-6',\n 'chevron-right': 'M9 18l6-6-6-6',\n 'x': 'M18 6L6 18M6 6l12 12',\n 'plus': 'M12 5v14M5 12h14',\n 'minus': 'M5 12h14',\n 'check': 'M5 12l5 5L20 7',\n 'search': 'M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z',\n 'filter': 'M3 4h18l-7 8.5V18l-4 2v-7.5L3 4z',\n 'sort-asc': 'M3 4h13M3 8h9M3 12h5m4 0l4-4m0 0l4 4m-4-4v12',\n 'sort-desc': 'M3 4h13M3 8h9M3 12h5m4 0l4 4m0 0l4-4m-4 4V4',\n 'drag': 'M4 8h16M4 16h16',\n 'table': 'M3 10h18M3 14h18M3 6h18v12H3V6zm5 0v12m5-12v12',\n 'column': 'M10 3v18M3 3h18v18H3V3z',\n 'key': 'M15 7a2 2 0 11-4 0 2 2 0 014 0zm-2 2v2m0 0l-4 4m4-4l4 4',\n 'link': 'M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1',\n 'play': 'M5 3l14 9-14 9V3z',\n 'refresh': 'M4 4v5h5M20 20v-5h-5M20.5 9A8.5 8.5 0 003.5 15M3.5 15A8.5 8.5 0 0020.5 9',\n 'sync': 'M23 4v6h-6M1 20v-6h6M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15',\n 'trash': 'M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16',\n 'edit': 'M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7M18.5 2.5a2.121 2.121 0 113 3L12 15l-4 1 1-4 9.5-9.5z',\n 'copy': 'M8 4H6a2 2 0 00-2 2v14a2 2 0 002 2h10a2 2 0 002-2v-2M8 4h12v12H8V4z',\n 'download': 'M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4m4-5l5 5 5-5m-5 5V3',\n 'settings': 'M12 15a3 3 0 100-6 3 3 0 000 6zm9.4-.5l-1.6-1a7.01 7.01 0 000-3l1.6-1a1 1 0 00.2-1.3l-2-3.5a1 1 0 00-1.2-.4l-1.8.7a6.97 6.97 0 00-2.6-1.5l-.3-2A1 1 0 0012.7 2h-4a1 1 0 00-1 .9l-.3 2a6.97 6.97 0 00-2.6 1.5l-1.8-.7a1 1 0 00-1.2.4l-2 3.5a1 1 0 00.2 1.3l1.6 1a7.01 7.01 0 000 3l-1.6 1a1 1 0 00-.2 1.3l2 3.5a1 1 0 001.2.4l1.8-.7a6.97 6.97 0 002.6 1.5l.3 2a1 1 0 001 .9h4a1 1 0 001-.9l.3-2a6.97 6.97 0 002.6-1.5l1.8.7a1 1 0 001.2-.4l2-3.5a1 1 0 00-.2-1.3z',\n 'sun': 'M12 3v1m0 16v1m9-9h-1M4 12H3m15.36-6.36l-.7.7m-10.6 10.6l-.7.7m12.7.1l-.7-.7m-10.6-10.6l-.7-.7M17 12a5 5 0 11-10 0 5 5 0 0110 0z',\n 'moon': 'M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z',\n 'info': 'M12 8v.01M12 12v4m0 4a8 8 0 100-16 8 8 0 000 16z',\n 'warning': 'M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z',\n 'error': 'M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z',\n 'more': 'M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z',\n 'expand': 'M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4',\n 'fullscreen': 'M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4',\n 'minimize': 'M8 3v4a1 1 0 01-1 1H3m18 0h-4a1 1 0 01-1-1V3m0 18v-4a1 1 0 011-1h4M3 16h4a1 1 0 011 1v4',\n 'chart-bar': 'M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z',\n 'chart-line': 'M3 12l2-2m0 0l7-7 4 4 6-6m-9 9l4 4m2-2l4-4m-5 5v4m-6 0h3',\n 'chart-pie': 'M11 3.055A9.001 9.001 0 1020.945 13H11V3.055zM20.488 9H15V3.512A9.025 9.025 0 0120.488 9z',\n 'grid': 'M4 5a1 1 0 011-1h4a1 1 0 011 1v4a1 1 0 01-1 1H5a1 1 0 01-1-1V5zm10 0a1 1 0 011-1h4a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 01-1-1V5zM4 15a1 1 0 011-1h4a1 1 0 011 1v4a1 1 0 01-1 1H5a1 1 0 01-1-1v-4zm10 0a1 1 0 011-1h4a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 01-1-1v-4z',\n 'more-vertical': 'M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z',\n 'layout': 'M4 5a1 1 0 011-1h14a1 1 0 011 1v14a1 1 0 01-1 1H5a1 1 0 01-1-1V5zm5 0v14m-5-5h14',\n 'calendar': 'M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z',\n 'alert-circle': 'M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Icon component rendering SVG icons.\n *\n * @example\n * ```tsx\n * <Icon name=\"search\" size={20} />\n * <Icon name=\"plus\" style={{ color: 'var(--prismiq-color-primary)' }} />\n * ```\n */\nexport const Icon = forwardRef<SVGSVGElement, IconProps>(function Icon(\n { name, size = 16, style, className, ...props },\n ref\n) {\n const path = iconPaths[name];\n\n if (!path) {\n console.warn(`Icon \"${name}\" not found`);\n return null;\n }\n\n return (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={{ flexShrink: 0, ...style }}\n aria-hidden=\"true\"\n {...props}\n >\n <path d={path} />\n </svg>\n );\n});\n","/**\n * Dialog component.\n *\n * Accessible modal dialog with focus trap and backdrop.\n */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { useFocusTrap } from '../../utils';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DialogProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Whether the dialog is open. */\n open: boolean;\n /** Called when the dialog should close. */\n onClose: () => void;\n /** Dialog title. */\n title?: ReactNode;\n /** Dialog description. */\n description?: ReactNode;\n /** Dialog content. */\n children: ReactNode;\n /** Whether to show a close button. */\n showCloseButton?: boolean;\n /** Whether clicking the backdrop closes the dialog. */\n closeOnBackdropClick?: boolean;\n /** Whether pressing Escape closes the dialog. */\n closeOnEscape?: boolean;\n /** Dialog width. */\n width?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n}\n\nexport interface DialogHeaderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nexport interface DialogFooterProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst backdropStyles: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 1000,\n padding: 'var(--prismiq-spacing-lg)',\n};\n\nconst dialogStyles: React.CSSProperties = {\n backgroundColor: 'var(--prismiq-color-background)',\n borderRadius: 'var(--prismiq-radius-lg)',\n boxShadow: 'var(--prismiq-shadow-lg)',\n maxHeight: '90vh',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n outline: 'none',\n};\n\nconst widthStyles: Record<NonNullable<DialogProps['width']>, React.CSSProperties> = {\n sm: { width: '100%', maxWidth: '400px' },\n md: { width: '100%', maxWidth: '560px' },\n lg: { width: '100%', maxWidth: '720px' },\n xl: { width: '100%', maxWidth: '960px' },\n full: { width: '100%', maxWidth: 'calc(100vw - 48px)' },\n};\n\nconst headerStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-lg)',\n borderBottom: '1px solid var(--prismiq-color-border)',\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 'var(--prismiq-spacing-md)',\n};\n\nconst titleStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-lg)',\n fontWeight: 600,\n color: 'var(--prismiq-color-text)',\n margin: 0,\n lineHeight: 1.4,\n};\n\nconst descriptionStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text-muted)',\n margin: '4px 0 0 0',\n lineHeight: 1.5,\n};\n\nconst closeButtonStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n background: 'transparent',\n borderRadius: 'var(--prismiq-radius-sm)',\n cursor: 'pointer',\n color: 'var(--prismiq-color-text-muted)',\n flexShrink: 0,\n};\n\nconst contentStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-lg)',\n overflow: 'auto',\n flex: 1,\n};\n\nconst footerStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-lg)',\n borderTop: '1px solid var(--prismiq-color-border)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\n// ============================================================================\n// Sub-components\n// ============================================================================\n\n/**\n * Dialog header component.\n */\nexport const DialogHeader = forwardRef<HTMLDivElement, DialogHeaderProps>(\n function DialogHeader({ children, style, ...props }, ref) {\n return (\n <div ref={ref} style={{ ...footerStyles, justifyContent: 'flex-start', ...style }} {...props}>\n {children}\n </div>\n );\n }\n);\n\n/**\n * Dialog footer component for action buttons.\n */\nexport const DialogFooter = forwardRef<HTMLDivElement, DialogFooterProps>(\n function DialogFooter({ children, style, ...props }, ref) {\n return (\n <div ref={ref} style={{ ...footerStyles, ...style }} {...props}>\n {children}\n </div>\n );\n }\n);\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\n/**\n * Modal dialog component with accessibility features.\n *\n * @example\n * ```tsx\n * function Example() {\n * const [open, setOpen] = useState(false);\n *\n * return (\n * <>\n * <Button onClick={() => setOpen(true)}>Open Dialog</Button>\n * <Dialog\n * open={open}\n * onClose={() => setOpen(false)}\n * title=\"Confirm Action\"\n * description=\"Are you sure you want to proceed?\"\n * >\n * <p>This action cannot be undone.</p>\n * <DialogFooter>\n * <Button variant=\"secondary\" onClick={() => setOpen(false)}>\n * Cancel\n * </Button>\n * <Button variant=\"danger\">Delete</Button>\n * </DialogFooter>\n * </Dialog>\n * </>\n * );\n * }\n * ```\n */\nexport const Dialog = forwardRef<HTMLDivElement, DialogProps>(function Dialog(\n {\n open,\n onClose,\n title,\n description,\n children,\n showCloseButton = true,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n width = 'md',\n style,\n ...props\n },\n _ref\n) {\n // Focus trap\n const { containerRef } = useFocusTrap({\n active: open,\n onEscape: closeOnEscape ? onClose : undefined,\n });\n\n // Note: We use containerRef from useFocusTrap for focus management\n // The forwarded ref is not used directly but available via the forwardRef pattern\n\n // Prevent body scroll when dialog is open\n useEffect(() => {\n if (open) {\n const originalOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = originalOverflow;\n };\n }\n }, [open]);\n\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (closeOnBackdropClick && e.target === e.currentTarget) {\n onClose();\n }\n },\n [closeOnBackdropClick, onClose]\n );\n\n if (!open) return null;\n\n const dialogContent = (\n <div\n style={backdropStyles}\n onClick={handleBackdropClick}\n role=\"presentation\"\n >\n <div\n ref={containerRef as React.RefObject<HTMLDivElement>}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'dialog-title' : undefined}\n aria-describedby={description ? 'dialog-description' : undefined}\n tabIndex={-1}\n style={{\n ...dialogStyles,\n ...widthStyles[width],\n ...style,\n }}\n {...props}\n >\n {(title || showCloseButton) && (\n <div style={headerStyles}>\n <div>\n {title && (\n <h2 id=\"dialog-title\" style={titleStyles}>\n {title}\n </h2>\n )}\n {description && (\n <p id=\"dialog-description\" style={descriptionStyles}>\n {description}\n </p>\n )}\n </div>\n {showCloseButton && (\n <button\n type=\"button\"\n onClick={onClose}\n style={closeButtonStyles}\n aria-label=\"Close dialog\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M4 4l8 8M12 4l-8 8\" />\n </svg>\n </button>\n )}\n </div>\n )}\n <div style={contentStyles}>{children}</div>\n </div>\n </div>\n );\n\n // Render in portal\n return createPortal(dialogContent, document.body);\n});\n","/**\n * CollapsibleSection component for organizing form sections.\n */\n\nimport { useState, useCallback } from 'react';\nimport { useTheme } from '../../theme';\nimport { Icon } from './Icon';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CollapsibleSectionProps {\n /** Section title. */\n title: string;\n /** Whether the section starts open. */\n defaultOpen?: boolean;\n /** Children to render inside the section. */\n children: React.ReactNode;\n /** Additional class name. */\n className?: string;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * A collapsible section with a toggle header.\n */\nexport function CollapsibleSection({\n title,\n defaultOpen = false,\n children,\n className,\n}: CollapsibleSectionProps): JSX.Element {\n const { theme } = useTheme();\n const [isOpen, setIsOpen] = useState(defaultOpen);\n\n const handleToggle = useCallback(() => {\n setIsOpen((prev) => !prev);\n }, []);\n\n const headerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.sm,\n padding: `${theme.spacing.sm} 0`,\n cursor: 'pointer',\n userSelect: 'none',\n };\n\n const titleStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.sm,\n fontWeight: 500,\n color: theme.colors.text,\n flex: 1,\n };\n\n const iconStyle: React.CSSProperties = {\n color: theme.colors.textMuted,\n transition: 'transform 0.2s ease',\n transform: isOpen ? 'rotate(90deg)' : 'rotate(0deg)',\n };\n\n const contentStyle: React.CSSProperties = {\n overflow: 'hidden',\n maxHeight: isOpen ? '1000px' : '0',\n opacity: isOpen ? 1 : 0,\n transition: 'max-height 0.3s ease, opacity 0.2s ease',\n paddingTop: isOpen ? theme.spacing.sm : 0,\n };\n\n return (\n <div className={className}>\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-expanded={isOpen}\n style={{\n ...headerStyle,\n background: 'none',\n border: 'none',\n width: '100%',\n textAlign: 'left',\n }}\n >\n <span style={iconStyle}>\n <Icon name=\"chevron-right\" size={14} />\n </span>\n <span style={titleStyle}>{title}</span>\n </button>\n <div style={contentStyle}>{children}</div>\n </div>\n );\n}\n","/**\n * ColorPaletteSelector component for selecting chart color palettes.\n */\n\nimport { useCallback } from 'react';\nimport { useTheme } from '../../theme';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Convert a color string to rgba with specified alpha.\n * Supports: hex (3, 4, 6, 8 digit), rgb(), and rgba() formats.\n * Other formats (named colors, hsl, etc.) are returned unchanged.\n */\nfunction colorWithAlpha(color: string, alpha: number): string {\n // Handle hex colors\n if (color.startsWith('#')) {\n let hex = color.slice(1);\n\n // Expand shorthand (3 or 4 digit) to full form\n if (hex.length === 3) {\n hex = (hex[0] ?? '') + (hex[0] ?? '') + (hex[1] ?? '') + (hex[1] ?? '') + (hex[2] ?? '') + (hex[2] ?? '');\n } else if (hex.length === 4) {\n hex = (hex[0] ?? '') + (hex[0] ?? '') + (hex[1] ?? '') + (hex[1] ?? '') + (hex[2] ?? '') + (hex[2] ?? '') + (hex[3] ?? '') + (hex[3] ?? '');\n }\n\n // Parse RGB values (ignore existing alpha if 8-digit hex)\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n\n if (!isNaN(r) && !isNaN(g) && !isNaN(b)) {\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n }\n\n // Handle rgb() format\n const rgbMatch = color.match(/^rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/i);\n if (rgbMatch) {\n return `rgba(${rgbMatch[1]}, ${rgbMatch[2]}, ${rgbMatch[3]}, ${alpha})`;\n }\n\n // Handle rgba() format - replace alpha\n const rgbaMatch = color.match(/^rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*[\\d.]+\\s*\\)$/i);\n if (rgbaMatch) {\n return `rgba(${rgbaMatch[1]}, ${rgbaMatch[2]}, ${rgbaMatch[3]}, ${alpha})`;\n }\n\n // Fallback: unsupported format (named colors, hsl, etc.) - return unchanged\n return color;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ColorPaletteSelectorProps {\n /** Current selected palette colors. */\n value: string[] | undefined;\n /** Callback when palette changes. */\n onChange: (colors: string[] | undefined) => void;\n /** Additional class name. */\n className?: string;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst PALETTES: { name: string; colors: string[] }[] = [\n {\n name: 'Default',\n colors: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4'],\n },\n {\n name: 'Vibrant',\n colors: ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7', '#DDA0DD', '#98D8C8', '#F7DC6F'],\n },\n {\n name: 'Ocean',\n colors: ['#1A535C', '#4ECDC4', '#F7FFF7', '#FF6B6B', '#FFE66D', '#2EC4B6', '#CBF3F0', '#FFBF69'],\n },\n {\n name: 'Sunset',\n colors: ['#F72585', '#B5179E', '#7209B7', '#560BAD', '#480CA8', '#3A0CA3', '#3F37C9', '#4361EE'],\n },\n {\n name: 'Forest',\n colors: ['#2D6A4F', '#40916C', '#52B788', '#74C69D', '#95D5B2', '#B7E4C7', '#D8F3DC', '#1B4332'],\n },\n {\n name: 'Monochrome',\n colors: ['#212529', '#343A40', '#495057', '#6C757D', '#ADB5BD', '#CED4DA', '#DEE2E6', '#E9ECEF'],\n },\n {\n name: 'Warm',\n colors: ['#D00000', '#DC2F02', '#E85D04', '#F48C06', '#FAA307', '#FFBA08', '#FFC94D', '#FFE066'],\n },\n {\n name: 'Cool',\n colors: ['#03045E', '#023E8A', '#0077B6', '#0096C7', '#00B4D8', '#48CAE4', '#90E0EF', '#ADE8F4'],\n },\n];\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Color palette selector with visual preview.\n */\nexport function ColorPaletteSelector({\n value,\n onChange,\n className,\n}: ColorPaletteSelectorProps): JSX.Element {\n const { theme } = useTheme();\n\n // Find currently selected palette\n const selectedPalette = PALETTES.find(\n (p) => JSON.stringify(p.colors) === JSON.stringify(value)\n )?.name ?? 'Custom';\n\n const handleSelect = useCallback(\n (palette: typeof PALETTES[number]) => {\n onChange(palette.colors);\n },\n [onChange]\n );\n\n const handleClear = useCallback(() => {\n onChange(undefined);\n }, [onChange]);\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.sm,\n };\n\n const labelStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.sm,\n fontWeight: 500,\n color: theme.colors.text,\n marginBottom: theme.spacing.xs,\n };\n\n const paletteGridStyle: React.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: theme.spacing.sm,\n };\n\n const paletteItemStyle = (isSelected: boolean): React.CSSProperties => ({\n padding: theme.spacing.sm,\n border: `2px solid ${isSelected ? theme.colors.primary : theme.colors.border}`,\n borderRadius: theme.radius.md,\n cursor: 'pointer',\n backgroundColor: isSelected ? colorWithAlpha(theme.colors.primary, 0.1) : 'transparent',\n transition: 'all 0.15s ease',\n });\n\n const paletteNameStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.text,\n marginBottom: theme.spacing.xs,\n };\n\n const swatchContainerStyle: React.CSSProperties = {\n display: 'flex',\n gap: '2px',\n height: '16px',\n };\n\n const swatchStyle = (color: string): React.CSSProperties => ({\n flex: 1,\n backgroundColor: color,\n borderRadius: '2px',\n });\n\n return (\n <div className={className} style={containerStyle}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <span style={labelStyle}>Color Palette</span>\n {value && (\n <button\n type=\"button\"\n onClick={handleClear}\n style={{\n fontSize: theme.fontSizes.xs,\n color: theme.colors.primary,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n textDecoration: 'underline',\n }}\n >\n Reset to default\n </button>\n )}\n </div>\n\n <div style={paletteGridStyle}>\n {PALETTES.map((palette) => (\n <button\n key={palette.name}\n type=\"button\"\n onClick={() => handleSelect(palette)}\n style={paletteItemStyle(selectedPalette === palette.name)}\n >\n <div style={paletteNameStyle}>{palette.name}</div>\n <div style={swatchContainerStyle}>\n {palette.colors.slice(0, 6).map((color, i) => (\n <div key={`${color}-${i}`} style={swatchStyle(color)} />\n ))}\n </div>\n </button>\n ))}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { useTheme } from '../../theme';\n\n/**\n * Props for the Skeleton component.\n */\nexport interface SkeletonProps {\n /** Width of the skeleton (CSS value or number for pixels) */\n width?: string | number;\n /** Height of the skeleton (CSS value or number for pixels) */\n height?: string | number;\n /** Border radius of the skeleton */\n borderRadius?: string;\n /** Whether to animate the skeleton */\n animate?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** Custom inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Base skeleton loading placeholder with shimmer animation.\n *\n * @example\n * ```tsx\n * // Simple skeleton\n * <Skeleton width={200} height={20} />\n *\n * // Circular skeleton\n * <Skeleton width={40} height={40} borderRadius=\"50%\" />\n *\n * // Full width\n * <Skeleton width=\"100%\" height={100} />\n * ```\n */\nexport function Skeleton({\n width = '100%',\n height = 16,\n borderRadius = '4px',\n animate = true,\n className,\n style,\n}: SkeletonProps): React.ReactElement {\n const { theme } = useTheme();\n\n const normalizedWidth = typeof width === 'number' ? `${width}px` : width;\n const normalizedHeight = typeof height === 'number' ? `${height}px` : height;\n\n const shimmerStyle: React.CSSProperties = {\n display: 'block',\n width: normalizedWidth,\n height: normalizedHeight,\n borderRadius,\n background: animate\n ? `linear-gradient(\n 90deg,\n ${theme.colors.surface} 25%,\n ${theme.colors.border} 50%,\n ${theme.colors.surface} 75%\n )`\n : theme.colors.surface,\n backgroundSize: '200% 100%',\n animation: animate ? 'prismiq-shimmer 1.5s infinite' : 'none',\n ...style,\n };\n\n return (\n <>\n <style>\n {`\n @keyframes prismiq-shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n }\n `}\n </style>\n <span\n className={className}\n style={shimmerStyle}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n </>\n );\n}\n\nexport default Skeleton;\n","'use client';\n\nimport React from 'react';\nimport { Skeleton } from './Skeleton';\n\n/**\n * Props for the SkeletonText component.\n */\nexport interface SkeletonTextProps {\n /** Number of lines to show */\n lines?: number;\n /** Width of the last line (for natural-looking text) */\n lastLineWidth?: string;\n /** Height of each line */\n lineHeight?: number;\n /** Gap between lines */\n gap?: number;\n /** Whether to animate the skeleton */\n animate?: boolean;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * Skeleton placeholder for text content.\n *\n * @example\n * ```tsx\n * // Single line\n * <SkeletonText />\n *\n * // Multiple lines with shorter last line\n * <SkeletonText lines={3} lastLineWidth=\"60%\" />\n *\n * // Paragraph\n * <SkeletonText lines={5} lastLineWidth=\"40%\" gap={8} />\n * ```\n */\nexport function SkeletonText({\n lines = 1,\n lastLineWidth = '80%',\n lineHeight = 16,\n gap = 8,\n animate = true,\n className,\n}: SkeletonTextProps): React.ReactElement {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: `${gap}px`,\n };\n\n return (\n <div className={className} style={containerStyle} role=\"presentation\" aria-hidden=\"true\">\n {Array.from({ length: lines }, (_, index) => {\n const isLastLine = index === lines - 1;\n const width = isLastLine && lines > 1 ? lastLineWidth : '100%';\n\n return (\n <Skeleton\n key={index}\n width={width}\n height={lineHeight}\n animate={animate}\n />\n );\n })}\n </div>\n );\n}\n\nexport default SkeletonText;\n","'use client';\n\nimport React from 'react';\nimport { useTheme } from '../../theme';\nimport { Skeleton } from './Skeleton';\n\n/**\n * Props for the SkeletonChart component.\n */\nexport interface SkeletonChartProps {\n /** Type of chart to simulate */\n type: 'bar' | 'line' | 'pie' | 'area' | 'scatter';\n /** Height of the chart skeleton */\n height?: number;\n /** Whether to animate the skeleton */\n animate?: boolean;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * Skeleton placeholder for chart components.\n *\n * @example\n * ```tsx\n * <SkeletonChart type=\"bar\" height={300} />\n * <SkeletonChart type=\"pie\" height={250} />\n * <SkeletonChart type=\"line\" />\n * ```\n */\nexport function SkeletonChart({\n type,\n height = 300,\n animate = true,\n className,\n}: SkeletonChartProps): React.ReactElement {\n const { theme } = useTheme();\n\n const containerStyle: React.CSSProperties = {\n width: '100%',\n height,\n display: 'flex',\n alignItems: 'flex-end',\n justifyContent: 'center',\n padding: '16px',\n boxSizing: 'border-box',\n backgroundColor: theme.colors.surface,\n borderRadius: '8px',\n border: `1px solid ${theme.colors.border}`,\n };\n\n if (type === 'bar') {\n // Bar chart: vertical bars of varying heights\n const barCount = 6;\n const barHeights = [60, 80, 45, 90, 55, 70];\n\n return (\n <div className={className} style={containerStyle} role=\"presentation\" aria-hidden=\"true\">\n <div\n style={{\n display: 'flex',\n alignItems: 'flex-end',\n gap: '16px',\n height: '80%',\n width: '100%',\n justifyContent: 'space-around',\n }}\n >\n {barHeights.slice(0, barCount).map((heightPercent, index) => (\n <Skeleton\n key={index}\n width={40}\n height={`${heightPercent}%`}\n borderRadius=\"4px 4px 0 0\"\n animate={animate}\n />\n ))}\n </div>\n </div>\n );\n }\n\n if (type === 'line' || type === 'area') {\n // Line/Area chart: wavy path representation\n return (\n <div className={className} style={containerStyle} role=\"presentation\" aria-hidden=\"true\">\n <svg\n width=\"100%\"\n height=\"80%\"\n viewBox=\"0 0 200 100\"\n preserveAspectRatio=\"none\"\n style={{ opacity: 0.5 }}\n >\n <defs>\n <linearGradient id=\"skeleton-gradient\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"25%\" stopColor={theme.colors.border} />\n <stop offset=\"50%\" stopColor={theme.colors.surfaceHover} />\n <stop offset=\"75%\" stopColor={theme.colors.border} />\n </linearGradient>\n </defs>\n {type === 'area' && (\n <path\n d=\"M0,80 Q50,20 100,50 T200,30 L200,100 L0,100 Z\"\n fill={theme.colors.border}\n opacity=\"0.3\"\n />\n )}\n <path\n d=\"M0,80 Q50,20 100,50 T200,30\"\n stroke={theme.colors.border}\n strokeWidth=\"3\"\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n {/* Data points */}\n {[0, 50, 100, 150, 200].map((x, i) => {\n const y = [80, 35, 50, 40, 30][i];\n return (\n <circle\n key={i}\n cx={x}\n cy={y}\n r=\"4\"\n fill={theme.colors.border}\n />\n );\n })}\n </svg>\n </div>\n );\n }\n\n if (type === 'pie') {\n // Pie chart: circular segments\n const size = Math.min(height - 32, 200);\n\n return (\n <div\n className={className}\n style={{\n ...containerStyle,\n alignItems: 'center',\n justifyContent: 'center',\n }}\n role=\"presentation\"\n aria-hidden=\"true\"\n >\n <div\n style={{\n width: size,\n height: size,\n borderRadius: '50%',\n background: `conic-gradient(\n ${theme.colors.border} 0deg 90deg,\n ${theme.colors.surfaceHover} 90deg 180deg,\n ${theme.colors.border} 180deg 250deg,\n ${theme.colors.surfaceHover} 250deg 360deg\n )`,\n opacity: animate ? undefined : 0.5,\n animation: animate ? 'prismiq-shimmer 1.5s infinite' : 'none',\n }}\n />\n </div>\n );\n }\n\n if (type === 'scatter') {\n // Scatter chart: random points\n const points = [\n { x: 20, y: 30 },\n { x: 40, y: 60 },\n { x: 60, y: 25 },\n { x: 80, y: 70 },\n { x: 100, y: 45 },\n { x: 130, y: 55 },\n { x: 150, y: 35 },\n { x: 170, y: 65 },\n ];\n\n return (\n <div className={className} style={containerStyle} role=\"presentation\" aria-hidden=\"true\">\n <svg\n width=\"100%\"\n height=\"80%\"\n viewBox=\"0 0 200 100\"\n preserveAspectRatio=\"none\"\n >\n {points.map((point, i) => (\n <circle\n key={i}\n cx={point.x}\n cy={point.y}\n r=\"6\"\n fill={theme.colors.border}\n opacity={0.6 + (i % 3) * 0.15}\n />\n ))}\n </svg>\n </div>\n );\n }\n\n // Default: simple rectangle\n return (\n <div className={className} style={containerStyle} role=\"presentation\" aria-hidden=\"true\">\n <Skeleton width=\"100%\" height=\"100%\" animate={animate} />\n </div>\n );\n}\n\nexport default SkeletonChart;\n","'use client';\n\nimport React from 'react';\nimport { useTheme } from '../../theme';\nimport { Skeleton } from './Skeleton';\n\n/**\n * Props for the SkeletonTable component.\n */\nexport interface SkeletonTableProps {\n /** Number of rows to show */\n rows?: number;\n /** Number of columns to show */\n columns?: number;\n /** Whether to show a header row */\n showHeader?: boolean;\n /** Height of each row */\n rowHeight?: number;\n /** Whether to animate the skeleton */\n animate?: boolean;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * Skeleton placeholder for table components.\n *\n * @example\n * ```tsx\n * <SkeletonTable rows={5} columns={4} />\n * <SkeletonTable rows={10} columns={6} showHeader={true} />\n * ```\n */\nexport function SkeletonTable({\n rows = 5,\n columns = 4,\n showHeader = true,\n rowHeight = 48,\n animate = true,\n className,\n}: SkeletonTableProps): React.ReactElement {\n const { theme } = useTheme();\n\n const containerStyle: React.CSSProperties = {\n width: '100%',\n border: `1px solid ${theme.colors.border}`,\n borderRadius: '8px',\n overflow: 'hidden',\n backgroundColor: theme.colors.surface,\n };\n\n const rowStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n height: rowHeight,\n padding: '0 16px',\n gap: '16px',\n borderBottom: `1px solid ${theme.colors.border}`,\n };\n\n const headerStyle: React.CSSProperties = {\n ...rowStyle,\n backgroundColor: theme.colors.surfaceHover,\n };\n\n const cellStyle: React.CSSProperties = {\n flex: 1,\n minWidth: 0,\n };\n\n // Vary column widths for more natural appearance\n const columnWidths = ['80%', '60%', '90%', '70%', '85%', '75%'];\n\n return (\n <div className={className} style={containerStyle} role=\"presentation\" aria-hidden=\"true\">\n {showHeader && (\n <div style={headerStyle}>\n {Array.from({ length: columns }, (_, colIndex) => (\n <div key={`header-${colIndex}`} style={cellStyle}>\n <Skeleton\n width={columnWidths[colIndex % columnWidths.length]}\n height={14}\n animate={animate}\n />\n </div>\n ))}\n </div>\n )}\n {Array.from({ length: rows }, (_, rowIndex) => (\n <div\n key={`row-${rowIndex}`}\n style={{\n ...rowStyle,\n borderBottom: rowIndex === rows - 1 ? 'none' : rowStyle.borderBottom,\n }}\n >\n {Array.from({ length: columns }, (_, colIndex) => (\n <div key={`cell-${rowIndex}-${colIndex}`} style={cellStyle}>\n <Skeleton\n width={columnWidths[(colIndex + rowIndex) % columnWidths.length]}\n height={12}\n animate={animate}\n />\n </div>\n ))}\n </div>\n ))}\n </div>\n );\n}\n\nexport default SkeletonTable;\n","'use client';\n\nimport React from 'react';\nimport { useTheme } from '../../theme';\nimport { Skeleton } from './Skeleton';\nimport { SkeletonText } from './SkeletonText';\n\n/**\n * Props for the SkeletonMetricCard component.\n */\nexport interface SkeletonMetricCardProps {\n /** Whether to show a sparkline placeholder */\n showSparkline?: boolean;\n /** Whether to show a trend indicator placeholder */\n showTrend?: boolean;\n /** Whether to animate the skeleton */\n animate?: boolean;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * Skeleton placeholder for MetricCard components.\n *\n * @example\n * ```tsx\n * <SkeletonMetricCard />\n * <SkeletonMetricCard showSparkline showTrend />\n * ```\n */\nexport function SkeletonMetricCard({\n showSparkline = false,\n showTrend = true,\n animate = true,\n className,\n}: SkeletonMetricCardProps): React.ReactElement {\n const { theme } = useTheme();\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n padding: '16px',\n borderRadius: '8px',\n backgroundColor: theme.colors.surface,\n border: `1px solid ${theme.colors.border}`,\n minWidth: '200px',\n };\n\n const headerStyle: React.CSSProperties = {\n marginBottom: '8px',\n };\n\n const valueContainerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n marginBottom: showSparkline ? '12px' : '0',\n };\n\n const trendStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n };\n\n const sparklineStyle: React.CSSProperties = {\n marginTop: '8px',\n height: '40px',\n display: 'flex',\n alignItems: 'flex-end',\n gap: '2px',\n };\n\n return (\n <div className={className} style={containerStyle} role=\"presentation\" aria-hidden=\"true\">\n {/* Title */}\n <div style={headerStyle}>\n <Skeleton width={120} height={14} animate={animate} />\n </div>\n\n {/* Value and trend */}\n <div style={valueContainerStyle}>\n {/* Main value */}\n <Skeleton width={80} height={32} animate={animate} />\n\n {/* Trend indicator */}\n {showTrend && (\n <div style={trendStyle}>\n <Skeleton width={16} height={16} borderRadius=\"50%\" animate={animate} />\n <Skeleton width={40} height={14} animate={animate} />\n </div>\n )}\n </div>\n\n {/* Description */}\n <SkeletonText lines={1} lineHeight={12} animate={animate} />\n\n {/* Sparkline */}\n {showSparkline && (\n <div style={sparklineStyle}>\n {Array.from({ length: 12 }, (_, i) => {\n const heights = [30, 50, 45, 70, 55, 80, 60, 75, 65, 85, 70, 90];\n return (\n <Skeleton\n key={i}\n width={6}\n height={`${heights[i % heights.length]}%`}\n borderRadius=\"2px\"\n animate={animate}\n />\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\nexport default SkeletonMetricCard;\n","'use client';\n\nimport React, { useState } from 'react';\nimport { useTheme } from '../../theme';\n\n/**\n * Props for the ErrorFallback component.\n */\nexport interface ErrorFallbackProps {\n /** The error that was caught */\n error: Error;\n /** Function to reset the error state */\n resetError: () => void;\n /** Custom title for the error display */\n title?: string;\n /** Whether to show error details */\n showDetails?: boolean;\n}\n\n/**\n * Default error fallback UI component.\n *\n * @example\n * ```tsx\n * <ErrorFallback\n * error={error}\n * resetError={reset}\n * title=\"Chart Error\"\n * showDetails={true}\n * />\n * ```\n */\nexport function ErrorFallback({\n error,\n resetError,\n title = 'Something went wrong',\n showDetails = false,\n}: ErrorFallbackProps): React.ReactElement {\n const { theme } = useTheme();\n const [detailsVisible, setDetailsVisible] = useState(showDetails);\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '32px',\n minHeight: '200px',\n backgroundColor: theme.colors.surface,\n borderRadius: '8px',\n border: `1px solid ${theme.colors.border}`,\n textAlign: 'center',\n };\n\n const iconStyle: React.CSSProperties = {\n width: '48px',\n height: '48px',\n marginBottom: '16px',\n color: theme.colors.error,\n };\n\n const titleStyle: React.CSSProperties = {\n margin: '0 0 8px 0',\n fontSize: theme.fontSizes.lg,\n fontWeight: 600,\n color: theme.colors.text,\n };\n\n const messageStyle: React.CSSProperties = {\n margin: '0 0 16px 0',\n fontSize: theme.fontSizes.sm,\n color: theme.colors.textMuted,\n maxWidth: '400px',\n };\n\n const buttonStyle: React.CSSProperties = {\n padding: '8px 16px',\n fontSize: theme.fontSizes.sm,\n fontWeight: 500,\n color: theme.colors.textInverse,\n backgroundColor: theme.colors.primary,\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n };\n\n const detailsButtonStyle: React.CSSProperties = {\n ...buttonStyle,\n backgroundColor: 'transparent',\n color: theme.colors.textMuted,\n marginLeft: '8px',\n };\n\n const detailsStyle: React.CSSProperties = {\n marginTop: '16px',\n padding: '12px',\n backgroundColor: theme.colors.background,\n borderRadius: '6px',\n border: `1px solid ${theme.colors.border}`,\n textAlign: 'left',\n maxWidth: '100%',\n overflow: 'auto',\n };\n\n const codeStyle: React.CSSProperties = {\n margin: 0,\n fontSize: theme.fontSizes.xs,\n fontFamily: theme.fonts.mono,\n color: theme.colors.error,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n };\n\n return (\n <div style={containerStyle} role=\"alert\">\n {/* Error icon */}\n <svg\n style={iconStyle}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n\n <h3 style={titleStyle}>{title}</h3>\n <p style={messageStyle}>{error.message || 'An unexpected error occurred.'}</p>\n\n <div>\n <button\n style={buttonStyle}\n onClick={resetError}\n onMouseEnter={(e) => {\n (e.target as HTMLButtonElement).style.backgroundColor = theme.colors.primaryHover;\n }}\n onMouseLeave={(e) => {\n (e.target as HTMLButtonElement).style.backgroundColor = theme.colors.primary;\n }}\n >\n Try Again\n </button>\n <button\n style={detailsButtonStyle}\n onClick={() => setDetailsVisible(!detailsVisible)}\n >\n {detailsVisible ? 'Hide Details' : 'Show Details'}\n </button>\n </div>\n\n {detailsVisible && (\n <div style={detailsStyle}>\n <pre style={codeStyle}>\n {error.stack || `${error.name}: ${error.message}`}\n </pre>\n </div>\n )}\n </div>\n );\n}\n\nexport default ErrorFallback;\n","'use client';\n\nimport { Component, ErrorInfo, ReactNode } from 'react';\nimport { ErrorFallback } from './ErrorFallback';\n\n/**\n * Props for the ErrorBoundary component.\n */\nexport interface ErrorBoundaryProps {\n /** Content to render */\n children: ReactNode;\n /** Custom fallback UI or render function */\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);\n /** Callback when an error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n /** Reset the error boundary when these values change */\n resetKeys?: unknown[];\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * Error boundary component that catches JavaScript errors in child components.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <ErrorBoundary>\n * <MyComponent />\n * </ErrorBoundary>\n *\n * // With custom fallback\n * <ErrorBoundary fallback={<div>Something went wrong</div>}>\n * <MyComponent />\n * </ErrorBoundary>\n *\n * // With error handler\n * <ErrorBoundary onError={(error) => logError(error)}>\n * <MyComponent />\n * </ErrorBoundary>\n *\n * // With reset keys (resets when values change)\n * <ErrorBoundary resetKeys={[userId]}>\n * <MyComponent userId={userId} />\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n const { onError } = this.props;\n if (onError) {\n onError(error, errorInfo);\n }\n }\n\n componentDidUpdate(prevProps: ErrorBoundaryProps): void {\n const { resetKeys } = this.props;\n const { hasError } = this.state;\n\n // Reset error state when resetKeys change\n if (hasError && resetKeys && prevProps.resetKeys) {\n const hasResetKeyChanged = resetKeys.some(\n (key, index) => key !== prevProps.resetKeys?.[index]\n );\n if (hasResetKeyChanged) {\n this.resetError();\n }\n }\n }\n\n resetError = (): void => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): ReactNode {\n const { children, fallback } = this.props;\n const { hasError, error } = this.state;\n\n if (hasError && error) {\n // Custom render function fallback\n if (typeof fallback === 'function') {\n return fallback(error, this.resetError);\n }\n\n // Custom ReactNode fallback\n if (fallback) {\n return fallback;\n }\n\n // Default fallback\n return <ErrorFallback error={error} resetError={this.resetError} />;\n }\n\n return children;\n }\n}\n\nexport default ErrorBoundary;\n","'use client';\n\nimport { Component, ErrorInfo, ReactNode } from 'react';\nimport { useTheme } from '../../theme';\n\n/**\n * Props for the WidgetErrorBoundary component.\n */\nexport interface WidgetErrorBoundaryProps {\n /** Content to render */\n children: ReactNode;\n /** Title of the widget (for display in error state) */\n widgetTitle?: string;\n /** Callback when an error is caught */\n onError?: (error: Error) => void;\n}\n\ninterface WidgetErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * Internal fallback component for widget errors.\n */\nfunction WidgetErrorFallback({\n widgetTitle,\n error,\n onRetry,\n}: {\n widgetTitle?: string;\n error: Error;\n onRetry: () => void;\n}): React.ReactElement {\n const { theme } = useTheme();\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n minHeight: '120px',\n padding: '16px',\n backgroundColor: theme.colors.surface,\n borderRadius: '8px',\n border: `1px solid ${theme.colors.border}`,\n textAlign: 'center',\n };\n\n const iconStyle: React.CSSProperties = {\n width: '32px',\n height: '32px',\n marginBottom: '8px',\n color: theme.colors.error,\n };\n\n const titleStyle: React.CSSProperties = {\n margin: '0 0 4px 0',\n fontSize: theme.fontSizes.sm,\n fontWeight: 500,\n color: theme.colors.text,\n };\n\n const messageStyle: React.CSSProperties = {\n margin: '0 0 12px 0',\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n maxWidth: '200px',\n };\n\n const buttonStyle: React.CSSProperties = {\n padding: '4px 12px',\n fontSize: theme.fontSizes.xs,\n fontWeight: 500,\n color: theme.colors.textInverse,\n backgroundColor: theme.colors.primary,\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n };\n\n return (\n <div style={containerStyle} role=\"alert\">\n {/* Error icon */}\n <svg\n style={iconStyle}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n\n <h4 style={titleStyle}>\n {widgetTitle ? `${widgetTitle} failed to load` : 'Widget failed to load'}\n </h4>\n <p style={messageStyle}>{error.message || 'An error occurred'}</p>\n\n <button\n style={buttonStyle}\n onClick={onRetry}\n onMouseEnter={(e) => {\n (e.target as HTMLButtonElement).style.backgroundColor = theme.colors.primaryHover;\n }}\n onMouseLeave={(e) => {\n (e.target as HTMLButtonElement).style.backgroundColor = theme.colors.primary;\n }}\n >\n Retry\n </button>\n </div>\n );\n}\n\n/**\n * Error boundary specifically designed for dashboard widgets.\n *\n * Provides a compact error display that fits within widget containers.\n *\n * @example\n * ```tsx\n * <WidgetErrorBoundary widgetTitle=\"Sales Chart\" onError={logError}>\n * <BarChart data={data} />\n * </WidgetErrorBoundary>\n * ```\n */\nexport class WidgetErrorBoundary extends Component<\n WidgetErrorBoundaryProps,\n WidgetErrorBoundaryState\n> {\n constructor(props: WidgetErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): WidgetErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n const { onError } = this.props;\n if (onError) {\n onError(error);\n }\n // Log to console in development\n if (process.env.NODE_ENV === 'development') {\n console.error('WidgetErrorBoundary caught an error:', error, errorInfo);\n }\n }\n\n resetError = (): void => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): ReactNode {\n const { children, widgetTitle } = this.props;\n const { hasError, error } = this.state;\n\n if (hasError && error) {\n return (\n <WidgetErrorFallback\n widgetTitle={widgetTitle}\n error={error}\n onRetry={this.resetError}\n />\n );\n }\n\n return children;\n }\n}\n\nexport default WidgetErrorBoundary;\n","'use client';\n\nimport React from 'react';\nimport { useTheme } from '../../theme';\n\n/**\n * Props for the EmptyState component.\n */\nexport interface EmptyStateProps {\n /** Custom icon to display */\n icon?: React.ReactNode;\n /** Title text */\n title: string;\n /** Description text */\n description?: string;\n /** Optional action button */\n action?: {\n label: string;\n onClick: () => void;\n };\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * Generic empty state component with customizable content.\n *\n * @example\n * ```tsx\n * <EmptyState\n * title=\"No data available\"\n * description=\"Try adjusting your filters\"\n * action={{ label: \"Clear Filters\", onClick: clearFilters }}\n * />\n * ```\n */\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n className,\n}: EmptyStateProps): React.ReactElement {\n const { theme } = useTheme();\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '48px 24px',\n textAlign: 'center',\n minHeight: '200px',\n };\n\n const iconContainerStyle: React.CSSProperties = {\n marginBottom: '16px',\n color: theme.colors.textMuted,\n };\n\n const titleStyle: React.CSSProperties = {\n margin: '0 0 8px 0',\n fontSize: theme.fontSizes.lg,\n fontWeight: 600,\n color: theme.colors.text,\n };\n\n const descriptionStyle: React.CSSProperties = {\n margin: '0 0 24px 0',\n fontSize: theme.fontSizes.sm,\n color: theme.colors.textMuted,\n maxWidth: '400px',\n };\n\n const buttonStyle: React.CSSProperties = {\n padding: '8px 16px',\n fontSize: theme.fontSizes.sm,\n fontWeight: 500,\n color: theme.colors.textInverse,\n backgroundColor: theme.colors.primary,\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n };\n\n // Default icon if none provided\n const defaultIcon = (\n <svg\n width=\"64\"\n height=\"64\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M8 15h8\" />\n <path d=\"M9 9h.01\" />\n <path d=\"M15 9h.01\" />\n </svg>\n );\n\n return (\n <div className={className} style={containerStyle}>\n <div style={iconContainerStyle}>\n {icon || defaultIcon}\n </div>\n\n <h3 style={titleStyle}>{title}</h3>\n\n {description && (\n <p style={descriptionStyle}>{description}</p>\n )}\n\n {action && (\n <button\n style={buttonStyle}\n onClick={action.onClick}\n onMouseEnter={(e) => {\n (e.target as HTMLButtonElement).style.backgroundColor = theme.colors.primaryHover;\n }}\n onMouseLeave={(e) => {\n (e.target as HTMLButtonElement).style.backgroundColor = theme.colors.primary;\n }}\n >\n {action.label}\n </button>\n )}\n </div>\n );\n}\n\nexport default EmptyState;\n","'use client';\n\nimport React from 'react';\nimport { useTheme } from '../../theme';\nimport { EmptyState } from './EmptyState';\n\n/**\n * Props for the NoData component.\n */\nexport interface NoDataProps {\n /** Custom message to display */\n message?: string;\n /** Callback when refresh button is clicked */\n onRefresh?: () => void;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * Empty state for when a query returns no data.\n *\n * @example\n * ```tsx\n * <NoData message=\"No sales data for this period\" onRefresh={refetch} />\n * ```\n */\nexport function NoData({\n message = 'No data available',\n onRefresh,\n className,\n}: NoDataProps): React.ReactElement {\n const { theme } = useTheme();\n\n const icon = (\n <svg\n width=\"64\"\n height=\"64\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={theme.colors.textMuted}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {/* Database with empty state */}\n <ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" />\n <path d=\"M21 12c0 1.66-4 3-9 3s-9-1.34-9-3\" />\n <path d=\"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5\" />\n {/* Empty indicator */}\n <path d=\"M12 11v4\" opacity=\"0.5\" />\n <path d=\"M10 13h4\" opacity=\"0.5\" />\n </svg>\n );\n\n return (\n <EmptyState\n className={className}\n icon={icon}\n title={message}\n description=\"The query returned no results. This could mean the data doesn't exist yet or the filters are too restrictive.\"\n action={onRefresh ? { label: 'Refresh', onClick: onRefresh } : undefined}\n />\n );\n}\n\nexport default NoData;\n","'use client';\n\nimport React from 'react';\nimport { useTheme } from '../../theme';\nimport { EmptyState } from './EmptyState';\n\n/**\n * Props for the NoResults component.\n */\nexport interface NoResultsProps {\n /** The search query that returned no results */\n searchQuery?: string;\n /** Callback when clear filters button is clicked */\n onClearFilters?: () => void;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * Empty state for when a search or filter returns no results.\n *\n * @example\n * ```tsx\n * <NoResults searchQuery=\"xyz123\" onClearFilters={clearFilters} />\n * ```\n */\nexport function NoResults({\n searchQuery,\n onClearFilters,\n className,\n}: NoResultsProps): React.ReactElement {\n const { theme } = useTheme();\n\n const icon = (\n <svg\n width=\"64\"\n height=\"64\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={theme.colors.textMuted}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {/* Search with X */}\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"M21 21l-4.35-4.35\" />\n {/* X mark inside */}\n <path d=\"M8 8l6 6\" opacity=\"0.5\" />\n <path d=\"M14 8l-6 6\" opacity=\"0.5\" />\n </svg>\n );\n\n const title = searchQuery\n ? `No results for \"${searchQuery}\"`\n : 'No matching results';\n\n const description = searchQuery\n ? 'Try using different keywords or adjusting your filters.'\n : 'Try adjusting your filters to see more results.';\n\n return (\n <EmptyState\n className={className}\n icon={icon}\n title={title}\n description={description}\n action={onClearFilters ? { label: 'Clear Filters', onClick: onClearFilters } : undefined}\n />\n );\n}\n\nexport default NoResults;\n","'use client';\n\nimport React from 'react';\nimport { useTheme } from '../../theme';\nimport { EmptyState } from './EmptyState';\n\n/**\n * Props for the EmptyDashboard component.\n */\nexport interface EmptyDashboardProps {\n /** Callback when add widget button is clicked */\n onAddWidget?: () => void;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * Empty state for dashboards with no widgets.\n *\n * @example\n * ```tsx\n * <EmptyDashboard onAddWidget={openWidgetPalette} />\n * ```\n */\nexport function EmptyDashboard({\n onAddWidget,\n className,\n}: EmptyDashboardProps): React.ReactElement {\n const { theme } = useTheme();\n\n const icon = (\n <svg\n width=\"80\"\n height=\"80\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={theme.colors.textMuted}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {/* Dashboard grid */}\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n {/* Plus sign in center */}\n <circle cx=\"12\" cy=\"12\" r=\"3\" fill={theme.colors.surface} stroke={theme.colors.primary} strokeWidth=\"1.5\" />\n <path d=\"M12 10v4\" stroke={theme.colors.primary} strokeWidth=\"1.5\" />\n <path d=\"M10 12h4\" stroke={theme.colors.primary} strokeWidth=\"1.5\" />\n </svg>\n );\n\n return (\n <EmptyState\n className={className}\n icon={icon}\n title=\"This dashboard is empty\"\n description=\"Get started by adding your first widget. You can add charts, metrics, tables, and more.\"\n action={onAddWidget ? { label: 'Add Widget', onClick: onAddWidget } : undefined}\n />\n );\n}\n\nexport default EmptyDashboard;\n","/**\n * Prismiq API Client.\n *\n * Typed HTTP client for communicating with the Prismiq backend.\n */\n\nimport type {\n Dashboard,\n DashboardCreate,\n DashboardPinContextsResponse,\n DashboardUpdate,\n DatabaseSchema,\n ExecuteSQLRequest,\n PinnedDashboard,\n PinnedDashboardsResponse,\n QueryDefinition,\n QueryResult,\n SavedQuery,\n SavedQueryCreate,\n SavedQueryUpdate,\n SQLValidationResult,\n TableSchema,\n ValidationResult,\n Widget,\n WidgetCreate,\n WidgetPositionUpdate,\n WidgetUpdate,\n} from '../types';\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/**\n * Configuration for the Prismiq client.\n */\nexport interface ClientConfig {\n /** Base URL of the Prismiq API endpoint. */\n endpoint: string;\n /**\n * Tenant ID for multi-tenant isolation.\n * All API calls will include this in the X-Tenant-ID header.\n * Required for production use.\n */\n tenantId: string;\n /**\n * User ID for ownership and permissions.\n * Included in X-User-ID header when provided.\n * Used for dashboard ownership and access control.\n */\n userId?: string;\n /**\n * PostgreSQL schema name for per-tenant schema isolation.\n * Included in X-Schema-Name header when provided.\n * Used when each tenant has their own PostgreSQL schema (e.g., \"org_123\").\n */\n schemaName?: string;\n /**\n * Custom headers to include with every request.\n * Useful for application-specific headers like row-level security filters.\n * Keys are header names, values are header values.\n */\n customHeaders?: Record<string, string>;\n /** Optional function to get an authentication token. */\n getToken?: () => Promise<string> | string;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/**\n * Base error class for Prismiq API errors.\n */\nexport class PrismiqError extends Error {\n constructor(\n message: string,\n public readonly statusCode?: number\n ) {\n super(message);\n this.name = 'PrismiqError';\n // Restore prototype chain for instanceof to work\n Object.setPrototypeOf(this, PrismiqError.prototype);\n }\n}\n\n// ============================================================================\n// API Client\n// ============================================================================\n\n/**\n * HTTP client for the Prismiq backend API.\n *\n * @example\n * ```typescript\n * const client = new PrismiqClient({\n * endpoint: 'https://api.example.com/analytics',\n * getToken: () => authService.getToken(),\n * });\n *\n * const schema = await client.getSchema();\n * const result = await client.executeQuery(query);\n * ```\n */\nexport class PrismiqClient {\n private readonly endpoint: string;\n private readonly tenantId: string;\n private readonly userId?: string;\n private readonly schemaName?: string;\n private readonly customHeaders?: Record<string, string>;\n private readonly getToken?: () => Promise<string> | string;\n\n constructor(config: ClientConfig) {\n // Normalize endpoint - remove trailing slash\n this.endpoint = config.endpoint.replace(/\\/$/, '');\n this.tenantId = config.tenantId;\n this.userId = config.userId;\n this.schemaName = config.schemaName;\n this.customHeaders = config.customHeaders;\n this.getToken = config.getToken;\n }\n\n /**\n * Make an authenticated request to the API.\n */\n private async request<T>(\n path: string,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${this.endpoint}${path}`;\n\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n 'X-Tenant-ID': this.tenantId,\n ...options.headers,\n };\n\n // Add user ID header if provided\n if (this.userId) {\n (headers as Record<string, string>)['X-User-ID'] = this.userId;\n }\n\n // Add schema name header if provided (for per-tenant schema isolation)\n if (this.schemaName) {\n (headers as Record<string, string>)['X-Schema-Name'] = this.schemaName;\n }\n\n // Add custom headers if provided (for application-specific needs)\n if (this.customHeaders) {\n for (const [key, value] of Object.entries(this.customHeaders)) {\n (headers as Record<string, string>)[key] = value;\n }\n }\n\n // Add authorization header if token provider is configured\n if (this.getToken) {\n const token = await this.getToken();\n (headers as Record<string, string>)['Authorization'] = `Bearer ${token}`;\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n let errorMessage = `API request failed: ${response.status} ${response.statusText}`;\n\n try {\n const errorBody = (await response.json()) as { detail?: string | Array<{ msg: string; loc?: string[] }> };\n if (errorBody.detail) {\n if (typeof errorBody.detail === 'string') {\n errorMessage = errorBody.detail;\n } else if (Array.isArray(errorBody.detail)) {\n // Pydantic validation errors are arrays of objects\n errorMessage = errorBody.detail\n .map((e) => e.msg + (e.loc ? ` (${e.loc.join('.')})` : ''))\n .join('; ');\n }\n }\n } catch {\n // Ignore JSON parse errors, use default message\n }\n\n throw new PrismiqError(errorMessage, response.status);\n }\n\n return response.json() as Promise<T>;\n }\n\n // ============================================================================\n // Generic Methods\n // ============================================================================\n\n /**\n * Make a GET request to the API.\n *\n * @param path - API path (starting with /)\n * @returns Response data\n */\n async get<T>(path: string): Promise<T> {\n return this.request<T>(path);\n }\n\n /**\n * Make a POST request to the API.\n *\n * @param path - API path (starting with /)\n * @param body - Request body (will be JSON stringified)\n * @returns Response data\n */\n async post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, {\n method: 'POST',\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * Make a PUT request to the API.\n *\n * @param path - API path (starting with /)\n * @param body - Request body (will be JSON stringified)\n * @returns Response data\n */\n async put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, {\n method: 'PUT',\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * Make a PATCH request to the API.\n *\n * @param path - API path (starting with /)\n * @param body - Request body (will be JSON stringified)\n * @returns Response data\n */\n async patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, {\n method: 'PATCH',\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * Make a DELETE request to the API.\n *\n * @param path - API path (starting with /)\n * @returns Response data\n */\n async delete<T>(path: string): Promise<T> {\n return this.request<T>(path, { method: 'DELETE' });\n }\n\n // ============================================================================\n // Schema Methods\n // ============================================================================\n\n /**\n * Get the complete database schema.\n *\n * @returns The database schema including all tables and relationships.\n */\n async getSchema(): Promise<DatabaseSchema> {\n return this.request<DatabaseSchema>('/schema');\n }\n\n /**\n * Get a list of available table names.\n *\n * @returns Array of table names.\n */\n async getTables(): Promise<string[]> {\n return this.request<string[]>('/tables');\n }\n\n /**\n * Get schema information for a specific table.\n *\n * @param tableName - The name of the table.\n * @returns The table schema including columns.\n */\n async getTable(tableName: string): Promise<TableSchema> {\n return this.request<TableSchema>(`/tables/${encodeURIComponent(tableName)}`);\n }\n\n /**\n * Get sample values from a column for data preview.\n *\n * @param tableName - The name of the table.\n * @param columnName - The name of the column.\n * @param limit - Maximum number of distinct values to return (default: 5).\n * @returns Array of sample values.\n */\n async getColumnSample(\n tableName: string,\n columnName: string,\n limit: number = 5\n ): Promise<unknown[]> {\n const path = `/tables/${encodeURIComponent(tableName)}/columns/${encodeURIComponent(columnName)}/sample?limit=${limit}`;\n const result = await this.request<{ values: unknown[] }>(path);\n return result.values;\n }\n\n // ============================================================================\n // Query Methods\n // ============================================================================\n\n /**\n * Validate a query without executing it.\n *\n * @param query - The query definition to validate.\n * @returns Validation result with any errors.\n */\n async validateQuery(query: QueryDefinition): Promise<ValidationResult> {\n return this.request<ValidationResult>('/query/validate', {\n method: 'POST',\n body: JSON.stringify(query),\n });\n }\n\n /**\n * Generate SQL from a query definition without executing.\n *\n * @param query - The query definition.\n * @returns The generated SQL string.\n */\n async generateSql(query: QueryDefinition): Promise<string> {\n const result = await this.request<{ sql: string }>('/query/sql', {\n method: 'POST',\n body: JSON.stringify(query),\n });\n return result.sql;\n }\n\n /**\n * Execute a query and return the full result.\n *\n * @param query - The query definition to execute.\n * @param bypassCache - If true, bypass cache and re-execute query.\n * @returns The query result with all rows and cache metadata.\n */\n async executeQuery(\n query: QueryDefinition,\n bypassCache: boolean = false\n ): Promise<QueryResult> {\n return this.request<QueryResult>('/query/execute', {\n method: 'POST',\n body: JSON.stringify({ query, bypass_cache: bypassCache }),\n });\n }\n\n /**\n * Execute a query with a limited result set for previewing.\n *\n * @param query - The query definition to execute.\n * @param limit - Maximum number of rows to return (default: 100).\n * @returns The query result with limited rows.\n */\n async previewQuery(\n query: QueryDefinition,\n limit: number = 100\n ): Promise<QueryResult> {\n const url = `/query/preview?limit=${encodeURIComponent(limit)}`;\n return this.request<QueryResult>(url, {\n method: 'POST',\n body: JSON.stringify(query),\n });\n }\n\n // ============================================================================\n // Custom SQL Methods\n // ============================================================================\n\n /**\n * Validate a raw SQL query without executing it.\n *\n * Checks that the SQL is a valid SELECT statement and only\n * references tables visible in the schema.\n *\n * @param sql - Raw SQL query to validate.\n * @returns Validation result with any errors and referenced tables.\n */\n async validateSQL(sql: string): Promise<SQLValidationResult> {\n return this.request<SQLValidationResult>('/query/validate-sql', {\n method: 'POST',\n body: JSON.stringify({ sql }),\n });\n }\n\n /**\n * Execute a raw SQL query.\n *\n * Only SELECT statements are allowed. Queries are restricted\n * to tables visible in the schema.\n *\n * @param sql - Raw SQL query (SELECT only).\n * @param params - Optional named parameters for the query.\n * @returns The query result with all rows.\n */\n async executeSQL(\n sql: string,\n params?: Record<string, unknown>\n ): Promise<QueryResult> {\n const body: ExecuteSQLRequest = { sql };\n if (params) {\n body.params = params;\n }\n return this.request<QueryResult>('/query/execute-sql', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n // ============================================================================\n // Dashboard Methods\n // ============================================================================\n\n /**\n * List all dashboards accessible to the current user.\n *\n * @returns Array of dashboards.\n */\n async listDashboards(): Promise<Dashboard[]> {\n const response = await this.request<{ dashboards: Dashboard[] }>('/dashboards');\n return response.dashboards;\n }\n\n /**\n * Get a specific dashboard by ID.\n *\n * @param id - The dashboard ID.\n * @returns The dashboard with all widgets.\n */\n async getDashboard(id: string): Promise<Dashboard> {\n return this.request<Dashboard>(`/dashboards/${encodeURIComponent(id)}`);\n }\n\n /**\n * Create a new dashboard.\n *\n * @param data - Dashboard creation data.\n * @returns The created dashboard.\n */\n async createDashboard(data: DashboardCreate): Promise<Dashboard> {\n return this.request<Dashboard>('/dashboards', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update an existing dashboard.\n *\n * @param id - The dashboard ID.\n * @param data - Dashboard update data.\n * @returns The updated dashboard.\n */\n async updateDashboard(id: string, data: DashboardUpdate): Promise<Dashboard> {\n return this.request<Dashboard>(`/dashboards/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete a dashboard.\n *\n * @param id - The dashboard ID.\n */\n async deleteDashboard(id: string): Promise<void> {\n await this.request<void>(`/dashboards/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n }\n\n // ============================================================================\n // Widget Methods\n // ============================================================================\n\n /**\n * Add a widget to a dashboard.\n *\n * @param dashboardId - The dashboard ID.\n * @param data - Widget creation data.\n * @returns The created widget.\n */\n async addWidget(dashboardId: string, data: WidgetCreate): Promise<Widget> {\n return this.request<Widget>(\n `/dashboards/${encodeURIComponent(dashboardId)}/widgets`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Update a widget.\n *\n * @param dashboardId - The dashboard ID.\n * @param widgetId - The widget ID.\n * @param data - Widget update data.\n * @returns The updated widget.\n */\n async updateWidget(\n dashboardId: string,\n widgetId: string,\n data: WidgetUpdate\n ): Promise<Widget> {\n return this.request<Widget>(\n `/dashboards/${encodeURIComponent(dashboardId)}/widgets/${encodeURIComponent(widgetId)}`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Delete a widget from a dashboard.\n *\n * @param dashboardId - The dashboard ID.\n * @param widgetId - The widget ID.\n */\n async deleteWidget(dashboardId: string, widgetId: string): Promise<void> {\n await this.request<void>(\n `/dashboards/${encodeURIComponent(dashboardId)}/widgets/${encodeURIComponent(widgetId)}`,\n {\n method: 'DELETE',\n }\n );\n }\n\n /**\n * Update the layout (positions) of multiple widgets.\n *\n * @param dashboardId - The dashboard ID.\n * @param positions - Array of widget position updates.\n * @returns The updated dashboard.\n */\n async updateLayout(\n dashboardId: string,\n positions: WidgetPositionUpdate[]\n ): Promise<Dashboard> {\n return this.request<Dashboard>(\n `/dashboards/${encodeURIComponent(dashboardId)}/layout`,\n {\n method: 'PUT',\n body: JSON.stringify(positions),\n }\n );\n }\n\n // ============================================================================\n // Saved Query Methods\n // ============================================================================\n\n /**\n * List all saved queries accessible to the current user.\n *\n * @returns Array of saved queries.\n */\n async listSavedQueries(): Promise<SavedQuery[]> {\n const response = await this.request<{ queries: SavedQuery[] }>(\n '/saved-queries'\n );\n return response.queries;\n }\n\n /**\n * Get a specific saved query by ID.\n *\n * @param id - The saved query ID.\n * @returns The saved query.\n */\n async getSavedQuery(id: string): Promise<SavedQuery> {\n return this.request<SavedQuery>(\n `/saved-queries/${encodeURIComponent(id)}`\n );\n }\n\n /**\n * Create a new saved query.\n *\n * @param data - Saved query creation data.\n * @returns The created saved query.\n */\n async createSavedQuery(data: SavedQueryCreate): Promise<SavedQuery> {\n return this.request<SavedQuery>('/saved-queries', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update an existing saved query.\n *\n * @param id - The saved query ID.\n * @param data - Saved query update data.\n * @returns The updated saved query.\n */\n async updateSavedQuery(\n id: string,\n data: SavedQueryUpdate\n ): Promise<SavedQuery> {\n return this.request<SavedQuery>(\n `/saved-queries/${encodeURIComponent(id)}`,\n {\n method: 'PATCH',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Delete a saved query.\n *\n * @param id - The saved query ID.\n */\n async deleteSavedQuery(id: string): Promise<void> {\n await this.request<void>(\n `/saved-queries/${encodeURIComponent(id)}`,\n {\n method: 'DELETE',\n }\n );\n }\n\n // ============================================================================\n // Pin Methods\n // ============================================================================\n\n /**\n * Pin a dashboard to a context.\n *\n * @param dashboardId - The dashboard ID to pin.\n * @param context - The context to pin to (e.g., \"accounts\", \"dashboard\").\n * @param position - Optional position in the list (appends at end if not provided).\n * @returns The created pin entry.\n */\n async pinDashboard(\n dashboardId: string,\n context: string,\n position?: number\n ): Promise<PinnedDashboard> {\n return this.request<PinnedDashboard>('/pins', {\n method: 'POST',\n body: JSON.stringify({\n dashboard_id: dashboardId,\n context,\n position,\n }),\n });\n }\n\n /**\n * Unpin a dashboard from a context.\n *\n * @param dashboardId - The dashboard ID to unpin.\n * @param context - The context to unpin from.\n */\n async unpinDashboard(dashboardId: string, context: string): Promise<void> {\n await this.request<void>('/pins', {\n method: 'DELETE',\n body: JSON.stringify({\n dashboard_id: dashboardId,\n context,\n }),\n });\n }\n\n /**\n * Get all dashboards pinned to a context.\n *\n * @param context - The context to get pins for (e.g., \"accounts\", \"dashboard\").\n * @returns Response with dashboards and pin metadata.\n */\n async getPinnedDashboards(context: string): Promise<PinnedDashboardsResponse> {\n return this.request<PinnedDashboardsResponse>(\n `/pins?context=${encodeURIComponent(context)}`\n );\n }\n\n /**\n * Get all contexts where a dashboard is pinned.\n *\n * @param dashboardId - The dashboard ID.\n * @returns List of context names.\n */\n async getDashboardPinContexts(dashboardId: string): Promise<string[]> {\n const response = await this.request<DashboardPinContextsResponse>(\n `/dashboards/${encodeURIComponent(dashboardId)}/pins`\n );\n return response.contexts;\n }\n\n /**\n * Reorder pinned dashboards within a context.\n *\n * @param context - The context to reorder pins in.\n * @param dashboardIds - Ordered list of dashboard IDs (new order).\n */\n async reorderPins(context: string, dashboardIds: string[]): Promise<void> {\n await this.request<void>('/pins/order', {\n method: 'PUT',\n body: JSON.stringify({\n context,\n dashboard_ids: dashboardIds,\n }),\n });\n }\n}\n","/**\n * Analytics Provider and Context.\n *\n * Provides the Prismiq client and schema to React components.\n */\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\n\nimport { PrismiqClient, type ClientConfig } from '../api/client';\nimport type { DatabaseSchema, QueryDefinition, QueryResult } from '../types';\n\n// ============================================================================\n// Context Types\n// ============================================================================\n\n/**\n * Value provided by the AnalyticsContext.\n */\nexport interface AnalyticsContextValue {\n /** The Prismiq API client instance. */\n client: PrismiqClient;\n /** The database schema, or null if not yet loaded. */\n schema: DatabaseSchema | null;\n /** Whether the schema is currently loading. */\n isLoading: boolean;\n /** Error that occurred during schema loading, if any. */\n error: Error | null;\n /** Function to manually refresh the schema. */\n refetchSchema: () => Promise<void>;\n /** Current tenant ID for multi-tenant isolation. */\n tenantId: string;\n /** Current user ID for ownership and permissions. */\n userId?: string;\n /** PostgreSQL schema name for per-tenant schema isolation. */\n schemaName?: string;\n}\n\n/**\n * Props for the AnalyticsProvider component.\n */\nexport interface AnalyticsProviderProps {\n /** Configuration for the Prismiq client. tenantId, userId, schemaName are provided via separate props. */\n config: Omit<ClientConfig, 'tenantId' | 'userId' | 'schemaName'>;\n /**\n * Tenant ID for multi-tenant isolation.\n * All API calls will include this in the X-Tenant-ID header.\n * Required for production use.\n */\n tenantId: string;\n /**\n * User ID for ownership and permissions.\n * Included in X-User-ID header when provided.\n * Used for dashboard ownership and access control.\n */\n userId?: string;\n /**\n * PostgreSQL schema name for per-tenant schema isolation.\n * Included in X-Schema-Name header when provided.\n * Used when each tenant has their own PostgreSQL schema (e.g., \"org_123\").\n */\n schemaName?: string;\n /** Callback when a query is executed successfully. */\n onQueryExecute?: (query: QueryDefinition, result: QueryResult) => void;\n /** Callback when a query execution fails. */\n onQueryError?: (query: QueryDefinition, error: Error) => void;\n /** Callback when schema is loaded successfully. */\n onSchemaLoad?: (schema: DatabaseSchema) => void;\n /** Callback when schema loading fails. */\n onSchemaError?: (error: Error) => void;\n /** Child components that will have access to the analytics context. */\n children: ReactNode;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst AnalyticsContext = createContext<AnalyticsContextValue | null>(null);\n\n// ============================================================================\n// Callbacks Context\n// ============================================================================\n\nexport interface AnalyticsCallbacks {\n onQueryExecute?: (query: QueryDefinition, result: QueryResult) => void;\n onQueryError?: (query: QueryDefinition, error: Error) => void;\n}\n\nconst CallbacksContext = createContext<AnalyticsCallbacks>({});\n\n/**\n * Hook to access analytics callbacks.\n * For internal use by components that need to fire callbacks.\n */\nexport function useAnalyticsCallbacks(): AnalyticsCallbacks {\n return useContext(CallbacksContext);\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * Provider component that supplies the Prismiq client and schema to child components.\n *\n * @example\n * ```tsx\n * function App() {\n * return (\n * <AnalyticsProvider\n * config={{ endpoint: 'https://api.example.com' }}\n * tenantId=\"my-org-123\"\n * userId=\"user-456\"\n * onQueryExecute={(query, result) => console.log('Query executed', result)}\n * onSchemaLoad={(schema) => console.log('Schema loaded', schema.tables.length)}\n * >\n * <Dashboard />\n * </AnalyticsProvider>\n * );\n * }\n * ```\n */\n// Debug: Track provider instances\nlet providerInstanceCount = 0;\n\nexport function AnalyticsProvider({\n config,\n tenantId,\n userId,\n schemaName,\n onQueryExecute,\n onQueryError,\n onSchemaLoad,\n onSchemaError,\n children,\n}: AnalyticsProviderProps): JSX.Element {\n // Debug: Track this provider instance\n const instanceIdRef = useRef<string | null>(null);\n if (!instanceIdRef.current) {\n providerInstanceCount++;\n instanceIdRef.current = `provider-${providerInstanceCount}`;\n console.log(`[AnalyticsProvider] Creating instance ${instanceIdRef.current}`);\n }\n\n // Create client instance ONCE on first render using ref\n // This prevents recreation when props change (which would cause cascading refetches)\n const clientRef = useRef<PrismiqClient | null>(null);\n if (!clientRef.current) {\n console.log(`[AnalyticsProvider ${instanceIdRef.current}] Creating PrismiqClient`);\n clientRef.current = new PrismiqClient({\n ...config,\n tenantId,\n userId,\n schemaName,\n });\n }\n const client = clientRef.current;\n\n // Schema state\n const [schema, setSchema] = useState<DatabaseSchema | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n // Track if initial schema fetch has been done\n const hasFetchedSchemaRef = useRef(false);\n\n // Debug: Log mount/unmount\n useEffect(() => {\n console.log(`[AnalyticsProvider ${instanceIdRef.current}] MOUNTED`);\n return () => {\n console.log(`[AnalyticsProvider ${instanceIdRef.current}] UNMOUNTED`);\n };\n }, []);\n\n // Store callbacks in refs to avoid recreating fetchSchema\n const onSchemaLoadRef = useRef(onSchemaLoad);\n const onSchemaErrorRef = useRef(onSchemaError);\n onSchemaLoadRef.current = onSchemaLoad;\n onSchemaErrorRef.current = onSchemaError;\n\n // Fetch schema function - stable reference\n const fetchSchema = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const fetchedSchema = await client.getSchema();\n setSchema(fetchedSchema);\n onSchemaLoadRef.current?.(fetchedSchema);\n } catch (err) {\n const schemaError = err instanceof Error ? err : new Error(String(err));\n setError(schemaError);\n onSchemaErrorRef.current?.(schemaError);\n } finally {\n setIsLoading(false);\n }\n }, [client]); // Only depends on client, which is now stable\n\n // Refetch schema function (exposed to consumers)\n const refetchSchema = useCallback(async () => {\n await fetchSchema();\n }, [fetchSchema]);\n\n // Fetch schema on mount - only once\n useEffect(() => {\n if (hasFetchedSchemaRef.current) return;\n hasFetchedSchemaRef.current = true;\n void fetchSchema();\n }, [fetchSchema]);\n\n // Memoize context value to prevent unnecessary re-renders\n const contextValue = useMemo<AnalyticsContextValue>(\n () => ({\n client,\n schema,\n isLoading,\n error,\n refetchSchema,\n tenantId,\n userId,\n schemaName,\n }),\n [client, schema, isLoading, error, refetchSchema, tenantId, userId, schemaName]\n );\n\n // Memoize callbacks\n const callbacks = useMemo<AnalyticsCallbacks>(\n () => ({\n onQueryExecute,\n onQueryError,\n }),\n [onQueryExecute, onQueryError]\n );\n\n return (\n <AnalyticsContext.Provider value={contextValue}>\n <CallbacksContext.Provider value={callbacks}>\n {children}\n </CallbacksContext.Provider>\n </AnalyticsContext.Provider>\n );\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to access the analytics context.\n *\n * Must be used within an AnalyticsProvider.\n *\n * @throws Error if used outside of AnalyticsProvider.\n *\n * @example\n * ```tsx\n * function Dashboard() {\n * const { client, schema, isLoading, error } = useAnalytics();\n *\n * if (isLoading) return <Loading />;\n * if (error) return <Error message={error.message} />;\n *\n * return <TableList tables={schema?.tables ?? []} />;\n * }\n * ```\n */\nexport function useAnalytics(): AnalyticsContextValue {\n const context = useContext(AnalyticsContext);\n\n if (context === null) {\n throw new Error(\n 'useAnalytics must be used within an AnalyticsProvider. ' +\n 'Wrap your component tree with <AnalyticsProvider config={...}>.'\n );\n }\n\n return context;\n}\n\n/**\n * Hook to access tenant and user information.\n *\n * Convenience hook for components that only need tenant/user context.\n *\n * @example\n * ```tsx\n * function UserInfo() {\n * const { tenantId, userId, schemaName } = useTenant();\n * return <span>Tenant: {tenantId}, User: {userId ?? 'anonymous'}</span>;\n * }\n * ```\n */\nexport function useTenant(): { tenantId: string; userId?: string; schemaName?: string } {\n const { tenantId, userId, schemaName } = useAnalytics();\n return { tenantId, userId, schemaName };\n}\n","/**\n * useSchema hook.\n *\n * Provides convenient access to database schema with helper methods.\n */\n\nimport { useCallback, useMemo } from 'react';\n\nimport { useAnalytics } from '../context/AnalyticsProvider';\nimport type { DatabaseSchema, Relationship, TableSchema } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Result of the useSchema hook.\n */\nexport interface UseSchemaResult {\n /** The complete database schema, or null if not yet loaded. */\n schema: DatabaseSchema | null;\n /** List of tables in the schema. */\n tables: TableSchema[];\n /** List of relationships between tables. */\n relationships: Relationship[];\n /** Whether the schema is currently loading. */\n isLoading: boolean;\n /** Error that occurred during schema loading, if any. */\n error: Error | null;\n /** Get a table by name. */\n getTable: (name: string) => TableSchema | undefined;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for accessing the database schema.\n *\n * Provides the schema from the AnalyticsProvider context with\n * convenient helper methods for working with tables.\n *\n * @example\n * ```tsx\n * function TableExplorer() {\n * const { tables, isLoading, getTable } = useSchema();\n *\n * if (isLoading) return <Loading />;\n *\n * const usersTable = getTable('users');\n *\n * return (\n * <ul>\n * {tables.map(table => (\n * <li key={table.name}>{table.name}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useSchema(): UseSchemaResult {\n const { schema, isLoading, error } = useAnalytics();\n\n // Extract tables and relationships from schema\n const tables = useMemo(() => schema?.tables ?? [], [schema]);\n const relationships = useMemo(() => schema?.relationships ?? [], [schema]);\n\n // Helper function to get a table by name\n const getTable = useCallback(\n (name: string): TableSchema | undefined => {\n return tables.find((table) => table.name === name);\n },\n [tables]\n );\n\n return {\n schema,\n tables,\n relationships,\n isLoading,\n error,\n getTable,\n };\n}\n","/**\n * useQuery hook.\n *\n * Executes queries against the Prismiq backend with caching and cancellation.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useAnalytics } from '../context/AnalyticsProvider';\nimport type { QueryDefinition, QueryResult } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for the useQuery hook.\n */\nexport interface UseQueryOptions {\n /**\n * Whether the query should be executed.\n * Set to false to disable automatic execution.\n * @default true\n */\n enabled?: boolean;\n /**\n * Whether to use the preview endpoint (limited results).\n * @default false\n */\n preview?: boolean;\n /**\n * Maximum number of rows to return when using preview.\n * @default 100\n */\n previewLimit?: number;\n}\n\n/**\n * Result of the useQuery hook.\n */\nexport interface UseQueryResult {\n /** The query result data, or null if not yet loaded. */\n data: QueryResult | null;\n /** Whether the query is currently loading. */\n isLoading: boolean;\n /** Error that occurred during query execution, if any. */\n error: Error | null;\n /** Function to manually re-execute the query. */\n refetch: () => Promise<void>;\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Deep comparison of query definitions to determine if they're equivalent.\n */\nfunction queryEquals(\n a: QueryDefinition | null,\n b: QueryDefinition | null\n): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for executing queries against the Prismiq backend.\n *\n * The query is automatically executed when:\n * - The query definition changes\n * - enabled is true\n * - The query is not null\n *\n * Supports cancellation when the component unmounts or the query changes.\n *\n * @param query - The query definition to execute, or null to skip.\n * @param options - Configuration options.\n *\n * @example\n * ```tsx\n * function QueryResults() {\n * const query: QueryDefinition = {\n * tables: [{ id: 't1', name: 'users' }],\n * columns: [\n * { table_id: 't1', column: 'name', aggregation: 'none' },\n * ],\n * };\n *\n * const { data, isLoading, error } = useQuery(query, { preview: true });\n *\n * if (isLoading) return <Loading />;\n * if (error) return <Error message={error.message} />;\n *\n * return (\n * <table>\n * <thead>\n * <tr>\n * {data?.columns.map(col => <th key={col}>{col}</th>)}\n * </tr>\n * </thead>\n * <tbody>\n * {data?.rows.map((row, i) => (\n * <tr key={i}>\n * {row.map((cell, j) => <td key={j}>{String(cell)}</td>)}\n * </tr>\n * ))}\n * </tbody>\n * </table>\n * );\n * }\n * ```\n */\nexport function useQuery(\n query: QueryDefinition | null,\n options: UseQueryOptions = {}\n): UseQueryResult {\n const { enabled = true, preview = false, previewLimit = 100 } = options;\n\n const { client } = useAnalytics();\n\n // State\n const [data, setData] = useState<QueryResult | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Track the current query for memoization\n const previousQueryRef = useRef<QueryDefinition | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Execute query function\n const executeQuery = useCallback(async () => {\n // Don't execute if query is null or disabled\n if (query === null || !enabled) {\n return;\n }\n\n // Cancel any in-flight request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Create new abort controller for this request\n abortControllerRef.current = new AbortController();\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = preview\n ? await client.previewQuery(query, previewLimit)\n : await client.executeQuery(query);\n\n // Check if request was aborted\n if (abortControllerRef.current?.signal.aborted) {\n return;\n }\n\n setData(result);\n } catch (err) {\n // Ignore abort errors\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setData(null);\n } finally {\n setIsLoading(false);\n }\n }, [client, query, enabled, preview, previewLimit]);\n\n // Store executeQuery in a ref to avoid circular dependency in useEffect\n const executeQueryRef = useRef(executeQuery);\n useEffect(() => {\n executeQueryRef.current = executeQuery;\n });\n\n // Refetch function (exposed to consumers)\n const refetch = useCallback(async () => {\n await executeQueryRef.current();\n }, []);\n\n // Execute query when dependencies change\n useEffect(() => {\n // Check if query has actually changed (deep comparison)\n if (queryEquals(query, previousQueryRef.current)) {\n return;\n }\n\n previousQueryRef.current = query;\n\n // Clear data when query is null\n if (query === null) {\n setData(null);\n setError(null);\n setIsLoading(false);\n return;\n }\n\n // Don't execute if disabled\n if (!enabled) {\n return;\n }\n\n void executeQueryRef.current();\n }, [query, enabled]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n return {\n data,\n isLoading,\n error,\n refetch,\n };\n}\n","/**\n * Hook for transforming QueryResult to chart-ready format.\n */\n\nimport { useMemo } from 'react';\nimport type { QueryResult } from '../types';\nimport type { ChartDataOptions, ChartDataResult, ChartSeries } from '../charts/types';\n\n/**\n * Transforms a QueryResult into chart-ready data format.\n *\n * Features:\n * - Extracts categories and series from query result\n * - Supports grouping by column for multi-series\n * - Sorting by X or Y values\n * - Limiting number of data points\n * - Memoized for performance\n *\n * @example\n * ```tsx\n * const { categories, series, isEmpty } = useChartData(queryResult, {\n * xColumn: 'month',\n * yColumns: ['revenue', 'cost'],\n * sortBy: 'y',\n * sortDirection: 'desc',\n * limit: 10,\n * });\n * ```\n */\nexport function useChartData(\n result: QueryResult | null,\n options: ChartDataOptions\n): ChartDataResult {\n const { xColumn, yColumns, groupColumn, sortBy = 'none', sortDirection = 'asc', limit } = options;\n\n return useMemo(() => {\n // Handle null/undefined result\n if (!result || result.rows.length === 0) {\n return {\n categories: [],\n series: [],\n isEmpty: true,\n totalRows: 0,\n };\n }\n\n // Find column indices\n const xIndex = result.columns.indexOf(xColumn);\n if (xIndex === -1) {\n return {\n categories: [],\n series: [],\n isEmpty: true,\n totalRows: result.row_count,\n };\n }\n\n const yIndices = yColumns\n .map((col) => ({ name: col, index: result.columns.indexOf(col) }))\n .filter((item) => item.index !== -1);\n\n if (yIndices.length === 0) {\n return {\n categories: [],\n series: [],\n isEmpty: true,\n totalRows: result.row_count,\n };\n }\n\n // Check if we need to group by a column\n const groupIndex = groupColumn ? result.columns.indexOf(groupColumn) : -1;\n\n if (groupIndex !== -1) {\n // Grouped multi-series\n return processGroupedData(result, xIndex, yIndices, groupIndex, sortBy, sortDirection, limit);\n }\n\n // Standard multi-column series\n return processStandardData(result, xIndex, yIndices, sortBy, sortDirection, limit);\n }, [result, xColumn, yColumns, groupColumn, sortBy, sortDirection, limit]);\n}\n\n/**\n * Process data without grouping - each Y column becomes a series.\n */\nfunction processStandardData(\n result: QueryResult,\n xIndex: number,\n yIndices: Array<{ name: string; index: number }>,\n sortBy: 'x' | 'y' | 'none',\n sortDirection: 'asc' | 'desc',\n limit?: number\n): ChartDataResult {\n // Build data points with all values\n const dataPoints = result.rows.map((row) => {\n const xValue = row[xIndex];\n const yValues = yIndices.map((yi) => {\n const val = row[yi.index];\n return val === null || val === undefined ? null : Number(val);\n });\n return {\n x: xValue === null ? '' : String(xValue),\n y: yValues,\n };\n });\n\n // Sort if requested\n let sortedPoints = dataPoints;\n if (sortBy !== 'none') {\n sortedPoints = [...dataPoints].sort((a, b) => {\n let comparison = 0;\n\n if (sortBy === 'x') {\n comparison = a.x.localeCompare(b.x);\n } else if (sortBy === 'y') {\n // Sort by first Y column\n const aVal = a.y[0] ?? 0;\n const bVal = b.y[0] ?? 0;\n comparison = aVal - bVal;\n }\n\n return sortDirection === 'desc' ? -comparison : comparison;\n });\n }\n\n // Apply limit\n const limitedPoints = limit ? sortedPoints.slice(0, limit) : sortedPoints;\n\n // Extract categories and series\n const categories = limitedPoints.map((p) => p.x);\n const series: ChartSeries[] = yIndices.map((yi, seriesIndex) => ({\n name: yi.name,\n data: limitedPoints.map((p) => p.y[seriesIndex] ?? null),\n }));\n\n return {\n categories,\n series,\n isEmpty: categories.length === 0,\n totalRows: result.row_count,\n };\n}\n\n/**\n * Process data with grouping - group column values become series.\n */\nfunction processGroupedData(\n result: QueryResult,\n xIndex: number,\n yIndices: Array<{ name: string; index: number }>,\n groupIndex: number,\n sortBy: 'x' | 'y' | 'none',\n sortDirection: 'asc' | 'desc',\n limit?: number\n): ChartDataResult {\n // Use first Y column for grouped data\n const yInfo = yIndices[0];\n if (!yInfo) {\n return {\n categories: [],\n series: [],\n isEmpty: true,\n totalRows: result.row_count,\n };\n }\n\n // Collect unique categories and groups\n const categorySet = new Set<string>();\n const groupMap = new Map<string, Map<string, number | null>>();\n\n result.rows.forEach((row) => {\n const xValue = row[xIndex];\n const groupValue = row[groupIndex];\n const yValue = row[yInfo.index];\n\n const category = xValue === null ? '' : String(xValue);\n const group = groupValue === null ? '' : String(groupValue);\n const value = yValue === null || yValue === undefined ? null : Number(yValue);\n\n categorySet.add(category);\n\n if (!groupMap.has(group)) {\n groupMap.set(group, new Map());\n }\n const groupData = groupMap.get(group);\n if (groupData) {\n groupData.set(category, value);\n }\n });\n\n // Get sorted categories\n let categories = Array.from(categorySet);\n if (sortBy === 'x') {\n categories = categories.sort((a, b) =>\n sortDirection === 'desc' ? b.localeCompare(a) : a.localeCompare(b)\n );\n }\n\n // Apply limit to categories\n if (limit) {\n categories = categories.slice(0, limit);\n }\n\n // Build series from groups\n const groupNames = Array.from(groupMap.keys()).sort();\n const series: ChartSeries[] = groupNames.map((groupName) => {\n const groupData = groupMap.get(groupName);\n return {\n name: groupName,\n data: categories.map((cat) => groupData?.get(cat) ?? null),\n };\n });\n\n // Sort by Y if requested (sort categories by first series value)\n if (sortBy === 'y' && series.length > 0) {\n const firstSeries = series[0];\n if (firstSeries) {\n const indices = categories.map((_, i) => i);\n indices.sort((a, b) => {\n const aVal = firstSeries.data[a] ?? 0;\n const bVal = firstSeries.data[b] ?? 0;\n const comparison = aVal - bVal;\n return sortDirection === 'desc' ? -comparison : comparison;\n });\n\n const sortedCategories = indices.map((i) => categories[i]).filter((c): c is string => c !== undefined);\n categories = sortedCategories;\n series.forEach((s) => {\n s.data = indices.map((i) => s.data[i] ?? null);\n });\n }\n }\n\n return {\n categories,\n series,\n isEmpty: categories.length === 0,\n totalRows: result.row_count,\n };\n}\n\nexport default useChartData;\n","/**\n * useDashboards hook.\n *\n * Fetches and manages the list of dashboards from the Prismiq backend.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useAnalytics } from '../context/AnalyticsProvider';\nimport type { Dashboard } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for the useDashboards hook.\n */\nexport interface UseDashboardsOptions {\n /**\n * Whether to automatically fetch dashboards on mount.\n * @default true\n */\n enabled?: boolean;\n}\n\n/**\n * Result of the useDashboards hook.\n */\nexport interface UseDashboardsResult {\n /** The list of dashboards, or null if not yet loaded. */\n data: Dashboard[] | null;\n /** Whether the dashboards are currently loading. */\n isLoading: boolean;\n /** Error that occurred during fetch, if any. */\n error: Error | null;\n /** Function to manually refresh the dashboard list. */\n refetch: () => Promise<void>;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for fetching the list of dashboards.\n *\n * @param options - Configuration options.\n *\n * @example\n * ```tsx\n * function DashboardList() {\n * const { data, isLoading, error } = useDashboards();\n *\n * if (isLoading) return <Loading />;\n * if (error) return <Error message={error.message} />;\n *\n * return (\n * <ul>\n * {data?.map(dashboard => (\n * <li key={dashboard.id}>{dashboard.name}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useDashboards(\n options: UseDashboardsOptions = {}\n): UseDashboardsResult {\n const { enabled = true } = options;\n\n const { client } = useAnalytics();\n\n const [data, setData] = useState<Dashboard[] | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Track if initial fetch has been done\n const hasFetchedRef = useRef(false);\n\n // Store client in ref to avoid refetching when client reference changes\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const fetchDashboards = useCallback(async () => {\n if (!enabled) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await clientRef.current.listDashboards();\n setData(result);\n } catch (err) {\n const fetchError = err instanceof Error ? err : new Error(String(err));\n setError(fetchError);\n setData(null);\n } finally {\n setIsLoading(false);\n }\n }, [enabled]); // Removed client dependency - using ref\n\n const refetch = useCallback(async () => {\n await fetchDashboards();\n }, [fetchDashboards]);\n\n // Fetch on mount - only once\n useEffect(() => {\n if (!enabled || hasFetchedRef.current) return;\n hasFetchedRef.current = true;\n void fetchDashboards();\n }, [enabled, fetchDashboards]);\n\n return {\n data,\n isLoading,\n error,\n refetch,\n };\n}\n","/**\n * useDashboard hook.\n *\n * Fetches a single dashboard by ID from the Prismiq backend.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useAnalytics } from '../context/AnalyticsProvider';\nimport type { Dashboard, Widget, WidgetPosition, WidgetPositionUpdate } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for the useDashboard hook.\n */\nexport interface UseDashboardOptions {\n /**\n * Whether to automatically fetch the dashboard on mount.\n * @default true\n */\n enabled?: boolean;\n}\n\n/**\n * Result of the useDashboard hook.\n */\nexport interface UseDashboardResult {\n /** The dashboard data, or null if not yet loaded. */\n data: Dashboard | null;\n /** Whether the dashboard is currently loading. */\n isLoading: boolean;\n /** Error that occurred during fetch, if any. */\n error: Error | null;\n /** Function to manually refresh the dashboard. */\n refetch: () => Promise<void>;\n /**\n * Optimistically update widget positions.\n * Updates local state immediately without waiting for API.\n */\n optimisticUpdatePositions: (\n positions: Record<string, WidgetPosition> | WidgetPositionUpdate[]\n ) => void;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for fetching a single dashboard by ID.\n *\n * @param dashboardId - The ID of the dashboard to fetch, or null to skip.\n * @param options - Configuration options.\n *\n * @example\n * ```tsx\n * function DashboardView({ id }: { id: string }) {\n * const { data, isLoading, error } = useDashboard(id);\n *\n * if (isLoading) return <Loading />;\n * if (error) return <Error message={error.message} />;\n * if (!data) return null;\n *\n * return (\n * <div>\n * <h1>{data.name}</h1>\n * <p>{data.description}</p>\n * {data.widgets.map(widget => (\n * <Widget key={widget.id} widget={widget} />\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useDashboard(\n dashboardId: string | null,\n options: UseDashboardOptions = {}\n): UseDashboardResult {\n const { enabled = true } = options;\n\n const { client } = useAnalytics();\n\n const [data, setData] = useState<Dashboard | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Track previous ID to detect changes\n const previousIdRef = useRef<string | null>(null);\n\n const fetchDashboard = useCallback(async () => {\n if (!enabled || !dashboardId) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await client.getDashboard(dashboardId);\n setData(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setData(null);\n } finally {\n setIsLoading(false);\n }\n }, [client, dashboardId, enabled]);\n\n const refetch = useCallback(async () => {\n await fetchDashboard();\n }, [fetchDashboard]);\n\n /**\n * Optimistically update widget positions in local state.\n * This updates the UI immediately without waiting for API response.\n */\n const optimisticUpdatePositions = useCallback(\n (positions: Record<string, WidgetPosition> | WidgetPositionUpdate[]) => {\n setData((currentData) => {\n if (!currentData) return currentData;\n\n // Convert array format to record format if needed\n const positionMap: Record<string, WidgetPosition> = Array.isArray(positions)\n ? positions.reduce((acc, update) => {\n acc[update.widget_id] = update.position;\n return acc;\n }, {} as Record<string, WidgetPosition>)\n : positions;\n\n // Update widget positions\n const updatedWidgets: Widget[] = currentData.widgets.map((widget) => {\n const newPosition = positionMap[widget.id];\n if (newPosition) {\n return {\n ...widget,\n position: {\n ...widget.position,\n x: newPosition.x,\n y: newPosition.y,\n w: newPosition.w,\n h: newPosition.h,\n },\n };\n }\n return widget;\n });\n\n return {\n ...currentData,\n widgets: updatedWidgets,\n };\n });\n },\n []\n );\n\n useEffect(() => {\n // Reset data when ID changes\n if (dashboardId !== previousIdRef.current) {\n previousIdRef.current = dashboardId;\n\n if (!dashboardId) {\n setData(null);\n setError(null);\n setIsLoading(false);\n return;\n }\n }\n\n if (enabled && dashboardId) {\n void fetchDashboard();\n }\n }, [dashboardId, enabled, fetchDashboard]);\n\n return {\n data,\n isLoading,\n error,\n refetch,\n optimisticUpdatePositions,\n };\n}\n","/**\n * useDashboardMutations hook.\n *\n * Provides mutation functions for creating, updating, and deleting dashboards and widgets.\n */\n\nimport { useCallback, useState } from 'react';\n\nimport { useAnalytics } from '../context/AnalyticsProvider';\nimport type {\n Dashboard,\n DashboardCreate,\n DashboardUpdate,\n Widget,\n WidgetCreate,\n WidgetPositionUpdate,\n WidgetUpdate,\n} from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * State for a mutation operation.\n */\nexport interface MutationState {\n /** Whether a mutation is in progress. */\n isLoading: boolean;\n /** Error from the last mutation, if any. */\n error: Error | null;\n}\n\n/**\n * Result of the useDashboardMutations hook.\n */\nexport interface UseDashboardMutationsResult {\n /** Current mutation state. */\n state: MutationState;\n\n // Dashboard mutations\n /** Create a new dashboard. */\n createDashboard: (data: DashboardCreate) => Promise<Dashboard>;\n /** Update an existing dashboard. */\n updateDashboard: (id: string, data: DashboardUpdate) => Promise<Dashboard>;\n /** Delete a dashboard. */\n deleteDashboard: (id: string) => Promise<void>;\n\n // Widget mutations\n /** Add a widget to a dashboard. */\n addWidget: (dashboardId: string, data: WidgetCreate) => Promise<Widget>;\n /** Update a widget. */\n updateWidget: (\n dashboardId: string,\n widgetId: string,\n data: WidgetUpdate\n ) => Promise<Widget>;\n /** Delete a widget. */\n deleteWidget: (dashboardId: string, widgetId: string) => Promise<void>;\n /** Update widget positions in a dashboard. */\n updateLayout: (\n dashboardId: string,\n positions: WidgetPositionUpdate[]\n ) => Promise<Dashboard>;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for dashboard and widget mutations.\n *\n * All mutation functions return promises and update the shared loading/error state.\n *\n * @example\n * ```tsx\n * function DashboardActions() {\n * const { state, createDashboard, deleteDashboard } = useDashboardMutations();\n * const { refetch } = useDashboards();\n *\n * const handleCreate = async () => {\n * try {\n * await createDashboard({ name: 'New Dashboard' });\n * await refetch();\n * } catch (error) {\n * // Error is also available in state.error\n * console.error('Failed to create dashboard:', error);\n * }\n * };\n *\n * return (\n * <button onClick={handleCreate} disabled={state.isLoading}>\n * {state.isLoading ? 'Creating...' : 'Create Dashboard'}\n * </button>\n * );\n * }\n * ```\n */\nexport function useDashboardMutations(): UseDashboardMutationsResult {\n const { client } = useAnalytics();\n\n const [state, setState] = useState<MutationState>({\n isLoading: false,\n error: null,\n });\n\n /**\n * Wrapper for mutation operations that handles loading/error state.\n */\n const withMutation = useCallback(\n async <T>(operation: () => Promise<T>): Promise<T> => {\n setState({ isLoading: true, error: null });\n try {\n const result = await operation();\n setState({ isLoading: false, error: null });\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setState({ isLoading: false, error });\n throw error;\n }\n },\n []\n );\n\n // Dashboard mutations\n const createDashboard = useCallback(\n async (data: DashboardCreate): Promise<Dashboard> => {\n return withMutation(() => client.createDashboard(data));\n },\n [client, withMutation]\n );\n\n const updateDashboard = useCallback(\n async (id: string, data: DashboardUpdate): Promise<Dashboard> => {\n return withMutation(() => client.updateDashboard(id, data));\n },\n [client, withMutation]\n );\n\n const deleteDashboard = useCallback(\n async (id: string): Promise<void> => {\n return withMutation(() => client.deleteDashboard(id));\n },\n [client, withMutation]\n );\n\n // Widget mutations\n const addWidget = useCallback(\n async (dashboardId: string, data: WidgetCreate): Promise<Widget> => {\n return withMutation(() => client.addWidget(dashboardId, data));\n },\n [client, withMutation]\n );\n\n const updateWidget = useCallback(\n async (\n dashboardId: string,\n widgetId: string,\n data: WidgetUpdate\n ): Promise<Widget> => {\n return withMutation(() =>\n client.updateWidget(dashboardId, widgetId, data)\n );\n },\n [client, withMutation]\n );\n\n const deleteWidget = useCallback(\n async (dashboardId: string, widgetId: string): Promise<void> => {\n return withMutation(() => client.deleteWidget(dashboardId, widgetId));\n },\n [client, withMutation]\n );\n\n const updateLayout = useCallback(\n async (\n dashboardId: string,\n positions: WidgetPositionUpdate[]\n ): Promise<Dashboard> => {\n return withMutation(() => client.updateLayout(dashboardId, positions));\n },\n [client, withMutation]\n );\n\n return {\n state,\n createDashboard,\n updateDashboard,\n deleteDashboard,\n addWidget,\n updateWidget,\n deleteWidget,\n updateLayout,\n };\n}\n","/**\n * useDebouncedLayoutSave hook.\n *\n * Debounces layout position updates to reduce API calls during drag/resize.\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\n\nimport { useDashboardMutations } from './useDashboardMutations';\nimport type { WidgetPositionUpdate } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Save status states.\n */\nexport type SaveStatus = 'idle' | 'pending' | 'saving' | 'saved' | 'error';\n\n/**\n * Options for useDebouncedLayoutSave.\n */\nexport interface UseDebouncedLayoutSaveOptions {\n /** Dashboard ID. */\n dashboardId: string;\n /** Debounce delay in milliseconds. */\n debounceMs?: number;\n /** How long to show \"Saved\" status. */\n savedDurationMs?: number;\n /** Callback on save success. */\n onSave?: () => void;\n /** Callback on save error. */\n onError?: (error: Error) => void;\n}\n\n/**\n * Result of useDebouncedLayoutSave.\n */\nexport interface UseDebouncedLayoutSaveResult {\n /** Queue a layout update (will be debounced). */\n queueUpdate: (positions: WidgetPositionUpdate[]) => void;\n /** Current save status. */\n status: SaveStatus;\n /** Last error if any. */\n error: Error | null;\n /** Force save immediately (flush pending). */\n flush: () => Promise<void>;\n /** Cancel pending save. */\n cancel: () => void;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for debounced layout updates.\n *\n * Queues layout changes and saves them after a debounce period.\n * Shows visual feedback for pending/saving/saved/error states.\n *\n * @example\n * ```tsx\n * function EditableDashboard({ id }: { id: string }) {\n * const { queueUpdate, status, error } = useDebouncedLayoutSave({\n * dashboardId: id,\n * debounceMs: 500,\n * savedDurationMs: 2000,\n * });\n *\n * const handleLayoutChange = (positions: Record<string, WidgetPosition>) => {\n * const updates = Object.entries(positions).map(([id, pos]) => ({\n * widget_id: id,\n * position: pos,\n * }));\n * queueUpdate(updates);\n * };\n *\n * return (\n * <>\n * <AutoSaveIndicator status={status} error={error} />\n * <DashboardLayout onLayoutChange={handleLayoutChange} />\n * </>\n * );\n * }\n * ```\n */\nexport function useDebouncedLayoutSave({\n dashboardId,\n debounceMs = 500,\n savedDurationMs = 2000,\n onSave,\n onError,\n}: UseDebouncedLayoutSaveOptions): UseDebouncedLayoutSaveResult {\n const { updateLayout } = useDashboardMutations();\n\n const [status, setStatus] = useState<SaveStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n\n // Track pending positions\n const pendingRef = useRef<WidgetPositionUpdate[] | null>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const savedTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n if (savedTimeoutRef.current) clearTimeout(savedTimeoutRef.current);\n };\n }, []);\n\n // Save function\n const save = useCallback(\n async (positions: WidgetPositionUpdate[]) => {\n setStatus('saving');\n setError(null);\n\n try {\n await updateLayout(dashboardId, positions);\n\n setStatus('saved');\n onSave?.();\n\n // Reset to idle after showing \"Saved\"\n savedTimeoutRef.current = setTimeout(() => {\n setStatus('idle');\n }, savedDurationMs);\n } catch (e) {\n const err = e instanceof Error ? e : new Error('Failed to save layout');\n setStatus('error');\n setError(err);\n onError?.(err);\n }\n },\n [dashboardId, updateLayout, savedDurationMs, onSave, onError]\n );\n\n // Queue update with debounce\n const queueUpdate = useCallback(\n (positions: WidgetPositionUpdate[]) => {\n pendingRef.current = positions;\n setStatus('pending');\n\n // Clear existing timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n // Clear saved timeout if showing saved\n if (savedTimeoutRef.current) {\n clearTimeout(savedTimeoutRef.current);\n }\n\n // Schedule save\n timeoutRef.current = setTimeout(() => {\n if (pendingRef.current) {\n save(pendingRef.current);\n pendingRef.current = null;\n }\n }, debounceMs);\n },\n [debounceMs, save]\n );\n\n // Flush pending save immediately\n const flush = useCallback(async () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n\n if (pendingRef.current) {\n const positions = pendingRef.current;\n pendingRef.current = null;\n await save(positions);\n }\n }, [save]);\n\n // Cancel pending save\n const cancel = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n pendingRef.current = null;\n setStatus('idle');\n }, []);\n\n return {\n queueUpdate,\n status,\n error,\n flush,\n cancel,\n };\n}\n","/**\n * useSavedQueries hook.\n *\n * Fetches and manages saved queries from the Prismiq backend.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { useAnalytics } from '../context/AnalyticsProvider';\nimport type { SavedQuery, SavedQueryCreate, SavedQueryUpdate } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for the useSavedQueries hook.\n */\nexport interface UseSavedQueriesOptions {\n /**\n * Whether to automatically fetch saved queries on mount.\n * @default true\n */\n enabled?: boolean;\n}\n\n/**\n * Result of the useSavedQueries hook.\n */\nexport interface UseSavedQueriesResult {\n /** The list of saved queries, or null if not yet loaded. */\n data: SavedQuery[] | null;\n /** Whether the saved queries are currently loading. */\n isLoading: boolean;\n /** Error that occurred during fetch, if any. */\n error: Error | null;\n /** Function to manually refresh the saved query list. */\n refetch: () => Promise<void>;\n /** Function to create a new saved query. */\n createQuery: (data: SavedQueryCreate) => Promise<SavedQuery>;\n /** Function to update an existing saved query. */\n updateQuery: (id: string, data: SavedQueryUpdate) => Promise<SavedQuery>;\n /** Function to delete a saved query. */\n deleteQuery: (id: string) => Promise<void>;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for fetching and managing saved queries.\n *\n * @param options - Configuration options.\n *\n * @example\n * ```tsx\n * function SavedQueryList() {\n * const { data, isLoading, error, createQuery } = useSavedQueries();\n *\n * if (isLoading) return <Loading />;\n * if (error) return <Error message={error.message} />;\n *\n * return (\n * <ul>\n * {data?.map(query => (\n * <li key={query.id}>{query.name}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useSavedQueries(\n options: UseSavedQueriesOptions = {}\n): UseSavedQueriesResult {\n const { enabled = true } = options;\n\n const { client } = useAnalytics();\n\n const [data, setData] = useState<SavedQuery[] | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchSavedQueries = useCallback(async () => {\n if (!enabled) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await client.listSavedQueries();\n setData(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setData(null);\n } finally {\n setIsLoading(false);\n }\n }, [client, enabled]);\n\n const refetch = useCallback(async () => {\n await fetchSavedQueries();\n }, [fetchSavedQueries]);\n\n const createQuery = useCallback(\n async (createData: SavedQueryCreate): Promise<SavedQuery> => {\n const created = await client.createSavedQuery(createData);\n // Refresh the list after creating\n await fetchSavedQueries();\n return created;\n },\n [client, fetchSavedQueries]\n );\n\n const updateQuery = useCallback(\n async (id: string, updateData: SavedQueryUpdate): Promise<SavedQuery> => {\n const updated = await client.updateSavedQuery(id, updateData);\n // Update the local state\n setData((prev) =>\n prev ? prev.map((q) => (q.id === id ? updated : q)) : prev\n );\n return updated;\n },\n [client]\n );\n\n const deleteQuery = useCallback(\n async (id: string): Promise<void> => {\n await client.deleteSavedQuery(id);\n // Remove from local state\n setData((prev) => (prev ? prev.filter((q) => q.id !== id) : prev));\n },\n [client]\n );\n\n useEffect(() => {\n if (enabled) {\n void fetchSavedQueries();\n }\n }, [enabled, fetchSavedQueries]);\n\n return {\n data,\n isLoading,\n error,\n refetch,\n createQuery,\n updateQuery,\n deleteQuery,\n };\n}\n","/**\n * useCustomSQL hook.\n *\n * Executes raw SQL queries against the Prismiq backend with validation.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useAnalytics } from '../context/AnalyticsProvider';\nimport type { QueryResult, SQLValidationResult } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for the useCustomSQL hook.\n */\nexport interface UseCustomSQLOptions {\n /**\n * Whether the query should be executed.\n * Set to false to disable automatic execution.\n * @default true\n */\n enabled?: boolean;\n /**\n * Named parameters for the query.\n */\n params?: Record<string, unknown>;\n /**\n * Whether to validate before executing.\n * When true, validates first and only executes if valid.\n * @default true\n */\n validateFirst?: boolean;\n}\n\n/**\n * Result of the useCustomSQL hook.\n */\nexport interface UseCustomSQLResult {\n /** The query result data, or null if not yet loaded. */\n data: QueryResult | null;\n /** Whether the query is currently loading. */\n isLoading: boolean;\n /** Error that occurred during query execution, if any. */\n error: Error | null;\n /** Validation result from the last validation check. */\n validation: SQLValidationResult | null;\n /** Whether the SQL is currently being validated. */\n isValidating: boolean;\n /** Function to manually re-execute the query. */\n refetch: () => Promise<void>;\n /** Function to manually validate the SQL without executing. */\n validate: () => Promise<SQLValidationResult>;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for executing raw SQL queries against the Prismiq backend.\n *\n * Only SELECT statements are allowed. Queries are restricted\n * to tables visible in the schema.\n *\n * @param sql - The SQL query to execute, or null to skip.\n * @param options - Configuration options.\n *\n * @example\n * ```tsx\n * function SQLResults() {\n * const sql = \"SELECT name, email FROM users WHERE status = 'active'\";\n * const { data, isLoading, error, validation } = useCustomSQL(sql);\n *\n * if (isLoading) return <Loading />;\n * if (error) return <Error message={error.message} />;\n * if (validation && !validation.valid) {\n * return <ValidationErrors errors={validation.errors} />;\n * }\n *\n * return (\n * <table>\n * <thead>\n * <tr>\n * {data?.columns.map(col => <th key={col}>{col}</th>)}\n * </tr>\n * </thead>\n * <tbody>\n * {data?.rows.map((row, i) => (\n * <tr key={i}>\n * {row.map((cell, j) => <td key={j}>{String(cell)}</td>)}\n * </tr>\n * ))}\n * </tbody>\n * </table>\n * );\n * }\n * ```\n */\nexport function useCustomSQL(\n sql: string | null,\n options: UseCustomSQLOptions = {}\n): UseCustomSQLResult {\n const { enabled = true, params, validateFirst = true } = options;\n\n const { client } = useAnalytics();\n\n // State\n const [data, setData] = useState<QueryResult | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [validation, setValidation] = useState<SQLValidationResult | null>(null);\n const [isValidating, setIsValidating] = useState(false);\n\n // Track the current SQL for memoization\n const previousSqlRef = useRef<string | null>(null);\n const previousParamsRef = useRef<Record<string, unknown> | undefined>(undefined);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Validate SQL function\n const validateSQL = useCallback(async (): Promise<SQLValidationResult> => {\n if (!sql) {\n const result: SQLValidationResult = {\n valid: false,\n errors: ['No SQL provided'],\n tables: [],\n };\n setValidation(result);\n return result;\n }\n\n setIsValidating(true);\n\n try {\n const result = await client.validateSQL(sql);\n setValidation(result);\n return result;\n } catch (err) {\n const errorResult: SQLValidationResult = {\n valid: false,\n errors: [err instanceof Error ? err.message : String(err)],\n tables: [],\n };\n setValidation(errorResult);\n return errorResult;\n } finally {\n setIsValidating(false);\n }\n }, [client, sql]);\n\n // Execute query function\n const executeQuery = useCallback(async () => {\n // Don't execute if SQL is null or disabled\n if (sql === null || !enabled) {\n return;\n }\n\n // Validate first if requested\n if (validateFirst) {\n const validationResult = await validateSQL();\n if (!validationResult.valid) {\n setError(new Error(validationResult.errors.join('; ')));\n setData(null);\n return;\n }\n }\n\n // Cancel any in-flight request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Create new abort controller for this request\n abortControllerRef.current = new AbortController();\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await client.executeSQL(sql, params);\n\n // Check if request was aborted\n if (abortControllerRef.current?.signal.aborted) {\n return;\n }\n\n setData(result);\n } catch (err) {\n // Ignore abort errors\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setData(null);\n } finally {\n setIsLoading(false);\n }\n }, [client, sql, params, enabled, validateFirst, validateSQL]);\n\n // Refetch function (exposed to consumers)\n const refetch = useCallback(async () => {\n await executeQuery();\n }, [executeQuery]);\n\n // Check if params changed\n const paramsChanged = useCallback(() => {\n if (params === previousParamsRef.current) return false;\n if (params === undefined || previousParamsRef.current === undefined) {\n return params !== previousParamsRef.current;\n }\n return JSON.stringify(params) !== JSON.stringify(previousParamsRef.current);\n }, [params]);\n\n // Execute query when dependencies change\n useEffect(() => {\n // Check if SQL or params have actually changed\n const sqlChanged = sql !== previousSqlRef.current;\n const paramsHaveChanged = paramsChanged();\n\n if (!sqlChanged && !paramsHaveChanged) {\n return;\n }\n\n previousSqlRef.current = sql;\n previousParamsRef.current = params;\n\n // Clear data when SQL is null\n if (sql === null) {\n setData(null);\n setError(null);\n setValidation(null);\n setIsLoading(false);\n return;\n }\n\n // Don't execute if disabled\n if (!enabled) {\n return;\n }\n\n void executeQuery();\n }, [sql, params, enabled, executeQuery, paramsChanged]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n return {\n data,\n isLoading,\n error,\n validation,\n isValidating,\n refetch,\n validate: validateSQL,\n };\n}\n","/**\n * usePinnedDashboards hook.\n *\n * Fetches dashboards pinned to a specific context.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { useAnalytics } from '../context/AnalyticsProvider';\nimport type { Dashboard, PinnedDashboard } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for the usePinnedDashboards hook.\n */\nexport interface UsePinnedDashboardsOptions {\n /**\n * Context to get pinned dashboards for (e.g., \"accounts\", \"dashboard\").\n */\n context: string;\n /**\n * Whether to automatically fetch on mount.\n * @default true\n */\n enabled?: boolean;\n}\n\n/**\n * Result of the usePinnedDashboards hook.\n */\nexport interface UsePinnedDashboardsResult {\n /** The list of pinned dashboards, or null if not yet loaded. */\n dashboards: Dashboard[] | null;\n /** Pin metadata for each dashboard. */\n pins: PinnedDashboard[] | null;\n /** Whether the data is currently loading. */\n isLoading: boolean;\n /** Error that occurred during fetch, if any. */\n error: Error | null;\n /** Function to manually refresh the pinned dashboards. */\n refetch: () => Promise<void>;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for fetching dashboards pinned to a context.\n *\n * @param options - Configuration options including the context.\n *\n * @example\n * ```tsx\n * function AccountsPinnedDashboards() {\n * const { dashboards, isLoading, error } = usePinnedDashboards({\n * context: 'accounts',\n * });\n *\n * if (isLoading) return <Loading />;\n * if (error) return <Error message={error.message} />;\n *\n * return (\n * <ul>\n * {dashboards?.map(d => (\n * <li key={d.id}>{d.name}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function usePinnedDashboards(\n options: UsePinnedDashboardsOptions\n): UsePinnedDashboardsResult {\n const { context, enabled = true } = options;\n\n const { client } = useAnalytics();\n\n const [dashboards, setDashboards] = useState<Dashboard[] | null>(null);\n const [pins, setPins] = useState<PinnedDashboard[] | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchPinnedDashboards = useCallback(async () => {\n if (!enabled || !context) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await client.getPinnedDashboards(context);\n setDashboards(result.dashboards);\n setPins(result.pins);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setDashboards(null);\n setPins(null);\n } finally {\n setIsLoading(false);\n }\n }, [client, context, enabled]);\n\n const refetch = useCallback(async () => {\n await fetchPinnedDashboards();\n }, [fetchPinnedDashboards]);\n\n useEffect(() => {\n if (enabled && context) {\n void fetchPinnedDashboards();\n }\n }, [enabled, context, fetchPinnedDashboards]);\n\n return {\n dashboards,\n pins,\n isLoading,\n error,\n refetch,\n };\n}\n","/**\n * usePinMutations hook.\n *\n * Provides functions for pin/unpin/reorder operations.\n */\n\nimport { useCallback, useState } from 'react';\n\nimport { useAnalytics } from '../context/AnalyticsProvider';\nimport type { PinnedDashboard } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Mutation state for pin operations.\n */\nexport interface PinMutationState {\n /** Whether a mutation is in progress. */\n isLoading: boolean;\n /** Error that occurred during the last mutation, if any. */\n error: Error | null;\n}\n\n/**\n * Result of the usePinMutations hook.\n */\nexport interface UsePinMutationsResult {\n /** Current mutation state. */\n state: PinMutationState;\n /**\n * Pin a dashboard to a context.\n * @param dashboardId - Dashboard ID to pin.\n * @param context - Context to pin to (e.g., \"accounts\").\n * @param position - Optional position in the list.\n * @returns The created pin entry.\n */\n pin: (\n dashboardId: string,\n context: string,\n position?: number\n ) => Promise<PinnedDashboard>;\n /**\n * Unpin a dashboard from a context.\n * @param dashboardId - Dashboard ID to unpin.\n * @param context - Context to unpin from.\n */\n unpin: (dashboardId: string, context: string) => Promise<void>;\n /**\n * Reorder pinned dashboards in a context.\n * @param context - Context to reorder pins in.\n * @param dashboardIds - Ordered list of dashboard IDs.\n */\n reorder: (context: string, dashboardIds: string[]) => Promise<void>;\n /** Clear the error state. */\n clearError: () => void;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for pin/unpin/reorder operations.\n *\n * @example\n * ```tsx\n * function PinButton({ dashboardId }: { dashboardId: string }) {\n * const { pin, unpin, state } = usePinMutations();\n * const [isPinned, setIsPinned] = useState(false);\n *\n * const handleClick = async () => {\n * if (isPinned) {\n * await unpin(dashboardId, 'accounts');\n * setIsPinned(false);\n * } else {\n * await pin(dashboardId, 'accounts');\n * setIsPinned(true);\n * }\n * };\n *\n * return (\n * <button onClick={handleClick} disabled={state.isLoading}>\n * {isPinned ? 'Unpin' : 'Pin'}\n * </button>\n * );\n * }\n * ```\n */\nexport function usePinMutations(): UsePinMutationsResult {\n const { client } = useAnalytics();\n\n const [state, setState] = useState<PinMutationState>({\n isLoading: false,\n error: null,\n });\n\n const pin = useCallback(\n async (\n dashboardId: string,\n context: string,\n position?: number\n ): Promise<PinnedDashboard> => {\n setState({ isLoading: true, error: null });\n\n try {\n const result = await client.pinDashboard(dashboardId, context, position);\n setState({ isLoading: false, error: null });\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setState({ isLoading: false, error });\n throw error;\n }\n },\n [client]\n );\n\n const unpin = useCallback(\n async (dashboardId: string, context: string): Promise<void> => {\n setState({ isLoading: true, error: null });\n\n try {\n await client.unpinDashboard(dashboardId, context);\n setState({ isLoading: false, error: null });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setState({ isLoading: false, error });\n throw error;\n }\n },\n [client]\n );\n\n const reorder = useCallback(\n async (context: string, dashboardIds: string[]): Promise<void> => {\n setState({ isLoading: true, error: null });\n\n try {\n await client.reorderPins(context, dashboardIds);\n setState({ isLoading: false, error: null });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setState({ isLoading: false, error });\n throw error;\n }\n },\n [client]\n );\n\n const clearError = useCallback(() => {\n setState((prev) => ({ ...prev, error: null }));\n }, []);\n\n return {\n state,\n pin,\n unpin,\n reorder,\n clearError,\n };\n}\n","/**\n * useDashboardPinStatus hook.\n *\n * Fetches the pin status of a dashboard across contexts.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { useAnalytics } from '../context/AnalyticsProvider';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for the useDashboardPinStatus hook.\n */\nexport interface UseDashboardPinStatusOptions {\n /**\n * Dashboard ID to check pin status for.\n */\n dashboardId: string;\n /**\n * Optional list of contexts to filter results by.\n * When provided, pinnedContexts will only include contexts from this list.\n * This is useful when you only care about specific contexts.\n */\n contexts?: string[];\n /**\n * Whether to automatically fetch on mount.\n * @default true\n */\n enabled?: boolean;\n}\n\n/**\n * Result of the useDashboardPinStatus hook.\n */\nexport interface UseDashboardPinStatusResult {\n /** List of contexts where the dashboard is pinned, or null if not yet loaded. */\n pinnedContexts: string[] | null;\n /**\n * Check if the dashboard is pinned to a specific context.\n * @param context - Context to check.\n * @returns true if pinned to the context, false otherwise.\n */\n isPinned: (context: string) => boolean;\n /** Whether the data is currently loading. */\n isLoading: boolean;\n /** Error that occurred during fetch, if any. */\n error: Error | null;\n /** Function to manually refresh the pin status. */\n refetch: () => Promise<void>;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for checking the pin status of a dashboard.\n *\n * @param options - Configuration options including the dashboard ID.\n *\n * @example\n * ```tsx\n * function DashboardPinMenu({ dashboardId }: { dashboardId: string }) {\n * const { pinnedContexts, isPinned, isLoading } = useDashboardPinStatus({\n * dashboardId,\n * });\n *\n * if (isLoading) return <Loading />;\n *\n * return (\n * <ul>\n * <li>\n * <Checkbox checked={isPinned('accounts')} />\n * Accounts\n * </li>\n * <li>\n * <Checkbox checked={isPinned('dashboard')} />\n * Dashboard\n * </li>\n * </ul>\n * );\n * }\n * ```\n */\nexport function useDashboardPinStatus(\n options: UseDashboardPinStatusOptions\n): UseDashboardPinStatusResult {\n const { dashboardId, contexts: filterContexts, enabled = true } = options;\n\n const { client } = useAnalytics();\n\n const [pinnedContexts, setPinnedContexts] = useState<string[] | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchPinStatus = useCallback(\n async (signal?: AbortSignal) => {\n if (!enabled || !dashboardId) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const allContexts = await client.getDashboardPinContexts(dashboardId);\n // Check if request was cancelled before updating state\n if (signal?.aborted) return;\n // Filter to only requested contexts if specified\n const filteredContexts = filterContexts\n ? allContexts.filter((ctx) => filterContexts.includes(ctx))\n : allContexts;\n setPinnedContexts(filteredContexts);\n } catch (err) {\n // Don't update state if request was cancelled\n if (signal?.aborted) return;\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setPinnedContexts(null);\n } finally {\n // Don't update loading state if request was cancelled\n if (!signal?.aborted) {\n setIsLoading(false);\n }\n }\n },\n [client, dashboardId, filterContexts, enabled]\n );\n\n const refetch = useCallback(async () => {\n await fetchPinStatus();\n }, [fetchPinStatus]);\n\n const isPinned = useMemo(() => {\n const contextSet = new Set(pinnedContexts ?? []);\n return (context: string): boolean => contextSet.has(context);\n }, [pinnedContexts]);\n\n useEffect(() => {\n if (enabled && dashboardId) {\n const controller = new AbortController();\n void fetchPinStatus(controller.signal);\n return () => controller.abort();\n }\n }, [enabled, dashboardId, fetchPinStatus]);\n\n return {\n pinnedContexts,\n isPinned,\n isLoading,\n error,\n refetch,\n };\n}\n","/**\n * CrossFilterContext - Cross-filtering state management.\n *\n * Enables interactive filtering: click on a chart element to filter other widgets.\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A cross-filter applied from one widget to others.\n */\nexport interface CrossFilter {\n /** Widget ID that triggered the filter. */\n sourceWidgetId: string;\n /** Column being filtered. */\n column: string;\n /** Filter value (can be string, number, or array for multi-select). */\n value: string | number | (string | number)[];\n /** Table the column belongs to (optional). */\n table?: string;\n /** Table ID in the query context. */\n tableId?: string;\n}\n\n/**\n * Cross-filter context value.\n */\nexport interface CrossFilterContextValue {\n /** Active cross-filters. */\n filters: CrossFilter[];\n /** Add or update a cross-filter from a widget. */\n addFilter: (filter: CrossFilter) => void;\n /** Remove a cross-filter by source widget ID. */\n removeFilter: (sourceWidgetId: string) => void;\n /** Toggle a filter (add if not exists, remove if same value). */\n toggleFilter: (filter: CrossFilter) => void;\n /** Clear all cross-filters. */\n clearFilters: () => void;\n /** Check if a widget has an active filter. */\n hasFilter: (widgetId: string) => boolean;\n /** Get the filter value for a widget. */\n getFilterValue: (widgetId: string) => CrossFilter | undefined;\n /** Check if any filters are active. */\n hasActiveFilters: boolean;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst CrossFilterContext = createContext<CrossFilterContextValue | null>(null);\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport interface CrossFilterProviderProps {\n children: ReactNode;\n}\n\n/**\n * Provider for cross-filter state.\n *\n * Wrap your dashboard or application with this provider to enable\n * cross-filtering between widgets.\n *\n * @example\n * ```tsx\n * function App() {\n * return (\n * <CrossFilterProvider>\n * <Dashboard id=\"my-dashboard\" />\n * </CrossFilterProvider>\n * );\n * }\n * ```\n */\nexport function CrossFilterProvider({\n children,\n}: CrossFilterProviderProps): JSX.Element {\n const [filters, setFilters] = useState<CrossFilter[]>([]);\n\n const addFilter = useCallback((filter: CrossFilter) => {\n setFilters((prev) => {\n // Replace existing filter from same source widget\n const filtered = prev.filter(\n (f) => f.sourceWidgetId !== filter.sourceWidgetId\n );\n return [...filtered, filter];\n });\n }, []);\n\n const removeFilter = useCallback((sourceWidgetId: string) => {\n setFilters((prev) =>\n prev.filter((f) => f.sourceWidgetId !== sourceWidgetId)\n );\n }, []);\n\n const toggleFilter = useCallback((filter: CrossFilter) => {\n setFilters((prev) => {\n const existing = prev.find(\n (f) => f.sourceWidgetId === filter.sourceWidgetId\n );\n\n // If same value exists, remove it (toggle off)\n if (existing && existing.value === filter.value) {\n return prev.filter((f) => f.sourceWidgetId !== filter.sourceWidgetId);\n }\n\n // Otherwise add/replace it\n const filtered = prev.filter(\n (f) => f.sourceWidgetId !== filter.sourceWidgetId\n );\n return [...filtered, filter];\n });\n }, []);\n\n const clearFilters = useCallback(() => {\n setFilters([]);\n }, []);\n\n const hasFilter = useCallback(\n (widgetId: string) => filters.some((f) => f.sourceWidgetId === widgetId),\n [filters]\n );\n\n const getFilterValue = useCallback(\n (widgetId: string) => filters.find((f) => f.sourceWidgetId === widgetId),\n [filters]\n );\n\n const hasActiveFilters = filters.length > 0;\n\n const value = useMemo(\n (): CrossFilterContextValue => ({\n filters,\n addFilter,\n removeFilter,\n toggleFilter,\n clearFilters,\n hasFilter,\n getFilterValue,\n hasActiveFilters,\n }),\n [\n filters,\n addFilter,\n removeFilter,\n toggleFilter,\n clearFilters,\n hasFilter,\n getFilterValue,\n hasActiveFilters,\n ]\n );\n\n return (\n <CrossFilterContext.Provider value={value}>\n {children}\n </CrossFilterContext.Provider>\n );\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to access cross-filter context.\n *\n * @example\n * ```tsx\n * function MyChart({ widgetId }: { widgetId: string }) {\n * const { toggleFilter, hasFilter } = useCrossFilter();\n *\n * const handleClick = (value: string) => {\n * toggleFilter({\n * sourceWidgetId: widgetId,\n * column: 'region',\n * value,\n * });\n * };\n *\n * const isFiltering = hasFilter(widgetId);\n *\n * return <BarChart onClick={handleClick} highlighted={isFiltering} />;\n * }\n * ```\n */\nexport function useCrossFilter(): CrossFilterContextValue {\n const context = useContext(CrossFilterContext);\n if (!context) {\n throw new Error('useCrossFilter must be used within CrossFilterProvider');\n }\n return context;\n}\n\n/**\n * Hook to optionally access cross-filter context.\n *\n * Returns null if not wrapped in CrossFilterProvider.\n * Use this when cross-filtering is optional.\n */\nexport function useCrossFilterOptional(): CrossFilterContextValue | null {\n return useContext(CrossFilterContext);\n}\n\n/**\n * Hook to get filters that apply to a specific widget.\n *\n * Returns all filters except those originating from this widget.\n *\n * @param widgetId - The widget ID to get filters for.\n */\nexport function useApplicableFilters(widgetId: string): CrossFilter[] {\n const { filters } = useCrossFilter();\n return useMemo(\n () => filters.filter((f) => f.sourceWidgetId !== widgetId),\n [filters, widgetId]\n );\n}\n","/**\n * ColumnNode component for displaying a column in the schema explorer.\n */\n\nimport { useCallback, useState, useRef, type MouseEvent, type DragEvent } from 'react';\n\nimport { useAnalytics } from '../../context';\nimport type { ColumnSchema, TableSchema } from '../../types';\nimport { Icon, Tooltip } from '../ui';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ColumnNodeProps {\n /** The column schema. */\n column: ColumnSchema;\n /** The parent table schema. */\n table: TableSchema;\n /** Whether this column is selected. */\n isSelected?: boolean;\n /** Callback when column is clicked. */\n onClick?: (table: TableSchema, column: ColumnSchema) => void;\n /** Callback when column drag starts. */\n onDragStart?: (table: TableSchema, column: ColumnSchema) => void;\n /** Additional class name. */\n className?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst nodeStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n padding: 'var(--prismiq-spacing-xs) var(--prismiq-spacing-sm)',\n paddingLeft: 'var(--prismiq-spacing-xl)',\n cursor: 'pointer',\n transition: 'background-color 0.1s',\n userSelect: 'none',\n position: 'relative',\n};\n\nconst selectedStyles: React.CSSProperties = {\n backgroundColor: 'var(--prismiq-color-surface)',\n};\n\nconst iconStyles: React.CSSProperties = {\n color: 'var(--prismiq-color-text-muted)',\n flexShrink: 0,\n};\n\nconst nameStyles: React.CSSProperties = {\n flex: 1,\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst typeStyles: React.CSSProperties = {\n fontSize: '10px',\n fontFamily: 'var(--prismiq-font-mono)',\n padding: '1px 4px',\n borderRadius: '3px',\n lineHeight: 1.2,\n};\n\n// Type category colors\nconst TYPE_COLORS: Record<string, { bg: string; text: string }> = {\n numeric: { bg: 'rgba(59, 130, 246, 0.15)', text: 'rgb(59, 130, 246)' }, // Blue\n string: { bg: 'rgba(34, 197, 94, 0.15)', text: 'rgb(34, 197, 94)' }, // Green\n datetime: { bg: 'rgba(249, 115, 22, 0.15)', text: 'rgb(249, 115, 22)' }, // Orange\n boolean: { bg: 'rgba(168, 85, 247, 0.15)', text: 'rgb(168, 85, 247)' }, // Purple\n json: { bg: 'rgba(236, 72, 153, 0.15)', text: 'rgb(236, 72, 153)' }, // Pink\n other: { bg: 'rgba(107, 114, 128, 0.15)', text: 'rgb(107, 114, 128)' }, // Gray\n};\n\n// Sample preview popover styles\nconst previewPopoverStyles: React.CSSProperties = {\n position: 'absolute',\n left: '100%',\n top: '50%',\n transform: 'translateY(-50%)',\n marginLeft: '8px',\n padding: '8px 12px',\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n zIndex: 1000,\n minWidth: '120px',\n maxWidth: '250px',\n};\n\nconst previewHeaderStyles: React.CSSProperties = {\n fontSize: '10px',\n fontWeight: 600,\n color: 'var(--prismiq-color-text-muted)',\n marginBottom: '6px',\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n};\n\nconst previewValueStyles: React.CSSProperties = {\n fontSize: '12px',\n fontFamily: 'var(--prismiq-font-mono)',\n color: 'var(--prismiq-color-text)',\n padding: '2px 0',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst previewLoadingStyles: React.CSSProperties = {\n fontSize: '11px',\n color: 'var(--prismiq-color-text-muted)',\n fontStyle: 'italic',\n};\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Get the icon name for a column based on its properties.\n */\nfunction getColumnIcon(column: ColumnSchema): 'key' | 'link' | 'column' {\n if (column.is_primary_key) return 'key';\n // Note: foreign key detection would come from relationships, not column itself\n return 'column';\n}\n\n/**\n * Format the data type for display.\n */\nfunction formatDataType(dataType: string): string {\n // Shorten common PostgreSQL types\n const typeMap: Record<string, string> = {\n 'character varying': 'varchar',\n 'timestamp without time zone': 'timestamp',\n 'timestamp with time zone': 'timestamptz',\n 'double precision': 'double',\n 'boolean': 'bool',\n 'integer': 'int',\n 'bigint': 'int8',\n 'smallint': 'int2',\n };\n return typeMap[dataType] ?? dataType;\n}\n\n/**\n * Get the type category for color coding.\n */\nfunction getTypeCategory(dataType: string): keyof typeof TYPE_COLORS {\n const lowerType = dataType.toLowerCase();\n\n // Numeric types\n if (\n lowerType.includes('int') ||\n lowerType.includes('numeric') ||\n lowerType.includes('decimal') ||\n lowerType.includes('real') ||\n lowerType.includes('double') ||\n lowerType.includes('serial') ||\n lowerType.includes('money')\n ) {\n return 'numeric';\n }\n\n // Date/time types\n if (\n lowerType.includes('timestamp') ||\n lowerType.includes('date') ||\n lowerType.includes('time') ||\n lowerType.includes('interval')\n ) {\n return 'datetime';\n }\n\n // Boolean\n if (lowerType.includes('bool')) {\n return 'boolean';\n }\n\n // JSON types\n if (lowerType.includes('json')) {\n return 'json';\n }\n\n // String types\n if (\n lowerType.includes('char') ||\n lowerType.includes('text') ||\n lowerType.includes('varchar') ||\n lowerType.includes('uuid') ||\n lowerType.includes('citext')\n ) {\n return 'string';\n }\n\n return 'other';\n}\n\n/**\n * Format a sample value for display.\n */\nfunction formatSampleValue(value: unknown): string {\n if (value === null || value === undefined) return 'null';\n if (typeof value === 'string') {\n // Truncate long strings\n return value.length > 30 ? `\"${value.slice(0, 27)}...\"` : `\"${value}\"`;\n }\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return String(value);\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * A single column node in the schema explorer tree.\n */\nexport function ColumnNode({\n column,\n table,\n isSelected = false,\n onClick,\n onDragStart,\n className,\n}: ColumnNodeProps): JSX.Element {\n const { client } = useAnalytics();\n const [showPreview, setShowPreview] = useState(false);\n const [sampleValues, setSampleValues] = useState<unknown[] | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const fetchedRef = useRef(false);\n\n const handleClick = useCallback(\n (e: MouseEvent) => {\n e.stopPropagation();\n onClick?.(table, column);\n },\n [onClick, table, column]\n );\n\n const handleDragStart = useCallback(\n (e: DragEvent) => {\n e.dataTransfer.setData(\n 'application/prismiq-column',\n JSON.stringify({ table: table.name, column: column.name })\n );\n e.dataTransfer.effectAllowed = 'copy';\n onDragStart?.(table, column);\n },\n [onDragStart, table, column]\n );\n\n const handleMouseEnter = useCallback(() => {\n // Start a delay before showing the preview\n hoverTimeoutRef.current = setTimeout(async () => {\n setShowPreview(true);\n\n // Fetch sample data if not already fetched\n if (!fetchedRef.current && !isLoading) {\n setIsLoading(true);\n try {\n const values = await client.getColumnSample(table.name, column.name, 5);\n setSampleValues(values);\n fetchedRef.current = true;\n } catch {\n // Silently fail - just don't show sample data\n setSampleValues([]);\n } finally {\n setIsLoading(false);\n }\n }\n }, 400); // 400ms delay before showing preview\n }, [client, table.name, column.name, isLoading]);\n\n const handleMouseLeave = useCallback(() => {\n // Cancel any pending timeout\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n hoverTimeoutRef.current = null;\n }\n setShowPreview(false);\n }, []);\n\n const iconName = getColumnIcon(column);\n const formattedType = formatDataType(column.data_type);\n const typeCategory = getTypeCategory(column.data_type);\n const defaultColor = { bg: 'rgba(107, 114, 128, 0.15)', text: 'rgb(107, 114, 128)' };\n const typeColor = TYPE_COLORS[typeCategory] ?? defaultColor;\n\n return (\n <div\n role=\"treeitem\"\n aria-selected={isSelected}\n tabIndex={0}\n className={className}\n draggable\n onClick={handleClick}\n onDragStart={handleDragStart}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.(table, column);\n }\n }}\n style={{\n ...nodeStyles,\n ...(isSelected ? selectedStyles : {}),\n }}\n >\n <Tooltip\n content={\n column.is_primary_key\n ? 'Primary Key'\n : column.is_nullable\n ? 'Nullable column'\n : 'Required column'\n }\n position=\"right\"\n delay={500}\n >\n <span style={iconStyles}>\n <Icon name={iconName} size={14} />\n </span>\n </Tooltip>\n <span style={nameStyles}>{column.name}</span>\n <span\n style={{\n ...typeStyles,\n backgroundColor: typeColor.bg,\n color: typeColor.text,\n }}\n >\n {formattedType}\n </span>\n\n {/* Sample data preview popover */}\n {showPreview && (\n <div style={previewPopoverStyles}>\n <div style={previewHeaderStyles}>Sample Values</div>\n {isLoading ? (\n <div style={previewLoadingStyles}>Loading...</div>\n ) : sampleValues && sampleValues.length > 0 ? (\n sampleValues.map((value, i) => (\n <div key={i} style={previewValueStyles} title={String(value)}>\n {formatSampleValue(value)}\n </div>\n ))\n ) : (\n <div style={previewLoadingStyles}>No data</div>\n )}\n </div>\n )}\n </div>\n );\n}\n","/**\n * TableNode component for displaying a table in the schema explorer.\n */\n\nimport { useCallback, useState, type MouseEvent, type KeyboardEvent } from 'react';\n\nimport type { ColumnSchema, TableSchema } from '../../types';\nimport { Icon } from '../ui';\nimport { ColumnNode } from './ColumnNode';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TableNodeProps {\n /** The table schema. */\n table: TableSchema;\n /** Whether the table is currently selected. */\n isSelected?: boolean;\n /** Array of selected column identifiers. */\n selectedColumns?: Array<{ table: string; column: string }>;\n /** Callback when table is clicked. */\n onTableClick?: (table: TableSchema) => void;\n /** Callback when a column is clicked. */\n onColumnClick?: (table: TableSchema, column: ColumnSchema) => void;\n /** Callback when column drag starts. */\n onColumnDragStart?: (table: TableSchema, column: ColumnSchema) => void;\n /** Whether the tree is collapsible. */\n collapsible?: boolean;\n /** Initial expanded state. */\n defaultExpanded?: boolean;\n /** Search filter to highlight matching items. */\n searchFilter?: string;\n /** Additional class name. */\n className?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst nodeStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n padding: 'var(--prismiq-spacing-sm)',\n cursor: 'pointer',\n transition: 'background-color 0.1s',\n userSelect: 'none',\n};\n\nconst selectedStyles: React.CSSProperties = {\n backgroundColor: 'var(--prismiq-color-surface)',\n};\n\nconst chevronStyles: React.CSSProperties = {\n color: 'var(--prismiq-color-text-muted)',\n transition: 'transform 0.15s',\n flexShrink: 0,\n};\n\nconst iconStyles: React.CSSProperties = {\n color: 'var(--prismiq-color-primary)',\n flexShrink: 0,\n};\n\nconst nameStyles: React.CSSProperties = {\n flex: 1,\n fontSize: 'var(--prismiq-font-size-base)',\n fontWeight: 500,\n color: 'var(--prismiq-color-text)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst countStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-xs)',\n color: 'var(--prismiq-color-text-muted)',\n};\n\nconst columnsContainerStyles: React.CSSProperties = {\n overflow: 'hidden',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * A table node in the schema explorer tree with expandable columns.\n */\nexport function TableNode({\n table,\n isSelected = false,\n selectedColumns = [],\n onTableClick,\n onColumnClick,\n onColumnDragStart,\n collapsible = true,\n defaultExpanded = false,\n searchFilter = '',\n className,\n}: TableNodeProps): JSX.Element {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n\n // Filter columns based on search\n const filteredColumns = searchFilter\n ? table.columns.filter((col) =>\n col.name.toLowerCase().includes(searchFilter.toLowerCase())\n )\n : table.columns;\n\n // Check if table name matches search\n const tableMatchesSearch =\n !searchFilter || table.name.toLowerCase().includes(searchFilter.toLowerCase());\n\n // If searching and table doesn't match but has matching columns, expand\n const shouldExpand = searchFilter\n ? filteredColumns.length > 0 || tableMatchesSearch\n : isExpanded;\n\n const handleClick = useCallback(\n (e: MouseEvent) => {\n e.stopPropagation();\n if (collapsible) {\n setIsExpanded((prev) => !prev);\n }\n onTableClick?.(table);\n },\n [collapsible, onTableClick, table]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (collapsible) {\n setIsExpanded((prev) => !prev);\n }\n onTableClick?.(table);\n } else if (e.key === 'ArrowRight' && !isExpanded) {\n e.preventDefault();\n setIsExpanded(true);\n } else if (e.key === 'ArrowLeft' && isExpanded) {\n e.preventDefault();\n setIsExpanded(false);\n }\n },\n [collapsible, onTableClick, table, isExpanded]\n );\n\n const isColumnSelected = (columnName: string): boolean =>\n selectedColumns.some(\n (sel) => sel.table === table.name && sel.column === columnName\n );\n\n // Don't render if searching and no matches\n if (searchFilter && !tableMatchesSearch && filteredColumns.length === 0) {\n return <></>;\n }\n\n return (\n <div role=\"treeitem\" aria-expanded={shouldExpand} className={className}>\n <div\n tabIndex={0}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n style={{\n ...nodeStyles,\n ...(isSelected ? selectedStyles : {}),\n }}\n >\n {collapsible && (\n <span\n style={{\n ...chevronStyles,\n transform: shouldExpand ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n >\n <Icon name=\"chevron-right\" size={14} />\n </span>\n )}\n <span style={iconStyles}>\n <Icon name=\"table\" size={16} />\n </span>\n <span style={nameStyles}>{table.name}</span>\n <span style={countStyles}>\n {table.row_count != null\n ? `${table.row_count.toLocaleString()} rows`\n : `${table.columns.length} cols`}\n </span>\n </div>\n\n {shouldExpand && (\n <div role=\"group\" style={columnsContainerStyles}>\n {filteredColumns.map((column) => (\n <ColumnNode\n key={column.name}\n column={column}\n table={table}\n isSelected={isColumnSelected(column.name)}\n onClick={onColumnClick}\n onDragStart={onColumnDragStart}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * SchemaExplorer component for browsing database tables and columns.\n */\n\nimport { useCallback, useState } from 'react';\n\nimport { useSchema } from '../../hooks';\nimport type { ColumnSchema, TableSchema } from '../../types';\nimport { Icon, Input } from '../ui';\nimport { TableNode } from './TableNode';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SchemaExplorerProps {\n /** Callback when a table is selected. */\n onTableSelect?: (table: TableSchema) => void;\n /** Callback when a column is selected. */\n onColumnSelect?: (table: TableSchema, column: ColumnSchema) => void;\n /** Callback when column drag starts. */\n onColumnDragStart?: (table: TableSchema, column: ColumnSchema) => void;\n /** Currently selected table name. */\n selectedTable?: string;\n /** Array of selected column identifiers. */\n selectedColumns?: Array<{ table: string; column: string }>;\n /** Whether to show search input. */\n searchable?: boolean;\n /** Whether tables are collapsible. */\n collapsible?: boolean;\n /** Additional class name. */\n className?: string;\n /** Additional styles. */\n style?: React.CSSProperties;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: 'var(--prismiq-color-background)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n overflow: 'hidden',\n};\n\nconst headerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n padding: 'var(--prismiq-spacing-sm)',\n borderBottom: '1px solid var(--prismiq-color-border)',\n backgroundColor: 'var(--prismiq-color-surface)',\n};\n\nconst titleStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-sm)',\n fontWeight: 600,\n color: 'var(--prismiq-color-text)',\n};\n\nconst searchContainerStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-sm)',\n borderBottom: '1px solid var(--prismiq-color-border)',\n};\n\nconst treeContainerStyles: React.CSSProperties = {\n flex: 1,\n overflow: 'auto',\n};\n\nconst errorStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-md)',\n color: 'var(--prismiq-color-error)',\n fontSize: 'var(--prismiq-font-size-sm)',\n textAlign: 'center',\n};\n\nconst emptyStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-md)',\n color: 'var(--prismiq-color-text-muted)',\n fontSize: 'var(--prismiq-font-size-sm)',\n textAlign: 'center',\n};\n\n// ============================================================================\n// Skeleton Component\n// ============================================================================\n\nfunction LoadingSkeleton(): JSX.Element {\n return (\n <div style={{ padding: 'var(--prismiq-spacing-sm)' }}>\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n padding: 'var(--prismiq-spacing-sm)',\n marginBottom: 'var(--prismiq-spacing-xs)',\n }}\n >\n <div\n style={{\n width: 16,\n height: 16,\n backgroundColor: 'var(--prismiq-color-surface)',\n borderRadius: 'var(--prismiq-radius-sm)',\n animation: 'prismiq-pulse 1.5s ease-in-out infinite',\n }}\n />\n <div\n style={{\n flex: 1,\n height: 14,\n backgroundColor: 'var(--prismiq-color-surface)',\n borderRadius: 'var(--prismiq-radius-sm)',\n animation: 'prismiq-pulse 1.5s ease-in-out infinite',\n }}\n />\n </div>\n ))}\n </div>\n );\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Schema explorer component for browsing database structure.\n *\n * @example\n * ```tsx\n * <SchemaExplorer\n * onTableSelect={(table) => console.log('Table:', table.name)}\n * onColumnSelect={(table, column) => console.log('Column:', column.name)}\n * searchable\n * collapsible\n * />\n * ```\n */\nexport function SchemaExplorer({\n onTableSelect,\n onColumnSelect,\n onColumnDragStart,\n selectedTable,\n selectedColumns = [],\n searchable = true,\n collapsible = true,\n className,\n style,\n}: SchemaExplorerProps): JSX.Element {\n const { tables, isLoading, error } = useSchema();\n const [searchQuery, setSearchQuery] = useState('');\n\n const handleTableClick = useCallback(\n (table: TableSchema) => {\n onTableSelect?.(table);\n },\n [onTableSelect]\n );\n\n const handleColumnClick = useCallback(\n (table: TableSchema, column: ColumnSchema) => {\n onColumnSelect?.(table, column);\n },\n [onColumnSelect]\n );\n\n const handleColumnDragStart = useCallback(\n (table: TableSchema, column: ColumnSchema) => {\n onColumnDragStart?.(table, column);\n },\n [onColumnDragStart]\n );\n\n // Filter tables based on search query\n const filteredTables = searchQuery\n ? tables.filter(\n (table) =>\n table.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n table.columns.some((col) =>\n col.name.toLowerCase().includes(searchQuery.toLowerCase())\n )\n )\n : tables;\n\n return (\n <div\n className={className}\n style={{ ...containerStyles, ...style }}\n role=\"tree\"\n aria-label=\"Database schema\"\n >\n <div style={headerStyles}>\n <Icon name=\"table\" size={16} style={{ color: 'var(--prismiq-color-primary)' }} />\n <span style={titleStyles}>Schema Explorer</span>\n </div>\n\n {searchable && (\n <div style={searchContainerStyles}>\n <Input\n inputSize=\"sm\"\n placeholder=\"Search tables and columns...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={{ width: '100%' }}\n />\n </div>\n )}\n\n <div style={treeContainerStyles}>\n {isLoading ? (\n <LoadingSkeleton />\n ) : error ? (\n <div style={errorStyles}>\n <Icon\n name=\"error\"\n size={24}\n style={{ marginBottom: 'var(--prismiq-spacing-sm)' }}\n />\n <div>Failed to load schema</div>\n <div style={{ fontSize: 'var(--prismiq-font-size-xs)', marginTop: 4 }}>\n {error.message}\n </div>\n </div>\n ) : filteredTables.length === 0 ? (\n <div style={emptyStyles}>\n {searchQuery ? (\n <>No tables or columns match \"{searchQuery}\"</>\n ) : (\n <>No tables available</>\n )}\n </div>\n ) : (\n filteredTables.map((table) => (\n <TableNode\n key={table.name}\n table={table}\n isSelected={selectedTable === table.name}\n selectedColumns={selectedColumns}\n onTableClick={handleTableClick}\n onColumnClick={handleColumnClick}\n onColumnDragStart={handleColumnDragStart}\n collapsible={collapsible}\n defaultExpanded={!collapsible}\n searchFilter={searchQuery}\n />\n ))\n )}\n </div>\n </div>\n );\n}\n","/**\n * SelectedColumn component for displaying a selected column in the query.\n */\n\nimport { useCallback, useState, type DragEvent } from 'react';\n\nimport type { AggregationType, ColumnSelection, DateTruncInterval, QueryTable, TableSchema } from '../../types';\nimport { Badge, Icon, Input, Select, type SelectOption } from '../ui';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SelectedColumnProps {\n /** The column selection. */\n column: ColumnSelection;\n /** The table this column belongs to. */\n table: QueryTable;\n /** The table schema for type information. */\n tableSchema: TableSchema | undefined;\n /** Index of this column in the list. */\n index: number;\n /** Callback when the column should be removed. */\n onRemove: () => void;\n /** Callback when the column selection is updated. */\n onUpdate: (column: ColumnSelection) => void;\n /** Callback when drag ends with reorder. */\n onDragEnd: (fromIndex: number, toIndex: number) => void;\n /** Additional class name. */\n className?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n padding: 'var(--prismiq-spacing-sm)',\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n cursor: 'grab',\n transition: 'border-color 0.15s, background-color 0.15s',\n};\n\nconst draggingStyles: React.CSSProperties = {\n opacity: 0.5,\n borderColor: 'var(--prismiq-color-primary)',\n};\n\nconst dragOverStyles: React.CSSProperties = {\n borderColor: 'var(--prismiq-color-primary)',\n backgroundColor: 'var(--prismiq-color-surface-hover)',\n};\n\nconst dragHandleStyles: React.CSSProperties = {\n color: 'var(--prismiq-color-text-muted)',\n cursor: 'grab',\n flexShrink: 0,\n};\n\nconst columnInfoStyles: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n gap: '2px',\n minWidth: 0,\n overflow: 'hidden',\n};\n\nconst columnNameStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-base)',\n fontWeight: 500,\n color: 'var(--prismiq-color-text)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst tableNameStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-xs)',\n color: 'var(--prismiq-color-text-muted)',\n};\n\nconst aggregationStyles: React.CSSProperties = {\n width: '120px',\n flexShrink: 0,\n};\n\nconst aliasStyles: React.CSSProperties = {\n width: '100px',\n flexShrink: 0,\n};\n\nconst dateTruncStyles: React.CSSProperties = {\n width: '100px',\n flexShrink: 0,\n};\n\nconst removeButtonStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-xs)',\n backgroundColor: 'transparent',\n border: 'none',\n borderRadius: 'var(--prismiq-radius-sm)',\n color: 'var(--prismiq-color-text-muted)',\n cursor: 'pointer',\n transition: 'color 0.15s',\n flexShrink: 0,\n};\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst aggregationOptions: SelectOption<AggregationType>[] = [\n { value: 'none', label: 'None' },\n { value: 'sum', label: 'Sum' },\n { value: 'avg', label: 'Average' },\n { value: 'count', label: 'Count' },\n { value: 'count_distinct', label: 'Count Distinct' },\n { value: 'min', label: 'Min' },\n { value: 'max', label: 'Max' },\n];\n\nconst dateTruncOptions: SelectOption<DateTruncInterval | ''>[] = [\n { value: '', label: 'No truncate' },\n { value: 'year', label: 'Year' },\n { value: 'quarter', label: 'Quarter' },\n { value: 'month', label: 'Month' },\n { value: 'week', label: 'Week' },\n { value: 'day', label: 'Day' },\n];\n\n/**\n * Check if a column is a date/timestamp type.\n */\nfunction isDateColumn(dataType: string | undefined): boolean {\n if (!dataType) return false;\n const type = dataType.toLowerCase();\n return type.includes('date') || type.includes('time') || type.includes('timestamp');\n}\n\n/**\n * Get aggregation options based on column data type.\n */\nfunction getAggregationOptions(dataType: string | undefined): SelectOption<AggregationType>[] {\n if (!dataType) return aggregationOptions;\n\n const type = dataType.toLowerCase();\n\n // Numeric types - all aggregations available\n if (\n type.includes('int') ||\n type.includes('numeric') ||\n type.includes('decimal') ||\n type.includes('float') ||\n type.includes('double') ||\n type.includes('real')\n ) {\n return aggregationOptions;\n }\n\n // Date/time types - count, count_distinct, min, max\n if (type.includes('date') || type.includes('time') || type.includes('timestamp')) {\n return aggregationOptions.filter((opt) =>\n ['none', 'count', 'count_distinct', 'min', 'max'].includes(opt.value)\n );\n }\n\n // Boolean - count, count_distinct\n if (type === 'boolean' || type === 'bool') {\n return aggregationOptions.filter((opt) =>\n ['none', 'count', 'count_distinct'].includes(opt.value)\n );\n }\n\n // String/other - count, count_distinct\n return aggregationOptions.filter((opt) =>\n ['none', 'count', 'count_distinct'].includes(opt.value)\n );\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * A selected column in the query with aggregation and alias options.\n */\nexport function SelectedColumn({\n column,\n table,\n tableSchema,\n index,\n onRemove,\n onUpdate,\n onDragEnd,\n className,\n}: SelectedColumnProps): JSX.Element {\n const [isDragging, setIsDragging] = useState(false);\n const [isDragOver, setIsDragOver] = useState(false);\n\n // Get column schema for type information\n const columnSchema = tableSchema?.columns.find((c) => c.name === column.column);\n const availableAggregations = getAggregationOptions(columnSchema?.data_type);\n\n const handleDragStart = useCallback(\n (e: DragEvent) => {\n e.dataTransfer.setData('text/plain', String(index));\n e.dataTransfer.effectAllowed = 'move';\n setIsDragging(true);\n },\n [index]\n );\n\n const handleDragEnd = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n setIsDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback(() => {\n setIsDragOver(false);\n }, []);\n\n const handleDrop = useCallback(\n (e: DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n const fromIndex = parseInt(e.dataTransfer.getData('text/plain'), 10);\n if (!isNaN(fromIndex) && fromIndex !== index) {\n onDragEnd(fromIndex, index);\n }\n },\n [index, onDragEnd]\n );\n\n const handleAggregationChange = useCallback(\n (aggregation: AggregationType) => {\n onUpdate({ ...column, aggregation });\n },\n [column, onUpdate]\n );\n\n const handleAliasChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const alias = e.target.value || undefined;\n onUpdate({ ...column, alias });\n },\n [column, onUpdate]\n );\n\n const handleDateTruncChange = useCallback(\n (value: DateTruncInterval | '') => {\n const date_trunc = value || undefined;\n onUpdate({ ...column, date_trunc });\n },\n [column, onUpdate]\n );\n\n // Check if this column is a date type\n const isDate = isDateColumn(columnSchema?.data_type);\n\n return (\n <div\n className={className}\n draggable\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n style={{\n ...containerStyles,\n ...(isDragging ? draggingStyles : {}),\n ...(isDragOver ? dragOverStyles : {}),\n }}\n >\n <span style={dragHandleStyles}>\n <Icon name=\"drag\" size={16} />\n </span>\n\n <div style={columnInfoStyles}>\n <span style={columnNameStyles}>{column.column}</span>\n <span style={tableNameStyles}>{table.alias ?? table.name}</span>\n </div>\n\n {columnSchema && (\n <Badge size=\"sm\" variant=\"default\">\n {columnSchema.data_type}\n </Badge>\n )}\n\n <div style={aggregationStyles}>\n <Select\n value={column.aggregation}\n onChange={handleAggregationChange}\n options={availableAggregations}\n size=\"sm\"\n />\n </div>\n\n {isDate && (\n <div style={dateTruncStyles}>\n <Select\n value={column.date_trunc ?? ''}\n onChange={handleDateTruncChange}\n options={dateTruncOptions}\n size=\"sm\"\n data-testid=\"date-trunc-select\"\n />\n </div>\n )}\n\n <div style={aliasStyles}>\n <Input\n inputSize=\"sm\"\n placeholder=\"Alias\"\n value={column.alias ?? ''}\n onChange={handleAliasChange}\n />\n </div>\n\n <button\n type=\"button\"\n onClick={onRemove}\n style={removeButtonStyles}\n aria-label={`Remove ${column.column}`}\n >\n <Icon name=\"x\" size={16} />\n </button>\n </div>\n );\n}\n","/**\n * ColumnSelector component for selecting and ordering columns in a query.\n */\n\nimport { useCallback, type DragEvent } from 'react';\n\nimport type { ColumnSelection, DatabaseSchema, QueryTable } from '../../types';\nimport { Icon } from '../ui';\nimport { SelectedColumn } from './SelectedColumn';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ColumnSelectorProps {\n /** Tables in the query. */\n tables: QueryTable[];\n /** Selected columns. */\n columns: ColumnSelection[];\n /** Callback when columns change. */\n onChange: (columns: ColumnSelection[]) => void;\n /** Database schema for type information. */\n schema: DatabaseSchema;\n /** Additional class name. */\n className?: string;\n /** Additional styles. */\n style?: React.CSSProperties;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\nconst headerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 'var(--prismiq-spacing-xs)',\n};\n\nconst titleStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-sm)',\n fontWeight: 600,\n color: 'var(--prismiq-color-text)',\n};\n\nconst countStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-xs)',\n color: 'var(--prismiq-color-text-muted)',\n};\n\nconst dropZoneStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n padding: 'var(--prismiq-spacing-lg)',\n border: '2px dashed var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n backgroundColor: 'var(--prismiq-color-surface)',\n color: 'var(--prismiq-color-text-muted)',\n fontSize: 'var(--prismiq-font-size-sm)',\n textAlign: 'center',\n transition: 'border-color 0.15s, background-color 0.15s',\n};\n\nconst listStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Column selector component for selecting and ordering columns.\n *\n * @example\n * ```tsx\n * <ColumnSelector\n * tables={query.tables}\n * columns={query.columns}\n * onChange={(columns) => setQuery({ ...query, columns })}\n * schema={schema}\n * />\n * ```\n */\nexport function ColumnSelector({\n tables,\n columns,\n onChange,\n schema,\n className,\n style,\n}: ColumnSelectorProps): JSX.Element {\n // Get table schema for a given table ID\n const getTableSchema = useCallback(\n (tableId: string) => {\n const table = tables.find((t) => t.id === tableId);\n if (!table) return undefined;\n return schema.tables.find((t) => t.name === table.name);\n },\n [tables, schema]\n );\n\n // Get table by ID\n const getTable = useCallback(\n (tableId: string) => {\n return tables.find((t) => t.id === tableId);\n },\n [tables]\n );\n\n // Handle removing a column\n const handleRemove = useCallback(\n (index: number) => {\n const newColumns = [...columns];\n newColumns.splice(index, 1);\n onChange(newColumns);\n },\n [columns, onChange]\n );\n\n // Handle updating a column\n const handleUpdate = useCallback(\n (index: number, column: ColumnSelection) => {\n const newColumns = [...columns];\n newColumns[index] = column;\n onChange(newColumns);\n },\n [columns, onChange]\n );\n\n // Handle reordering columns via drag and drop\n const handleDragEnd = useCallback(\n (fromIndex: number, toIndex: number) => {\n const newColumns = [...columns];\n const [removed] = newColumns.splice(fromIndex, 1);\n if (removed) {\n newColumns.splice(toIndex, 0, removed);\n onChange(newColumns);\n }\n },\n [columns, onChange]\n );\n\n // Handle dropping a column from the schema explorer\n const handleDrop = useCallback(\n (e: DragEvent) => {\n e.preventDefault();\n const data = e.dataTransfer.getData('application/prismiq-column');\n if (!data) return;\n\n try {\n const { table: tableName, column: columnName } = JSON.parse(data) as {\n table: string;\n column: string;\n };\n\n // Find the table in the query\n const table = tables.find((t) => t.name === tableName);\n if (!table) {\n console.warn(`Table \"${tableName}\" is not in the query`);\n return;\n }\n\n // Check if column is already selected\n const alreadySelected = columns.some(\n (c) => c.table_id === table.id && c.column === columnName\n );\n if (alreadySelected) {\n return;\n }\n\n // Add the column\n const newColumn: ColumnSelection = {\n table_id: table.id,\n column: columnName,\n aggregation: 'none',\n };\n onChange([...columns, newColumn]);\n } catch {\n // Invalid data, ignore\n }\n },\n [tables, columns, onChange]\n );\n\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'copy';\n }, []);\n\n const isEmpty = columns.length === 0;\n\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={headerStyles}>\n <span style={titleStyles}>\n <Icon\n name=\"column\"\n size={14}\n style={{\n marginRight: 'var(--prismiq-spacing-xs)',\n verticalAlign: 'middle',\n }}\n />\n Selected Columns\n </span>\n <span style={countStyles}>{columns.length} columns</span>\n </div>\n\n {isEmpty ? (\n <div\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n style={dropZoneStyles}\n >\n <Icon name=\"column\" size={24} />\n <div>Drag columns here from the Schema Explorer</div>\n <div style={{ fontSize: 'var(--prismiq-font-size-xs)' }}>\n or click on columns to add them\n </div>\n </div>\n ) : (\n <div style={listStyles}>\n {columns.map((column, index) => {\n const table = getTable(column.table_id);\n const tableSchema = getTableSchema(column.table_id);\n\n if (!table) return null;\n\n return (\n <SelectedColumn\n key={`${column.table_id}-${column.column}-${index}`}\n column={column}\n table={table}\n tableSchema={tableSchema}\n index={index}\n onRemove={() => handleRemove(index)}\n onUpdate={(updated) => handleUpdate(index, updated)}\n onDragEnd={handleDragEnd}\n />\n );\n })}\n\n {/* Drop zone at the end */}\n <div\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n style={{\n ...dropZoneStyles,\n padding: 'var(--prismiq-spacing-sm)',\n minHeight: '40px',\n }}\n >\n <span>Drop column here to add</span>\n </div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * FilterValueInput component for entering filter values.\n */\n\nimport type { FilterOperator } from '../../types';\nimport { Input } from '../ui';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FilterValueInputProps {\n /** Filter operator. */\n operator: FilterOperator;\n /** Current value. */\n value: unknown;\n /** Callback when value changes. */\n onChange: (value: unknown) => void;\n /** Column data type. */\n dataType?: string;\n /** Whether the input is disabled. */\n disabled?: boolean;\n /** Additional class name. */\n className?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n flex: 1,\n};\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Parse a value based on data type.\n */\nfunction parseValue(value: string, dataType?: string): unknown {\n if (!value) return undefined;\n\n const type = dataType?.toLowerCase() ?? '';\n\n // Numeric types\n if (\n type.includes('int') ||\n type.includes('numeric') ||\n type.includes('decimal') ||\n type.includes('float') ||\n type.includes('double') ||\n type.includes('real')\n ) {\n const num = parseFloat(value);\n return isNaN(num) ? value : num;\n }\n\n // Boolean\n if (type === 'boolean' || type === 'bool') {\n const lower = value.toLowerCase();\n if (lower === 'true' || lower === '1') return true;\n if (lower === 'false' || lower === '0') return false;\n return value;\n }\n\n return value;\n}\n\n/**\n * Format a value for display.\n */\nfunction formatValue(value: unknown): string {\n if (value === undefined || value === null) return '';\n if (Array.isArray(value)) return value.join(', ');\n return String(value);\n}\n\n/**\n * Get input type based on data type.\n */\nfunction getInputType(dataType?: string): 'text' | 'number' | 'date' {\n const type = dataType?.toLowerCase() ?? '';\n\n if (\n type.includes('int') ||\n type.includes('numeric') ||\n type.includes('decimal') ||\n type.includes('float') ||\n type.includes('double') ||\n type.includes('real')\n ) {\n return 'number';\n }\n\n if (type.includes('date') && !type.includes('time')) {\n return 'date';\n }\n\n return 'text';\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Input component for filter values that adapts to the operator and data type.\n */\nexport function FilterValueInput({\n operator,\n value,\n onChange,\n dataType,\n disabled = false,\n className,\n}: FilterValueInputProps): JSX.Element {\n const inputType = getInputType(dataType);\n\n // No input needed for null operators\n if (operator === 'is_null' || operator === 'is_not_null') {\n return <></>;\n }\n\n // Between operator needs two inputs\n if (operator === 'between') {\n const [min, max] = Array.isArray(value) ? value : [undefined, undefined];\n\n return (\n <div className={className} style={containerStyles}>\n <Input\n inputSize=\"sm\"\n type={inputType}\n placeholder=\"Min\"\n value={formatValue(min)}\n disabled={disabled}\n onChange={(e) => {\n const newMin = parseValue(e.target.value, dataType);\n onChange([newMin, max]);\n }}\n style={{ flex: 1 }}\n />\n <span style={{ color: 'var(--prismiq-color-text-muted)' }}>and</span>\n <Input\n inputSize=\"sm\"\n type={inputType}\n placeholder=\"Max\"\n value={formatValue(max)}\n disabled={disabled}\n onChange={(e) => {\n const newMax = parseValue(e.target.value, dataType);\n onChange([min, newMax]);\n }}\n style={{ flex: 1 }}\n />\n </div>\n );\n }\n\n // IN, NOT IN, and IN OR NULL operators need comma-separated values\n if (operator === 'in_' || operator === 'not_in' || operator === 'in_or_null') {\n const handleMultiChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const values = e.target.value\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean)\n .map((v) => parseValue(v, dataType));\n onChange(values);\n };\n\n return (\n <div className={className} style={containerStyles}>\n <Input\n inputSize=\"sm\"\n type=\"text\"\n placeholder=\"value1, value2, ...\"\n value={formatValue(value)}\n disabled={disabled}\n onChange={handleMultiChange}\n style={{ flex: 1 }}\n />\n </div>\n );\n }\n\n // Single value input\n return (\n <div className={className} style={containerStyles}>\n <Input\n inputSize=\"sm\"\n type={inputType}\n placeholder=\"Value\"\n value={formatValue(value)}\n disabled={disabled}\n onChange={(e) => onChange(parseValue(e.target.value, dataType))}\n style={{ flex: 1 }}\n />\n </div>\n );\n}\n","/**\n * FilterRow component for a single filter condition.\n */\n\nimport { useCallback, useMemo } from 'react';\n\nimport type {\n DatabaseSchema,\n FilterDefinition,\n FilterOperator,\n QueryTable,\n} from '../../types';\nimport { Icon, Select, type SelectOption } from '../ui';\nimport { FilterValueInput } from './FilterValueInput';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FilterRowProps {\n /** The filter definition. */\n filter: FilterDefinition;\n /** Tables in the query. */\n tables: QueryTable[];\n /** Database schema. */\n schema: DatabaseSchema;\n /** Callback when the filter changes. */\n onChange: (filter: FilterDefinition) => void;\n /** Callback when the filter should be removed. */\n onRemove: () => void;\n /** Additional class name. */\n className?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst rowStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n padding: 'var(--prismiq-spacing-sm)',\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n};\n\nconst columnSelectStyles: React.CSSProperties = {\n width: '200px',\n flexShrink: 0,\n};\n\nconst operatorSelectStyles: React.CSSProperties = {\n width: '140px',\n flexShrink: 0,\n};\n\nconst valueInputStyles: React.CSSProperties = {\n flex: 1,\n minWidth: '150px',\n};\n\nconst removeButtonStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-xs)',\n backgroundColor: 'transparent',\n border: 'none',\n borderRadius: 'var(--prismiq-radius-sm)',\n color: 'var(--prismiq-color-text-muted)',\n cursor: 'pointer',\n transition: 'color 0.15s',\n flexShrink: 0,\n};\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst allOperators: { value: FilterOperator; label: string }[] = [\n { value: 'eq', label: '=' },\n { value: 'neq', label: '!=' },\n { value: 'gt', label: '>' },\n { value: 'gte', label: '>=' },\n { value: 'lt', label: '<' },\n { value: 'lte', label: '<=' },\n { value: 'like', label: 'LIKE' },\n { value: 'ilike', label: 'ILIKE' },\n { value: 'not_like', label: 'NOT LIKE' },\n { value: 'not_ilike', label: 'NOT ILIKE' },\n { value: 'in_', label: 'IN' },\n { value: 'not_in', label: 'NOT IN' },\n { value: 'in_or_null', label: 'IN OR NULL' },\n { value: 'between', label: 'BETWEEN' },\n { value: 'is_null', label: 'IS NULL' },\n { value: 'is_not_null', label: 'IS NOT NULL' },\n];\n\n/**\n * Get available operators based on column data type.\n */\nfunction getOperatorsForType(dataType?: string): SelectOption<FilterOperator>[] {\n if (!dataType) return allOperators;\n\n const type = dataType.toLowerCase();\n\n // Numeric types\n if (\n type.includes('int') ||\n type.includes('numeric') ||\n type.includes('decimal') ||\n type.includes('float') ||\n type.includes('double') ||\n type.includes('real')\n ) {\n return allOperators.filter((op) =>\n ['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'in_', 'not_in', 'in_or_null', 'between', 'is_null', 'is_not_null'].includes(op.value)\n );\n }\n\n // Date/time types\n if (type.includes('date') || type.includes('time') || type.includes('timestamp')) {\n return allOperators.filter((op) =>\n ['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'in_', 'not_in', 'in_or_null', 'between', 'is_null', 'is_not_null'].includes(op.value)\n );\n }\n\n // Boolean\n if (type === 'boolean' || type === 'bool') {\n return allOperators.filter((op) =>\n ['eq', 'neq', 'is_null', 'is_not_null'].includes(op.value)\n );\n }\n\n // String types - all operators (including not_like, not_ilike)\n return allOperators;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * A single filter row with column, operator, and value inputs.\n */\nexport function FilterRow({\n filter,\n tables,\n schema,\n onChange,\n onRemove,\n className,\n}: FilterRowProps): JSX.Element {\n // Build column options grouped by table\n const columnOptions = useMemo(() => {\n const options: SelectOption<string>[] = [];\n\n tables.forEach((table) => {\n const tableSchema = schema.tables.find((t) => t.name === table.name);\n if (!tableSchema) return;\n\n tableSchema.columns.forEach((column) => {\n options.push({\n value: `${table.id}.${column.name}`,\n label: `${table.alias ?? table.name}.${column.name}`,\n });\n });\n });\n\n return options;\n }, [tables, schema]);\n\n // Get current column's schema for type-aware operators\n const currentColumnSchema = useMemo(() => {\n const table = tables.find((t) => t.id === filter.table_id);\n if (!table) return undefined;\n\n const tableSchema = schema.tables.find((t) => t.name === table.name);\n if (!tableSchema) return undefined;\n\n return tableSchema.columns.find((c) => c.name === filter.column);\n }, [tables, schema, filter.table_id, filter.column]);\n\n const operatorOptions = useMemo(\n () => getOperatorsForType(currentColumnSchema?.data_type),\n [currentColumnSchema]\n );\n\n const handleColumnChange = useCallback(\n (columnId: string) => {\n const [tableId, columnName] = columnId.split('.');\n if (tableId && columnName) {\n onChange({\n ...filter,\n table_id: tableId,\n column: columnName,\n // Reset value when column changes\n value: undefined,\n });\n }\n },\n [filter, onChange]\n );\n\n const handleOperatorChange = useCallback(\n (operator: FilterOperator) => {\n // Reset value for null operators\n const value = operator === 'is_null' || operator === 'is_not_null' ? undefined : filter.value;\n onChange({ ...filter, operator, value });\n },\n [filter, onChange]\n );\n\n const handleValueChange = useCallback(\n (value: unknown) => {\n onChange({ ...filter, value });\n },\n [filter, onChange]\n );\n\n const currentColumnId = `${filter.table_id}.${filter.column}`;\n\n return (\n <div className={className} style={rowStyles}>\n <div style={columnSelectStyles}>\n <Select\n value={currentColumnId}\n onChange={handleColumnChange}\n options={columnOptions}\n placeholder=\"Select column\"\n size=\"sm\"\n searchable\n />\n </div>\n\n <div style={operatorSelectStyles}>\n <Select\n value={filter.operator}\n onChange={handleOperatorChange}\n options={operatorOptions}\n size=\"sm\"\n />\n </div>\n\n <div style={valueInputStyles}>\n <FilterValueInput\n operator={filter.operator}\n value={filter.value}\n onChange={handleValueChange}\n dataType={currentColumnSchema?.data_type}\n />\n </div>\n\n <button\n type=\"button\"\n onClick={onRemove}\n style={removeButtonStyles}\n aria-label=\"Remove filter\"\n >\n <Icon name=\"x\" size={16} />\n </button>\n </div>\n );\n}\n","/**\n * FilterBuilder component for building filter conditions.\n */\n\nimport { useCallback } from 'react';\n\nimport type { DatabaseSchema, FilterDefinition, QueryTable } from '../../types';\nimport { Button, Icon } from '../ui';\nimport { FilterRow } from './FilterRow';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FilterBuilderProps {\n /** Tables in the query. */\n tables: QueryTable[];\n /** Current filter definitions. */\n filters: FilterDefinition[];\n /** Callback when filters change. */\n onChange: (filters: FilterDefinition[]) => void;\n /** Database schema. */\n schema: DatabaseSchema;\n /** Additional class name. */\n className?: string;\n /** Additional styles. */\n style?: React.CSSProperties;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\nconst headerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 'var(--prismiq-spacing-xs)',\n};\n\nconst titleStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-sm)',\n fontWeight: 600,\n color: 'var(--prismiq-color-text)',\n};\n\nconst countStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-xs)',\n color: 'var(--prismiq-color-text-muted)',\n};\n\nconst emptyStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-md)',\n textAlign: 'center',\n color: 'var(--prismiq-color-text-muted)',\n fontSize: 'var(--prismiq-font-size-sm)',\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px dashed var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n};\n\nconst filtersListStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\nconst actionsStyles: React.CSSProperties = {\n display: 'flex',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Filter builder component for creating filter conditions.\n *\n * @example\n * ```tsx\n * <FilterBuilder\n * tables={query.tables}\n * filters={query.filters ?? []}\n * onChange={(filters) => setQuery({ ...query, filters })}\n * schema={schema}\n * />\n * ```\n */\nexport function FilterBuilder({\n tables,\n filters,\n onChange,\n schema,\n className,\n style,\n}: FilterBuilderProps): JSX.Element {\n // Get default table and column for new filter\n const getDefaultFilter = useCallback((): FilterDefinition | null => {\n if (tables.length === 0) return null;\n\n const firstTable = tables[0];\n if (!firstTable) return null;\n\n const tableSchema = schema.tables.find((t) => t.name === firstTable.name);\n const firstColumn = tableSchema?.columns[0];\n\n if (!firstColumn) return null;\n\n return {\n table_id: firstTable.id,\n column: firstColumn.name,\n operator: 'eq',\n value: undefined,\n };\n }, [tables, schema]);\n\n const handleAddFilter = useCallback(() => {\n const defaultFilter = getDefaultFilter();\n if (defaultFilter) {\n onChange([...filters, defaultFilter]);\n }\n }, [filters, onChange, getDefaultFilter]);\n\n const handleUpdateFilter = useCallback(\n (index: number, filter: FilterDefinition) => {\n const newFilters = [...filters];\n newFilters[index] = filter;\n onChange(newFilters);\n },\n [filters, onChange]\n );\n\n const handleRemoveFilter = useCallback(\n (index: number) => {\n const newFilters = [...filters];\n newFilters.splice(index, 1);\n onChange(newFilters);\n },\n [filters, onChange]\n );\n\n const handleClearAll = useCallback(() => {\n onChange([]);\n }, [onChange]);\n\n const isEmpty = filters.length === 0;\n const hasNoTables = tables.length === 0;\n\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={headerStyles}>\n <span style={titleStyles}>\n <Icon\n name=\"filter\"\n size={14}\n style={{\n marginRight: 'var(--prismiq-spacing-xs)',\n verticalAlign: 'middle',\n }}\n />\n Filters\n </span>\n <span style={countStyles}>\n {filters.length} {filters.length === 1 ? 'filter' : 'filters'}\n </span>\n </div>\n\n {isEmpty ? (\n <div style={emptyStyles}>\n {hasNoTables ? (\n <>Select a table first to add filters</>\n ) : (\n <>No filters applied. Click \"Add Filter\" to filter results.</>\n )}\n </div>\n ) : (\n <div style={filtersListStyles}>\n {filters.map((filter, index) => (\n <FilterRow\n key={`${filter.table_id}-${filter.column}-${index}`}\n filter={filter}\n tables={tables}\n schema={schema}\n onChange={(updated) => handleUpdateFilter(index, updated)}\n onRemove={() => handleRemoveFilter(index)}\n />\n ))}\n </div>\n )}\n\n <div style={actionsStyles}>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n leftIcon={<Icon name=\"plus\" size={14} />}\n onClick={handleAddFilter}\n disabled={hasNoTables}\n >\n Add Filter\n </Button>\n {!isEmpty && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n leftIcon={<Icon name=\"trash\" size={14} />}\n onClick={handleClearAll}\n >\n Clear All\n </Button>\n )}\n </div>\n </div>\n );\n}\n","/**\n * SortRow component for a single sort condition.\n */\n\nimport { useCallback, useMemo, useState, type DragEvent } from 'react';\n\nimport type { DatabaseSchema, QueryTable, SortDefinition, SortDirection } from '../../types';\nimport { Icon, Select, type SelectOption } from '../ui';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SortRowProps {\n /** The sort definition. */\n sort: SortDefinition;\n /** Tables in the query. */\n tables: QueryTable[];\n /** Database schema. */\n schema: DatabaseSchema;\n /** Index of this sort in the list. */\n index: number;\n /** Callback when the sort changes. */\n onChange: (sort: SortDefinition) => void;\n /** Callback when the sort should be removed. */\n onRemove: () => void;\n /** Callback when drag ends with reorder. */\n onDragEnd: (fromIndex: number, toIndex: number) => void;\n /** Already used columns to prevent duplicates. */\n usedColumns: Array<{ table_id: string; column: string }>;\n /** Additional class name. */\n className?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst rowStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n padding: 'var(--prismiq-spacing-sm)',\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n cursor: 'grab',\n transition: 'border-color 0.15s, background-color 0.15s',\n};\n\nconst draggingStyles: React.CSSProperties = {\n opacity: 0.5,\n borderColor: 'var(--prismiq-color-primary)',\n};\n\nconst dragOverStyles: React.CSSProperties = {\n borderColor: 'var(--prismiq-color-primary)',\n backgroundColor: 'var(--prismiq-color-surface-hover)',\n};\n\nconst priorityStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n backgroundColor: 'var(--prismiq-color-primary)',\n color: 'var(--prismiq-color-text-inverse)',\n borderRadius: 'var(--prismiq-radius-full)',\n fontSize: 'var(--prismiq-font-size-xs)',\n fontWeight: 600,\n flexShrink: 0,\n};\n\nconst dragHandleStyles: React.CSSProperties = {\n color: 'var(--prismiq-color-text-muted)',\n cursor: 'grab',\n flexShrink: 0,\n};\n\nconst columnSelectStyles: React.CSSProperties = {\n flex: 1,\n minWidth: '150px',\n};\n\nconst directionButtonStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n padding: 'var(--prismiq-spacing-xs) var(--prismiq-spacing-sm)',\n backgroundColor: 'var(--prismiq-color-background)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n color: 'var(--prismiq-color-text)',\n fontSize: 'var(--prismiq-font-size-sm)',\n cursor: 'pointer',\n transition: 'background-color 0.15s',\n flexShrink: 0,\n minWidth: '80px',\n};\n\nconst removeButtonStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-xs)',\n backgroundColor: 'transparent',\n border: 'none',\n borderRadius: 'var(--prismiq-radius-sm)',\n color: 'var(--prismiq-color-text-muted)',\n cursor: 'pointer',\n transition: 'color 0.15s',\n flexShrink: 0,\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * A single sort row with column and direction.\n */\nexport function SortRow({\n sort,\n tables,\n schema,\n index,\n onChange,\n onRemove,\n onDragEnd,\n usedColumns,\n className,\n}: SortRowProps): JSX.Element {\n const [isDragging, setIsDragging] = useState(false);\n const [isDragOver, setIsDragOver] = useState(false);\n\n // Build column options excluding already used columns\n const columnOptions = useMemo(() => {\n const options: SelectOption<string>[] = [];\n\n tables.forEach((table) => {\n const tableSchema = schema.tables.find((t) => t.name === table.name);\n if (!tableSchema) return;\n\n tableSchema.columns.forEach((column) => {\n const isUsed = usedColumns.some(\n (used) =>\n used.table_id === table.id &&\n used.column === column.name &&\n !(sort.table_id === table.id && sort.column === column.name)\n );\n\n options.push({\n value: `${table.id}.${column.name}`,\n label: `${table.alias ?? table.name}.${column.name}`,\n disabled: isUsed,\n });\n });\n });\n\n return options;\n }, [tables, schema, usedColumns, sort.table_id, sort.column]);\n\n const handleColumnChange = useCallback(\n (columnId: string) => {\n const [tableId, columnName] = columnId.split('.');\n if (tableId && columnName) {\n onChange({\n ...sort,\n table_id: tableId,\n column: columnName,\n });\n }\n },\n [sort, onChange]\n );\n\n const handleDirectionToggle = useCallback(() => {\n const newDirection: SortDirection = sort.direction === 'ASC' ? 'DESC' : 'ASC';\n onChange({ ...sort, direction: newDirection });\n }, [sort, onChange]);\n\n const handleDragStart = useCallback(\n (e: DragEvent) => {\n e.dataTransfer.setData('text/plain', String(index));\n e.dataTransfer.effectAllowed = 'move';\n setIsDragging(true);\n },\n [index]\n );\n\n const handleDragEnd = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n setIsDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback(() => {\n setIsDragOver(false);\n }, []);\n\n const handleDrop = useCallback(\n (e: DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n const fromIndex = parseInt(e.dataTransfer.getData('text/plain'), 10);\n if (!isNaN(fromIndex) && fromIndex !== index) {\n onDragEnd(fromIndex, index);\n }\n },\n [index, onDragEnd]\n );\n\n const currentColumnId = `${sort.table_id}.${sort.column}`;\n\n return (\n <div\n className={className}\n draggable\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n style={{\n ...rowStyles,\n ...(isDragging ? draggingStyles : {}),\n ...(isDragOver ? dragOverStyles : {}),\n }}\n >\n <span style={priorityStyles}>{index + 1}</span>\n\n <span style={dragHandleStyles}>\n <Icon name=\"drag\" size={16} />\n </span>\n\n <div style={columnSelectStyles}>\n <Select\n value={currentColumnId}\n onChange={handleColumnChange}\n options={columnOptions}\n placeholder=\"Select column\"\n size=\"sm\"\n searchable\n />\n </div>\n\n <button\n type=\"button\"\n onClick={handleDirectionToggle}\n style={directionButtonStyles}\n >\n <Icon name={sort.direction === 'ASC' ? 'sort-asc' : 'sort-desc'} size={14} />\n {sort.direction}\n </button>\n\n <button\n type=\"button\"\n onClick={onRemove}\n style={removeButtonStyles}\n aria-label=\"Remove sort\"\n >\n <Icon name=\"x\" size={16} />\n </button>\n </div>\n );\n}\n","/**\n * SortBuilder component for defining sort order.\n */\n\nimport { useCallback, useMemo } from 'react';\n\nimport type { DatabaseSchema, QueryTable, SortDefinition } from '../../types';\nimport { Button, Icon } from '../ui';\nimport { SortRow } from './SortRow';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SortBuilderProps {\n /** Tables in the query. */\n tables: QueryTable[];\n /** Current sort definitions. */\n sorts: SortDefinition[];\n /** Callback when sorts change. */\n onChange: (sorts: SortDefinition[]) => void;\n /** Database schema. */\n schema: DatabaseSchema;\n /** Maximum number of sorts allowed. */\n maxSorts?: number;\n /** Additional class name. */\n className?: string;\n /** Additional styles. */\n style?: React.CSSProperties;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\nconst headerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 'var(--prismiq-spacing-xs)',\n};\n\nconst titleStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-sm)',\n fontWeight: 600,\n color: 'var(--prismiq-color-text)',\n};\n\nconst countStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-xs)',\n color: 'var(--prismiq-color-text-muted)',\n};\n\nconst emptyStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-md)',\n textAlign: 'center',\n color: 'var(--prismiq-color-text-muted)',\n fontSize: 'var(--prismiq-font-size-sm)',\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px dashed var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n};\n\nconst sortsListStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\nconst actionsStyles: React.CSSProperties = {\n display: 'flex',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Sort builder component for defining sort order.\n *\n * @example\n * ```tsx\n * <SortBuilder\n * tables={query.tables}\n * sorts={query.order_by ?? []}\n * onChange={(sorts) => setQuery({ ...query, order_by: sorts })}\n * schema={schema}\n * maxSorts={3}\n * />\n * ```\n */\nexport function SortBuilder({\n tables,\n sorts,\n onChange,\n schema,\n maxSorts = 3,\n className,\n style,\n}: SortBuilderProps): JSX.Element {\n // Track used columns to prevent duplicates\n const usedColumns = useMemo(\n () => sorts.map((s) => ({ table_id: s.table_id, column: s.column })),\n [sorts]\n );\n\n // Get default sort for new entry\n const getDefaultSort = useCallback((): SortDefinition | null => {\n if (tables.length === 0) return null;\n\n // Find first unused column\n for (const table of tables) {\n const tableSchema = schema.tables.find((t) => t.name === table.name);\n if (!tableSchema) continue;\n\n for (const column of tableSchema.columns) {\n const isUsed = usedColumns.some(\n (used) => used.table_id === table.id && used.column === column.name\n );\n\n if (!isUsed) {\n return {\n table_id: table.id,\n column: column.name,\n direction: 'ASC',\n };\n }\n }\n }\n\n return null;\n }, [tables, schema, usedColumns]);\n\n const handleAddSort = useCallback(() => {\n const defaultSort = getDefaultSort();\n if (defaultSort) {\n onChange([...sorts, defaultSort]);\n }\n }, [sorts, onChange, getDefaultSort]);\n\n const handleUpdateSort = useCallback(\n (index: number, sort: SortDefinition) => {\n const newSorts = [...sorts];\n newSorts[index] = sort;\n onChange(newSorts);\n },\n [sorts, onChange]\n );\n\n const handleRemoveSort = useCallback(\n (index: number) => {\n const newSorts = [...sorts];\n newSorts.splice(index, 1);\n onChange(newSorts);\n },\n [sorts, onChange]\n );\n\n const handleDragEnd = useCallback(\n (fromIndex: number, toIndex: number) => {\n const newSorts = [...sorts];\n const [removed] = newSorts.splice(fromIndex, 1);\n if (removed) {\n newSorts.splice(toIndex, 0, removed);\n onChange(newSorts);\n }\n },\n [sorts, onChange]\n );\n\n const handleClearAll = useCallback(() => {\n onChange([]);\n }, [onChange]);\n\n const isEmpty = sorts.length === 0;\n const hasNoTables = tables.length === 0;\n const canAddMore = sorts.length < maxSorts && getDefaultSort() !== null;\n\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={headerStyles}>\n <span style={titleStyles}>\n <Icon\n name=\"sort-asc\"\n size={14}\n style={{\n marginRight: 'var(--prismiq-spacing-xs)',\n verticalAlign: 'middle',\n }}\n />\n Sort Order\n </span>\n <span style={countStyles}>\n {sorts.length} / {maxSorts} sorts\n </span>\n </div>\n\n {isEmpty ? (\n <div style={emptyStyles}>\n {hasNoTables ? (\n <>Select a table first to add sorting</>\n ) : (\n <>No sorting applied. Click \"Add Sort\" to order results.</>\n )}\n </div>\n ) : (\n <div style={sortsListStyles}>\n {sorts.map((sort, index) => (\n <SortRow\n key={`${sort.table_id}-${sort.column}-${index}`}\n sort={sort}\n tables={tables}\n schema={schema}\n index={index}\n onChange={(updated) => handleUpdateSort(index, updated)}\n onRemove={() => handleRemoveSort(index)}\n onDragEnd={handleDragEnd}\n usedColumns={usedColumns}\n />\n ))}\n </div>\n )}\n\n <div style={actionsStyles}>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n leftIcon={<Icon name=\"plus\" size={14} />}\n onClick={handleAddSort}\n disabled={!canAddMore}\n >\n Add Sort\n </Button>\n {!isEmpty && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n leftIcon={<Icon name=\"trash\" size={14} />}\n onClick={handleClearAll}\n >\n Clear All\n </Button>\n )}\n </div>\n </div>\n );\n}\n","/**\n * JoinRow component for configuring a single join.\n */\n\nimport { useCallback, useMemo } from 'react';\n\nimport type { DatabaseSchema, JoinDefinition, JoinType, QueryTable } from '../../types';\nimport { Button, Icon, Select } from '../ui';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface JoinRowProps {\n /** The join definition. */\n join: JoinDefinition;\n /** Tables in the query. */\n tables: QueryTable[];\n /** Database schema. */\n schema: DatabaseSchema;\n /** Row index. */\n index: number;\n /** Callback when join changes. */\n onChange: (join: JoinDefinition) => void;\n /** Callback when join is removed. */\n onRemove: () => void;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst rowStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n padding: 'var(--prismiq-spacing-sm)',\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n flexWrap: 'wrap',\n};\n\nconst selectWrapperStyles: React.CSSProperties = {\n minWidth: '120px',\n};\n\nconst labelStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text-muted)',\n flexShrink: 0,\n};\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst JOIN_TYPE_OPTIONS: Array<{ value: JoinType; label: string }> = [\n { value: 'INNER', label: 'Inner Join' },\n { value: 'LEFT', label: 'Left Join' },\n { value: 'RIGHT', label: 'Right Join' },\n { value: 'FULL', label: 'Full Join' },\n];\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * A single join row in the join builder.\n */\nexport function JoinRow({\n join,\n tables,\n schema,\n index,\n onChange,\n onRemove,\n}: JoinRowProps): JSX.Element {\n // Get table options\n const tableOptions = useMemo(() => {\n return tables.map((t) => ({\n value: t.id,\n label: t.alias ?? t.name,\n }));\n }, [tables]);\n\n // Get columns for from table\n const fromColumnOptions = useMemo(() => {\n const table = tables.find((t) => t.id === join.from_table_id);\n if (!table) return [];\n\n const tableSchema = schema.tables.find((t) => t.name === table.name);\n if (!tableSchema) return [];\n\n return tableSchema.columns.map((col) => ({\n value: col.name,\n label: col.name,\n }));\n }, [tables, schema, join.from_table_id]);\n\n // Get columns for to table\n const toColumnOptions = useMemo(() => {\n const table = tables.find((t) => t.id === join.to_table_id);\n if (!table) return [];\n\n const tableSchema = schema.tables.find((t) => t.name === table.name);\n if (!tableSchema) return [];\n\n return tableSchema.columns.map((col) => ({\n value: col.name,\n label: col.name,\n }));\n }, [tables, schema, join.to_table_id]);\n\n const handleFromTableChange = useCallback(\n (value: string) => {\n const table = tables.find((t) => t.id === value);\n const tableSchema = table\n ? schema.tables.find((t) => t.name === table.name)\n : null;\n const firstColumn = tableSchema?.columns[0]?.name ?? '';\n\n onChange({\n ...join,\n from_table_id: value,\n from_column: firstColumn,\n });\n },\n [join, onChange, tables, schema]\n );\n\n const handleFromColumnChange = useCallback(\n (value: string) => {\n onChange({ ...join, from_column: value });\n },\n [join, onChange]\n );\n\n const handleToTableChange = useCallback(\n (value: string) => {\n const table = tables.find((t) => t.id === value);\n const tableSchema = table\n ? schema.tables.find((t) => t.name === table.name)\n : null;\n const firstColumn = tableSchema?.columns[0]?.name ?? '';\n\n onChange({\n ...join,\n to_table_id: value,\n to_column: firstColumn,\n });\n },\n [join, onChange, tables, schema]\n );\n\n const handleToColumnChange = useCallback(\n (value: string) => {\n onChange({ ...join, to_column: value });\n },\n [join, onChange]\n );\n\n const handleJoinTypeChange = useCallback(\n (value: string) => {\n onChange({ ...join, join_type: value as JoinType });\n },\n [join, onChange]\n );\n\n return (\n <div style={rowStyles}>\n <span style={labelStyles}>{index + 1}.</span>\n\n {/* Join Type */}\n <div style={selectWrapperStyles}>\n <Select\n value={join.join_type}\n options={JOIN_TYPE_OPTIONS}\n onChange={handleJoinTypeChange}\n size=\"sm\"\n />\n </div>\n\n {/* From Table */}\n <div style={selectWrapperStyles}>\n <Select\n value={join.from_table_id}\n options={tableOptions}\n onChange={handleFromTableChange}\n placeholder=\"From table\"\n size=\"sm\"\n />\n </div>\n\n {/* From Column */}\n <div style={selectWrapperStyles}>\n <Select\n value={join.from_column}\n options={fromColumnOptions}\n onChange={handleFromColumnChange}\n placeholder=\"Column\"\n size=\"sm\"\n />\n </div>\n\n <span style={labelStyles}>=</span>\n\n {/* To Table */}\n <div style={selectWrapperStyles}>\n <Select\n value={join.to_table_id}\n options={tableOptions}\n onChange={handleToTableChange}\n placeholder=\"To table\"\n size=\"sm\"\n />\n </div>\n\n {/* To Column */}\n <div style={selectWrapperStyles}>\n <Select\n value={join.to_column}\n options={toColumnOptions}\n onChange={handleToColumnChange}\n placeholder=\"Column\"\n size=\"sm\"\n />\n </div>\n\n {/* Remove button */}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n aria-label=\"Remove join\"\n style={{ marginLeft: 'auto' }}\n >\n <Icon name=\"x\" size={14} />\n </Button>\n </div>\n );\n}\n","/**\n * JoinBuilder component for defining table joins.\n */\n\nimport { useCallback, useMemo } from 'react';\n\nimport type { DatabaseSchema, JoinDefinition, QueryTable } from '../../types';\nimport { Button, Icon } from '../ui';\nimport { JoinRow } from './JoinRow';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface JoinBuilderProps {\n /** Tables in the query. */\n tables: QueryTable[];\n /** Current join definitions. */\n joins: JoinDefinition[];\n /** Callback when joins change. */\n onChange: (joins: JoinDefinition[]) => void;\n /** Database schema. */\n schema: DatabaseSchema;\n /** Maximum number of joins allowed. */\n maxJoins?: number;\n /** Additional class name. */\n className?: string;\n /** Additional styles. */\n style?: React.CSSProperties;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\nconst headerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 'var(--prismiq-spacing-xs)',\n};\n\nconst titleStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-sm)',\n fontWeight: 600,\n color: 'var(--prismiq-color-text)',\n};\n\nconst countStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-xs)',\n color: 'var(--prismiq-color-text-muted)',\n};\n\nconst emptyStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-md)',\n textAlign: 'center',\n color: 'var(--prismiq-color-text-muted)',\n fontSize: 'var(--prismiq-font-size-sm)',\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px dashed var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n};\n\nconst joinsListStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\nconst actionsStyles: React.CSSProperties = {\n display: 'flex',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Join builder component for defining table joins.\n *\n * @example\n * ```tsx\n * <JoinBuilder\n * tables={query.tables}\n * joins={query.joins ?? []}\n * onChange={(joins) => setQuery({ ...query, joins })}\n * schema={schema}\n * maxJoins={5}\n * />\n * ```\n */\nexport function JoinBuilder({\n tables,\n joins,\n onChange,\n schema,\n maxJoins = 10,\n className,\n style,\n}: JoinBuilderProps): JSX.Element {\n // Check if we can add more joins (need at least 2 tables)\n const canAddJoin = useMemo(() => {\n return tables.length >= 2 && joins.length < maxJoins;\n }, [tables.length, joins.length, maxJoins]);\n\n // Get default join for new entry\n const getDefaultJoin = useCallback((): JoinDefinition | null => {\n if (tables.length < 2) return null;\n\n const fromTable = tables[0];\n const toTable = tables[1];\n if (!fromTable || !toTable) return null;\n\n const fromTableSchema = schema.tables.find((t) => t.name === fromTable.name);\n const toTableSchema = schema.tables.find((t) => t.name === toTable.name);\n\n if (!fromTableSchema || !toTableSchema) return null;\n\n // Try to find matching column names (common join pattern)\n let fromColumn = fromTableSchema.columns[0]?.name ?? '';\n let toColumn = toTableSchema.columns[0]?.name ?? '';\n\n // Look for id/foreign key patterns\n const toTableName = toTable.name.replace(/s$/, ''); // orders -> order\n const fkPattern = `${toTableName}_id`;\n\n // Check if from table has a foreign key to the to table\n const fkColumn = fromTableSchema.columns.find(\n (c) => c.name === fkPattern || c.name === `${toTableName}id`\n );\n if (fkColumn) {\n fromColumn = fkColumn.name;\n toColumn = 'id';\n }\n\n // Check if to table has a foreign key to the from table\n const fromTableName = fromTable.name.replace(/s$/, '');\n const reverseFkPattern = `${fromTableName}_id`;\n const reverseFkColumn = toTableSchema.columns.find(\n (c) => c.name === reverseFkPattern || c.name === `${fromTableName}id`\n );\n if (reverseFkColumn) {\n fromColumn = 'id';\n toColumn = reverseFkColumn.name;\n }\n\n return {\n from_table_id: fromTable.id,\n from_column: fromColumn,\n to_table_id: toTable.id,\n to_column: toColumn,\n join_type: 'INNER',\n };\n }, [tables, schema]);\n\n const handleAddJoin = useCallback(() => {\n const defaultJoin = getDefaultJoin();\n if (defaultJoin) {\n onChange([...joins, defaultJoin]);\n }\n }, [joins, onChange, getDefaultJoin]);\n\n const handleUpdateJoin = useCallback(\n (index: number, join: JoinDefinition) => {\n const newJoins = [...joins];\n newJoins[index] = join;\n onChange(newJoins);\n },\n [joins, onChange]\n );\n\n const handleRemoveJoin = useCallback(\n (index: number) => {\n const newJoins = [...joins];\n newJoins.splice(index, 1);\n onChange(newJoins);\n },\n [joins, onChange]\n );\n\n const handleClearAll = useCallback(() => {\n onChange([]);\n }, [onChange]);\n\n const isEmpty = joins.length === 0;\n const needsMoreTables = tables.length < 2;\n\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={headerStyles}>\n <span style={titleStyles}>\n <Icon\n name=\"link\"\n size={14}\n style={{\n marginRight: 'var(--prismiq-spacing-xs)',\n verticalAlign: 'middle',\n }}\n />\n Joins\n </span>\n <span style={countStyles}>\n {joins.length} / {maxJoins} joins\n </span>\n </div>\n\n {isEmpty ? (\n <div style={emptyStyles}>\n {needsMoreTables ? (\n <>Select at least 2 tables to add joins</>\n ) : (\n <>No joins defined. Click \"Add Join\" to connect tables.</>\n )}\n </div>\n ) : (\n <div style={joinsListStyles}>\n {joins.map((join, index) => (\n <JoinRow\n key={`${join.from_table_id}-${join.to_table_id}-${index}`}\n join={join}\n tables={tables}\n schema={schema}\n index={index}\n onChange={(updated) => handleUpdateJoin(index, updated)}\n onRemove={() => handleRemoveJoin(index)}\n />\n ))}\n </div>\n )}\n\n <div style={actionsStyles}>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n leftIcon={<Icon name=\"plus\" size={14} />}\n onClick={handleAddJoin}\n disabled={!canAddJoin}\n >\n Add Join\n </Button>\n {!isEmpty && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n leftIcon={<Icon name=\"trash\" size={14} />}\n onClick={handleClearAll}\n >\n Clear All\n </Button>\n )}\n </div>\n </div>\n );\n}\n","/**\n * AggregationPicker component for selecting column aggregations.\n */\n\nimport { useMemo } from 'react';\n\nimport type { AggregationType } from '../../types';\nimport { Icon, Select, Tooltip, type SelectOption, type IconName } from '../ui';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AggregationPickerProps {\n /** Current aggregation value. */\n value: AggregationType;\n /** Callback when aggregation changes. */\n onChange: (aggregation: AggregationType) => void;\n /** Column data type for filtering applicable aggregations. */\n columnType: string;\n /** Whether the picker is disabled. */\n disabled?: boolean;\n /** Size variant. */\n size?: 'sm' | 'md' | 'lg';\n /** Additional class name. */\n className?: string;\n /** Additional styles. */\n style?: React.CSSProperties;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\ninterface AggregationInfo {\n value: AggregationType;\n label: string;\n description: string;\n icon: IconName;\n}\n\nconst aggregationInfo: AggregationInfo[] = [\n {\n value: 'none',\n label: 'None',\n description: 'Return raw values without aggregation',\n icon: 'minus',\n },\n {\n value: 'sum',\n label: 'Sum',\n description: 'Calculate the sum of all values',\n icon: 'plus',\n },\n {\n value: 'avg',\n label: 'Average',\n description: 'Calculate the average (mean) of all values',\n icon: 'minus',\n },\n {\n value: 'count',\n label: 'Count',\n description: 'Count the number of rows',\n icon: 'column',\n },\n {\n value: 'count_distinct',\n label: 'Count Distinct',\n description: 'Count the number of unique values',\n icon: 'column',\n },\n {\n value: 'min',\n label: 'Min',\n description: 'Find the minimum value',\n icon: 'chevron-down',\n },\n {\n value: 'max',\n label: 'Max',\n description: 'Find the maximum value',\n icon: 'chevron-up',\n },\n];\n\n/**\n * Get available aggregations based on column data type.\n */\nfunction getAvailableAggregations(dataType: string): AggregationType[] {\n const type = dataType.toLowerCase();\n\n // Numeric types - all aggregations available\n if (\n type.includes('int') ||\n type.includes('numeric') ||\n type.includes('decimal') ||\n type.includes('float') ||\n type.includes('double') ||\n type.includes('real')\n ) {\n return ['none', 'sum', 'avg', 'count', 'count_distinct', 'min', 'max'];\n }\n\n // Date/time types - count, count_distinct, min, max\n if (type.includes('date') || type.includes('time') || type.includes('timestamp')) {\n return ['none', 'count', 'count_distinct', 'min', 'max'];\n }\n\n // Boolean - count, count_distinct\n if (type === 'boolean' || type === 'bool') {\n return ['none', 'count', 'count_distinct'];\n }\n\n // String/other - count, count_distinct\n return ['none', 'count', 'count_distinct'];\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Dropdown picker for selecting column aggregation functions.\n *\n * @example\n * ```tsx\n * <AggregationPicker\n * value={column.aggregation}\n * onChange={(agg) => updateColumn({ ...column, aggregation: agg })}\n * columnType=\"integer\"\n * />\n * ```\n */\nexport function AggregationPicker({\n value,\n onChange,\n columnType,\n disabled = false,\n size = 'sm',\n className,\n style,\n}: AggregationPickerProps): JSX.Element {\n // Get available aggregations for this column type\n const availableAggregations = useMemo(\n () => getAvailableAggregations(columnType),\n [columnType]\n );\n\n // Build options with tooltips\n const options: SelectOption<AggregationType>[] = useMemo(\n () =>\n aggregationInfo\n .filter((info) => availableAggregations.includes(info.value))\n .map((info) => ({\n value: info.value,\n label: info.label,\n })),\n [availableAggregations]\n );\n\n // Get current aggregation info\n const currentInfo = aggregationInfo.find((info) => info.value === value);\n\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <Tooltip\n content={currentInfo?.description ?? 'Select aggregation'}\n position=\"top\"\n delay={300}\n >\n <span style={{ display: 'inline-flex' }}>\n <Icon\n name={currentInfo?.icon ?? 'minus'}\n size={14}\n style={{ color: 'var(--prismiq-color-text-muted)' }}\n />\n </span>\n </Tooltip>\n <Select\n value={value}\n onChange={onChange}\n options={options}\n disabled={disabled}\n size={size}\n />\n </div>\n );\n}\n","/**\n * Pagination component for the results table.\n */\n\nimport { useMemo } from 'react';\n\nimport { Button, Icon, Select, type SelectOption } from '../ui';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PaginationProps {\n /** Current page (1-indexed). */\n currentPage: number;\n /** Total number of items. */\n totalItems: number;\n /** Items per page. */\n pageSize: number;\n /** Callback when page changes. */\n onPageChange: (page: number) => void;\n /** Callback when page size changes. */\n onPageSizeChange?: (pageSize: number) => void;\n /** Available page size options. */\n pageSizeOptions?: number[];\n /** Additional class name. */\n className?: string;\n /** Additional styles. */\n style?: React.CSSProperties;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexWrap: 'wrap',\n gap: 'var(--prismiq-spacing-sm)',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n borderTop: '1px solid var(--prismiq-color-border)',\n backgroundColor: 'var(--prismiq-color-surface)',\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text-muted)',\n};\n\nconst leftStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n flexWrap: 'wrap',\n};\n\nconst rightStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n flexShrink: 0,\n};\n\nconst pageInfoStyles: React.CSSProperties = {\n whiteSpace: 'nowrap',\n marginRight: 'var(--prismiq-spacing-xs)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Pagination controls for the results table.\n */\nexport function Pagination({\n currentPage,\n totalItems,\n pageSize,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 25, 50, 100],\n className,\n style,\n}: PaginationProps): JSX.Element {\n const totalPages = Math.max(1, Math.ceil(totalItems / pageSize));\n const startItem = Math.min((currentPage - 1) * pageSize + 1, totalItems);\n const endItem = Math.min(currentPage * pageSize, totalItems);\n\n const pageSizeSelectOptions: SelectOption<number>[] = useMemo(\n () =>\n pageSizeOptions.map((size) => ({\n value: size,\n label: `${size} / page`,\n })),\n [pageSizeOptions]\n );\n\n const handlePrevious = () => {\n if (currentPage > 1) {\n onPageChange(currentPage - 1);\n }\n };\n\n const handleNext = () => {\n if (currentPage < totalPages) {\n onPageChange(currentPage + 1);\n }\n };\n\n const handleFirst = () => {\n onPageChange(1);\n };\n\n const handleLast = () => {\n onPageChange(totalPages);\n };\n\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={leftStyles}>\n <span style={{ whiteSpace: 'nowrap' }}>\n Showing {startItem} - {endItem} of {totalItems.toLocaleString()} rows\n </span>\n {onPageSizeChange && (\n <Select\n value={pageSize}\n onChange={onPageSizeChange}\n options={pageSizeSelectOptions}\n size=\"sm\"\n />\n )}\n </div>\n\n <div style={rightStyles}>\n <span style={pageInfoStyles}>\n Page {currentPage} of {totalPages}\n </span>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleFirst}\n disabled={currentPage === 1}\n aria-label=\"First page\"\n >\n <Icon name=\"chevron-left\" size={14} />\n <Icon name=\"chevron-left\" size={14} style={{ marginLeft: '-8px' }} />\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handlePrevious}\n disabled={currentPage === 1}\n aria-label=\"Previous page\"\n >\n <Icon name=\"chevron-left\" size={14} />\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleNext}\n disabled={currentPage === totalPages}\n aria-label=\"Next page\"\n >\n <Icon name=\"chevron-right\" size={14} />\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleLast}\n disabled={currentPage === totalPages}\n aria-label=\"Last page\"\n >\n <Icon name=\"chevron-right\" size={14} />\n <Icon name=\"chevron-right\" size={14} style={{ marginLeft: '-8px' }} />\n </Button>\n </div>\n </div>\n );\n}\n","/**\n * TableHeader component for rendering the table header row.\n */\n\nimport { Icon } from '../ui';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TableHeaderProps {\n /** Column names. */\n columns: string[];\n /** Column data types. */\n columnTypes?: string[];\n /** Whether columns are sortable. */\n sortable?: boolean;\n /** Currently sorted column. */\n sortColumn?: string;\n /** Current sort direction. */\n sortDirection?: 'asc' | 'desc';\n /** Callback when a column header is clicked for sorting. */\n onSort?: (column: string, direction: 'asc' | 'desc') => void;\n /** Additional class name. */\n className?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst headerRowStyles: React.CSSProperties = {\n backgroundColor: 'var(--prismiq-color-surface)',\n};\n\nconst headerCellStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n borderBottom: '2px solid var(--prismiq-color-border)',\n fontSize: 'var(--prismiq-font-size-sm)',\n fontWeight: 600,\n color: 'var(--prismiq-color-text)',\n textAlign: 'left',\n whiteSpace: 'nowrap',\n position: 'sticky',\n top: 0,\n backgroundColor: 'var(--prismiq-color-surface)',\n zIndex: 10,\n // Ensure header is visible when scrolling with a subtle shadow\n boxShadow: '0 1px 0 var(--prismiq-color-border)',\n};\n\nconst sortableStyles: React.CSSProperties = {\n cursor: 'pointer',\n userSelect: 'none',\n};\n\nconst headerContentStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n};\n\nconst sortIconStyles: React.CSSProperties = {\n color: 'var(--prismiq-color-text-muted)',\n};\n\nconst activeSortIconStyles: React.CSSProperties = {\n color: 'var(--prismiq-color-primary)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Table header row with optional sorting.\n */\nexport function TableHeader({\n columns,\n sortable = false,\n sortColumn,\n sortDirection,\n onSort,\n className,\n}: TableHeaderProps): JSX.Element {\n const handleHeaderClick = (column: string) => {\n if (!sortable || !onSort) return;\n\n // Toggle direction if same column, otherwise default to asc\n const newDirection =\n sortColumn === column && sortDirection === 'asc' ? 'desc' : 'asc';\n onSort(column, newDirection);\n };\n\n return (\n <thead className={className}>\n <tr style={headerRowStyles}>\n {columns.map((column) => {\n const isActive = sortColumn === column;\n\n return (\n <th\n key={column}\n onClick={() => handleHeaderClick(column)}\n style={{\n ...headerCellStyles,\n ...(sortable ? sortableStyles : {}),\n }}\n >\n <div style={headerContentStyles}>\n <span>{column}</span>\n {sortable && (\n <span\n style={isActive ? activeSortIconStyles : sortIconStyles}\n >\n {isActive ? (\n <Icon\n name={sortDirection === 'asc' ? 'sort-asc' : 'sort-desc'}\n size={14}\n />\n ) : (\n <Icon name=\"sort-asc\" size={14} style={{ opacity: 0.3 }} />\n )}\n </span>\n )}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n );\n}\n","/**\n * TableCell component for rendering a single cell in the results table.\n */\n\nimport { useMemo } from 'react';\n\nimport { Tooltip } from '../ui';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TableCellProps {\n /** Cell value. */\n value: unknown;\n /** Column data type. */\n columnType?: string;\n /** Custom formatter function. */\n formatter?: (value: unknown) => string;\n /** Maximum width before truncation. */\n maxWidth?: number;\n /** Callback when cell is clicked. */\n onClick?: () => void;\n /** Additional class name. */\n className?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst cellStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n borderBottom: '1px solid var(--prismiq-color-border)',\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text)',\n verticalAlign: 'middle',\n textAlign: 'left',\n};\n\nconst nullStyles: React.CSSProperties = {\n color: 'var(--prismiq-color-text-muted)',\n fontStyle: 'italic',\n};\n\nconst numberStyles: React.CSSProperties = {\n fontFamily: 'var(--prismiq-font-mono)',\n textAlign: 'right',\n};\n\nconst truncatedStyles: React.CSSProperties = {\n maxWidth: '200px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Format a value for display based on its type.\n */\nfunction formatValue(value: unknown, columnType?: string): string {\n if (value === null || value === undefined) {\n return 'NULL';\n }\n\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n\n if (typeof value === 'number') {\n // Format numbers with locale\n if (Number.isInteger(value)) {\n return value.toLocaleString();\n }\n return value.toLocaleString(undefined, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n });\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n // Format date strings\n if (columnType?.includes('timestamp') || columnType?.includes('date')) {\n const dateStr = String(value);\n try {\n const date = new Date(dateStr);\n if (!isNaN(date.getTime())) {\n if (columnType?.includes('time')) {\n return date.toLocaleString();\n }\n return date.toLocaleDateString();\n }\n } catch {\n // Fall through to string\n }\n }\n\n // Format arrays/objects as JSON\n if (typeof value === 'object') {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n }\n\n return String(value);\n}\n\n/**\n * Check if value is numeric type.\n */\nfunction isNumericType(columnType?: string): boolean {\n if (!columnType) return false;\n const type = columnType.toLowerCase();\n return (\n type.includes('int') ||\n type.includes('numeric') ||\n type.includes('decimal') ||\n type.includes('float') ||\n type.includes('double') ||\n type.includes('real')\n );\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * A single cell in the results table.\n */\nexport function TableCell({\n value,\n columnType,\n formatter,\n maxWidth = 200,\n onClick,\n className,\n}: TableCellProps): JSX.Element {\n const isNull = value === null || value === undefined;\n const isNumeric = isNumericType(columnType);\n\n const formattedValue = useMemo(() => {\n if (formatter) {\n return formatter(value);\n }\n return formatValue(value, columnType);\n }, [value, columnType, formatter]);\n\n const needsTruncation = formattedValue.length > 50;\n\n const cellContent = (\n <td\n className={className}\n onClick={onClick}\n style={{\n ...cellStyles,\n ...(isNull ? nullStyles : {}),\n ...(isNumeric ? numberStyles : {}),\n ...(needsTruncation ? { ...truncatedStyles, maxWidth } : {}),\n ...(onClick ? { cursor: 'pointer' } : {}),\n }}\n >\n {formattedValue}\n </td>\n );\n\n if (needsTruncation) {\n return (\n <Tooltip content={formattedValue} position=\"top\" delay={200}>\n {cellContent}\n </Tooltip>\n );\n }\n\n return cellContent;\n}\n","/**\n * TableRow component for rendering a single data row.\n */\n\nimport { TableCell } from './TableCell';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TableRowProps {\n /** Row data. */\n row: unknown[];\n /** Row index. */\n index: number;\n /** Column data types. */\n columnTypes?: string[];\n /** Custom formatters by column index or name. */\n formatters?: Record<string | number, (value: unknown) => string>;\n /** Callback when the row is clicked. */\n onRowClick?: (row: unknown[], index: number) => void;\n /** Callback when a cell is clicked. */\n onCellClick?: (value: unknown, columnIndex: number, rowIndex: number) => void;\n /** Whether the row is selected. */\n isSelected?: boolean;\n /** Additional class name. */\n className?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst rowStyles: React.CSSProperties = {\n transition: 'background-color 0.1s',\n};\n\nconst hoverStyles: React.CSSProperties = {\n backgroundColor: 'var(--prismiq-color-surface-hover)',\n};\n\nconst selectedStyles: React.CSSProperties = {\n backgroundColor: 'var(--prismiq-color-surface)',\n};\n\nconst clickableStyles: React.CSSProperties = {\n cursor: 'pointer',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * A single data row in the results table.\n */\nexport function TableRow({\n row,\n index,\n columnTypes,\n formatters,\n onRowClick,\n onCellClick,\n isSelected = false,\n className,\n}: TableRowProps): JSX.Element {\n const handleRowClick = () => {\n onRowClick?.(row, index);\n };\n\n const handleCellClick = (value: unknown, columnIndex: number) => {\n onCellClick?.(value, columnIndex, index);\n };\n\n return (\n <tr\n className={className}\n onClick={onRowClick ? handleRowClick : undefined}\n style={{\n ...rowStyles,\n ...(isSelected ? selectedStyles : {}),\n ...(onRowClick ? clickableStyles : {}),\n }}\n onMouseEnter={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = hoverStyles.backgroundColor ?? '';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = '';\n }\n }}\n >\n {row.map((cell, cellIndex) => (\n <TableCell\n key={cellIndex}\n value={cell}\n columnType={columnTypes?.[cellIndex]}\n formatter={formatters?.[cellIndex]}\n onClick={onCellClick ? () => handleCellClick(cell, cellIndex) : undefined}\n />\n ))}\n </tr>\n );\n}\n","/**\n * ResultsTable component for displaying query results.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport type { QueryResult } from '../../types';\nimport { Button, Icon } from '../ui';\nimport { Pagination } from './Pagination';\nimport { TableHeader } from './TableHeader';\nimport { TableRow } from './TableRow';\n\n// ============================================================================\n// CSV Export Utility\n// ============================================================================\n\n/**\n * Escape a value for CSV format.\n */\nfunction escapeCSVValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n const str = String(value);\n // Escape quotes and wrap in quotes if contains comma, quote, or newline\n if (str.includes(',') || str.includes('\"') || str.includes('\\n') || str.includes('\\r')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n}\n\n/**\n * Convert QueryResult to CSV string.\n */\nfunction convertToCSV(result: QueryResult): string {\n const lines: string[] = [];\n\n // Header row\n lines.push(result.columns.map(escapeCSVValue).join(','));\n\n // Data rows\n for (const row of result.rows) {\n lines.push(row.map(escapeCSVValue).join(','));\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Download a string as a file.\n */\nfunction downloadFile(content: string, filename: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ResultsTableProps {\n /** Query result data. */\n result: QueryResult | null;\n /** Whether data is currently loading. */\n loading?: boolean;\n /** Error that occurred during query execution. */\n error?: Error | null;\n /** Number of rows per page. */\n pageSize?: number;\n /** Whether columns are sortable. */\n sortable?: boolean;\n /** Callback when a column is sorted. */\n onSort?: (column: string, direction: 'asc' | 'desc') => void;\n /** Callback when a row is clicked. */\n onRowClick?: (row: unknown[], index: number) => void;\n /** Callback when a cell is clicked. */\n onCellClick?: (value: unknown, column: string, rowIndex: number) => void;\n /** Custom formatters by column name. */\n formatters?: Record<string, (value: unknown) => string>;\n /** Callback when export is requested. */\n onExport?: (format: 'csv' | 'json') => void;\n /** Additional class name. */\n className?: string;\n /** Additional styles. */\n style?: React.CSSProperties;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n backgroundColor: 'var(--prismiq-color-background)',\n overflow: 'hidden',\n height: '100%', // Fill parent container\n};\n\nconst tableContainerStyles: React.CSSProperties = {\n flex: 1,\n overflow: 'auto',\n // Height will be constrained by the parent container\n};\n\nconst tableStyles: React.CSSProperties = {\n width: '100%',\n borderCollapse: 'separate',\n borderSpacing: 0,\n fontFamily: 'var(--prismiq-font-sans)',\n};\n\nconst loadingStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 'var(--prismiq-spacing-xl)',\n color: 'var(--prismiq-color-text-muted)',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\nconst errorStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 'var(--prismiq-spacing-xl)',\n color: 'var(--prismiq-color-error)',\n gap: 'var(--prismiq-spacing-sm)',\n textAlign: 'center',\n};\n\nconst emptyStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 'var(--prismiq-spacing-xl)',\n color: 'var(--prismiq-color-text-muted)',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\nconst truncatedWarningStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-xs) var(--prismiq-spacing-md)',\n backgroundColor: 'var(--prismiq-color-warning)',\n color: '#000000',\n fontSize: 'var(--prismiq-font-size-xs)',\n textAlign: 'center',\n};\n\nconst toolbarStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n borderBottom: '1px solid var(--prismiq-color-border)',\n backgroundColor: 'var(--prismiq-color-surface)',\n};\n\nconst toolbarLeftStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text-muted)',\n};\n\nconst toolbarRightStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n};\n\n// ============================================================================\n// Loading Skeleton\n// ============================================================================\n\nfunction LoadingSkeleton(): JSX.Element {\n return (\n <div style={loadingStyles}>\n <div\n style={{\n width: 24,\n height: 24,\n border: '2px solid var(--prismiq-color-border)',\n borderTopColor: 'var(--prismiq-color-primary)',\n borderRadius: '50%',\n animation: 'prismiq-spin 0.6s linear infinite',\n }}\n />\n <span>Loading results...</span>\n </div>\n );\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Data grid component for displaying query results.\n *\n * @example\n * ```tsx\n * <ResultsTable\n * result={queryResult}\n * loading={isLoading}\n * error={error}\n * pageSize={25}\n * sortable\n * onSort={(column, direction) => handleSort(column, direction)}\n * onRowClick={(row, index) => handleRowClick(row, index)}\n * />\n * ```\n */\nexport function ResultsTable({\n result,\n loading = false,\n error = null,\n pageSize: initialPageSize = 25,\n sortable = false,\n onSort,\n onRowClick,\n onCellClick,\n formatters,\n className,\n style,\n}: ResultsTableProps): JSX.Element {\n const [currentPage, setCurrentPage] = useState(1);\n const [pageSize, setPageSize] = useState(initialPageSize);\n const [sortColumn, setSortColumn] = useState<string | undefined>();\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc');\n\n // Handle sort\n const handleSort = useCallback(\n (column: string, direction: 'asc' | 'desc') => {\n setSortColumn(column);\n setSortDirection(direction);\n onSort?.(column, direction);\n },\n [onSort]\n );\n\n // Handle cell click\n const handleCellClick = useCallback(\n (value: unknown, columnIndex: number, rowIndex: number) => {\n if (!onCellClick || !result) return;\n const column = result.columns[columnIndex];\n if (column) {\n onCellClick(value, column, rowIndex);\n }\n },\n [onCellClick, result]\n );\n\n // Convert formatters from column names to indices\n const formattersByIndex = useMemo(() => {\n if (!formatters || !result) return undefined;\n const byIndex: Record<number, (value: unknown) => string> = {};\n result.columns.forEach((column, index) => {\n if (formatters[column]) {\n byIndex[index] = formatters[column];\n }\n });\n return byIndex;\n }, [formatters, result]);\n\n // Sort and paginate rows\n const paginatedRows = useMemo(() => {\n if (!result) return [];\n\n // Apply client-side sorting if sortColumn is set\n let sortedRows = result.rows;\n if (sortColumn) {\n const columnIndex = result.columns.indexOf(sortColumn);\n if (columnIndex >= 0) {\n sortedRows = [...result.rows].sort((a, b) => {\n const aVal = a[columnIndex];\n const bVal = b[columnIndex];\n\n // Handle nulls - always sort to end\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n\n // Numeric comparison\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n return sortDirection === 'asc' ? aVal - bVal : bVal - aVal;\n }\n\n // String comparison (case-insensitive)\n const aStr = String(aVal).toLowerCase();\n const bStr = String(bVal).toLowerCase();\n const comparison = aStr.localeCompare(bStr);\n return sortDirection === 'asc' ? comparison : -comparison;\n });\n }\n }\n\n const startIndex = (currentPage - 1) * pageSize;\n return sortedRows.slice(startIndex, startIndex + pageSize);\n }, [result, currentPage, pageSize, sortColumn, sortDirection]);\n\n // Reset to first page when results change\n useEffect(() => {\n setCurrentPage(1);\n }, [result?.row_count]);\n\n // Handle page size change\n const handlePageSizeChange = useCallback((newPageSize: number) => {\n setPageSize(newPageSize);\n setCurrentPage(1);\n }, []);\n\n // Handle CSV export\n const handleExportCSV = useCallback(() => {\n if (!result) return;\n const csv = convertToCSV(result);\n const timestamp = new Date().toISOString().slice(0, 10);\n downloadFile(csv, `export-${timestamp}.csv`, 'text/csv;charset=utf-8;');\n }, [result]);\n\n // Handle JSON export\n const handleExportJSON = useCallback(() => {\n if (!result) return;\n // Convert to array of objects for easier consumption\n const data = result.rows.map((row) => {\n const obj: Record<string, unknown> = {};\n result.columns.forEach((col, i) => {\n obj[col] = row[i];\n });\n return obj;\n });\n const json = JSON.stringify(data, null, 2);\n const timestamp = new Date().toISOString().slice(0, 10);\n downloadFile(json, `export-${timestamp}.json`, 'application/json');\n }, [result]);\n\n // Render states\n if (loading) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <LoadingSkeleton />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={errorStyles}>\n <Icon name=\"error\" size={32} />\n <div>\n <strong>Query Error</strong>\n </div>\n <div style={{ fontSize: 'var(--prismiq-font-size-sm)' }}>\n {error.message}\n </div>\n </div>\n </div>\n );\n }\n\n if (!result) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={emptyStyles}>\n <Icon name=\"table\" size={32} />\n <div>No results</div>\n <div style={{ fontSize: 'var(--prismiq-font-size-xs)' }}>\n Execute a query to see results\n </div>\n </div>\n </div>\n );\n }\n\n if (result.row_count === 0) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={emptyStyles}>\n <Icon name=\"table\" size={32} />\n <div>No rows returned</div>\n <div style={{ fontSize: 'var(--prismiq-font-size-xs)' }}>\n The query executed successfully but returned no data\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n {result.truncated && (\n <div style={truncatedWarningStyles}>\n Results truncated. Showing {result.row_count.toLocaleString()} rows.\n </div>\n )}\n\n {/* Toolbar with row count and export buttons */}\n <div style={toolbarStyles}>\n <div style={toolbarLeftStyles}>\n <Icon name=\"table\" size={14} />\n <span>\n {result.row_count.toLocaleString()} row{result.row_count !== 1 ? 's' : ''}\n {result.columns.length > 0 && ` × ${result.columns.length} column${result.columns.length !== 1 ? 's' : ''}`}\n </span>\n {result.execution_time_ms !== undefined && (\n <span style={{ borderLeft: '1px solid var(--prismiq-color-border)', paddingLeft: 'var(--prismiq-spacing-sm)' }}>\n {result.execution_time_ms < 1000\n ? `${Math.round(result.execution_time_ms)}ms`\n : `${(result.execution_time_ms / 1000).toFixed(2)}s`}\n </span>\n )}\n </div>\n <div style={toolbarRightStyles}>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleExportCSV} title=\"Export as CSV\">\n <Icon name=\"download\" size={14} />\n <span>CSV</span>\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleExportJSON} title=\"Export as JSON\">\n <Icon name=\"download\" size={14} />\n <span>JSON</span>\n </Button>\n </div>\n </div>\n\n <div style={tableContainerStyles}>\n <table style={tableStyles}>\n <TableHeader\n columns={result.columns}\n columnTypes={result.column_types}\n sortable={sortable}\n sortColumn={sortColumn}\n sortDirection={sortDirection}\n onSort={handleSort}\n />\n <tbody>\n {paginatedRows.map((row, index) => (\n <TableRow\n key={index}\n row={row}\n index={(currentPage - 1) * pageSize + index}\n columnTypes={result.column_types}\n formatters={formattersByIndex}\n onRowClick={onRowClick}\n onCellClick={onCellClick ? handleCellClick : undefined}\n />\n ))}\n </tbody>\n </table>\n </div>\n\n <Pagination\n currentPage={currentPage}\n totalItems={result.row_count}\n pageSize={pageSize}\n onPageChange={setCurrentPage}\n onPageSizeChange={handlePageSizeChange}\n />\n </div>\n );\n}\n","/**\n * ExpressionEditor component for editing calculated field expressions.\n *\n * Provides a text input with:\n * - Expression syntax help\n * - Available functions reference\n * - Field reference insertion\n */\n\nimport { useState, useCallback, useRef } from 'react';\nimport { useTheme } from '../../theme';\nimport { Input } from '../ui/Input';\nimport { Button } from '../ui/Button';\nimport { Dropdown, DropdownItem, DropdownSeparator } from '../ui/Dropdown';\nimport { Icon } from '../ui/Icon';\nimport type { QueryTable, DatabaseSchema } from '../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ExpressionEditorProps {\n /** Current expression value. */\n value: string;\n /** Callback when expression changes. */\n onChange: (value: string) => void;\n /** Tables in the query (for field references). */\n tables: QueryTable[];\n /** Database schema for field information. */\n schema: DatabaseSchema;\n /** Placeholder text. */\n placeholder?: string;\n /** Whether the input is disabled. */\n disabled?: boolean;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst FUNCTIONS = [\n { name: 'if', signature: 'if(condition, true_val, false_val)', description: 'Conditional expression' },\n { name: 'sum', signature: 'sum(expr)', description: 'Sum of values' },\n { name: 'avg', signature: 'avg(expr)', description: 'Average of values' },\n { name: 'count', signature: 'count(expr)', description: 'Count of values' },\n { name: 'min', signature: 'min(expr)', description: 'Minimum value' },\n { name: 'max', signature: 'max(expr)', description: 'Maximum value' },\n { name: 'year', signature: 'year(date)', description: 'Extract year from date' },\n { name: 'month', signature: 'month(date)', description: 'Extract month from date' },\n { name: 'day', signature: 'day(date)', description: 'Extract day from date' },\n { name: 'datediff', signature: 'datediff(date1, date2)', description: 'Days between dates' },\n { name: 'today', signature: 'today()', description: 'Current date' },\n { name: 'concatenate', signature: 'concatenate(str1, str2, ...)', description: 'Join strings' },\n];\n\nconst OPERATORS = [\n { symbol: '+', description: 'Addition' },\n { symbol: '-', description: 'Subtraction' },\n { symbol: '*', description: 'Multiplication' },\n { symbol: '/', description: 'Division' },\n { symbol: '==', description: 'Equals' },\n { symbol: '!=', description: 'Not equals' },\n { symbol: '>', description: 'Greater than' },\n { symbol: '<', description: 'Less than' },\n { symbol: '>=', description: 'Greater or equal' },\n { symbol: '<=', description: 'Less or equal' },\n];\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Expression editor with syntax help and field insertion.\n */\nexport function ExpressionEditor({\n value,\n onChange,\n tables,\n schema,\n placeholder = 'Enter expression (e.g., [revenue] - [cost])',\n disabled = false,\n}: ExpressionEditorProps): JSX.Element {\n const { theme } = useTheme();\n const inputRef = useRef<HTMLInputElement>(null);\n const [showHelp, setShowHelp] = useState(false);\n\n // Insert text at cursor position\n const insertText = useCallback(\n (text: string) => {\n const input = inputRef.current;\n if (!input) {\n onChange(value + text);\n return;\n }\n\n const start = input.selectionStart ?? value.length;\n const end = input.selectionEnd ?? value.length;\n const newValue = value.slice(0, start) + text + value.slice(end);\n onChange(newValue);\n\n // Move cursor after inserted text\n setTimeout(() => {\n input.selectionStart = input.selectionEnd = start + text.length;\n input.focus();\n }, 0);\n },\n [value, onChange]\n );\n\n // Insert field reference\n const insertFieldRef = useCallback(\n (tableId: string, column: string) => {\n const table = tables.find((t) => t.id === tableId);\n if (tables.length > 1 && table) {\n insertText(`[${table.alias ?? table.name}.${column}]`);\n } else {\n insertText(`[${column}]`);\n }\n },\n [tables, insertText]\n );\n\n // Insert function\n const insertFunction = useCallback(\n (fn: (typeof FUNCTIONS)[0]) => {\n insertText(fn.signature);\n },\n [insertText]\n );\n\n // Styles\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.sm,\n };\n\n const inputRowStyle: React.CSSProperties = {\n display: 'flex',\n gap: theme.spacing.xs,\n alignItems: 'center',\n };\n\n const helpStyle: React.CSSProperties = {\n padding: theme.spacing.md,\n backgroundColor: theme.colors.surface,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.md,\n fontSize: theme.fontSizes.xs,\n };\n\n const sectionStyle: React.CSSProperties = {\n marginBottom: theme.spacing.md,\n };\n\n const sectionTitleStyle: React.CSSProperties = {\n fontWeight: 600,\n marginBottom: theme.spacing.xs,\n color: theme.colors.text,\n };\n\n const listStyle: React.CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n gap: theme.spacing.xs,\n margin: 0,\n padding: 0,\n listStyle: 'none',\n };\n\n const itemStyle: React.CSSProperties = {\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n backgroundColor: theme.colors.background,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.sm,\n cursor: 'pointer',\n fontSize: theme.fontSizes.xs,\n };\n\n return (\n <div style={containerStyle}>\n <div style={inputRowStyle}>\n <Input\n ref={inputRef}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n style={{ flex: 1, fontFamily: 'monospace' }}\n />\n\n {/* Insert Field Dropdown */}\n <Dropdown\n trigger={\n <Button variant=\"secondary\" size=\"sm\" disabled={disabled || tables.length === 0}>\n <Icon name=\"table\" size={14} />\n </Button>\n }\n >\n {tables.flatMap((table) => {\n const tableSchema = schema.tables.find((t) => t.name === table.name);\n if (!tableSchema) return [];\n\n return [\n <DropdownItem key={`header-${table.id}`} disabled>\n {table.alias ?? table.name}\n </DropdownItem>,\n ...tableSchema.columns.map((col) => (\n <DropdownItem\n key={`${table.id}-${col.name}`}\n onClick={() => insertFieldRef(table.id, col.name)}\n >\n {col.name}\n <span style={{ color: theme.colors.textMuted, marginLeft: theme.spacing.sm }}>\n ({col.data_type})\n </span>\n </DropdownItem>\n )),\n <DropdownSeparator key={`sep-${table.id}`} />,\n ];\n })}\n </Dropdown>\n\n {/* Insert Function Dropdown */}\n <Dropdown\n trigger={\n <Button variant=\"secondary\" size=\"sm\" disabled={disabled}>\n <Icon name=\"settings\" size={14} />\n </Button>\n }\n >\n {FUNCTIONS.map((fn) => (\n <DropdownItem key={fn.name} onClick={() => insertFunction(fn)}>\n <span style={{ fontFamily: 'monospace' }}>{fn.name}()</span>\n <span style={{ color: theme.colors.textMuted, marginLeft: theme.spacing.sm }}>\n {fn.description}\n </span>\n </DropdownItem>\n ))}\n </Dropdown>\n\n {/* Help Toggle */}\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setShowHelp(!showHelp)}>\n <Icon name=\"info\" size={14} />\n </Button>\n </div>\n\n {/* Syntax Help */}\n {showHelp && (\n <div style={helpStyle}>\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Field References</div>\n <p style={{ margin: 0, color: theme.colors.textMuted }}>\n Use <code>[field_name]</code> to reference columns, or{' '}\n <code>[Table.field]</code> for multi-table queries.\n </p>\n </div>\n\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Operators</div>\n <ul style={listStyle}>\n {OPERATORS.map((op) => (\n <li\n key={op.symbol}\n style={itemStyle}\n onClick={() => insertText(` ${op.symbol} `)}\n title={op.description}\n >\n {op.symbol}\n </li>\n ))}\n </ul>\n </div>\n\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Functions</div>\n <ul style={listStyle}>\n {FUNCTIONS.map((fn) => (\n <li\n key={fn.name}\n style={itemStyle}\n onClick={() => insertFunction(fn)}\n title={fn.description}\n >\n {fn.name}()\n </li>\n ))}\n </ul>\n </div>\n\n <div>\n <div style={sectionTitleStyle}>Examples</div>\n <ul style={{ margin: 0, paddingLeft: theme.spacing.md, color: theme.colors.textMuted }}>\n <li><code>[revenue] - [cost]</code> - Calculate profit</li>\n <li><code>if([status] == \"active\", 1, 0)</code> - Conditional value</li>\n <li><code>year([created_at])</code> - Extract year</li>\n <li><code>datediff(today(), [order_date])</code> - Days since order</li>\n </ul>\n </div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * CalculatedFieldBuilder component for creating and managing calculated fields.\n *\n * Provides UI for:\n * - Adding new calculated fields\n * - Editing field names and expressions\n * - Selecting data types\n * - Removing fields\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useTheme } from '../../theme';\nimport { Input } from '../ui/Input';\nimport { Select } from '../ui/Select';\nimport { Button } from '../ui/Button';\nimport { Icon } from '../ui/Icon';\nimport { ExpressionEditor } from './ExpressionEditor';\nimport type { CalculatedField, QueryTable, DatabaseSchema } from '../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CalculatedFieldBuilderProps {\n /** Current calculated fields. */\n fields: CalculatedField[];\n /** Callback when fields change. */\n onChange: (fields: CalculatedField[]) => void;\n /** Tables in the query (for field references). */\n tables: QueryTable[];\n /** Database schema for field information. */\n schema: DatabaseSchema;\n /** Maximum number of calculated fields allowed. */\n maxFields?: number;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DATA_TYPE_OPTIONS = [\n { value: 'number', label: 'Number' },\n { value: 'string', label: 'Text' },\n { value: 'date', label: 'Date' },\n { value: 'boolean', label: 'Boolean' },\n];\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Builder for creating and managing calculated fields.\n */\nexport function CalculatedFieldBuilder({\n fields,\n onChange,\n tables,\n schema,\n maxFields = 10,\n}: CalculatedFieldBuilderProps): JSX.Element {\n const { theme } = useTheme();\n\n // Counter for generating unique IDs when no stable property exists\n const idCounter = useRef(0);\n // Map from stable key (derived from field data) to generated ID\n const stableIdsRef = useRef<Map<string, string>>(new Map());\n\n /**\n * Get or create a stable ID for a field.\n * Uses field name + index to create a stable key, falling back to counter for duplicates.\n */\n const getFieldId = useCallback((field: CalculatedField, index: number): string => {\n // Create a stable key from field data\n const stableKey = field.name ? `${field.name}-${index}` : `unnamed-${index}`;\n\n let id = stableIdsRef.current.get(stableKey);\n if (!id) {\n id = `field-${++idCounter.current}`;\n stableIdsRef.current.set(stableKey, id);\n }\n return id;\n }, []);\n\n const addField = useCallback(() => {\n if (fields.length >= maxFields) return;\n\n const newField: CalculatedField = {\n name: `calculated_${fields.length + 1}`,\n expression: '',\n data_type: 'number',\n };\n onChange([...fields, newField]);\n }, [fields, onChange, maxFields]);\n\n // Update a field\n const updateField = useCallback(\n (index: number, updates: Partial<CalculatedField>) => {\n onChange(fields.map((f, i) => (i === index ? { ...f, ...updates } : f)));\n },\n [fields, onChange]\n );\n\n // Remove a field\n const removeField = useCallback(\n (index: number) => {\n onChange(fields.filter((_, i) => i !== index));\n },\n [fields, onChange]\n );\n\n // Styles\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.md,\n };\n\n const fieldCardStyle: React.CSSProperties = {\n padding: theme.spacing.md,\n backgroundColor: theme.colors.surface,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.md,\n };\n\n const fieldHeaderStyle: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: theme.spacing.sm,\n };\n\n const fieldIndexStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n fontWeight: 500,\n };\n\n const fieldRowStyle: React.CSSProperties = {\n display: 'flex',\n gap: theme.spacing.sm,\n marginBottom: theme.spacing.sm,\n };\n\n const labelStyle: React.CSSProperties = {\n display: 'block',\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n marginBottom: theme.spacing.xs,\n };\n\n const helpTextStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n };\n\n const emptyStateStyle: React.CSSProperties = {\n padding: theme.spacing.lg,\n textAlign: 'center',\n color: theme.colors.textMuted,\n border: `1px dashed ${theme.colors.border}`,\n borderRadius: theme.radius.md,\n };\n\n return (\n <div style={containerStyle}>\n {fields.length === 0 ? (\n <div style={emptyStateStyle}>\n <p style={{ margin: 0, marginBottom: theme.spacing.sm }}>\n No calculated fields defined\n </p>\n <p style={{ ...helpTextStyle, margin: 0 }}>\n Create computed columns using expressions like <code>[revenue] - [cost]</code>\n </p>\n </div>\n ) : (\n fields.map((field, index) => (\n <div key={getFieldId(field, index)} style={fieldCardStyle}>\n <div style={fieldHeaderStyle}>\n <span style={fieldIndexStyle}>Calculated Field #{index + 1}</span>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => removeField(index)}>\n <Icon name=\"trash\" size={14} />\n </Button>\n </div>\n\n <div style={fieldRowStyle}>\n <div style={{ flex: 1 }}>\n <label style={labelStyle}>Name</label>\n <Input\n value={field.name}\n onChange={(e) => updateField(index, { name: e.target.value })}\n placeholder=\"field_name\"\n />\n </div>\n <div style={{ width: '120px' }}>\n <label style={labelStyle}>Data Type</label>\n <Select\n value={field.data_type ?? 'number'}\n onChange={(value) => updateField(index, { data_type: value })}\n options={DATA_TYPE_OPTIONS}\n />\n </div>\n </div>\n\n <div>\n <label style={labelStyle}>Expression</label>\n <ExpressionEditor\n value={field.expression}\n onChange={(expression) => updateField(index, { expression })}\n tables={tables}\n schema={schema}\n />\n </div>\n </div>\n ))\n )}\n\n {fields.length < maxFields && (\n <Button\n variant=\"secondary\"\n onClick={addField}\n style={{ alignSelf: 'flex-start' }}\n >\n <Icon name=\"plus\" size={14} />\n <span style={{ marginLeft: theme.spacing.xs }}>Add Calculated Field</span>\n </Button>\n )}\n\n {fields.length >= maxFields && (\n <span style={helpTextStyle}>\n Maximum of {maxFields} calculated fields reached\n </span>\n )}\n </div>\n );\n}\n","/**\n * SavedQueryPicker component.\n *\n * Allows users to select, save, and manage saved queries.\n */\n\nimport {\n forwardRef,\n useCallback,\n useState,\n type HTMLAttributes,\n} from 'react';\n\nimport { useSavedQueries } from '../../hooks/useSavedQueries';\nimport type { QueryDefinition, SavedQuery } from '../../types';\nimport { Button } from '../ui/Button';\nimport { Dropdown, DropdownItem, DropdownSeparator } from '../ui/Dropdown';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SavedQueryPickerProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n /** Current query definition (used when saving). */\n currentQuery?: QueryDefinition | null;\n /** Callback when a saved query is selected. */\n onSelect?: (query: SavedQuery) => void;\n /** Callback after successfully saving a query. */\n onSave?: (query: SavedQuery) => void;\n /** Whether to show the save option. */\n showSave?: boolean;\n /** Custom trigger element. */\n trigger?: React.ReactNode;\n /** Label for the trigger button. */\n label?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n display: 'inline-block',\n};\n\nconst queryItemStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: '2px',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n cursor: 'pointer',\n transition: 'background-color 0.1s',\n};\n\nconst queryNameStyles: React.CSSProperties = {\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-base)',\n fontWeight: 500,\n color: 'var(--prismiq-color-text)',\n};\n\nconst queryDescStyles: React.CSSProperties = {\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text-muted)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: '200px',\n};\n\nconst emptyStyles: React.CSSProperties = {\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text-muted)',\n padding: 'var(--prismiq-spacing-md)',\n textAlign: 'center',\n};\n\nconst loadingStyles: React.CSSProperties = {\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text-muted)',\n padding: 'var(--prismiq-spacing-md)',\n textAlign: 'center',\n};\n\nconst dialogOverlayStyles: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10001,\n};\n\nconst dialogStyles: React.CSSProperties = {\n backgroundColor: 'var(--prismiq-color-background)',\n borderRadius: 'var(--prismiq-radius-lg)',\n padding: 'var(--prismiq-spacing-lg)',\n minWidth: '300px',\n maxWidth: '400px',\n boxShadow: 'var(--prismiq-shadow-lg)',\n};\n\nconst dialogTitleStyles: React.CSSProperties = {\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-lg)',\n fontWeight: 600,\n color: 'var(--prismiq-color-text)',\n marginBottom: 'var(--prismiq-spacing-md)',\n};\n\nconst inputStyles: React.CSSProperties = {\n width: '100%',\n padding: 'var(--prismiq-spacing-sm)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-base)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n marginBottom: 'var(--prismiq-spacing-sm)',\n boxSizing: 'border-box',\n};\n\nconst dialogActionsStyles: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 'var(--prismiq-spacing-sm)',\n marginTop: 'var(--prismiq-spacing-md)',\n};\n\nconst sharedBadgeStyles: React.CSSProperties = {\n display: 'inline-block',\n fontSize: '10px',\n padding: '1px 4px',\n backgroundColor: 'var(--prismiq-color-primary)',\n color: 'var(--prismiq-color-text-inverse)',\n borderRadius: 'var(--prismiq-radius-sm)',\n marginLeft: 'var(--prismiq-spacing-xs)',\n};\n\n// ============================================================================\n// SaveDialog Component\n// ============================================================================\n\ninterface SaveDialogProps {\n isOpen: boolean;\n onClose: () => void;\n onSave: (name: string, description: string, isShared: boolean) => void;\n isSaving: boolean;\n}\n\nfunction SaveDialog({ isOpen, onClose, onSave, isSaving }: SaveDialogProps) {\n const [name, setName] = useState('');\n const [description, setDescription] = useState('');\n const [isShared, setIsShared] = useState(false);\n\n const handleSubmit = useCallback(() => {\n if (name.trim()) {\n onSave(name.trim(), description.trim(), isShared);\n }\n }, [name, description, isShared, onSave]);\n\n if (!isOpen) return null;\n\n return (\n <div style={dialogOverlayStyles} onClick={onClose}>\n <div style={dialogStyles} onClick={(e) => e.stopPropagation()}>\n <div style={dialogTitleStyles}>Save Query</div>\n <input\n type=\"text\"\n placeholder=\"Query name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n style={inputStyles}\n autoFocus\n />\n <textarea\n placeholder=\"Description (optional)\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={2}\n style={{ ...inputStyles, resize: 'vertical' }}\n />\n <label\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n cursor: 'pointer',\n }}\n >\n <input\n type=\"checkbox\"\n checked={isShared}\n onChange={(e) => setIsShared(e.target.checked)}\n />\n Share with all users\n </label>\n <div style={dialogActionsStyles}>\n <Button variant=\"secondary\" onClick={onClose} disabled={isSaving}>\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n onClick={handleSubmit}\n disabled={!name.trim() || isSaving}\n loading={isSaving}\n >\n Save\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * SavedQueryPicker component for selecting and saving queries.\n *\n * @example\n * ```tsx\n * <SavedQueryPicker\n * currentQuery={query}\n * onSelect={(savedQuery) => setQuery(savedQuery.query)}\n * onSave={(savedQuery) => console.log('Saved:', savedQuery.name)}\n * />\n * ```\n */\nexport const SavedQueryPicker = forwardRef<HTMLDivElement, SavedQueryPickerProps>(\n function SavedQueryPicker(\n {\n currentQuery,\n onSelect,\n onSave,\n showSave = true,\n trigger,\n label = 'Saved Queries',\n style,\n className,\n ...props\n },\n ref\n ) {\n const { data, isLoading, createQuery } = useSavedQueries();\n const [isSaveDialogOpen, setIsSaveDialogOpen] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n\n const handleSelect = useCallback(\n (query: SavedQuery) => {\n onSelect?.(query);\n },\n [onSelect]\n );\n\n const handleSave = useCallback(\n async (name: string, description: string, isShared: boolean) => {\n if (!currentQuery) return;\n\n setIsSaving(true);\n try {\n const saved = await createQuery({\n name,\n description: description || undefined,\n query: currentQuery,\n is_shared: isShared,\n });\n onSave?.(saved);\n setIsSaveDialogOpen(false);\n } catch (error) {\n console.error('Failed to save query:', error);\n } finally {\n setIsSaving(false);\n }\n },\n [currentQuery, createQuery, onSave]\n );\n\n const triggerElement = trigger || (\n <Button variant=\"secondary\" size=\"sm\">\n {label}\n </Button>\n );\n\n const renderContent = () => {\n if (isLoading) {\n return <div style={loadingStyles}>Loading...</div>;\n }\n\n const queries = data || [];\n const hasQueries = queries.length > 0;\n\n return (\n <>\n {!hasQueries && <div style={emptyStyles}>No saved queries</div>}\n\n {queries.map((query) => (\n <DropdownItem\n key={query.id}\n onClick={() => handleSelect(query)}\n style={{ padding: 0 }}\n >\n <div style={queryItemStyles}>\n <div style={queryNameStyles}>\n {query.name}\n {query.is_shared && <span style={sharedBadgeStyles}>Shared</span>}\n </div>\n {query.description && (\n <div style={queryDescStyles}>{query.description}</div>\n )}\n </div>\n </DropdownItem>\n ))}\n\n {showSave && currentQuery && (\n <>\n {hasQueries && <DropdownSeparator />}\n <DropdownItem onClick={() => setIsSaveDialogOpen(true)}>\n Save current query...\n </DropdownItem>\n </>\n )}\n </>\n );\n };\n\n return (\n <div ref={ref} style={{ ...containerStyles, ...style }} className={className} {...props}>\n <Dropdown trigger={triggerElement}>{renderContent()}</Dropdown>\n\n <SaveDialog\n isOpen={isSaveDialogOpen}\n onClose={() => setIsSaveDialogOpen(false)}\n onSave={handleSave}\n isSaving={isSaving}\n />\n </div>\n );\n }\n);\n","/**\n * TimeSeriesConfig component for configuring time series queries.\n *\n * Provides controls for:\n * - Time bucket interval (minute, hour, day, week, month, quarter, year)\n * - Fill missing time buckets toggle\n * - Fill value for missing buckets\n */\n\nimport { useMemo, useState, type ChangeEvent } from 'react';\nimport { useTheme } from '../../theme';\nimport { Select } from '../ui/Select';\nimport { Checkbox } from '../ui/Checkbox';\nimport { Input } from '../ui/Input';\nimport type {\n DatabaseSchema,\n QueryTable,\n TimeSeriesConfig as TimeSeriesConfigType,\n TimeSeriesInterval,\n} from '../../types';\nimport { parseColumnRef } from '../../utils/columnRef';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TimeSeriesConfigProps {\n /** Database schema for column type detection. */\n schema: DatabaseSchema;\n /** Tables in the current query. */\n tables: QueryTable[];\n /** Current time series configuration (can be undefined). */\n config: TimeSeriesConfigType | undefined;\n /** Callback when configuration changes. */\n onChange: (config: TimeSeriesConfigType | undefined) => void;\n /** Pre-selected date column (from group by selection). */\n selectedDateColumn?: {\n table_id: string;\n column: string;\n };\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst INTERVAL_OPTIONS: { value: TimeSeriesInterval; label: string }[] = [\n { value: 'day', label: 'Day' },\n { value: 'week', label: 'Week' },\n { value: 'month', label: 'Month' },\n { value: 'quarter', label: 'Quarter' },\n { value: 'year', label: 'Year' },\n];\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Check if a column is a date/timestamp type.\n */\nfunction isDateType(dataType: string): boolean {\n const type = dataType.toLowerCase();\n return type.includes('date') || type.includes('time') || type.includes('timestamp');\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Time series configuration component for date-based charts.\n */\nexport function TimeSeriesConfig({\n schema,\n tables,\n config,\n onChange,\n selectedDateColumn,\n}: TimeSeriesConfigProps): JSX.Element {\n const { theme } = useTheme();\n const [error, setError] = useState<string | null>(null);\n\n // Find all date columns from selected tables\n const dateColumnOptions = useMemo(() => {\n const options: { value: string; label: string; tableId: string }[] = [];\n\n for (const table of tables) {\n const tableSchema = schema.tables.find((t) => t.name === table.name);\n if (!tableSchema) continue;\n\n for (const col of tableSchema.columns) {\n if (isDateType(col.data_type)) {\n options.push({\n value: `${table.id}.${col.name}`,\n label:\n tables.length > 1\n ? `${table.alias ?? table.name}.${col.name}`\n : col.name,\n tableId: table.id,\n });\n }\n }\n }\n\n return options;\n }, [tables, schema.tables]);\n\n // Determine current values\n const isEnabled = config !== undefined;\n const currentDateColumn = config\n ? `${config.table_id}.${config.date_column}`\n : selectedDateColumn\n ? `${selectedDateColumn.table_id}.${selectedDateColumn.column}`\n : dateColumnOptions[0]?.value ?? '';\n const currentInterval = config?.interval ?? 'day';\n const fillMissing = config?.fill_missing ?? false;\n const fillValue = config?.fill_value ?? 0;\n\n // Handle enabling/disabling time series\n const handleToggle = (e: ChangeEvent<HTMLInputElement>) => {\n setError(null);\n\n if (!e.target.checked) {\n onChange(undefined);\n return;\n }\n\n if (!currentDateColumn) {\n setError('No date column available. Add a date column to the query first.');\n return;\n }\n\n const parsed = parseColumnRef(currentDateColumn, 't1');\n if (!parsed) {\n setError('Invalid date column reference. Please select a valid date column.');\n return;\n }\n\n onChange({\n table_id: parsed.tableId,\n date_column: parsed.column,\n interval: 'day',\n fill_missing: false,\n });\n };\n\n // Handle date column change\n const handleDateColumnChange = (value: string) => {\n if (!config || !value) return;\n\n const parsed = parseColumnRef(value, config.table_id);\n if (!parsed) {\n setError('Invalid column reference. Please select a valid date column.');\n return;\n }\n\n setError(null);\n onChange({\n ...config,\n table_id: parsed.tableId,\n date_column: parsed.column,\n });\n };\n\n // Handle interval change\n const handleIntervalChange = (value: string) => {\n if (!config) return;\n onChange({\n ...config,\n interval: value as TimeSeriesInterval,\n });\n };\n\n // Handle fill missing toggle\n const handleFillMissingChange = (e: ChangeEvent<HTMLInputElement>) => {\n if (!config) return;\n onChange({\n ...config,\n fill_missing: e.target.checked,\n fill_value: e.target.checked ? (config.fill_value ?? 0) : undefined,\n });\n };\n\n // Handle fill value change\n const handleFillValueChange = (e: ChangeEvent<HTMLInputElement>) => {\n if (!config) return;\n const value = parseFloat(e.target.value);\n onChange({\n ...config,\n fill_value: isNaN(value) ? 0 : value,\n });\n };\n\n // Styles\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.md,\n };\n\n const fieldStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.xs,\n };\n\n const labelStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.sm,\n color: theme.colors.text,\n };\n\n const helpTextStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n };\n\n const rowStyle: React.CSSProperties = {\n display: 'flex',\n gap: theme.spacing.sm,\n alignItems: 'center',\n };\n\n const errorStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.error,\n marginTop: theme.spacing.xs,\n };\n\n // No date columns available\n if (dateColumnOptions.length === 0) {\n return (\n <div style={containerStyle}>\n <span style={helpTextStyle}>\n No date/timestamp columns available in selected tables\n </span>\n </div>\n );\n }\n\n return (\n <div style={containerStyle}>\n {/* Enable Time Series Toggle */}\n <Checkbox\n label=\"Enable Time Series Mode\"\n checked={isEnabled}\n onChange={handleToggle}\n />\n <span style={helpTextStyle}>\n Automatically bucket dates and optionally fill missing time periods\n </span>\n {error && <span style={errorStyle}>{error}</span>}\n\n {isEnabled && (\n <>\n {/* Date Column Selection */}\n <div style={fieldStyle}>\n <label style={labelStyle}>Date Column</label>\n <Select\n value={currentDateColumn}\n onChange={handleDateColumnChange}\n options={dateColumnOptions}\n />\n </div>\n\n {/* Interval Selection */}\n <div style={fieldStyle}>\n <label style={labelStyle}>Time Interval</label>\n <Select\n value={currentInterval}\n onChange={handleIntervalChange}\n options={INTERVAL_OPTIONS}\n />\n <span style={helpTextStyle}>\n Group data into buckets of this size\n </span>\n </div>\n\n {/* Fill Missing Toggle */}\n <Checkbox\n label=\"Fill Missing Periods\"\n checked={fillMissing}\n onChange={handleFillMissingChange}\n />\n\n {/* Fill Value (when fill missing is enabled) */}\n {fillMissing && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Fill Value</label>\n <div style={rowStyle}>\n <Input\n type=\"number\"\n value={String(fillValue)}\n onChange={handleFillValueChange}\n style={{ width: '100px' }}\n />\n <span style={helpTextStyle}>\n Value for missing time periods\n </span>\n </div>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","/**\n * QueryBuilderToolbar component for query actions.\n */\n\nimport { Button, Icon } from '../ui';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface QueryBuilderToolbarProps {\n /** Whether a query is currently executing. */\n isExecuting: boolean;\n /** Whether the query can be executed (has valid configuration). */\n canExecute: boolean;\n /** Callback when execute button is clicked. */\n onExecute: () => void;\n /** Callback when preview button is clicked. */\n onPreview: () => void;\n /** Callback when clear button is clicked. */\n onClear: () => void;\n /** Whether SQL preview is currently shown. */\n showingPreview?: boolean;\n /** Additional class name. */\n className?: string;\n /** Additional styles. */\n style?: React.CSSProperties;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst toolbarStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n padding: 'var(--prismiq-spacing-sm) 0',\n borderTop: '1px solid var(--prismiq-color-border)',\n borderBottom: '1px solid var(--prismiq-color-border)',\n};\n\nconst leftGroupStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\nconst spacerStyles: React.CSSProperties = {\n flex: 1,\n};\n\nconst hintStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-xs)',\n color: 'var(--prismiq-color-text-muted)',\n};\n\nconst kbdStyles: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '2px',\n padding: '2px 5px',\n fontSize: '10px',\n fontFamily: 'var(--prismiq-font-mono)',\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: '3px',\n marginLeft: '4px',\n};\n\n// Detect if Mac\nconst isMac = typeof navigator !== 'undefined' && /Mac|iPod|iPhone|iPad/.test(navigator.platform);\nconst modKey = isMac ? '⌘' : 'Ctrl';\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Toolbar with execute, preview, and clear buttons.\n */\nexport function QueryBuilderToolbar({\n isExecuting,\n canExecute,\n onExecute,\n onPreview,\n onClear,\n className,\n style,\n}: QueryBuilderToolbarProps): JSX.Element {\n return (\n <div className={className} style={{ ...toolbarStyles, ...style }}>\n <div style={leftGroupStyles}>\n <Button\n variant=\"primary\"\n size=\"sm\"\n leftIcon={<Icon name=\"play\" size={14} />}\n onClick={onExecute}\n disabled={!canExecute}\n loading={isExecuting}\n title={`Execute query (${modKey}+Enter)`}\n >\n Execute\n </Button>\n\n <Button\n variant=\"secondary\"\n size=\"sm\"\n leftIcon={<Icon name=\"search\" size={14} />}\n onClick={onPreview}\n disabled={!canExecute || isExecuting}\n title=\"Preview first 100 rows\"\n >\n Preview\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n leftIcon={<Icon name=\"trash\" size={14} />}\n onClick={onClear}\n disabled={isExecuting}\n title=\"Clear query\"\n >\n Clear\n </Button>\n </div>\n\n <div style={spacerStyles} />\n\n <span style={hintStyles}>\n <kbd style={kbdStyles}>{modKey}</kbd>\n <kbd style={kbdStyles}>↵</kbd>\n <span style={{ marginLeft: '4px' }}>to execute</span>\n </span>\n </div>\n );\n}\n","/**\n * QueryPreview component for displaying SQL preview.\n */\n\nimport { useState } from 'react';\n\nimport { Button, Icon } from '../ui';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface QueryPreviewProps {\n /** The SQL query string. */\n sql: string | null;\n /** Whether the preview is loading. */\n loading?: boolean;\n /** Error message if SQL generation failed. */\n error?: string | null;\n /** Whether the preview is collapsible. */\n collapsible?: boolean;\n /** Initial collapsed state. */\n defaultCollapsed?: boolean;\n /** Additional class name. */\n className?: string;\n /** Additional styles. */\n style?: React.CSSProperties;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n overflow: 'hidden',\n};\n\nconst headerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n backgroundColor: 'var(--prismiq-color-surface)',\n borderBottom: '1px solid var(--prismiq-color-border)',\n cursor: 'pointer',\n};\n\nconst titleStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n fontSize: 'var(--prismiq-font-size-sm)',\n fontWeight: 600,\n color: 'var(--prismiq-color-text)',\n};\n\nconst actionsStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\nconst contentStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-md)',\n backgroundColor: 'var(--prismiq-color-background)',\n overflow: 'auto',\n maxHeight: '200px',\n};\n\nconst codeStyles: React.CSSProperties = {\n fontFamily: 'var(--prismiq-font-mono)',\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text)',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n margin: 0,\n};\n\nconst emptyStyles: React.CSSProperties = {\n color: 'var(--prismiq-color-text-muted)',\n fontStyle: 'italic',\n};\n\nconst errorStyles: React.CSSProperties = {\n color: 'var(--prismiq-color-error)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * SQL preview panel with syntax highlighting (basic).\n */\nexport function QueryPreview({\n sql,\n loading = false,\n error = null,\n collapsible = true,\n defaultCollapsed = false,\n className,\n style,\n}: QueryPreviewProps): JSX.Element {\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n\n const handleCopy = async () => {\n if (sql) {\n try {\n await navigator.clipboard.writeText(sql);\n } catch {\n // Fallback for older browsers\n console.warn('Failed to copy to clipboard');\n }\n }\n };\n\n const handleToggle = () => {\n if (collapsible) {\n setIsCollapsed((prev) => !prev);\n }\n };\n\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div\n style={headerStyles}\n onClick={handleToggle}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleToggle();\n }\n }}\n >\n <span style={titleStyles}>\n {collapsible && (\n <Icon\n name=\"chevron-right\"\n size={14}\n style={{\n transform: isCollapsed ? 'rotate(0deg)' : 'rotate(90deg)',\n transition: 'transform 0.15s',\n }}\n />\n )}\n <Icon name=\"column\" size={14} />\n SQL Preview\n </span>\n\n <div style={actionsStyles} onClick={(e) => e.stopPropagation()}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n leftIcon={<Icon name=\"copy\" size={14} />}\n onClick={handleCopy}\n disabled={!sql || loading}\n >\n Copy\n </Button>\n </div>\n </div>\n\n {!isCollapsed && (\n <div style={contentStyles}>\n {loading ? (\n <span style={emptyStyles}>Generating SQL...</span>\n ) : error ? (\n <span style={errorStyles}>{error}</span>\n ) : sql ? (\n <pre style={codeStyles}>{sql}</pre>\n ) : (\n <span style={emptyStyles}>\n Build a query to see the SQL preview\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n","/**\n * QueryBuilder component - main container combining all query building components.\n */\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { useAnalytics, useSchema, useQuery as useQueryHook } from '../../hooks';\nimport type {\n CalculatedField,\n ColumnSelection,\n ColumnSchema,\n FilterDefinition,\n JoinDefinition,\n QueryDefinition,\n QueryResult,\n SavedQuery,\n SortDefinition,\n TableSchema,\n TimeSeriesConfig as TimeSeriesConfigType,\n} from '../../types';\nimport { CalculatedFieldBuilder } from '../CalculatedFieldBuilder';\nimport { ColumnSelector } from '../ColumnSelector';\nimport { FilterBuilder } from '../FilterBuilder';\nimport { JoinBuilder } from '../JoinBuilder';\nimport { ResultsTable } from '../ResultsTable';\nimport { SavedQueryPicker } from '../SavedQueryPicker';\nimport { SchemaExplorer } from '../SchemaExplorer';\nimport { SortBuilder } from '../SortBuilder';\nimport { TimeSeriesConfig } from '../TimeSeriesConfig';\nimport { CollapsibleSection } from '../ui/CollapsibleSection';\nimport { QueryBuilderToolbar } from './QueryBuilderToolbar';\nimport { QueryPreview } from './QueryPreview';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface QueryBuilderProps {\n /** Initial query definition. */\n initialQuery?: QueryDefinition;\n /** Callback when query changes. */\n onQueryChange?: (query: QueryDefinition) => void;\n /** Callback when query is executed successfully. */\n onExecute?: (result: QueryResult) => void;\n /** Callback when an error occurs. */\n onError?: (error: Error) => void;\n /** Whether to auto-execute on query change. */\n autoExecute?: boolean;\n /** Delay before auto-execute (ms). */\n autoExecuteDelay?: number;\n /** Whether to show SQL preview panel. */\n showSqlPreview?: boolean;\n /** Whether to show results table. */\n showResultsTable?: boolean;\n /** Whether to show saved queries picker. */\n showSavedQueries?: boolean;\n /** Callback when a saved query is loaded. */\n onSavedQueryLoad?: (savedQuery: SavedQuery) => void;\n /** Callback when the current query is saved. */\n onSavedQuerySave?: (savedQuery: SavedQuery) => void;\n /** Layout direction. */\n layout?: 'horizontal' | 'vertical';\n /** Additional class name. */\n className?: string;\n /** Additional styles. */\n style?: React.CSSProperties;\n}\n\nexport interface QueryBuilderState {\n query: QueryDefinition;\n result: QueryResult | null;\n isExecuting: boolean;\n error: Error | null;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-md)',\n height: '100%',\n fontFamily: 'var(--prismiq-font-sans)',\n};\n\nconst horizontalLayoutStyles: React.CSSProperties = {\n display: 'flex',\n gap: 'var(--prismiq-spacing-md)',\n flex: 1,\n minHeight: 0,\n overflow: 'hidden',\n};\n\nconst sidebarStyles: React.CSSProperties = {\n width: '240px',\n flexShrink: 0,\n overflow: 'hidden',\n};\n\nconst mainStyles: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-md)',\n minWidth: 0,\n overflow: 'auto',\n};\n\nconst builderSectionStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-md)',\n};\n\nconst resultsStyles: React.CSSProperties = {\n flex: 1,\n minHeight: 0,\n overflow: 'hidden',\n};\n\n// ============================================================================\n// Default Query\n// ============================================================================\n\nconst createDefaultQuery = (): QueryDefinition => ({\n tables: [],\n columns: [],\n filters: [],\n order_by: [],\n});\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Main QueryBuilder component combining all query building components.\n *\n * @example\n * ```tsx\n * <QueryBuilder\n * onQueryChange={(query) => console.log('Query:', query)}\n * onExecute={(result) => console.log('Result:', result)}\n * showSqlPreview\n * showResultsTable\n * />\n * ```\n */\nexport function QueryBuilder({\n initialQuery,\n onQueryChange,\n onExecute,\n onError,\n autoExecute = false,\n autoExecuteDelay = 500,\n showSqlPreview = true,\n showResultsTable = true,\n showSavedQueries = false,\n onSavedQueryLoad,\n onSavedQuerySave,\n layout = 'horizontal',\n className,\n style,\n}: QueryBuilderProps): JSX.Element {\n // Context and hooks\n const { client } = useAnalytics();\n const { schema, isLoading: schemaLoading } = useSchema();\n\n // State\n const [query, setQuery] = useState<QueryDefinition>(\n initialQuery ?? createDefaultQuery()\n );\n const [selectedTable, setSelectedTable] = useState<string | undefined>();\n const [sqlPreview, setSqlPreview] = useState<string | null>(null);\n const [sqlError, setSqlError] = useState<string | null>(null);\n\n // Sync internal state when initialQuery prop changes (e.g., loading saved query)\n useEffect(() => {\n if (initialQuery) {\n setQuery(initialQuery);\n // Auto-select the first table for filter/sort context\n const firstTable = initialQuery.tables[0];\n if (firstTable) {\n setSelectedTable(firstTable.name);\n }\n }\n }, [initialQuery]);\n\n // Use the query hook for execution\n const [executeQuery, setExecuteQuery] = useState<QueryDefinition | null>(null);\n const { data: result, isLoading: isExecuting, error } = useQueryHook(\n executeQuery,\n { enabled: executeQuery !== null }\n );\n\n // Refs for auto-execute debouncing\n const autoExecuteTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Track selected columns for SchemaExplorer\n const selectedColumns = useMemo(\n () =>\n query.columns.map((col) => {\n const table = query.tables.find((t) => t.id === col.table_id);\n return {\n table: table?.name ?? '',\n column: col.column,\n };\n }),\n [query.columns, query.tables]\n );\n\n // Check if query can be executed\n const canExecute = useMemo(() => {\n return query.tables.length > 0 && query.columns.length > 0;\n }, [query.tables.length, query.columns.length]);\n\n // Generate SQL preview when query changes\n useEffect(() => {\n if (!canExecute) {\n setSqlPreview(null);\n setSqlError(null);\n return;\n }\n\n const generatePreview = async () => {\n try {\n const sql = await client.generateSql(query);\n setSqlPreview(sql);\n setSqlError(null);\n } catch (err) {\n setSqlError(err instanceof Error ? err.message : 'Failed to generate SQL');\n setSqlPreview(null);\n }\n };\n\n void generatePreview();\n }, [client, query, canExecute]);\n\n // Store latest callbacks in refs to avoid including in useEffect dependencies\n const onQueryChangeRef = useRef(onQueryChange);\n const onExecuteRef = useRef(onExecute);\n const onErrorRef = useRef(onError);\n\n // Keep refs up to date\n useEffect(() => {\n onQueryChangeRef.current = onQueryChange;\n onExecuteRef.current = onExecute;\n onErrorRef.current = onError;\n });\n\n // Notify parent of query changes\n useEffect(() => {\n onQueryChangeRef.current?.(query);\n }, [query]);\n\n // Handle execution results\n useEffect(() => {\n if (result) {\n onExecuteRef.current?.(result);\n }\n }, [result]);\n\n // Handle errors\n useEffect(() => {\n if (error) {\n onErrorRef.current?.(error);\n }\n }, [error]);\n\n // Auto-execute with debounce\n useEffect(() => {\n if (!autoExecute || !canExecute) return;\n\n if (autoExecuteTimeoutRef.current) {\n clearTimeout(autoExecuteTimeoutRef.current);\n }\n\n autoExecuteTimeoutRef.current = setTimeout(() => {\n setExecuteQuery({ ...query });\n }, autoExecuteDelay);\n\n return () => {\n if (autoExecuteTimeoutRef.current) {\n clearTimeout(autoExecuteTimeoutRef.current);\n }\n };\n }, [query, autoExecute, autoExecuteDelay, canExecute]);\n\n // Handle execute\n const handleExecute = useCallback(() => {\n setExecuteQuery({ ...query });\n }, [query]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault();\n if (canExecute && !isExecuting) {\n handleExecute();\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [canExecute, isExecuting, handleExecute]);\n\n // Handle table selection from schema explorer\n const handleTableSelect = useCallback((table: TableSchema) => {\n setSelectedTable(table.name);\n\n setQuery((prev) => {\n // Check if table is already in query\n const existingTable = prev.tables.find((t) => t.name === table.name);\n if (existingTable) return prev;\n\n // Add table to query\n const newTable = {\n id: `t${prev.tables.length + 1}`,\n name: table.name,\n };\n\n return {\n ...prev,\n tables: [...prev.tables, newTable],\n };\n });\n }, []);\n\n // Handle column selection from schema explorer\n const handleColumnSelect = useCallback((table: TableSchema, column: ColumnSchema) => {\n setQuery((prev) => {\n // Find or create table in query\n let queryTable = prev.tables.find((t) => t.name === table.name);\n\n if (!queryTable) {\n queryTable = {\n id: `t${prev.tables.length + 1}`,\n name: table.name,\n };\n }\n\n // Check if column already selected\n const alreadySelected = prev.columns.some(\n (c) => c.table_id === queryTable!.id && c.column === column.name\n );\n\n if (alreadySelected) return prev;\n\n // Add column\n const newColumn: ColumnSelection = {\n table_id: queryTable.id,\n column: column.name,\n aggregation: 'none',\n };\n\n const newTables = prev.tables.find((t) => t.name === table.name)\n ? prev.tables\n : [...prev.tables, queryTable];\n\n return {\n ...prev,\n tables: newTables,\n columns: [...prev.columns, newColumn],\n };\n });\n }, []);\n\n // Handle columns change\n const handleColumnsChange = useCallback((columns: ColumnSelection[]) => {\n setQuery((prev) => ({ ...prev, columns }));\n }, []);\n\n // Handle filters change\n const handleFiltersChange = useCallback((filters: FilterDefinition[]) => {\n setQuery((prev) => ({ ...prev, filters }));\n }, []);\n\n // Handle sorts change\n const handleSortsChange = useCallback((sorts: SortDefinition[]) => {\n setQuery((prev) => ({ ...prev, order_by: sorts }));\n }, []);\n\n // Handle time series change\n const handleTimeSeriesChange = useCallback(\n (timeSeries: TimeSeriesConfigType | undefined) => {\n setQuery((prev) => ({ ...prev, time_series: timeSeries }));\n },\n []\n );\n\n // Handle calculated fields change\n const handleCalculatedFieldsChange = useCallback(\n (calculatedFields: CalculatedField[]) => {\n setQuery((prev) => ({\n ...prev,\n calculated_fields: calculatedFields.length > 0 ? calculatedFields : undefined,\n }));\n },\n []\n );\n\n // Handle joins change\n const handleJoinsChange = useCallback((joins: JoinDefinition[]) => {\n setQuery((prev) => ({ ...prev, joins }));\n }, []);\n\n // Handle preview (limited rows)\n const handlePreview = useCallback(() => {\n setExecuteQuery({ ...query, limit: 100 });\n }, [query]);\n\n // Handle clear\n const handleClear = useCallback(() => {\n setQuery(createDefaultQuery());\n setSelectedTable(undefined);\n setExecuteQuery(null);\n }, []);\n\n // Handle saved query selection\n const handleSavedQuerySelect = useCallback(\n (savedQuery: SavedQuery) => {\n setQuery(savedQuery.query);\n setSelectedTable(savedQuery.query.tables[0]?.name);\n setExecuteQuery(null);\n onSavedQueryLoad?.(savedQuery);\n },\n [onSavedQueryLoad]\n );\n\n // Handle saved query save\n const handleSavedQuerySave = useCallback(\n (savedQuery: SavedQuery) => {\n onSavedQuerySave?.(savedQuery);\n },\n [onSavedQuerySave]\n );\n\n if (schemaLoading || !schema) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n color: 'var(--prismiq-color-text-muted)',\n }}\n >\n Loading schema...\n </div>\n </div>\n );\n }\n\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={horizontalLayoutStyles}>\n {layout === 'horizontal' && (\n <div style={sidebarStyles}>\n <SchemaExplorer\n selectedTable={selectedTable}\n selectedColumns={selectedColumns}\n onTableSelect={handleTableSelect}\n onColumnSelect={handleColumnSelect}\n style={{ height: '100%' }}\n />\n </div>\n )}\n\n <div style={mainStyles}>\n <div style={builderSectionStyles}>\n <ColumnSelector\n tables={query.tables}\n columns={query.columns}\n onChange={handleColumnsChange}\n schema={schema}\n />\n\n <JoinBuilder\n tables={query.tables}\n joins={query.joins ?? []}\n onChange={handleJoinsChange}\n schema={schema}\n />\n\n <FilterBuilder\n tables={query.tables}\n filters={query.filters ?? []}\n onChange={handleFiltersChange}\n schema={schema}\n />\n\n <SortBuilder\n tables={query.tables}\n sorts={query.order_by ?? []}\n onChange={handleSortsChange}\n schema={schema}\n />\n\n <CollapsibleSection\n title=\"Calculated Fields\"\n defaultOpen={(query.calculated_fields?.length ?? 0) > 0}\n >\n <CalculatedFieldBuilder\n fields={query.calculated_fields ?? []}\n onChange={handleCalculatedFieldsChange}\n tables={query.tables}\n schema={schema}\n />\n </CollapsibleSection>\n\n <CollapsibleSection\n title=\"Time Series\"\n defaultOpen={query.time_series !== undefined}\n >\n <TimeSeriesConfig\n schema={schema}\n tables={query.tables}\n config={query.time_series}\n onChange={handleTimeSeriesChange}\n />\n </CollapsibleSection>\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--prismiq-spacing-sm)' }}>\n <QueryBuilderToolbar\n isExecuting={isExecuting}\n canExecute={canExecute}\n onExecute={handleExecute}\n onPreview={handlePreview}\n onClear={handleClear}\n style={{ flex: 1 }}\n />\n {showSavedQueries && (\n <SavedQueryPicker\n currentQuery={canExecute ? query : null}\n onSelect={handleSavedQuerySelect}\n onSave={handleSavedQuerySave}\n />\n )}\n </div>\n\n {showSqlPreview && (\n <QueryPreview\n sql={sqlPreview}\n error={sqlError}\n collapsible\n defaultCollapsed={false}\n />\n )}\n\n {showResultsTable && (\n <div style={resultsStyles}>\n <ResultsTable\n result={result}\n loading={isExecuting}\n error={error}\n sortable\n style={{ height: '100%' }}\n />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","/**\n * AutoSaveIndicator component.\n *\n * Shows save status for auto-save operations.\n */\n\nimport { forwardRef, type HTMLAttributes } from 'react';\n\nimport type { SaveStatus } from '../../hooks/useDebouncedLayoutSave';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AutoSaveIndicatorProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Current save status. */\n status: SaveStatus;\n /** Error if status is error. */\n error?: Error | null;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst baseStyles: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n padding: '4px 10px',\n borderRadius: '4px',\n fontSize: '13px',\n fontWeight: 500,\n transition: 'opacity 0.2s, background-color 0.2s',\n};\n\nconst statusStyles: Record<Exclude<SaveStatus, 'idle'>, React.CSSProperties> = {\n pending: {\n backgroundColor: 'var(--prismiq-color-warning-background, #fef3cd)',\n color: 'var(--prismiq-color-warning-text, #856404)',\n },\n saving: {\n backgroundColor: 'var(--prismiq-color-info-background, #cce5ff)',\n color: 'var(--prismiq-color-info-text, #004085)',\n },\n saved: {\n backgroundColor: 'var(--prismiq-color-success-background, #d4edda)',\n color: 'var(--prismiq-color-success-text, #155724)',\n },\n error: {\n backgroundColor: 'var(--prismiq-color-error-background, #f8d7da)',\n color: 'var(--prismiq-color-error-text, #721c24)',\n },\n};\n\nconst dotStyles: React.CSSProperties = {\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: 'currentColor',\n};\n\nconst spinnerStyles: React.CSSProperties = {\n width: '14px',\n height: '14px',\n border: '2px solid currentColor',\n borderTopColor: 'transparent',\n borderRadius: '50%',\n animation: 'prismiq-spin 0.8s linear infinite',\n};\n\nconst iconStyles: React.CSSProperties = {\n fontWeight: 'bold',\n fontSize: '14px',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Auto-save status indicator.\n *\n * Shows pending, saving, saved, or error states.\n * Renders nothing when idle.\n *\n * @example\n * ```tsx\n * const { status, error } = useDebouncedLayoutSave({ dashboardId: id });\n *\n * <AutoSaveIndicator status={status} error={error} />\n * ```\n */\nexport const AutoSaveIndicator = forwardRef<\n HTMLDivElement,\n AutoSaveIndicatorProps\n>(function AutoSaveIndicator({ status, error, style, ...props }, ref) {\n // Don't render when idle\n if (status === 'idle') {\n return null;\n }\n\n return (\n <>\n <style>\n {`\n @keyframes prismiq-spin {\n to {\n transform: rotate(360deg);\n }\n }\n `}\n </style>\n <div\n ref={ref}\n data-testid=\"save-indicator\"\n role=\"status\"\n aria-live=\"polite\"\n style={{\n ...baseStyles,\n ...statusStyles[status],\n ...style,\n }}\n {...props}\n >\n {status === 'pending' && (\n <>\n <span style={dotStyles} aria-hidden=\"true\" />\n <span>Unsaved changes</span>\n </>\n )}\n\n {status === 'saving' && (\n <>\n <span style={spinnerStyles} aria-hidden=\"true\" />\n <span>Saving...</span>\n </>\n )}\n\n {status === 'saved' && (\n <>\n <span style={iconStyles} aria-hidden=\"true\">\n ✓\n </span>\n <span>Saved</span>\n </>\n )}\n\n {status === 'error' && (\n <>\n <span style={iconStyles} aria-hidden=\"true\">\n !\n </span>\n <span title={error?.message}>Error saving</span>\n </>\n )}\n </div>\n </>\n );\n});\n","/**\n * CustomSQLEditor component.\n *\n * A simple SQL editor with textarea input, validation, and execution.\n */\n\nimport { useCallback, useState } from 'react';\n\nimport { useCustomSQL } from '../../hooks/useCustomSQL';\nimport { ResultsTable } from '../ResultsTable';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CustomSQLEditorProps {\n /** Initial SQL query. */\n initialSql?: string;\n /** Callback when SQL changes. */\n onSqlChange?: (sql: string) => void;\n /** Callback when query executes successfully. */\n onExecute?: (sql: string) => void;\n /** Placeholder text for the textarea. */\n placeholder?: string;\n /** Whether to show the results table. */\n showResults?: boolean;\n /** Height of the textarea in pixels. */\n height?: number;\n /** Additional class name. */\n className?: string;\n /** Additional styles. */\n style?: React.CSSProperties;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-md, 16px)',\n fontFamily: 'var(--prismiq-font-sans, system-ui, sans-serif)',\n};\n\nconst editorWrapperStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-sm, 8px)',\n};\n\nconst textareaStyles: React.CSSProperties = {\n width: '100%',\n padding: 'var(--prismiq-spacing-md, 16px)',\n fontFamily: 'var(--prismiq-font-mono, \"SF Mono\", \"Monaco\", \"Menlo\", monospace)',\n fontSize: '14px',\n lineHeight: '1.5',\n backgroundColor: 'var(--prismiq-color-surface, #1e1e1e)',\n color: 'var(--prismiq-color-text, #d4d4d4)',\n border: '1px solid var(--prismiq-color-border, #3c3c3c)',\n borderRadius: 'var(--prismiq-radius-md, 8px)',\n resize: 'vertical',\n outline: 'none',\n};\n\nconst textareaFocusStyles: React.CSSProperties = {\n borderColor: 'var(--prismiq-color-primary, #0ea5e9)',\n boxShadow: '0 0 0 2px var(--prismiq-color-primary-alpha, rgba(14, 165, 233, 0.2))',\n};\n\nconst toolbarStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--prismiq-spacing-md, 16px)',\n};\n\nconst buttonStyles: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs, 4px)',\n padding: 'var(--prismiq-spacing-sm, 8px) var(--prismiq-spacing-md, 16px)',\n fontFamily: 'inherit',\n fontSize: '14px',\n fontWeight: 500,\n color: 'white',\n backgroundColor: 'var(--prismiq-color-primary, #0ea5e9)',\n border: 'none',\n borderRadius: 'var(--prismiq-radius-md, 8px)',\n cursor: 'pointer',\n transition: 'background-color 0.15s ease',\n};\n\nconst buttonDisabledStyles: React.CSSProperties = {\n backgroundColor: 'var(--prismiq-color-muted, #6b7280)',\n cursor: 'not-allowed',\n};\n\nconst errorStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-md, 16px)',\n backgroundColor: 'var(--prismiq-color-error-bg, #fef2f2)',\n color: 'var(--prismiq-color-error, #dc2626)',\n borderRadius: 'var(--prismiq-radius-md, 8px)',\n fontSize: '14px',\n};\n\nconst validationErrorStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-sm, 8px) var(--prismiq-spacing-md, 16px)',\n backgroundColor: 'var(--prismiq-color-warning-bg, #fffbeb)',\n color: 'var(--prismiq-color-warning, #d97706)',\n borderRadius: 'var(--prismiq-radius-md, 8px)',\n fontSize: '13px',\n};\n\nconst statusStyles: React.CSSProperties = {\n fontSize: '13px',\n color: 'var(--prismiq-color-text-muted, #6b7280)',\n};\n\nconst tablesListStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs, 4px)',\n fontSize: '12px',\n color: 'var(--prismiq-color-text-muted, #6b7280)',\n};\n\nconst tableTagStyles: React.CSSProperties = {\n padding: '2px 6px',\n backgroundColor: 'var(--prismiq-color-surface, #f3f4f6)',\n borderRadius: 'var(--prismiq-radius-sm, 4px)',\n fontFamily: 'var(--prismiq-font-mono, monospace)',\n};\n\nconst resultsContainerStyles: React.CSSProperties = {\n flex: 1,\n minHeight: 0,\n overflow: 'hidden',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * SQL editor with textarea input and query execution.\n *\n * @example\n * ```tsx\n * <CustomSQLEditor\n * initialSql=\"SELECT * FROM users LIMIT 10\"\n * onExecute={(sql) => console.log('Executed:', sql)}\n * showResults\n * />\n * ```\n */\nexport function CustomSQLEditor({\n initialSql = '',\n onSqlChange,\n onExecute,\n placeholder = 'SELECT * FROM table_name LIMIT 100',\n showResults = true,\n height = 200,\n className,\n style,\n}: CustomSQLEditorProps): JSX.Element {\n // Local state\n const [sql, setSql] = useState(initialSql);\n const [isFocused, setIsFocused] = useState(false);\n const [executeEnabled, setExecuteEnabled] = useState(false);\n const [lastExecutedSql, setLastExecutedSql] = useState<string | null>(null);\n\n // Use custom SQL hook\n const {\n data,\n isLoading,\n error,\n validation,\n isValidating,\n } = useCustomSQL(lastExecutedSql, {\n enabled: executeEnabled,\n validateFirst: true,\n });\n\n // Handle SQL change\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newSql = e.target.value;\n setSql(newSql);\n onSqlChange?.(newSql);\n },\n [onSqlChange]\n );\n\n // Handle execute\n const handleExecute = useCallback(() => {\n if (!sql.trim()) return;\n setLastExecutedSql(sql);\n setExecuteEnabled(true);\n onExecute?.(sql);\n }, [sql, onExecute]);\n\n // Handle keyboard shortcuts\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Cmd/Ctrl + Enter to execute\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault();\n handleExecute();\n }\n },\n [handleExecute]\n );\n\n // Determine if we can execute\n const canExecute = sql.trim().length > 0 && !isLoading && !isValidating;\n\n // Merge styles\n const mergedTextareaStyles: React.CSSProperties = {\n ...textareaStyles,\n height,\n ...(isFocused ? textareaFocusStyles : {}),\n };\n\n const mergedButtonStyles: React.CSSProperties = {\n ...buttonStyles,\n ...(canExecute ? {} : buttonDisabledStyles),\n };\n\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={editorWrapperStyles}>\n <textarea\n value={sql}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n placeholder={placeholder}\n style={mergedTextareaStyles}\n spellCheck={false}\n autoComplete=\"off\"\n autoCapitalize=\"off\"\n />\n\n {validation && !validation.valid && (\n <div style={validationErrorStyles}>\n <strong>Validation errors:</strong>\n <ul style={{ margin: '8px 0 0 16px', padding: 0 }}>\n {validation.errors.map((err, i) => (\n <li key={i}>{err}</li>\n ))}\n </ul>\n </div>\n )}\n\n <div style={toolbarStyles}>\n <div style={statusStyles}>\n {isValidating && 'Validating...'}\n {isLoading && 'Executing...'}\n {!isValidating && !isLoading && validation?.valid && (\n <div style={tablesListStyles}>\n Tables:{' '}\n {validation.tables.map((table) => (\n <span key={table} style={tableTagStyles}>\n {table}\n </span>\n ))}\n </div>\n )}\n </div>\n\n <button\n onClick={handleExecute}\n disabled={!canExecute}\n style={mergedButtonStyles}\n type=\"button\"\n >\n {isLoading ? 'Executing...' : 'Run Query'}\n <span style={{ fontSize: '11px', opacity: 0.7 }}>(Cmd+Enter)</span>\n </button>\n </div>\n </div>\n\n {error && (\n <div style={errorStyles}>\n <strong>Error:</strong> {error.message}\n </div>\n )}\n\n {showResults && data && (\n <div style={resultsContainerStyles}>\n <ResultsTable\n result={data}\n loading={isLoading}\n sortable\n style={{ height: '100%' }}\n />\n </div>\n )}\n </div>\n );\n}\n","/**\n * TableSelector component for selecting multiple tables in a query.\n *\n * Allows adding and removing tables with support for suggested joins\n * based on schema relationships.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useTheme } from '../../theme';\nimport type { DatabaseSchema, QueryTable } from '../../types';\nimport { Icon, Select, Badge } from '../ui';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TableSelectorProps {\n /** Database schema with available tables. */\n schema: DatabaseSchema;\n /** Currently selected tables. */\n tables: QueryTable[];\n /** Callback when tables change. */\n onChange: (tables: QueryTable[]) => void;\n /** Maximum number of tables allowed. */\n maxTables?: number;\n /** Whether to show relationship suggestions. */\n showRelationships?: boolean;\n /** Additional class name. */\n className?: string;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Generate a unique table ID.\n */\nfunction generateTableId(tables: QueryTable[]): string {\n let id = tables.length + 1;\n const existingIds = new Set(tables.map((t) => t.id));\n while (existingIds.has(`t${id}`)) {\n id++;\n }\n return `t${id}`;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Multi-table selector with relationship suggestions.\n */\nexport function TableSelector({\n schema,\n tables,\n onChange,\n maxTables = 5,\n showRelationships = true,\n className,\n}: TableSelectorProps): JSX.Element {\n const { theme } = useTheme();\n\n // Get table options excluding already selected tables\n const availableTableOptions = useMemo(() => {\n const selectedNames = new Set(tables.map((t) => t.name));\n return schema.tables\n .filter((t) => !selectedNames.has(t.name))\n .map((t) => ({\n value: t.name,\n label: `${t.name} (${t.columns.length} cols)`,\n }));\n }, [schema.tables, tables]);\n\n // Get suggested tables based on relationships\n const suggestedTables = useMemo(() => {\n if (!showRelationships || tables.length === 0) return [];\n\n const selectedNames = new Set(tables.map((t) => t.name));\n const suggestions: { table: string; relationship: string }[] = [];\n\n for (const rel of schema.relationships) {\n // If from_table is selected, suggest to_table\n if (selectedNames.has(rel.from_table) && !selectedNames.has(rel.to_table)) {\n const existing = suggestions.find((s) => s.table === rel.to_table);\n if (!existing) {\n suggestions.push({\n table: rel.to_table,\n relationship: `via ${rel.from_table}.${rel.from_column}`,\n });\n }\n }\n // If to_table is selected, suggest from_table\n if (selectedNames.has(rel.to_table) && !selectedNames.has(rel.from_table)) {\n const existing = suggestions.find((s) => s.table === rel.from_table);\n if (!existing) {\n suggestions.push({\n table: rel.from_table,\n relationship: `via ${rel.to_table}.${rel.to_column}`,\n });\n }\n }\n }\n\n return suggestions.slice(0, 3); // Limit to 3 suggestions\n }, [schema.relationships, tables, showRelationships]);\n\n const handleAddTable = useCallback(\n (tableName: string) => {\n if (!tableName || tables.length >= maxTables) return;\n\n const newTable: QueryTable = {\n id: generateTableId(tables),\n name: tableName,\n };\n onChange([...tables, newTable]);\n },\n [tables, onChange, maxTables]\n );\n\n const handleRemoveTable = useCallback(\n (tableId: string) => {\n onChange(tables.filter((t) => t.id !== tableId));\n },\n [tables, onChange]\n );\n\n // Styles\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.md,\n };\n\n const selectedTablesStyle: React.CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n gap: theme.spacing.sm,\n };\n\n const tableChipStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.xs,\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n backgroundColor: theme.colors.surface,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.md,\n fontSize: theme.fontSizes.sm,\n };\n\n const removeButtonStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '2px',\n backgroundColor: 'transparent',\n border: 'none',\n borderRadius: theme.radius.sm,\n cursor: 'pointer',\n color: theme.colors.textMuted,\n };\n\n const addSectionStyle: React.CSSProperties = {\n display: 'flex',\n gap: theme.spacing.sm,\n alignItems: 'center',\n };\n\n const suggestionsStyle: React.CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n gap: theme.spacing.xs,\n marginTop: theme.spacing.xs,\n };\n\n const suggestionChipStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.xs,\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n backgroundColor: `${theme.colors.primary}10`,\n border: `1px dashed ${theme.colors.primary}`,\n borderRadius: theme.radius.md,\n fontSize: theme.fontSizes.xs,\n cursor: 'pointer',\n color: theme.colors.primary,\n };\n\n const canAddMore = tables.length < maxTables && availableTableOptions.length > 0;\n\n return (\n <div className={className} style={containerStyle}>\n {/* Selected Tables */}\n {tables.length > 0 && (\n <div style={selectedTablesStyle}>\n {tables.map((table, index) => (\n <div key={table.id} style={tableChipStyle}>\n <Icon name=\"table\" size={14} />\n <span>{table.name}</span>\n {index === 0 && <Badge size=\"sm\" variant=\"default\">primary</Badge>}\n {tables.length > 1 && (\n <button\n type=\"button\"\n style={removeButtonStyle}\n onClick={() => handleRemoveTable(table.id)}\n aria-label={`Remove ${table.name}`}\n >\n <Icon name=\"x\" size={12} />\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* Add Table */}\n {canAddMore && (\n <div>\n <div style={addSectionStyle}>\n <Select\n value=\"\"\n onChange={handleAddTable}\n options={[{ value: '', label: 'Add another table...' }, ...availableTableOptions]}\n style={{ minWidth: '200px' }}\n />\n <span style={{ fontSize: theme.fontSizes.xs, color: theme.colors.textMuted }}>\n {tables.length} / {maxTables} tables\n </span>\n </div>\n\n {/* Suggestions */}\n {suggestedTables.length > 0 && (\n <div style={suggestionsStyle}>\n <span style={{ fontSize: theme.fontSizes.xs, color: theme.colors.textMuted }}>\n Related:\n </span>\n {suggestedTables.map((suggestion) => (\n <button\n key={suggestion.table}\n type=\"button\"\n style={suggestionChipStyle}\n onClick={() => handleAddTable(suggestion.table)}\n title={suggestion.relationship}\n >\n <Icon name=\"plus\" size={10} />\n {suggestion.table}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"]}
|