@dlh.io/bideux 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/LICENSE +202 -0
- package/README.md +90 -0
- package/dist/all.d.ts +14 -0
- package/dist/all.js +15 -0
- package/dist/all.js.map +1 -0
- package/dist/chunk-62IQGXLW.js +11470 -0
- package/dist/chunk-62IQGXLW.js.map +1 -0
- package/dist/chunk-75CRTQK7.js +315 -0
- package/dist/chunk-75CRTQK7.js.map +1 -0
- package/dist/chunk-FVO6E22Z.js +225 -0
- package/dist/chunk-FVO6E22Z.js.map +1 -0
- package/dist/chunk-GRITOB4M.js +337 -0
- package/dist/chunk-GRITOB4M.js.map +1 -0
- package/dist/chunk-HPFHIZWO.js +40 -0
- package/dist/chunk-HPFHIZWO.js.map +1 -0
- package/dist/chunk-IMNUQGHE.js +2864 -0
- package/dist/chunk-IMNUQGHE.js.map +1 -0
- package/dist/chunk-LHD445PJ.js +571 -0
- package/dist/chunk-LHD445PJ.js.map +1 -0
- package/dist/chunk-LPLBBHOW.js +386 -0
- package/dist/chunk-LPLBBHOW.js.map +1 -0
- package/dist/chunk-NGM5R3LW.js +881 -0
- package/dist/chunk-NGM5R3LW.js.map +1 -0
- package/dist/chunk-OMPR32AR.js +1320 -0
- package/dist/chunk-OMPR32AR.js.map +1 -0
- package/dist/chunk-QDQ5VVTC.js +255 -0
- package/dist/chunk-QDQ5VVTC.js.map +1 -0
- package/dist/chunk-RRWZKNDZ.js +1004 -0
- package/dist/chunk-RRWZKNDZ.js.map +1 -0
- package/dist/chunk-SRWIBMEB.js +178 -0
- package/dist/chunk-SRWIBMEB.js.map +1 -0
- package/dist/element/chunk-AOKCBPMV.js +1646 -0
- package/dist/element/chunk-AOKCBPMV.js.map +1 -0
- package/dist/element/chunk-B67SYRQP.js +281 -0
- package/dist/element/chunk-B67SYRQP.js.map +1 -0
- package/dist/element/chunk-FNRVFA2C.js +55 -0
- package/dist/element/chunk-FNRVFA2C.js.map +1 -0
- package/dist/element/chunk-G3C722QP.js +4707 -0
- package/dist/element/chunk-G3C722QP.js.map +1 -0
- package/dist/element/chunk-H5IFOSQP.js +346 -0
- package/dist/element/chunk-H5IFOSQP.js.map +1 -0
- package/dist/element/chunk-LXR3CLCN.js +30 -0
- package/dist/element/chunk-LXR3CLCN.js.map +1 -0
- package/dist/element/chunk-TFV4CJR4.js +183 -0
- package/dist/element/chunk-TFV4CJR4.js.map +1 -0
- package/dist/element/chunk-TXSK3CIN.js +859 -0
- package/dist/element/chunk-TXSK3CIN.js.map +1 -0
- package/dist/element/chunk-WDTTBY3S.js +45 -0
- package/dist/element/chunk-WDTTBY3S.js.map +1 -0
- package/dist/element/chunk-ZI3RYCAR.js +233 -0
- package/dist/element/chunk-ZI3RYCAR.js.map +1 -0
- package/dist/element/element.d.ts +3044 -0
- package/dist/element/element.js +146554 -0
- package/dist/element/element.js.map +1 -0
- package/dist/element/revo-grid.entry-7FHEBN3O.js +4817 -0
- package/dist/element/revo-grid.entry-7FHEBN3O.js.map +1 -0
- package/dist/element/revogr-attribution_7.entry-LSOFVZRA.js +1328 -0
- package/dist/element/revogr-attribution_7.entry-LSOFVZRA.js.map +1 -0
- package/dist/element/revogr-clipboard_3.entry-V74UIBPJ.js +494 -0
- package/dist/element/revogr-clipboard_3.entry-V74UIBPJ.js.map +1 -0
- package/dist/element/revogr-data_4.entry-2UBOKTFN.js +1041 -0
- package/dist/element/revogr-data_4.entry-2UBOKTFN.js.map +1 -0
- package/dist/element/revogr-filter-panel.entry-B24PLQU4.js +552 -0
- package/dist/element/revogr-filter-panel.entry-B24PLQU4.js.map +1 -0
- package/dist/index.d.ts +1041 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +1915 -0
- package/dist/react.js +14 -0
- package/dist/react.js.map +1 -0
- package/dist/renderers/echarts.d.ts +44 -0
- package/dist/renderers/echarts.js +6 -0
- package/dist/renderers/echarts.js.map +1 -0
- package/dist/renderers/index.d.ts +48 -0
- package/dist/renderers/index.js +12 -0
- package/dist/renderers/index.js.map +1 -0
- package/dist/renderers/revogrid.d.ts +76 -0
- package/dist/renderers/revogrid.js +6 -0
- package/dist/renderers/revogrid.js.map +1 -0
- package/dist/renderers/tabulator.d.ts +37 -0
- package/dist/renderers/tabulator.js +6 -0
- package/dist/renderers/tabulator.js.map +1 -0
- package/dist/result-table-CPls-277.d.ts +1885 -0
- package/dist/schema/dashboard.schema.json +4374 -0
- package/dist/schema/semantic-model.schema.json +1200 -0
- package/dist/schema/widget.schema.json +1793 -0
- package/dist/styles.css +156 -0
- package/dist/theme.css +1789 -0
- package/dist/types-CHFSsU_X.d.ts +1007 -0
- package/package.json +119 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../dashboard-react/src/code-editor.tsx","../../dashboard-react/src/cn.ts","../../dashboard-react/src/defaults/icons.tsx","../../dashboard-react/src/defaults/ui.tsx","../../dashboard-react/src/authoring-context.tsx","../../dashboard-react/src/auto-fit-text.tsx","../../dashboard-react/src/context.tsx","../../dashboard-react/src/breadcrumb.tsx","../../dashboard-react/src/builder-fields.tsx","../../dashboard-react/src/filters-context.tsx","../../dashboard-react/src/widget-actions.tsx","../../dashboard-react/src/style.ts","../../dashboard-react/src/widget-label.tsx","../../dashboard-react/src/widget-header.tsx","../../dashboard-react/src/filter-widget.tsx","../../dashboard-react/src/use-count-up.ts","../../dashboard-react/src/kpi-card.tsx","../../dashboard-react/src/renderer-mount.tsx","../../dashboard-react/src/table-export.ts","../../dashboard-react/src/table-view.tsx","../../dashboard-react/src/widget-frame.tsx","../../dashboard-react/src/widget-states.tsx","../../dashboard-react/src/widget-renderer.tsx","../../dashboard-react/src/canvas.tsx","../../dashboard-react/src/dashboard-yaml-editor.tsx","../../dashboard-react/src/inline-edit.tsx","../../dashboard-react/src/dataset-builder-panel.tsx","../../dashboard-react/src/drilldown-modal.tsx","../../dashboard-react/src/filter-bar.tsx","../../dashboard-react/src/filter-panel.tsx","../../dashboard-react/src/grid-settings-panel.tsx","../../dashboard-react/src/layout-dialogs.tsx","../../dashboard-react/src/metric-builder-panel.tsx","../../dashboard-react/src/relationship-builder-panel.tsx","../../dashboard-react/src/model-builder.tsx","../../dashboard-react/src/model-version-history.ts","../../dashboard-react/src/model-editor.tsx","../../dashboard-react/src/pivot-detail-modal.tsx","../../dashboard-react/src/ports.ts","../../dashboard-react/src/section.tsx","../../dashboard-react/src/reader.tsx","../../dashboard-react/src/reader-loader.tsx","../../dashboard-react/src/use-layout-draft.ts","../../dashboard-react/src/widget-ask-panel.tsx","../../dashboard-react/src/widget-builder-model.ts","../../dashboard-react/src/widget-builder.tsx","../../dashboard-react/src/widget-diagnostics.tsx","../../dashboard-react/src/widget-inventory.tsx","../../dashboard-react/src/widget-yaml-editor.tsx","../../dashboard-react/src/use-resource.ts","../../dashboard-react/src/dashboard-chrome.tsx","../../dashboard-react/src/dashboard-workspace.tsx","../../dashboard-react/src/dashboard-list.tsx","../src/transports.ts","../src/react/bideux-dashboard.tsx"],"names":["jsxs","jsx","useRef","useCallback","useState","useEffect","createContext","useMemo","useContext","value","summary","TOOLTIP_ICONS","forwardRef","WidgetFrame","detail","Fragment","Info","getClickInteraction","label","document","fromDataset","toDataset","requiredRows","model","http"],"mappings":";;;;;;;;;;AAUO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,MAAA,GAAS,WAAW,EAAC;AAC3B,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,oBAAA,EAAmB,OAAA,EAC5C,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,sIAAA;AAAA,QACV,cAAY,SAAA,IAAa,MAAA;AAAA,QACzB,UAAA,EAAY,KAAA;AAAA,QACZ,UAAU,QAAA,IAAY,KAAA;AAAA,QACtB,KAAA;AAAA,QACA,IAAA,EAAM,EAAA;AAAA,QACN,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,QAC7B;AAAA;AAAA,KACF;AAAA,IACC,MAAA,CAAO,MAAA,GAAS,CAAA,mBACf,GAAA,CAAC,IAAA,EAAA,EAAG,4BAAA,EAA2B,EAAA,EAC5B,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,qBACnB,GAAA,CAAC,IAAA,EAAA,EACE,QAAA,EAAA,CAAA,KAAA,EAAQ,MAAA,CAAO,eAAe,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,CAAA,CAAA,EAAA,EAD3C,CAAA,EAAG,MAAA,CAAO,eAAe,CAAA,CAAA,EAAI,KAAK,CAAA,CAE3C,CACD,GACH,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;;;AC3CO,SAAS,MACX,MAAA,EACiB;AACpB,EAAA,MAAM,QAAQ,MAAA,CAAO,MAAA;AAAA,IACnB,CAAC,KAAA,KAA2B,OAAO,KAAA,KAAU,YAAY,KAAA,KAAU;AAAA,GACrE;AACA,EAAA,OAAO,MAAM,MAAA,KAAW,CAAA,GAAI,MAAA,GAAY,KAAA,CAAM,KAAK,GAAG,CAAA;AACxD;ACGA,IAAM,KAAA,GAAkC;AAAA,EACtC,QAAA,EAAU,2BAAA;AAAA,EACV,KAAA,EACE,gGAAA;AAAA,EACF,SAAA,EAAW,yBAAA;AAAA,EACX,SAAA,EAAW,yBAAA;AAAA,EACX,OAAA,EAAS,uBAAA;AAAA,EACT,WAAA,EAAa,2CAAA;AAAA,EACb,QAAA,EACE,yJAAA;AAAA,EACF,QAAA,EACE,8FAAA;AAAA,EACF,KAAA,EAAO,iBAAA;AAAA,EACP,WAAA,EAAa,cAAA;AAAA,EACb,WAAA,EAAa,gBAAA;AAAA,EACb,YAAA,EAAc,eAAA;AAAA,EACd,KAAA,EAAO,sBAAA;AAAA,EACP,IAAA,EAAM,6BAAA;AAAA,EACN,IAAA,EAAM,6BAAA;AAAA,EACN,QAAA,EAAU,gEAAA;AAAA,EACV,MAAA,EAAQ,wCAAA;AAAA,EACR,GAAA,EAAK,oFAAA;AAAA,EACL,MAAA,EAAQ,4BAAA;AAAA,EACR,IAAA,EAAM,yDAAA;AAAA,EACN,IAAA,EAAM,uFAAA;AAAA,EACN,IAAA,EAAM,6DAAA;AAAA,EACN,MAAA,EAAQ,oDAAA;AAAA,EACR,MAAA,EACE,oGAAA;AAAA,EACF,IAAA,EAAM,uCAAA;AAAA,EACN,KAAA,EAAO,UAAA;AAAA,EACP,IAAA,EAAM,+BAAA;AAAA,EACN,IAAA,EAAM,kBAAA;AAAA,EACN,OAAA,EACE,iFAAA;AAAA,EACF,IAAA,EAAM,sFAAA;AAAA,EACN,MAAA,EAAQ,sDAAA;AAAA,EACR,QAAA,EACE,okBAAA;AAAA,EACF,KAAA,EACE,wIAAA;AAAA,EACF,OAAA,EACE,wEAAA;AAAA,EACF,QAAA,EACE,uFAAA;AAAA,EACF,WAAA,EACE,2FAAA;AAAA,EACF,KAAA,EAAO,oDAAA;AAAA,EACP,SAAA,EAAW,mCAAA;AAAA,EACX,SAAA,EAAW,uBAAA;AAAA,EACX,OAAA,EAAS,iCAAA;AAAA,EACT,IAAA,EAAM,sCAAA;AAAA,EACN,KAAA,EACE;AACJ,CAAA;AAEA,SAAS,MAAM,IAAA,EAA0C;AACvD,EAAA,MAAM,CAAA,GAAI,MAAM,IAAI,CAAA;AACpB,EAAA,OAAO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,OAAM,EAAc;AAC1D,IAAA,uBACEA,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,eAAa,KAAA,KAAU,MAAA;AAAA,QACvB,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAAA,QAC1C,WAAA,EAAW,IAAA;AAAA,QACX,IAAA,EAAK,MAAA;AAAA,QACL,IAAA,EAAM,KAAA,KAAU,MAAA,GAAY,MAAA,GAAY,KAAA;AAAA,QACxC,MAAA,EAAO,cAAA;AAAA,QACP,aAAA,EAAc,OAAA;AAAA,QACd,cAAA,EAAe,OAAA;AAAA,QACf,WAAA,EAAa,CAAA;AAAA,QACb,OAAA,EAAQ,WAAA;AAAA,QAEP,QAAA,EAAA;AAAA,UAAA,KAAA,KAAU,MAAA,GAAY,IAAA,mBAAOC,GAAAA,CAAC,WAAO,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BAC5CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAM;AAAA;AAAA;AAAA,KACd;AAAA,EAEJ,CAAA;AACF;AAGO,IAAM,eAAwB,MAAA,CAAO,WAAA;AAAA,EACzC,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAiB,GAAA,CAAI,CAAC,IAAA,KAAS,CAAC,IAAA,EAAM,KAAA,CAAM,IAAI,CAAC,CAAC;AACtE;AAGO,SAAS,WAAW,SAAA,EAAuC;AAChE,EAAA,IAAI,SAAA,KAAc,QAAW,OAAO,YAAA;AACpC,EAAA,MAAM,MAAA,GAA2B,EAAE,GAAG,YAAA,EAAa;AACnD,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAGnD;AACH,IAAA,IAAI,SAAA,KAAc,MAAA,EAAW,MAAA,CAAO,IAAI,CAAA,GAAI,SAAA;AAAA,EAC9C;AACA,EAAA,OAAO,MAAA;AACT;ACrEA,IAAM,UAAA,GACJ,4HAAA;AAEF,IAAM,UAAA,GAAgE;AAAA,EACpE,OAAA,EAAS,gCAAA;AAAA,EACT,IAAA,EAAM,wCAAA;AAAA,EACN,OAAA,EAAS,oCAAA;AAAA,EACT,OAAA,EAAS,qDAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,SAAS,MAAM,EAAE,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,OAAM,EAAiB;AACjE,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,2EAAA;AAAA,QACA,UAAA,CAAW,QAAQ,SAAS,CAAA;AAAA,QAC5B;AAAA,OACF;AAAA,MACA,aAAA,EAAY,OAAA;AAAA,MACZ,aAAW,IAAA,IAAQ,SAAA;AAAA,MACnB,KAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAEA,IAAM,cAAA,GAAwE;AAAA,EAC5E,OAAA,EAAS,wDAAA;AAAA,EACT,SAAA,EACE,mEAAA;AAAA,EACF,KAAA,EAAO,gCAAA;AAAA,EACP,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,WAAA,GAAkE;AAAA,EACtE,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAMA,IAAM,MAAA,GAAS,UAAA;AAAA,EACb,SAAS,YAAA,CACP;AAAA,IACE,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,KAEF,GAAA,EACA;AACA,IAAA,uBACEA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAY,SAAA;AAAA,QACZ,SAAA,EAAW,EAAA;AAAA,UACT,+MAAA;AAAA,UACA,UAAA;AAAA,UACA,cAAA,CAAe,WAAW,WAAW,CAAA;AAAA,UACrC,WAAA,CAAY,QAAQ,IAAI,CAAA;AAAA,UACxB;AAAA,SACF;AAAA,QACA,aAAA,EAAY,QAAA;AAAA,QACZ,gBAAc,OAAA,IAAW,WAAA;AAAA,QACzB,QAAA;AAAA,QACA,OAAA;AAAA,QACA,GAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAM,IAAA,IAAQ,QAAA;AAAA,QAEb;AAAA;AAAA,KACH;AAAA,EAEJ;AACF,CAAA;AAEA,SAAS,QAAA,CAAS;AAAA,EAChB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,uBACED,IAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,uDAAA;AAAA,QACA,aAAa,IAAA,IAAQ,+BAAA;AAAA,QACrB;AAAA,OACF;AAAA,MACA,aAAA,EAAY,UAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,OAAA;AAAA,YACA,SAAA,EAAW,EAAA,CAAG,sCAAA,EAAwC,UAAU,CAAA;AAAA,YAChE,QAAA;AAAA,YACA,UAAU,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,YAClD,IAAA,EAAK;AAAA;AAAA,SACP;AAAA,QACC;AAAA;AAAA;AAAA,GACH;AAEJ;AAGA,SAAS,UAAA,CACP,IAAA,EACA,OAAA,EACA,IAAA,EACM;AACN,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAyB;AACtC,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,OAAA,EAAQ;AAAA,IACtC,CAAA;AACA,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAwB;AACzC,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,MAAA,IAAI,EAAE,kBAAkB,IAAA,CAAA,EAAO;AAC/B,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,SAAS,QAAA,CAAS,MAAM,CAAA,KAAM,IAAI,CAAA,EAAG;AAChE,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,QAAA,CAAS,gBAAA,CAAiB,eAAe,SAAS,CAAA;AAClD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAC7C,MAAA,QAAA,CAAS,mBAAA,CAAoB,eAAe,SAAS,CAAA;AAAA,IACvD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,OAAA,EAAS,IAAI,CAAC,CAAA;AAC1B;AASA,SAAS,mBAAA,CACP,IAAA,EACA,MAAA,EACA,KAAA,EACA,KAAA,EACe;AACf,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,CAAwB,EAAE,CAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,IAAA,MAAM,WAAW,KAAA,CAAM,OAAA;AACvB,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,QAAA,KAAa,IAAA,EAAM;AAC3C,IAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,IAAA,MAAM,QAAQ,QAAA,CAAS,WAAA;AACvB,IAAA,MAAM,SAAS,QAAA,CAAS,YAAA;AACxB,IAAA,MAAM,gBAAgB,MAAA,CAAO,UAAA;AAC7B,IAAA,MAAM,iBAAiB,MAAA,CAAO,WAAA;AAC9B,IAAA,IAAI,IAAA,GACF,KAAA,KAAU,OAAA,GACN,IAAA,CAAK,OACL,KAAA,KAAU,KAAA,GACR,IAAA,CAAK,KAAA,GAAQ,QACb,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,GAAQ,CAAA;AAC7C,IAAA,IAAA,GAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,IAAA,EAAM,aAAA,GAAgB,KAAA,GAAQ,CAAC,CAAC,CAAA;AAC5D,IAAA,IAAI,GAAA,GAAM,KAAK,MAAA,GAAS,CAAA;AACxB,IAAA,IAAI,GAAA,GAAM,SAAS,cAAA,GAAiB,CAAA,IAAK,KAAK,GAAA,GAAM,MAAA,GAAS,IAAI,CAAA,EAAG;AAClE,MAAA,GAAA,GAAM,IAAA,CAAK,MAAM,MAAA,GAAS,CAAA;AAAA,IAC5B;AACA,IAAA,QAAA,CAAS,EAAE,QAAA,EAAU,OAAA,EAAS,KAAK,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAC,CAAA;AACzB,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,KAAA,EAAM;AACN,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,KAAA,EAAO,IAAI,CAAA;AAC7C,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,KAAK,CAAA;AACvC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,KAAA,EAAO,IAAI,CAAA;AAChD,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,KAAK,CAAA;AAAA,IAC5C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAChB,EAAA,OAAO,KAAA;AACT;AAEA,IAAM,KAAA,GACJ,8EAAA;AAEF,SAAS,OAAA,CAAQ;AAAA,EACf,IAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,MAAA,GAAS,OAAwB,IAAI,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,OAAuB,IAAI,CAAA;AACzC,EAAA,MAAM,eAAA,GAAkB,OAAO,YAAY,CAAA;AAC3C,EAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM,eAAA,CAAgB,QAAQ,KAAK,CAAA,EAAG,EAAE,CAAA;AAClE,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAC,MAAA,EAAQ,KAAK,CAAU,CAAA;AAC5C,EAAA,UAAA,CAAW,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AACpC,EAAA,MAAM,QAAQ,mBAAA,CAAoB,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,SAAS,QAAQ,CAAA;AACxE,EAAA,uBACED,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,aAAA;AAAA,QACV,aAAA,EAAY,iBAAA;AAAA,QACZ,OAAA,EAAS,MAAM,YAAA,CAAa,CAAC,IAAI,CAAA;AAAA,QACjC,GAAA,EAAK,MAAA;AAAA,QAEJ,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,IACC,uBACCA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,UAAA,EAAY,SAAS,CAAA;AAAA,QAC1C,aAAA,EAAY,SAAA;AAAA,QACZ,GAAA,EAAK,KAAA;AAAA,QACL,IAAA,EAAK,QAAA;AAAA,QACL,KAAA;AAAA,QAEC;AAAA;AAAA,KACH,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAEA,SAAS,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,WAAU,EAAgB;AACxD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,MAAA,GAAS,OAAwB,IAAI,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,OAAuB,IAAI,CAAA;AACzC,EAAA,MAAM,QAAQ,WAAA,CAAY,MAAM,QAAQ,KAAK,CAAA,EAAG,EAAE,CAAA;AAClD,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAC,MAAA,EAAQ,KAAK,CAAU,CAAA;AAC5C,EAAA,UAAA,CAAW,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,IAAA,EAAM,MAAA,EAAQ,OAAO,KAAK,CAAA;AAC5D,EAAA,MAAM,KAAK,KAAA,EAAM;AACjB,EAAA,uBACED,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,eAAA,EAAe,EAAA;AAAA,QACf,eAAA,EAAe,IAAA;AAAA,QACf,eAAA,EAAc,MAAA;AAAA,QACd,YAAA,EAAY,SAAA;AAAA,QACZ,SAAA,EAAU,aAAA;AAAA,QACV,aAAA,EAAY,cAAA;AAAA,QACZ,SAAS,MAAM,OAAA,CAAQ,CAAC,KAAA,KAAU,CAAC,KAAK,CAAA;AAAA,QACxC,GAAA,EAAK,MAAA;AAAA,QAEJ,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,IACC,uBACCA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,cAAc,CAAA;AAAA,QACnC,aAAA,EAAY,MAAA;AAAA,QACZ,EAAA;AAAA,QACA,GAAA,EAAK,KAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,KAAA;AAAA,QAEC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,UAAA,MAAM,QACJ,IAAA,CAAK,IAAA,KAAS,SAAY,IAAA,GAAO,YAAA,CAAa,KAAK,IAAI,CAAA;AACzD,UAAA,uBACED,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,wJAAA;AAAA,gBACA;AAAA,eACF;AAAA,cACA,UAAU,IAAA,CAAK,QAAA;AAAA,cAEf,SAAS,MAAM;AACb,gBAAA,OAAA,CAAQ,KAAK,CAAA;AACb,gBAAA,IAAA,CAAK,QAAA,EAAS;AAAA,cAChB,CAAA;AAAA,cACA,IAAA,EAAK,UAAA;AAAA,cACL,IAAA,EAAK,QAAA;AAAA,cAEJ,QAAA,EAAA;AAAA,gBAAA,KAAA,KAAU,IAAA,GAAO,IAAA,mBAAOC,GAAAA,CAAC,KAAA,EAAA,EAAM,CAAA;AAAA,gBAC/B,IAAA,CAAK;AAAA;AAAA,aAAA;AAAA,YATD,IAAA,CAAK;AAAA,WAUZ;AAAA,QAEJ,CAAC;AAAA;AAAA,KACH,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAEA,IAAM,UAAA,GAAgE;AAAA,EACpE,EAAA,EAAI,UAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,SAAA,GACJ,2IAAA;AAEF,SAAS,KAAA,CAAM;AAAA,EACb,IAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAA,MAAM,KAAA,GAAQ,OAAuB,IAAI,CAAA;AACzC,EAAA,MAAM,UAAU,KAAA,EAAM;AACtB,EAAA,MAAM,eAAA,GAAkB,OAAO,YAAY,CAAA;AAC3C,EAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM,eAAA,CAAgB,QAAQ,KAAK,CAAA,EAAG,EAAE,CAAA;AAClE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,WAAW,QAAA,CAAS,aAAA;AAC1B,IAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,IAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,QAAA;AAC5B,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AACtB,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,EAAS,aAAA,CAA2B,SAAS,CAAA;AACjE,IAAA,CAAC,KAAA,IAAS,KAAA,CAAM,OAAA,GAAU,KAAA,EAAM;AAChC,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAyB;AACtC,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,QAAA,KAAA,EAAM;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,KAAA,IAAS,KAAA,CAAM,YAAY,IAAA,EAAM;AACnD,MAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AAAA,QACtB,KAAA,CAAM,OAAA,CAAQ,gBAAA,CAA8B,SAAS;AAAA,OACvD;AACA,MAAA,MAAM,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAC3C,MAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,MAAA,EAAW;AAC9C,MAAA,IAAI,KAAA,CAAM,QAAA,IAAY,QAAA,CAAS,aAAA,KAAkB,IAAA,EAAM;AACrD,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb,WAAW,CAAC,KAAA,CAAM,QAAA,IAAY,QAAA,CAAS,kBAAkB,IAAA,EAAM;AAC7D,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAC7C,MAAA,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AACtB,MAAA,IAAI,QAAA,YAAoB,WAAA,EAAa,QAAA,CAAS,KAAA,EAAM;AAAA,IACtD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAChB,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,aAAa,YAAA,CAAa,KAAA;AAChC,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,qEAAA;AAAA,MACV,aAAA,EAAY,gBAAA;AAAA,MACZ,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,QAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,aAAA,EAAe,KAAA,EAAM;AAAA,MAClD,CAAA;AAAA,MAEA,QAAA,kBAAAD,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,iBAAA,EAAiB,OAAA;AAAA,UACjB,YAAA,EAAW,MAAA;AAAA,UACX,SAAA,EAAW,EAAA;AAAA,YACT,kJAAA;AAAA,YACA,UAAA,CAAW,QAAQ,IAAI;AAAA,WACzB;AAAA,UACA,aAAA,EAAY,OAAA;AAAA,UACZ,GAAA,EAAK,KAAA;AAAA,UACL,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,EAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,MAAA,oBACCC,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,oCAAA,EAAqC,EAAA,EAAI,SACpD,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,gBAED,MAAA,KAAW,MAAA,GAAY,IAAA,mBACtBA,GAAAA,CAAC,QAAG,SAAA,EAAU,SAAA,EAAU,EAAA,EAAI,OAAA,EACzB,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,gBAED,WAAA,KAAgB,SAAY,IAAA,mBAC3BA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,WAAA,EAAY;AAAA,eAAA,EAE9D,CAAA;AAAA,8BACAA,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,YAAA,EAAW,OAAA;AAAA,kBACX,SAAA,EAAW,EAAA;AAAA,oBACT,4DAAA;AAAA,oBACA;AAAA,mBACF;AAAA,kBACA,OAAA,EAAS,KAAA;AAAA,kBACT,IAAA,EAAK,QAAA;AAAA,kBAEL,QAAA,kBAAAA,IAAC,UAAA,EAAA,EAAW;AAAA;AAAA;AACd,aAAA,EACF,CAAA;AAAA,YACC,QAAA;AAAA,YACA,MAAA,KAAW,SAAY,IAAA,mBACtBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDACZ,QAAA,EAAA,MAAA,EACH;AAAA;AAAA;AAAA;AAEJ;AAAA,GACF;AAEJ;AAEA,IAAM,KAAA,GACJ,wKAAA;AAEF,SAAS,MAAA,CAAO;AAAA,EACd,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,UAAU,YAAA,CAAa,WAAA;AAC7B,EAAA,uBACED,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,SAAS,CAAA;AAAA,MACtD,aAAA,EAAY,QAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAY,SAAA;AAAA,YACZ,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,qCAAA,EAAuC,UAAU,CAAA;AAAA,YACtE,QAAA;AAAA,YACA,UAAU,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,YAChD,KAAA;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,WAAA,KAAgB,MAAA,IAAa,KAAA,KAAU,EAAA,mBACtCC,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAQ,IAAA,EAAC,KAAA,EAAM,EAAA,EACpB,QAAA,EAAA,WAAA,EACH,CAAA,GACE,IAAA;AAAA,cACH,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,UAAU,MAAA,CAAO,QAAA;AAAA,kBAEjB,OAAO,MAAA,CAAO,KAAA;AAAA,kBAEb,QAAA,EAAA,MAAA,CAAO;AAAA,iBAAA;AAAA,gBAHH,MAAA,CAAO;AAAA,eAKf;AAAA;AAAA;AAAA,SACH;AAAA,wBACAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,qFAAA,EAAsF;AAAA;AAAA;AAAA,GAC3G;AAEJ;AAEA,SAAS,QAAA,CAAS,EAAE,SAAA,EAAW,KAAA,EAAM,EAAoB;AACvD,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,yCAAA,EAA2C,SAAS,CAAA;AAAA,MAClE,aAAA,EAAY,UAAA;AAAA,MACZ;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,SAAA,CAAU;AAAA,EACjB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,uBACEA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,UAAA,EAAY,SAAS,CAAA;AAAA,MAC1C,aAAA,EAAY,YAAA;AAAA,MACZ,QAAA;AAAA,MACA,MAAA,EAAQ,QAAA;AAAA,MACR,UAAU,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,MAChD,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,QAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,EAAS,QAAA,IAAW;AAAA,MACxC,CAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAM,IAAA,IAAQ,MAAA;AAAA,MACd;AAAA;AAAA,GACF;AAEJ;AAEA,IAAM,YAAA,GAAoE;AAAA,EACxE,GAAA,EAAK,8CAAA;AAAA,EACL,MAAA,EAAQ,2CAAA;AAAA,EACR,IAAA,EAAM,4CAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,OAAA,CAAQ,EAAE,KAAA,EAAO,QAAA,EAAU,MAAK,EAAmB;AAC1D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,KAAK,CAAA;AACxC,EAAA,uBACED,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,sBAAA;AAAA,MACV,aAAA,EAAY,SAAA;AAAA,MACZ,MAAA,EAAQ,MAAM,QAAA,CAAS,KAAK,CAAA;AAAA,MAC5B,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,MAC5B,YAAA,EAAc,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,MACjC,YAAA,EAAc,MAAM,QAAA,CAAS,KAAK,CAAA;AAAA,MAEjC,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA,wBACCC,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,0HAAA;AAAA,cACA,YAAA,CAAa,QAAQ,KAAK;AAAA,aAC5B;AAAA,YACA,IAAA,EAAK,SAAA;AAAA,YAEJ,QAAA,EAAA;AAAA;AAAA,SACH,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;AAGO,IAAM,YAAA,GAAsB;AAAA,EACjC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF;AAMO,SAAS,mBAAmB,SAAA,EAAmC;AACpE,EAAA,IAAI,SAAA,KAAc,QAAW,OAAO,YAAA;AACpC,EAAA,MAAM,UAAU,MAAA,CAAO,WAAA;AAAA,IACrB,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CAAE,MAAA;AAAA,MACxB,CAAC,GAAG,SAAS,MAAM,SAAA,KAAc;AAAA;AACnC,GACF;AACA,EAAA,OAAO,EAAE,GAAG,YAAA,EAAc,GAAG,OAAA,EAAQ;AACvC;ACnjBA,IAAM,gBAAA,GAAmB,aAAA;AAAA,EACvB;AACF,CAAA;AAeO,SAAS,0BAAA,CAA2B;AAAA,EACzC,SAAA;AAAA,EACA,EAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA,GAAS,eAAA;AAAA,EACT,WAAW,MAAM,MAAA;AAAA,EACjB,OAAA,GAAU,IAAA;AAAA,EACV;AACF,CAAA,EAAoC;AAClC,EAAA,MAAM,GAAA,GAAM,QAAQ,MAAM,kBAAA,CAAmB,EAAE,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AACtD,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAM,UAAA,CAAW,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAIvD,EAAA,MAAM,SAAA,GAAYC,OAAmB,QAAQ,CAAA;AAC7C,EAAA,SAAA,CAAU,OAAA,GAAU,QAAA;AACpB,EAAA,MAAM,MAAA,GAASC,WAAAA,CAAwB,CAAC,MAAA,KAAW;AACjD,IAAA,SAAA,CAAU,QAAQ,MAAM,CAAA;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO;AAAA,MACL,SAAA;AAAA,MACA,EAAA,EAAI,GAAA;AAAA,MACJ,KAAA,EAAO,MAAA;AAAA,MACP,MAAA;AAAA,MACA,QAAA,EAAU,MAAA;AAAA,MACV,WAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,GAAA,EAAK,QAAQ,MAAA,EAAQ,MAAA,EAAQ,aAAa,OAAO;AAAA,GAC/D;AACA,EAAA,uBACEF,GAAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,OACxB,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,YAAA,GAA+C;AAC7D,EAAA,MAAM,KAAA,GAAQ,WAAW,gBAAgB,CAAA;AACzC,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AC5EO,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAA,GAAM,EAAA;AAAA,EACN,GAAA,GAAM,EAAA;AAAA,EACN;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,MAAA,GAASC,OAA8B,IAAI,CAAA;AACjD,EAAA,MAAM,OAAA,GAAUA,OAA+B,IAAI,CAAA;AACnD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIE,SAAS,GAAG,CAAA;AAEpC,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,IAAA,KAAS,IAAA,EAAM;AACnC,IAAA,MAAM,MAAM,MAAM;AAChB,MAAA,IAAI,IAAA,GAAO,GAAA;AACX,MAAA,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AAG7B,MAAA,MAAM,UAAU,MACd,GAAA,CAAI,eAAe,CAAA,IAAK,IAAA,CAAK,eAAe,GAAA,CAAI,YAAA;AAClD,MAAA,OAAO,OAAO,GAAA,KAAQ,IAAA,CAAK,cAAc,GAAA,CAAI,WAAA,IAAe,SAAQ,CAAA,EAAI;AACtE,QAAA,IAAA,IAAQ,CAAA;AACR,QAAA,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AAAA,MAC/B;AACA,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA;AACA,IAAA,GAAA,EAAI;AACJ,IAAA,IAAI,OAAO,mBAAmB,WAAA,EAAa;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,GAAG,CAAA;AACvC,IAAA,QAAA,CAAS,QAAQ,GAAG,CAAA;AACpB,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,UAAA,EAAW;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,GAAA,EAAK,GAAG,CAAC,CAAA;AAEvB,EAAA,uBACEJ,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAW,EAAA,CAAG,uCAAA,EAAyC,SAAS,CAAA;AAAA,MAGhE,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,QAAA;AAAA,QACV,GAAG;AAAA,OACL;AAAA,MAEA,QAAA,kBAAAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,OAAA;AAAA,UACL,SAAA,EAAU,yBAAA;AAAA,UACV,OAAO,EAAE,QAAA,EAAU,GAAG,IAAI,CAAA,EAAA,CAAA,EAAM,YAAY,GAAA,EAAI;AAAA,UAE/C;AAAA;AAAA;AACH;AAAA,GACF;AAEJ;AC/CA,IAAM,aAAA,GAAgBK,cAAkD,IAAI,CAAA;AAkB5E,IAAM,iBAAA,GAAmC,EAAE,OAAA,EAAS,CAAC,cAAc,SAAA,EAAU;AAE7E,SAAS,SAAA,CAAU;AAAA,EACjB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,uBACEL,GAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS,UAAA;AAAA,MACT,GAAA,EAAK,MAAA,KAAW,QAAA,GAAW,YAAA,GAAe,MAAA;AAAA,MAEzC;AAAA;AAAA,GACH;AAEJ;AAEA,IAAM,UAAA,GAAwB,EAAE,IAAA,EAAM,SAAA,EAAU;AAEzC,SAAS,uBAAA,CAAwB;AAAA,EACtC,SAAA;AAAA,EACA,EAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA,GAAS,iBAAA;AAAA,EACT,KAAA,GAAQ,UAAA;AAAA,EACR,YAAY,EAAC;AAAA,EACb,WAAW,MAAM,MAAA;AAAA,EACjB,OAAA,GAAU,KAAA;AAAA,EACV,QAAA,GAAW,KAAA;AAAA,EACX,aAAA,GAAgB,KAAA;AAAA,EAChB;AACF,CAAA,EAAiC;AAC/B,EAAA,MAAM,GAAA,GAAMM,QAAQ,MAAM,kBAAA,CAAmB,EAAE,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AACtD,EAAA,MAAM,MAAA,GAASA,QAAQ,MAAM,UAAA,CAAW,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAIvD,EAAA,MAAM,SAAA,GAAYL,OAAmB,QAAQ,CAAA;AAC7C,EAAA,SAAA,CAAU,OAAA,GAAU,QAAA;AACpB,EAAA,MAAM,MAAA,GAASC,WAAAA,CAAwB,CAAC,MAAA,KAAW;AACjD,IAAA,SAAA,CAAU,QAAQ,MAAM,CAAA;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQI,OAAAA;AAAA,IACZ,OAAO;AAAA,MACL,SAAA;AAAA,MACA,EAAA,EAAI,GAAA;AAAA,MACJ,KAAA,EAAO,MAAA;AAAA,MACP,MAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA,EAAU,MAAA;AAAA,MACV,OAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,SAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA;AACF,GACF;AACA,EAAA,uBACEN,GAAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,OAAe,QAAA,EAAS,CAAA;AAEpD;AAEO,SAAS,kBAAA,GAAkD;AAChE,EAAA,MAAM,KAAA,GAAQO,WAAW,aAAa,CAAA;AACtC,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,QAAA,GAAkB;AAChC,EAAA,OAAO,oBAAmB,CAAE,EAAA;AAC9B;AAEO,SAAS,QAAA,GAAoB;AAClC,EAAA,OAAO,oBAAmB,CAAE,KAAA;AAC9B;ACjIO,SAAS,mBAAA,CAAoB;AAAA,EAClC,KAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,kBAAA,EAAmB;AACrC,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,EAAA,uBACEP,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAW,YAAA;AAAA,MACX,SAAA,EAAW,EAAA;AAAA,QACT,uDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,0BAChBD,IAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,yBAAA;AAAA,UAET,QAAA,EAAA;AAAA,YAAA,KAAA,GAAQ,qBAAKC,GAAAA,CAAC,MAAM,YAAA,EAAN,EAAmB,WAAU,SAAA,EAAU,CAAA;AAAA,YACrD,IAAA,CAAK,IAAA,KAAS,MAAA,mBACbA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,KAAA,KAAU,KAAA,CAAM,MAAA,GAAS,IAAI,iBAAA,GAAoB,EAAA;AAAA,gBAC5D,cAAA,EAAc,KAAA,KAAU,KAAA,CAAM,MAAA,GAAS,IAAI,MAAA,GAAS,MAAA;AAAA,gBAEnD,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,aACR,mBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAK,MAAM,IAAA,CAAK,IAAA,EAAO,eAAK,KAAA,EAAM;AAAA;AAAA,SAAA;AAAA,QAZhC,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,OAe9B;AAAA;AAAA,GACH;AAEJ;ACzCO,IAAM,KAAA,GAAQ;AAGd,SAAS,IAAA,CAAK,EAAE,IAAA,EAAK,EAAqB;AAC/C,EAAA,MAAM,EAAE,EAAA,EAAI,KAAA,EAAM,GAAI,YAAA,EAAa;AACnC,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,EAAA,uBACEA,GAAAA,CAAC,EAAA,CAAG,SAAH,EAAW,KAAA,EAAO,MACjB,QAAA,kBAAAA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAY,IAAA;AAAA,MACZ,IAAA,EAAK,KAAA;AAAA,MACL,SAAA,EAAU,gDAAA;AAAA,MAEV,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc,OAAO,IAAA,EAAM;AAAA;AAAA,GAC7C,EACF,CAAA;AAEJ;AAGO,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,IACrD,uBAAOA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,MAAM,CAAA,GAAK;AAAA,GAAA,EACjC,CAAA;AAEJ;AAGO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EASG;AACD,EAAA,MAAM,EAAE,EAAA,EAAG,GAAI,YAAA,EAAa;AAC5B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIG,SAAS,KAAK,CAAA;AACxC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAG5C,EAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,GAAQ,KAAA;AAEhC,EAAA,uBACEJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAY,CAAA;AAAA,oBACrCA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAS,MAAM;AACb,UAAA,QAAA,CAAS,KAAK,CAAA;AACd,UAAA,UAAA,CAAW,IAAI,CAAA;AAAA,QACjB,CAAA;AAAA,QACA,QAAQ,MAAM;AACZ,UAAA,UAAA,CAAW,KAAK,CAAA;AAChB,UAAA,IAAI,KAAA,KAAU,KAAA,EAAO,QAAA,CAAS,KAAK,CAAA;AAAA,QACrC,CAAA;AAAA,QAEA,QAAA,kBAAAA,GAAAA;AAAA,UAAC,EAAA,CAAG,SAAA;AAAA,UAAH;AAAA,YACC,KAAA,EAAO,KAAA;AAAA,YACP,SAAA,EAAW,KAAA;AAAA,YACX,WAAA;AAAA,YACA,QAAA,EAAU,QAAA;AAAA,YACV,SAAA,EAAW,EAAA,CAAG,IAAA,GAAO,uBAAA,GAA0B,EAAE,CAAA;AAAA,YACjD,QAAA,EAAU,QAAA;AAAA,YACV,UAAU,MAAM;AACd,cAAA,UAAA,CAAW,KAAK,CAAA;AAChB,cAAA,IAAI,KAAA,KAAU,KAAA,EAAO,QAAA,CAAS,KAAK,CAAA;AAAA,YACrC;AAAA;AAAA;AACF;AAAA,KACF;AAAA,IACC,uBACCA,GAAAA,CAAC,OAAE,SAAA,EAAU,mCAAA,EAAqC,gBAAK,CAAA,GACrD;AAAA,GAAA,EACN,CAAA;AAEJ;AAGO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,MAAM,EAAE,EAAA,EAAG,GAAI,YAAA,EAAa;AAC5B,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAY,CAAA;AAAA,MACpC,uBACCA,GAAAA,CAAC,OAAE,SAAA,EAAU,mCAAA,EAAqC,gBAAK,CAAA,GACrD;AAAA,KAAA,EACN,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAAC,EAAA,CAAG,QAAA;AAAA,MAAH;AAAA,QACC,OAAA;AAAA,QACA,QAAA,EAAU,QAAA;AAAA,QACV,KAAA;AAAA,QACA,QAAA,EAAU;AAAA;AAAA;AACZ,GAAA,EACF,CAAA;AAEJ;AAGO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAUG;AACD,EAAA,uBACEA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,KAAA,EAAO,KAAA,KAAU,IAAA,GAAO,EAAA,GAAK,OAAO,KAAK,CAAA;AAAA,MACzC,WAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,QAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,QAAA,IAAI,YAAY,EAAA,EAAI;AAClB,UAAA,QAAA,CAAS,IAAI,CAAA;AACb,UAAA;AAAA,QACF;AACA,QAAA,MAAM,MAAA,GAAS,OAAO,OAAO,CAAA;AAC7B,QAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9B,QAAA,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAC,CAAC,CAAA;AAAA,MAC3D;AAAA;AAAA,GACF;AAEJ;AAGO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EASG;AACD,EAAA,MAAM,EAAE,EAAA,EAAG,GAAI,YAAA,EAAa;AAC5B,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAY,CAAA;AAAA,oBACrCA,GAAAA;AAAA,MAAC,EAAA,CAAG,MAAA;AAAA,MAAH;AAAA,QACC,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,OAAA;AAAA,QACA,SAAA,EAAW,KAAA;AAAA,QACX,WAAA;AAAA,QACA,QAAA,EAAU,QAAA;AAAA,QACV,QAAA,EAAU;AAAA;AAAA,KACZ;AAAA,IACC,uBACCA,GAAAA,CAAC,OAAE,SAAA,EAAU,mCAAA,EAAqC,gBAAK,CAAA,GACrD;AAAA,GAAA,EACN,CAAA;AAEJ;AAGO,SAAS,QAAA,CAA2B;AAAA,EACzC,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU,CAAA;AAAA,EACV;AACF,CAAA,EAMG;AACD,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,YAAA;AAAA,QACA,OAAA,KAAY,IAAI,gBAAA,GAAmB;AAAA,OACrC;AAAA,MAEC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,QAAA;AAAA,UACV,cAAA,EAAc,OAAO,EAAA,KAAO,KAAA;AAAA,UAC5B,SAAS,MAAM;AACb,YAAA,MAAA,CAAO,OAAO,EAAE,CAAA;AAAA,UAClB,CAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,sFAAA;AAAA,YACA,MAAA,CAAO,EAAA,KAAO,KAAA,GACV,uCAAA,GACA,sCAAA;AAAA,YACJ,WAAW,2BAAA,GAA8B;AAAA,WAC3C;AAAA,UAEA,QAAA,kBAAAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EACd,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,iBAAO,KAAA,EAAM,CAAA;AAAA,YAC9C,MAAA,CAAO,wBACNA,GAAAA,CAAC,UAAK,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA,MAAA,CAAO,KAAA,EACV,CAAA,GACE;AAAA,WAAA,EACN;AAAA,SAAA;AAAA,QAtBK,MAAA,CAAO;AAAA,OAwBf;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAQG;AACD,EAAA,MAAM,EAAE,EAAA,EAAG,GAAI,YAAA,EAAa;AAC5B,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,MACC,uBAAOA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,MAAM,CAAA,GAAK;AAAA,KAAA,EACjC,CAAA;AAAA,IACC,QAAQ,MAAA,KAAW,CAAA,mBAClBA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+BAAA,EAAiC,QAAA,EAAA,KAAA,EAAM,oBAEpDA,GAAAA,CAAC,SAAI,SAAA,EAAU,2BAAA,EACZ,kBAAQ,GAAA,CAAI,CAAC,2BACZA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,OAAO,MAAA,CAAO,GAAA;AAAA,QACd,SAAA,EAAW,EAAA;AAAA,UACT,iEAAA;AAAA,UACA,QAAA,CAAS,QAAA,CAAS,MAAA,CAAO,GAAG,IACxB,gCAAA,GACA,sCAAA;AAAA,UACJ,WAAW,YAAA,GAAe;AAAA,SAC5B;AAAA,QAEA,QAAA,kBAAAA,GAAAA;AAAA,UAAC,EAAA,CAAG,QAAA;AAAA,UAAH;AAAA,YACC,OAAA,EAAS,QAAA,CAAS,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA;AAAA,YACrC,QAAA,EAAU,QAAA;AAAA,YACV,KAAA,kBACED,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,2BAAA,EACd,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,iBAAO,KAAA,EAAM,CAAA;AAAA,cACxC,MAAA,CAAO,MAAA,mBACNA,GAAAA,CAAC,EAAA,CAAG,OAAH,EAAS,IAAA,EAAK,SAAA,EAAU,QAAA,EAAA,OAAA,EAAK,CAAA,GAC5B;AAAA,aAAA,EACN,CAAA;AAAA,YAEF,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,cAAA,QAAA,CAAS,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,YAC9B;AAAA;AAAA;AACF,OAAA;AAAA,MAxBK,MAAA,CAAO;AAAA,KA0Bf,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAGO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAS,EAAyB;AACnE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIG,SAAS,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,uBACEJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,4FAAA;AAAA,QACV,SAAS,MAAM;AACb,UAAA,OAAA,CAAQ,CAAC,OAAA,KAAY,CAAC,OAAO,CAAA;AAAA,QAC/B,CAAA;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA,GAAO,MAAA,GAAS,MAAA;AAAA,UAAO;AAAA;AAAA;AAAA,KAC1B;AAAA,IACC,uBACCC,GAAAA,CAAC,SAAI,SAAA,EAAU,8DAAA,EACZ,oBACH,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAGO,SAAS,iBAAA,CAAkB;AAAA,EAChC,IAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC9B,EAAA,uBACEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qFAAA,EACV,qBACG,CAAA,8DAAA,EAAiE,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,0BAAA,CAAA,GAChF,CAAA,uDAAA,EAA0D,KAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,EAC/E,CAAA;AAEJ;AAEO,SAAS,SAAA,CAAU;AAAA,EACxB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAQG;AACD,EAAA;AAAA;AAAA;AAAA,oBAGED,IAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,MAAA;AAAA,QACJ,YAAA,EAAY,KAAA;AAAA,QACZ,SAAA,EAAU,0CAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,oEAAA,EAChB,QAAA,EAAA;AAAA,4BAAAC,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,oFAAA;AAAA,kBACA,OACI,oCAAA,GACA;AAAA,iBACN;AAAA,gBAEC,QAAA,EAAA;AAAA;AAAA,aACH;AAAA,4BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,gBAC5C,uBAAOA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,MAAM,CAAA,GAAK;AAAA,eAAA,EACjC,CAAA;AAAA,cACC,wBACCA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAiC,iBAAM,CAAA,GAClD;AAAA,aAAA,EACN;AAAA,WAAA,EACF,CAAA;AAAA,0BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAiB,QAAA,EAAS;AAAA;AAAA;AAAA;AAC3C;AAEJ;ACxZA,IAAM,iBAAiBK,aAAAA,CAAqC;AAAA,EAC1D,SAAS,EAAC;AAAA,EACV,WAAW,MAAM,MAAA;AAAA,EACjB,QAAQ,EAAC;AAAA,EACT,gBAAgB,MAAM,MAAA;AAAA,EACtB,cAAc,MAAM;AACtB,CAAC,CAAA;AAUM,SAAS,wBAAA,CAAyB;AAAA,EACvC,QAAA;AAAA,EACA,OAAA,EAAS,iBAAA;AAAA,EACT,SAAA,EAAW,mBAAA;AAAA,EACX,cAAA;AAAA,EACA,iBAAiB;AACnB,CAAA,EAAkC;AAChC,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GACxCF,SAAkC,cAAc,CAAA;AAClD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAAiC,EAAE,CAAA;AAE/D,EAAA,MAAM,cAAA,GAAiBD,WAAAA,CAAY,CAAC,EAAA,EAAY,KAAA,KAAkB;AAChE,IAAA,SAAA;AAAA,MAAU,CAAC,QAAA,KACT,QAAA,CAAS,EAAE,CAAA,KAAM,KAAA,GAAQ,QAAA,GAAW,EAAE,GAAG,QAAA,EAAU,CAAC,EAAE,GAAG,KAAA;AAAM,KACjE;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAU,iBAAA,IAAqB,eAAA;AACrC,EAAA,MAAM,SAAA,GAAYI,OAAAA;AAAA,IAChB,MACE,mBAAA,KACC,CAAC,EAAA,EAAYE,MAAAA,KAAmB;AAC/B,MAAA,kBAAA,CAAmB,CAAC,cAAc,EAAE,GAAG,UAAU,CAAC,EAAE,GAAGA,MAAAA,EAAM,CAAE,CAAA;AAAA,IACjE,CAAA,CAAA;AAAA,IACF,CAAC,mBAAmB;AAAA,GACtB;AAEA,EAAA,MAAM,KAAA,GAAQF,OAAAA;AAAA,IACZ,OAAO;AAAA,MACL,OAAA;AAAA,MACA,SAAA,EAAW,CAAC,EAAA,EAAI,IAAA,KAAS;AACvB,QAAA,SAAA,CAAU,IAAI,IAAI,CAAA;AAClB,QAAA,cAAA,GAAiB,IAAI,IAAI,CAAA;AAAA,MAC3B,CAAA;AAAA,MACA,MAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAc,MAAM;AAClB,QAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACrC,UAAA,SAAA,CAAU,IAAI,MAAS,CAAA;AACvB,UAAA,cAAA,GAAiB,IAAI,MAAS,CAAA;AAAA,QAChC;AAAA,MACF;AAAA,KACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,SAAA,EAAW,cAAA,EAAgB,QAAQ,cAAc;AAAA,GAC7D;AAEA,EAAA,uBACEN,GAAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,OAAe,QAAA,EAAS,CAAA;AAErD;AAEO,SAAS,mBAAA,GAA6C;AAC3D,EAAA,OAAOO,WAAW,cAAc,CAAA;AAClC;ACxEA,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA,EAC9B,SAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,YAAA,GAAe,GAAA;AAErB,IAAM,cAAA,GAAgC;AAAA,EACpC,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO,CAAA;AAAA,EACP,GAAA,EAAK,CAAA;AAAA,EACL,MAAA,EAAQ,EAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK;AACP,CAAA;AAiBO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,SAAS,kBAAA,EAAmB;AAClC,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,mBAAA,EAAoB;AAChD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIJ,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE9C,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,aAAa,EAAE,CAAA;AACpD,EAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,SAAS,GAAG,OAAO,IAAA;AAC5C,EAAA,IAAI,OAAO,MAAA,EAAQ,KAAA,KAAU,QAAA,EAAU,OAAO,IAAA;AAC9C,EAAA,IAAI,MAAA,CAAO,SAAS,OAAO,IAAA;AAE3B,EAAA,MAAM,IAAA,GAAO,WAAW,MAAM,CAAA;AAC9B,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,MAAA,EAAQ,IAAI,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,QAAQ,MAAA,GAAS,CAAA;AACrD,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,MAAA;AAAA,IACtC,CAAC,GAAG,KAAK,MAAM,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU;AAAA,GACpE;AAEA,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,MAAM,GAAA,GAAM,cAAA,CAAe,EAAE,OAAA,EAAS,MAAM,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,WAAW,SAAA,EAAW,SAAA;AACxC,IAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,MAAA,MAAA,CAAO,SAAS,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,yBAAyB,CAAA;AACnE,MAAA;AAAA,IACF;AACA,IAAA,KAAK,SAAA,CAAU,SAAA,CAAU,GAAG,CAAA,CAAE,IAAA;AAAA,MAC5B,MAAM;AACJ,QAAA,MAAA,CAAO,SAAS,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,iBAAiB,CAAA;AAAA,MAC/D,CAAA;AAAA,MACA,MAAM;AACJ,QAAA,MAAA,CAAO,SAAS,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,eAAe,CAAA;AAAA,MAC3D;AAAA,KACF;AAAA,EACF,CAAA;AAEA,EAAA,uBACEJ,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,yBAAA,EAAwB,MAAA;AAAA,MACxB,qBAAA,EAAqB,OAAO,QAAA,CAAS,EAAA;AAAA,MACrC,SAAA,EAAW,EAAA;AAAA,QACT,uFAAA;AAAA,QACA,qFAAA;AAAA,QACA;AAAA,OACF;AAAA,MAGA,KAAA,EAAO,cAAA;AAAA,MAEP,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,EAAA,CAAG,OAAA;AAAA,UAAH;AAAA,YACC,IAAA,EAAM,QAAA;AAAA,YACN,YAAA,EAAc,WAAA;AAAA,YACd,KAAA,EAAM,KAAA;AAAA,YACN,yBACEA,GAAAA;AAAA,cAAC,EAAA,CAAG,MAAA;AAAA,cAAH;AAAA,gBACC,OAAA,EAAQ,OAAA;AAAA,gBACR,IAAA,EAAK,IAAA;AAAA,gBACL,SAAA,EAAU,6BAAA;AAAA,gBACV,KAAA,EAAM,6BAAA;AAAA,gBACN,SAAS,MAAM;AACb,kBAAA,WAAA,CAAY,CAAC,QAAQ,CAAA;AAAA,gBACvB,CAAA;AAAA,gBAEA,0BAAAA,GAAAA,CAAC,KAAA,CAAM,IAAA,EAAN,EAAW,WAAU,aAAA,EAAc;AAAA;AAAA,aACtC;AAAA,YAGF,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,MAAA,CAAO,SAAS,IAAA,EAAK,CAAA;AAAA,cAChD,OAAO,MAAA,CAAO,QAAA,CAAS,WAAA,KAAgB,QAAA,oBACtCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EACV,QAAA,EAAA,MAAA,CAAO,QAAA,CAAS,WAAA,EACnB,CAAA;AAAA,8BAEFD,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EACV,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,MAAA;AAAA,gBAAO,MAAA;AAAA,gBAAK,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAA;AAAA,gBAAI,IAAA;AAAA,gBAAG,OAAA,CAAQ,MAAA;AAAA,gBAAQ,GAAA;AAAA,gBAAI,QAAA;AAAA,gBAC/D,OAAA,CAAQ,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK;AAAA,eAAA,EACrC,CAAA;AAAA,8BACAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oBAAmB,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,cAC9C,OAAA,CAAQ,MAAA,KAAW,CAAA,mBAClBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,mDAAA,EAErC,CAAA,mBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,0CAAA,EACX,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,EAAA,EAAI,KAAK,CAAA,qBACtBD,IAAAA,CAAC,IAAA,EAAA,EAAY,SAAA,EAAU,UAAA,EACpB,QAAA,EAAA;AAAA,gBAAA,WAAA,GAAc,EAAE,CAAA,IAAK,EAAA;AAAA,gBAAG,GAAA;AAAA,gBAAE,GAAA;AAAA,gBAC1B,MAAA,CAAO,EAAE,CAAA,IAAK,iBAAA,CAAkB,KAAK;AAAA,eAAA,EAAA,EAF/B,EAGT,CACD,CAAA,EACH;AAAA,aAAA,EAEJ;AAAA;AAAA,SACF;AAAA,wBACAC,GAAAA;AAAA,UAAC,EAAA,CAAG,IAAA;AAAA,UAAH;AAAA,YACC,SAAA,EAAU,gBAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,GAAI,SAAA,KAAc,MAAA,GACd,EAAC,GACD;AAAA,gBACE;AAAA,kBACE,EAAA,EAAI,SAAA;AAAA,kBACJ,KAAA,EAAO,SAAA;AAAA,kBACP,IAAA,EAAM,SAAA;AAAA,kBACN,QAAA,EAAU;AAAA;AACZ,eACF;AAAA,cACJ;AAAA,gBACE,EAAA,EAAI,MAAA;AAAA,gBACJ,KAAA,EAAO,WAAA;AAAA,gBACP,IAAA,EAAM,QAAA;AAAA,gBACN,UAAU,MAAM;AACd,kBAAA,WAAA,CAAY,IAAI,CAAA;AAAA,gBAClB;AAAA,eACF;AAAA,cACA;AAAA,gBACE,EAAA,EAAI,MAAA;AAAA,gBACJ,KAAA,EAAO,aAAA;AAAA,gBACP,IAAA,EAAM,UAAA;AAAA,gBACN,QAAA,EAAU;AAAA;AACZ,aACF;AAAA,YACA,yBACEA,GAAAA,CAAC,GAAG,MAAA,EAAH,EAAU,SAAQ,OAAA,EAAQ,IAAA,EAAK,MAAK,SAAA,EAAU,gBAAA,EAC7C,0BAAAA,GAAAA,CAAC,KAAA,CAAM,MAAN,EAAW,SAAA,EAAU,eAAc,CAAA,EACtC;AAAA;AAAA,SAEJ;AAAA,wBACAA,GAAAA;AAAA,UAAC,EAAA,CAAG,KAAA;AAAA,UAAH;AAAA,YACC,IAAA,EAAM,QAAA;AAAA,YACN,YAAA,EAAc,WAAA;AAAA,YACd,IAAA,EAAK,IAAA;AAAA,YACL,KAAA,EAAO,OAAO,QAAA,CAAS,IAAA;AAAA,YACvB,aACE,IAAA,CAAK,MAAA,GAAS,eACV,CAAA,MAAA,EAAS,YAAY,OAAO,IAAA,CAAK,MAAM,CAAA,yBAAA,CAAA,GACvC,CAAA,IAAA,EAAO,KAAK,MAAM,CAAA,IAAA,EAAO,KAAK,MAAA,KAAW,CAAA,GAAI,KAAK,GAAG,CAAA,oBAAA,CAAA;AAAA,YAG3D,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDACb,QAAA,kBAAAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gCAAA,EACf,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,WACC,QAAA,kBAAAA,GAAAA,CAAC,QACE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,GAAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBAEC,KAAA,EAAM,KAAA;AAAA,kBACN,SAAA,EAAU,mDAAA;AAAA,kBAET,QAAA,EAAA;AAAA,iBAAA;AAAA,gBAJI;AAAA,eAMR,GACH,CAAA,EACF,CAAA;AAAA,8BACAA,GAAAA,CAAC,OAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,KAAA,CAAM,GAAG,YAAY,CAAA,CAAE,GAAA,CAAI,CAAC,KAAK,KAAA,qBACrCA,GAAAA,CAAC,IAAA,EAAA,EAAe,WAAU,wBAAA,EACvB,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,2BACZA,GAAAA,CAAC,IAAA,EAAA,EAAgB,SAAA,EAAU,+BACxB,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,MAAM,CAAC,KADd,MAET,CACD,CAAA,EAAA,EALM,KAMT,CACD,CAAA,EACH;AAAA,aAAA,EACF,CAAA,EACF;AAAA;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;;;AC/NO,SAAS,SAAS,MAAA,EAAmD;AAC1E,EAAA,MAAM,QAAyC,EAAC;AAChD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,UAAU,KAAA,EAAO;AAC9D,IAAA,IAAI,UAAU,IAAA,EAAM;AACpB,IAAA,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,EACf;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,QAAW,KAAA,EAA4C;AACrE,EAAA,OAAO,KAAA,KAAU,OAAO,MAAA,GAAY,KAAA;AACtC;ACfA,IAAM,aAAA,GAA0C;AAAA,EAC9C,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAUO,SAAS,cAAA,CACd,OACA,QAAA,EAC6B;AAC7B,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AACzD,IAAA,OAAO,QAAA,KAAa,MAAA,GAAY,MAAA,GAAY,EAAE,MAAM,QAAA,EAAS;AAAA,EAC/D;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,EAAE,MAAM,KAAA,EAAM;AACpD,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,QAAA;AAC3B,EAAA,IAAI,SAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAI,OAAO,MAAA;AAC/D,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,IAAA,EAAM,MAAM,IAAA,IAAQ,MAAA;AAAA,IACpB,OAAA,EAAS,MAAM,OAAA,IAAW,MAAA;AAAA,IAC1B,QAAA,EAAU,MAAM,QAAA,IAAY;AAAA,GAC9B;AACF;AAUO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,EAAO,QAAQ,CAAA;AAC5C,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,IAAA,KAAS,IAAI,OAAO,IAAA;AACrD,EAAA,MAAM,WACJ,KAAA,CAAM,IAAA,KAAS,SAAY,MAAA,GAAY,aAAA,CAAc,MAAM,IAAI,CAAA;AACjE,EAAA,MAAM,IAAA,GAAO,QAAA,KAAa,MAAA,GAAY,IAAA,GAAO,MAAM,QAAQ,CAAA;AAC3D,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,oFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,UAAK,SAAA,EAAU,UAAA,EAAW,OAAO,KAAA,CAAM,IAAA,EACrC,gBAAM,IAAA,EACT,CAAA;AAAA,QACC,IAAA,KAAS,IAAA,IAAQ,KAAA,CAAM,OAAA,KAAY,UAAa,KAAA,CAAM,OAAA,KAAY,EAAA,oBACjEA,GAAAA,CAAC,EAAA,CAAG,OAAA,EAAH,EAAW,OAAO,KAAA,CAAM,OAAA,EAAS,IAAA,EAAK,QAAA,EACrC,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCACd,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,GACjE,CAAA,EACF,CAAA;AAAA,QAED;AAAA;AAAA;AAAA,GACH;AAEJ;ACtEO,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,MAAA,GAAS,OAAO,QAAA,CAAS,MAAA;AAC/B,EAAA,IAAI,WAAW,MAAA,IAAa,MAAA,KAAW,IAAA,IAAQ,MAAA,CAAO,YAAY,KAAA,EAAO;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,aAAa,cAAA,CAAe,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,SAAS,IAAI,CAAA;AACpE,EAAA,IAAI,UAAA,KAAe,MAAA,IAAa,UAAA,CAAW,IAAA,KAAS,QAAW,OAAO,IAAA;AAEtE,EAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,IACrB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,iBAAiB,MAAA,CAAO,eAAA;AAAA,IACxB,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,MAAA,EAAQ,MAAA,CAAO,MAAA,KAAW,IAAA,GAAO,2BAA2B,MAAA,CAAO;AAAA,GACpE,CAAA;AAED,EAAA,MAAM,UAAA,GACJ,OAAO,aAAA,KAAkB,QAAA,GACrB,iBACA,MAAA,CAAO,aAAA,KAAkB,WACvB,WAAA,GACA,aAAA;AAER,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,qGAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA;AAAA,MACA,oBAAA,EAAoB,OAAO,QAAA,CAAS,EAAA;AAAA,MAEpC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,UAAA,EAAY,WAAU,cAAA,EAAe,CAAA;AAAA,QACxD,OAAA,KAAY,UAAa,OAAA,KAAY,IAAA,oBACpCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAA,OAAA,EAAQ;AAAA;AAAA;AAAA,GAE/D;AAEJ;ACzBA,SAAS,WAAA,CAAY,SAAyB,GAAA,EAAsB;AAClE,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,OAAO,KAAK,CAAA,KAAM,GAAG,CAAA,EAAG,KAAA,IAAS,GAAA;AAC1E;AAOA,SAAS,MAAM,KAAA,EAAgC;AAC7C,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxE,IAAA,MAAM,MAAA,GAAS,KAAA;AACf,IAAA,OAAO;AAAA,MACL,OAAO,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,GAAW,OAAO,KAAA,GAAQ,EAAA;AAAA,MACzD,KAAK,OAAO,MAAA,CAAO,GAAA,KAAQ,QAAA,GAAW,OAAO,GAAA,GAAM;AAAA,KACrD;AAAA,EACF;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,EAAA,EAAI,GAAA,EAAK,EAAA,EAAG;AAC9B;AAEA,SAAS,WAAW,KAAA,EAA0B;AAC5C,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA,CAAM,IAAI,MAAM,CAAA;AACjD,EAAA,IAAI,UAAU,EAAA,IAAM,KAAA,KAAU,QAAQ,KAAA,KAAU,MAAA,SAAkB,EAAC;AACnE,EAAA,OAAO,CAAC,MAAA,CAAO,KAAK,CAAC,CAAA;AACvB;AASA,SAAS,mBAAmB,EAAE,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,MAAK,EAAiB;AAC5E,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,UAAU,KAAA,CAAM,WAAA;AACtB,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIG,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,MAAA,GAAS,WAAW,OAAO,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAgB;AAC9B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,GAAG,IAC5B,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,KAAU,UAAU,GAAG,CAAA,GACtC,CAAC,GAAG,QAAQ,GAAG,CAAA;AACnB,IAAA,IAAA;AAAA,MACE,MAAM,OAAA,CACH,MAAA,CAAO,CAAC,MAAA,KAAW,KAAK,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA,CACtD,IAAI,CAAC,MAAA,KAAW,OAAO,KAAK;AAAA,KACjC;AAAA,EACF,CAAA;AACA,EAAA,MAAMM,WACJ,MAAA,CAAO,MAAA,KAAW,CAAA,GACb,KAAA,CAAM,eAAe,KAAA,GACtB,cAAA;AAAA,IACE,MAAM,OAAA,CACH,MAAA,CAAO,CAAC,MAAA,KAAW,OAAO,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA,CACxD,IAAI,CAAC,MAAA,KAAW,OAAO,KAAK,CAAA;AAAA,IAC/B,KAAA,CAAM;AAAA,GACR;AACN,EAAA,uBACEV,IAAAA;AAAA,IAAC,EAAA,CAAG,OAAA;AAAA,IAAH;AAAA,MACC,IAAA;AAAA,MACA,YAAA,EAAc,OAAA;AAAA,MACd,KAAA,EAAM,OAAA;AAAA,MACN,SAAA,EAAU,UAAA;AAAA,MACV,yBACEA,IAAAA;AAAA,QAAC,EAAA,CAAG,MAAA;AAAA,QAAH;AAAA,UACC,OAAA,EAAQ,WAAA;AAAA,UACR,SAAA,EAAU,oCAAA;AAAA,UACV,WAAW,KAAA,CAAM,KAAA;AAAA,UAChB,GAAI,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,QAAA,EAAS;AAAA,UAC9C,SAAS,MAAM;AACb,YAAA,OAAA,CAAQ,CAAC,IAAI,CAAA;AAAA,UACf,CAAA;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,UAAAS,QAAAA,EAAQ,CAAA;AAAA,4BACpCT,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,kCAAA,EAAmC;AAAA;AAAA;AAAA,OACxD;AAAA,MAGF,QAAA,EAAA;AAAA,wBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,YAAA,GAAe,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,SAAA,CAAA,EACxD,CAAA;AAAA,UACC,MAAA,CAAO,MAAA,GAAS,CAAA,oBACfA,GAAAA;AAAA,YAAC,EAAA,CAAG,MAAA;AAAA,YAAH;AAAA,cACC,OAAA,EAAQ,OAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,SAAA,EAAU,kBAAA;AAAA,cACV,SAAS,MAAM;AACb,gBAAA,IAAA,CAAK,EAAE,CAAA;AAAA,cACT,CAAA;AAAA,cACD,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EAEJ,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,SAAA;AAAA,YACL,sBAAA,EAAqB,MAAA;AAAA,YACrB,cAAY,KAAA,CAAM,KAAA;AAAA,YAClB,SAAA,EAAU,kCAAA;AAAA,YAET,QAAA,EAAA,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAC7B,cAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAC/B,cAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA;AACpC,cAAA,uBACED,IAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBAEC,IAAA,EAAK,QAAA;AAAA,kBACL,IAAA,EAAK,QAAA;AAAA,kBACL,eAAA,EAAe,QAAA;AAAA,kBACf,QAAA;AAAA,kBACA,SAAS,MAAM;AACb,oBAAA,MAAA,CAAO,GAAG,CAAA;AAAA,kBACZ,CAAA;AAAA,kBACA,SAAA,EAAU,yFAAA;AAAA,kBAEV,QAAA,EAAA;AAAA,oCAAAC,GAAAA;AAAA,sBAAC,KAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAW,EAAA;AAAA,0BACT,kBAAA;AAAA,0BACA,WAAW,aAAA,GAAgB;AAAA;AAC7B;AAAA,qBACF;AAAA,oCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,iBAAO,KAAA,EAAM;AAAA;AAAA,iBAAA;AAAA,gBAhBpC;AAAA,eAiBP;AAAA,YAEJ,CAAC;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAEJ;AAWA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,eAAe,KAAA,CAAM,QAAA;AAC3B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIG,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,SAAA,GAAYG,QAAQ,MAAM;AAC9B,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AACxC,IAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,MAAM,OAAO,CAAA;AACpC,IAAA,IAAI,KAAA,KAAU,EAAA,IAAM,GAAA,KAAQ,EAAA,IAAM,KAAA,KAAU,GAAA;AAC1C,MAAA,OAAO,CAAA,EAAG,KAAK,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA;AAC3B,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACZ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,SAAS,SAAS,CAAA;AAC5C,EAAAC,UAAU,MAAM;AACd,IAAA,QAAA,CAAS,SAAS,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAAiB;AAC/B,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,YAAY,EAAA,EAAI;AAClB,MAAA,IAAA,CAAK,EAAE,CAAA;AACP,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,WAAW,CAAA;AACvC,MAAA,IACE,KAAA,CAAM,MAAA,KAAW,CAAA,IACjB,SAAA,CAAU,MAAM,CAAC,CAAA,IAAK,EAAE,CAAA,IACxB,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAA,EACxB;AACA,QAAA,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,CAAC,GAAG,GAAA,EAAK,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA;AACvC,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,SAAA,CAAU,OAAO,CAAA,IAAK,wBAAA,CAAyB,OAAO,CAAA,EAAG;AAC3D,MAAA,IAAA,CAAK,OAAO,CAAA;AAAA,IACd;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,KAAA,GACJ,KAAA,CAAM,IAAA,EAAK,KAAM,EAAA,IACjB,SAAA,CAAU,KAAA,CAAM,IAAA,EAAM,CAAA,IACtB,wBAAA,CAAyB,KAAK,CAAA,IAC7B,SAAS,OAAA,IACR,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA,CAAE,KAAA,CAAM,CAAC,IAAA,KAAS,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA;AAEnE,EAAA,MAAM,UAAA,GAAa,MAAM,OAAO,CAAA;AAChC,EAAA,MAAM,SACJ,IAAA,KAAS,OAAA,mBACPL,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wBAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,EAAA,CAAG,SAAA;AAAA,MAAH;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,SAAA,EAAW,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,MAAA,CAAA;AAAA,QACxB,GAAI,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,QAAA,EAAS;AAAA,QAC9C,OAAO,UAAA,CAAW,KAAA;AAAA,QAClB,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,UAAA,IAAA,CAAK,EAAE,GAAG,UAAA,EAAY,KAAA,EAAO,MAAM,CAAA;AAAA,QACrC;AAAA;AAAA,KACF;AAAA,oBACAA,GAAAA;AAAA,MAAC,EAAA,CAAG,SAAA;AAAA,MAAH;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,SAAA,EAAW,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,IAAA,CAAA;AAAA,QACxB,GAAI,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,QAAA,EAAS;AAAA,QAC9C,OAAO,UAAA,CAAW,GAAA;AAAA,QAClB,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,UAAA,MAAM,SAAA,GAAY,EAAE,GAAG,UAAA,EAAY,KAAK,IAAA,EAAK;AAC7C,UAAA,IAAA,CAAK,SAAS,CAAA;AACd,UAAA,IAAI,UAAU,KAAA,KAAU,EAAA,IAAM,IAAA,KAAS,EAAA,gBAAkB,KAAK,CAAA;AAAA,QAChE;AAAA;AAAA;AACF,GAAA,EACF,oBAEAA,GAAAA;AAAA,IAAC,EAAA,CAAG,SAAA;AAAA,IAAH;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAW,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,SAAA,CAAA;AAAA,MACxB,GAAI,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,QAAA,EAAS;AAAA,MAC9C,OAAO,OAAO,OAAA,KAAY,YAAY,SAAA,CAAU,OAAO,IAAI,OAAA,GAAU,EAAA;AAAA,MACrE,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,QAAA,IAAA,CAAK,IAAI,CAAA;AACT,QAAA,IAAI,IAAA,KAAS,EAAA,EAAI,aAAA,CAAc,KAAK,CAAA;AAAA,MACtC;AAAA;AAAA,GACF;AAGJ,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,EAAA,CAAG,SAAA;AAAA,QAAH;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,WAAW,KAAA,CAAM,KAAA;AAAA,UACjB,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,CAAC,SAAS,oBAAoB,CAAA;AAAA,UACrD,GAAI,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,QAAA,EAAS;AAAA,UAC9C,WAAA,EACE,KAAA,CAAM,WAAA,KACL,IAAA,KAAS,UACN,0BAAA,GACA,0BAAA,CAAA;AAAA,UAEN,KAAA,EAAO,KAAA;AAAA,UACP,QAAA,EAAU,QAAA;AAAA,UACV,UAAU,MAAM;AACd,YAAA,MAAA,CAAO,KAAK,CAAA;AAAA,UACd;AAAA;AAAA,OACF;AAAA,MACC,KAAA,CAAM,4BACLA,GAAAA;AAAA,QAAC,EAAA,CAAG,OAAA;AAAA,QAAH;AAAA,UACC,IAAA,EAAM,UAAA;AAAA,UACN,YAAA,EAAc,aAAA;AAAA,UACd,KAAA,EAAM,QAAA;AAAA,UACN,SAAA,EAAU,KAAA;AAAA,UACV,yBACEA,GAAAA;AAAA,YAAC,EAAA,CAAG,MAAA;AAAA,YAAH;AAAA,cACC,OAAA,EAAQ,WAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,SAAA,EAAU,uBAAA;AAAA,cACV,SAAA,EAAU,eAAA;AAAA,cACT,GAAI,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,QAAA,EAAS;AAAA,cAC9C,SAAS,MAAM;AACb,gBAAA,aAAA,CAAc,CAAC,UAAU,CAAA;AAAA,cAC3B,CAAA;AAAA,cAEA,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WACpC;AAAA,UAGD,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EAEJ,CAAA;AAAA,IACC,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,CAAA,oBACtBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACZ,QAAA,EAAA,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,2BAClBA,GAAAA;AAAA,MAAC,EAAA,CAAG,MAAA;AAAA,MAAH;AAAA,QAEC,OAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACJ,GAAI,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,QAAA,EAAS;AAAA,QAC9C,SAAS,MAAM;AACb,UAAA,IAAA,CAAK,MAAM,CAAA;AAAA,QACb,CAAA;AAAA,QAEC,QAAA,EAAA;AAAA,OAAA;AAAA,MARI;AAAA,KAUR,CAAA,EACH,CAAA;AAAA,IAED,CAAC,MAAM,QAAA,oBACNA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAA+B,QAAA,EAAA,MAAA,EAAO;AAAA,GAAA,EAEzD,CAAA;AAEJ;AAOO,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,SAAS,EAAC;AAAA,EACV,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,KAAA,GAAQM,OAAAA;AAAA,IACZ,MAAM,gBAAA,CAAiB,MAAA,EAAQ,MAAM,CAAA;AAAA,IACrC,CAAC,QAAQ,MAAM;AAAA,GACjB;AACA,EAAA,MAAM,OAAA,GAAU,SAAS,KAAA,CAAM,YAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA,QAAA,CAAA;AACnC,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,OAAA,EAAS,KAAA,CAAM,OAAO,CAAA;AAC1D,EAAAF,UAAU,MAAM;AACd,IAAA,OAAA,GAAU,KAAA,CAAM,UAAU,YAAY,CAAA;AAAA,EACxC,GAAG,CAAC,OAAA,EAAS,KAAA,CAAM,QAAA,EAAU,YAAY,CAAC,CAAA;AAE1C,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAkB;AAC9B,IAAA,QAAA,CAAS,MAAM,QAAA,EAAU,IAAA,EAAM,eAAe,IAAA,EAAM,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,EACpE,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,WAAW,OAAO,CAAA;AACnC,EAAA,MAAM,YAAA,GAA6B,EAAE,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA,EAAK;AACpE,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,gBAAA,GAAmB,IAAA,mBACrCJ,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,SAAA;AAAA,MACT,SAAA,EAAW,EAAA;AAAA,QACT,2CAAA;AAAA,QACA,KAAA,CAAM,aAAA,KAAkB,QAAA,GAAW,MAAA,GAAS;AAAA,OAC9C;AAAA,MAEC,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,GACT;AAGF,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,mDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,sBAAoB,KAAA,CAAM,QAAA;AAAA,MAC1B,uBAAqB,KAAA,CAAM,OAAA;AAAA,MAE1B,QAAA,EAAA;AAAA,QAAA,KAAA,CAAM,oCACLC,GAAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EAAgB,WAAU,MAAA,EAAO,CAAA;AAAA,QAEhD,KAAA,CAAM,kBAAkB,KAAA,IAAS,KAAA;AAAA,QACjC,KAAA,CAAM,OAAA,KAAY,QAAA,oBACjBA,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA,IAAK,EAAA;AAAA,YACtB,WAAW,KAAA,CAAM,KAAA;AAAA,YAChB,GAAI,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,QAAA,EAAS;AAAA,YAC9C,WAAA,EAAa,MAAM,WAAA,IAAe,WAAA;AAAA,YAClC,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,cACtC,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA,cAC1B,OAAO,MAAA,CAAO;AAAA,aAChB,CAAE,CAAA;AAAA,YACF,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,cAAA,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,YACvC;AAAA;AAAA,SACF;AAAA,QAED,MAAM,OAAA,KAAY,aAAA,oBACjBA,GAAAA,CAAC,kBAAA,EAAA,EAAoB,GAAG,YAAA,EAAc,CAAA;AAAA,QAEvC,KAAA,CAAM,OAAA,KAAY,OAAA,oBACjBA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,SAAA;AAAA,YACJ,IAAA,EAAK,YAAA;AAAA,YACL,cAAY,KAAA,CAAM,KAAA;AAAA,YAClB,SAAA,EAAW,EAAA;AAAA,cACT,MAAA;AAAA,cACA,KAAA,CAAM,gBAAA,KAAqB,YAAA,GACvB,0BAAA,GACA;AAAA,aACN;AAAA,YAEC,QAAA,EAAA,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,2BAClBD,IAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,iCAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAAC,GAAAA;AAAA,oBAAC,OAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,OAAA;AAAA,sBACL,IAAA,EAAM,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA,MAAA,CAAA;AAAA,sBACvB,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA,sBAC1B,QAAA;AAAA,sBACA,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,KAAM,MAAA,CAAO,WAAW,EAAE,CAAA;AAAA,sBACtD,UAAU,MAAM;AACd,wBAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,sBACnB;AAAA;AAAA,mBACF;AAAA,kBACC,MAAA,CAAO;AAAA;AAAA,eAAA;AAAA,cAbH,MAAA,CAAO,OAAO,KAAK;AAAA,aAe3B;AAAA;AAAA,SACH;AAAA,QAED,KAAA,CAAM,YAAY,MAAA,oBACjBA,IAAC,WAAA,EAAA,EAAa,GAAG,YAAA,EAAc,IAAA,EAAK,QAAA,EAAS,CAAA;AAAA,QAE9C,KAAA,CAAM,YAAY,YAAA,oBACjBA,IAAC,WAAA,EAAA,EAAa,GAAG,YAAA,EAAc,IAAA,EAAK,OAAA,EAAQ,CAAA;AAAA,QAE7C,KAAA,CAAM,OAAA,KAAY,OAAA,oBACjBA,GAAAA;AAAA,UAAC,EAAA,CAAG,SAAA;AAAA,UAAH;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,WAAW,KAAA,CAAM,KAAA;AAAA,YAChB,GAAI,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,QAAA,EAAS;AAAA,YAC9C,WAAA,EAAa,MAAM,WAAA,IAAe,eAAA;AAAA,YAClC,OACE,OAAA,KAAY,IAAA,IAAQ,YAAY,MAAA,GAAY,EAAA,GAAK,OAAO,OAAO,CAAA;AAAA,YAEjE,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,cAAA,IAAA,CAAK,IAAI,CAAA;AAAA,YACX;AAAA;AAAA,SACF;AAAA,QAED,KAAA,CAAM,kBAAkB,QAAA,IAAY;AAAA;AAAA;AAAA,GACvC;AAEJ;ACtcO,SAAS,UAAA,CACd,MAAA,EACA,QAAA,GAAW,GAAA,EACS;AACpB,EAAA,MAAM,SAAS,kBAAA,EAAmB;AAClC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,aAAA,IAAiB,MAAA,CAAO,OAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIG,SAA6B,MAAM,CAAA;AAC7D,EAAA,MAAM,UAAA,GAAaF,OAA2B,MAAM,CAAA;AAEpD,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,YAAA,GACJ,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,QAAA,CAAS,MAAM,IAChD,MAAA,GACA,MAAA;AACN,IAAA,MAAM,OAAO,UAAA,CAAW,OAAA;AACxB,IAAA,IACE,YAAA,KAAiB,MAAA,IACjB,OAAA,IACA,IAAA,KAAS,UACT,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,IACrB,IAAA,KAAS,YAAA,IACT,OAAO,0BAA0B,UAAA,EACjC;AACA,MAAA,UAAA,CAAW,OAAA,GAAU,MAAA;AACrB,MAAA,QAAA,CAAS,MAAM,CAAA;AACf,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,MAAM,KAAA,GACJ,OAAO,WAAA,KAAgB,WAAA,GAAc,YAAY,GAAA,EAAI,GAAI,KAAK,GAAA,EAAI;AACpE,IAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC5B,MAAA,MAAM,UAAU,GAAA,GAAM,KAAA;AACtB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,QAAQ,CAAA;AAC/C,MAAA,MAAM,QAAQ,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,UAAU,CAAC,CAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,IAAA,GAAA,CAAQ,YAAA,GAAe,IAAA,IAAQ,KAAA;AAC5C,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI,WAAW,CAAA,EAAG;AAChB,QAAA,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AAAA,MACpC,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,GAAU,YAAA;AAAA,MACvB;AAAA,IACF,CAAA;AACA,IAAA,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AAClC,IAAA,OAAO,MAAM;AACX,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,IAC5B,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,QAAQ,CAAC,CAAA;AAE9B,EAAA,OAAO,KAAA;AACT;ACzCA,IAAM,WAAA,GAA2D;AAAA,EAC/D,EAAA,EAAI,SAAA;AAAA,EACJ,IAAA,EAAM,WAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAEA,IAAMM,cAAAA,GAGF;AAAA,EACF,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,YAAA,GAAsD;AAAA,EAC1D,EAAA,EAAI,qHAAA;AAAA,EACJ,IAAA,EAAM,mGAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAMA,IAAM,WAAA,GAA6B;AAAA,EACjC,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,cAAA,EAAgB,QAAA;AAAA,EAChB,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,MAAA;AAAA,EACP,QAAA,EAAU,CAAA;AAAA,EACV,SAAA,EAAW,CAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,gBAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,MAAA;AAAA,EACT,IAAA,EAAM,UAAA;AAAA,EACN,SAAA,EAAW,CAAA;AAAA,EACX,UAAA,EAAY,UAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,YAAA,GAA8B;AAAA,EAClC,QAAA,EAAU,QAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,UAAA,EAAY,QAAA;AAAA,EACZ,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,SAAA;AAAA,EACZ,UAAA,EAAY,GAAA;AAAA,EACZ,aAAA,EAAe,UAAA;AAAA,EACf,kBAAA,EAAoB;AACtB,CAAA;AAMA,SAAS,SAAA,CAAU,EAAE,KAAA,EAAM,EAAmB;AAC5C,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,SAAA,GACJ,MAAM,IAAA,KAAS,MAAA,GAAS,OAAO,KAAA,CAAM,WAAA,CAAY,KAAA,CAAM,IAAI,CAAC,CAAA;AAC9D,EAAA,MAAM,WAAA,GACJ,MAAM,WAAA,KAAgB,MAAA,GAClB,OACA,KAAA,CAAMA,cAAAA,CAAc,KAAA,CAAM,WAAW,CAAC,CAAA;AAC5C,EAAA,MAAM,uBACJX,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,0IAAA;AAAA,QACA,KAAA,CAAM,KAAA,KAAU,MAAA,IAAa,YAAA,CAAa,MAAM,IAAI;AAAA,OACtD;AAAA,MACA,KAAA,EAAO,MAAM,KAAA,KAAU,MAAA,GAAY,SAAY,EAAE,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,MACpE,kBAAgB,KAAA,CAAM,IAAA;AAAA,MAErB,QAAA,EAAA;AAAA,QAAA,SAAA,KAAc,IAAA,oBAAQC,GAAAA,CAAC,SAAA,EAAA,EAAU,WAAU,SAAA,EAAU,CAAA;AAAA,QACrD,KAAA,CAAM,cAAA;AAAA,QACN,KAAA,CAAM,iBAAiB,MAAA,oBACtBA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,QAAA,EAAA,KAAA,CAAM,YAAA,EAAa,CAAA;AAAA,QAE9D,gBAAgB,IAAA,oBAAQA,GAAAA,CAAC,WAAA,EAAA,EAAY,WAAU,oBAAA,EAAqB;AAAA;AAAA;AAAA,GACvE;AAEF,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,IAAa,KAAA,CAAM,cAAc,MAAA,EAAW;AAChE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,uBACEA,GAAAA;AAAA,IAAC,EAAA,CAAG,OAAA;AAAA,IAAH;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,KAAA,kBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,KAAA,CAAM,OAAA,KAAY,0BACjBC,GAAAA,CAAC,OAAE,SAAA,EAAU,qBAAA,EAAuB,gBAAM,OAAA,EAAQ,CAAA;AAAA,QAEnD,MAAM,SAAA,KAAc,MAAA,oBACnBD,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,UAAA,aAAA;AAAA,UAC/B,MAAM,SAAA,CAAU;AAAA,SAAA,EAC9B;AAAA,OAAA,EAEJ,CAAA;AAAA,MAGD,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,OAAA,CAAQ,EAAE,KAAA,EAAO,SAAA,EAAW,SAAQ,EAAiB;AACnE,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,KAAA;AAC1B,EAAA,MAAM,cAAA,GAAiB,OAAO,QAAA,KAAa,QAAA;AAC3C,EAAA,MAAM,SAAA,GACJ,KAAA,KAAU,MAAA,GAAY,IAAA,mBACpBC,GAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAA;AAAA,QACpB,OAAA,EAAS,MAAM,OAAA,IAAW,MAAA;AAAA,QAC1B,IAAA,EAAM,MAAM,WAAA,IAAe;AAAA,OAC7B;AAAA,MACA,SAAA,EAAW,iBAAiB,MAAA,GAAS;AAAA;AAAA,GACvC;AAMJ,EAAA,MAAM,aAAA,GAAgB,UAAA;AAAA,IACpB,OAAO,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,GAAI,MAAM,KAAA,GAAQ;AAAA,GAC/C;AACA,EAAA,MAAM,cAAA,GAAiBM,QAAQ,MAAM;AACnC,IAAA,IAAI,aAAA,KAAkB,MAAA,IAAa,aAAA,KAAkB,KAAA,CAAM,KAAA,EAAO;AAChE,MAAA,OAAO,KAAA,CAAM,cAAA;AAAA,IACf;AACA,IAAA,MAAM,UAAU,KAAA,CAAM,WAAA;AACtB,IAAA,MAAM,OAAA,GACJ,OAAA,CAAQ,QAAA,KAAa,MAAA,IACrB,QAAQ,MAAA,KAAW,SAAA,IACnB,MAAA,CAAO,SAAA,CAAU,MAAM,KAAK,CAAA,GACxB,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA,GACxB,aAAA;AACN,IAAA,OAAO,WAAA,CAAY,SAAS,OAAO,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,aAAA,EAAe,KAAK,CAAC,CAAA;AAEzB,EAAA,MAAM,cAAc,OAAA,KAAY,MAAA;AAEhC,EAAA,uBACEP,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,+EAAA;AAAA,QACA,WAAA,IAAe,gBAAA;AAAA,QACf;AAAA,OACF;AAAA,MACA,KAAA,EAAO,WAAA;AAAA,MACP,kBAAgB,KAAA,CAAM,YAAA;AAAA,MACtB,OAAA;AAAA,MACA,IAAA,EAAM,cAAc,QAAA,GAAW,MAAA;AAAA,MAC/B,QAAA,EAAU,cAAc,CAAA,GAAI,MAAA;AAAA,MAC5B,SAAA,EACE,WAAA,GACI,CAAC,KAAA,KAAU;AACT,QAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,EAAK;AAC9C,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA,GACA,MAAA;AAAA,MAGL,QAAA,EAAA;AAAA,QAAA,cAAA,IAAkB,SAAA;AAAA,wBACnBA,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,0DAAA;AAAA,YACV,KAAA,EAAO,gBAAA;AAAA,YAEP,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,6DAAA;AAAA,kBACV,KAAA,EAAO,YAAA;AAAA,kBACP,OAAO,KAAA,CAAM,YAAA;AAAA,kBAEZ,QAAA,EAAA;AAAA;AAAA,eACH;AAAA,cACC,KAAA,KAAU,MAAA,oBAAaA,GAAAA,CAAC,aAAU,KAAA,EAAc;AAAA;AAAA;AAAA,SACnD;AAAA,QACC,MAAM,IAAA,KAAS,MAAA,IAAa,KAAA,CAAM,IAAA,KAAS,sBAC1CA,GAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,6CAAA;AAAA,YACV,OAAO,KAAA,CAAM,IAAA;AAAA,YAEZ,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,SACT;AAAA,QAED,CAAC,cAAA,IAAkB;AAAA;AAAA;AAAA,GACtB;AAEJ;ACtMO,SAAS,aAAA,CAAc;AAAA,EAC5B,OAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,OAAA,GAAUC,OAA8B,IAAI,CAAA;AAOlD,EAAA,MAAM,UAAA,GAAaA,OAA8B,IAAI,CAAA;AACrD,EAAA,MAAM,WAAA,GAAcA,OAA8B,IAAI,CAAA;AACtD,EAAA,MAAM,QAAA,GAAWA,OAAO,KAAK,CAAA;AAC7B,EAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAEnB,EAAA,MAAM,UAAA,GAAaA,OAAmD,IAAI,CAAA;AAE1E,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,SAAS,IAAA,EAAM;AACnB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,aAAA,CAAc,KAAK,CAAA;AACtD,IAAA,OAAA,CAAQ,MAAM,MAAA,GAAS,MAAA;AACvB,IAAA,OAAA,CAAQ,MAAM,KAAA,GAAQ,MAAA;AACtB,IAAA,OAAA,CAAQ,MAAM,SAAA,GAAY,GAAA;AAC1B,IAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AACxB,IAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,MAAM,UAAU,OAAA,CAAQ,EAAE,GAAG,QAAA,CAAS,OAAA,EAAS,SAAS,CAAA;AACxD,IAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAA6B;AAC3C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,OAAA,EAAQ;AACjB,QAAA;AAAA,MACF;AACA,MAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,MAAA,UAAA,CAAW,UAAU,QAAA,CAAS,OAAA;AAAA,IAChC,CAAA;AACA,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,KAAK,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,CAAC,KAAA,KAAmB;AAC5C,QAAA,QAAA,CAAS,QAAQ,SAAA,EAAW,OAAA;AAAA,UAC1B,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,MAAM,iBAAiB;AAAA,SAC9D;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,OAAO,CAAA;AAAA,IAChB;AACA,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,WAAA,CAAY,SAAS,OAAA,EAAQ;AAC7B,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,MAAA,IAAI,UAAA,CAAW,OAAA,KAAY,OAAA,EAAS,UAAA,CAAW,OAAA,GAAU,IAAA;AACzD,MAAA,OAAA,CAAQ,MAAA,EAAO;AAAA,IACjB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,IAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,QAAA,KAAa,IAAA,EAAM;AAC3C,IAAA,IAAI,UAAA,CAAW,YAAY,KAAA,EAAO;AAClC,IAAA,UAAA,CAAW,OAAA,GAAU,KAAA;AACrB,IAAA,QAAA,CAAS,MAAA,CAAO,EAAE,GAAG,KAAA,EAAO,SAAS,CAAA;AAAA,EACvC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAO,cAAA,KAAmB,WAAA,EAAa;AAC/D,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,MAAM;AACxC,MAAA,WAAA,CAAY,SAAS,MAAA,EAAO;AAAA,IAC9B,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,QAAQ,OAAO,CAAA;AACxB,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,UAAA,EAAW;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEJ,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,OAAA;AAAA,MACL,SAAA;AAAA,MACA,KAAA;AAAA,MACA,qBAAA,EAAqB,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS;AAAA;AAAA,GAC7C;AAEJ;;;ACzFO,SAAS,gBAAA,CAAiB,OAAoB,QAAA,EAAwB;AAC3E,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,OAAO,QAAQ,WAAA,EAAa;AACnE,EAAA,MAAM,OAAO,IAAI,IAAA,CAAK,CAAC,cAAA,CAAe,KAAK,CAAC,CAAA,EAAG;AAAA,IAC7C,IAAA,EAAM;AAAA,GACP,CAAA;AACD,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,GAAG,QAAQ,CAAA,IAAA,CAAA;AAC3B,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;ACRO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,EAAA,MAAM,YAAY,KAAA,CAAM,SAAA;AACxB,EAAA,MAAM,cAAc,KAAA,CAAM,WAAA;AAC1B,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,EAAe,SAAA,KAAqC;AACtE,IAAA,IAAI,iBAAiB,MAAA,EAAW;AAChC,IAAA,IAAI,SAAA,KAAc,MAAM,YAAA,CAAa,EAAE,QAAQ,KAAA,EAAO,SAAA,EAAW,OAAO,CAAA;AAAA,SAAA,IAC/D,SAAA,KAAc,KAAA;AACrB,MAAA,YAAA,CAAa,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,QAAQ,CAAA;AAAA,sBACjC,IAAI,CAAA;AAAA,EACxB,CAAA;AACA,EAAA,MAAM,cAAc,UAAA,KAAe,MAAA;AAEnC,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,wDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,OAAA,KAAY,MAAA,IAAa,YAAY,IAAA,oBACpCC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDACZ,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,wBAEFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCACb,QAAA,kBAAAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,+BAAA,EACf,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iBAAA,EACf,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4BAAA,EACX,QAAA,EAAA,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,2BAClBA,GAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,KAAA,EAAM,KAAA;AAAA,cACN,SAAA,EAAU,sFAAA;AAAA,cACV,WAAA,EACE,OAAO,aAAA,KAAkB,KAAA,GACrB,cACA,MAAA,CAAO,aAAA,KAAkB,SACvB,YAAA,GACA,MAAA;AAAA,cAGP,QAAA,EAAA,MAAA,CAAO,2BACND,IAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,SAAA,EAAU,2DAAA;AAAA,kBACV,SAAS,MAAM;AACb,oBAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,aAAa,CAAA;AAAA,kBAC/C,CAAA;AAAA,kBAEC,QAAA,EAAA;AAAA,oBAAA,MAAA,CAAO,KAAA;AAAA,oBACP,MAAA,CAAO,kBAAkB,KAAA,mBACxBC,IAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,aAAA,EAAc,CAAA,GAC/B,MAAA,CAAO,aAAA,KAAkB,yBAC3BA,GAAAA,CAAC,aAAU,SAAA,EAAU,aAAA,EAAc,oBAEnCA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,wBAAA,EAAyB;AAAA;AAAA;AAAA,kBAIpD,MAAA,CAAO;AAAA,aAAA;AAAA,YA7BJ,MAAA,CAAO;AAAA,WAgCf,GACH,CAAA,EACF,CAAA;AAAA,0BACAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,4BAAA,EACd,QAAA,EAAA;AAAA,YAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACfC,GAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAW,EAAA;AAAA,kBACT,8CAAA;AAAA,kBACA,WAAA,IAAe;AAAA,iBACjB;AAAA,gBACA,OAAA,EACE,UAAA,KAAe,MAAA,GACX,MAAA,GACA,MAAM;AACJ,kBAAA,UAAA,CAAW,IAAI,IAAI,CAAA;AAAA,gBACrB,CAAA;AAAA,gBAGL,QAAA,EAAA,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,yBACdA,GAAAA;AAAA,kBAAC,IAAA;AAAA,kBAAA;AAAA,oBAEC,SAAA,EAAU,oCAAA;AAAA,oBAET,QAAA,EAAA,IAAA,CAAK;AAAA,mBAAA;AAAA,kBAHD,IAAA,CAAK;AAAA,iBAKb;AAAA,eAAA;AAAA,cApBI,GAAA,CAAI;AAAA,aAsBZ,CAAA;AAAA,YACA,MAAM,IAAA,CAAK,MAAA,KAAW,qBACrBA,GAAAA,CAAC,QACC,QAAA,kBAAAA,GAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,SAAS,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,gBACzC,SAAA,EAAU,uCAAA;AAAA,gBACX,QAAA,EAAA;AAAA;AAAA,aAED,EACF;AAAA,WAAA,EAEJ;AAAA,SAAA,EACF,CAAA,EACF,CAAA;AAAA,QACC,MAAM,SAAA,GAAY,CAAA,oBACjBD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mGAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,YAAA,OAAA;AAAA,YACE,KAAA,CAAM,IAAA;AAAA,YAAK,MAAA;AAAA,YAAK,KAAA,CAAM,SAAA;AAAA,YAAU,IAAA;AAAA,YAAG,KAAA,CAAM,SAAA;AAAA,YAAU;AAAA,WAAA,EAC3D,CAAA;AAAA,0BACAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,4BAAAC,GAAAA;AAAA,cAAC,EAAA,CAAG,MAAA;AAAA,cAAH;AAAA,gBACC,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAQ,OAAA;AAAA,gBACR,QAAA,EAAU,MAAM,IAAA,IAAQ,CAAA;AAAA,gBACxB,SAAA,EAAU,eAAA;AAAA,gBACV,SAAS,MAAM;AACb,kBAAA,YAAA,GAAe,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,gBAC/B,CAAA;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BACAA,GAAAA;AAAA,cAAC,EAAA,CAAG,MAAA;AAAA,cAAH;AAAA,gBACC,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAQ,OAAA;AAAA,gBACR,QAAA,EAAU,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,SAAA;AAAA,gBAC9B,SAAA,EAAU,WAAA;AAAA,gBACV,SAAS,MAAM;AACb,kBAAA,YAAA,GAAe,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,gBAC/B,CAAA;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ;AClKO,SAAS,WAAW,KAAA,EAAmC;AAC5D,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,KAAA,CAAM,UAAU,KAAA,CAAM,OAAA;AACvD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,KAAA,CAAM,SAAS,KAAA,CAAM,MAAA;AACrD,EAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,MAAA,EAAW,KAAA,CAAM,eAAe,KAAA,CAAM,YAAA;AACjE,EAAA,IAAI,KAAA,CAAM,UAAA,KAAe,MAAA,EAAW,KAAA,CAAM,aAAa,KAAA,CAAM,UAAA;AAC7D,EAAA,IAAI,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,EAAU,KAAA,CAAM,SAAS,KAAA,CAAM,MAAA;AAC3D,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,IAAA,EAAM,KAAA,CAAM,MAAA,GAAS,kCAAA;AAC1C,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,EAAO,KAAA,CAAM,MAAA,GAAS,MAAA;AAC3C,EAAA,IAAI,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,EAAU,KAAA,CAAM,YAAY,KAAA,CAAM,MAAA;AAC9D,EAAA,IAAI,KAAA,CAAM,WAAW,IAAA,EAAM;AACzB,IAAA,KAAA,CAAM,SAAA,GAAY,+BAAA;AAAA,EACpB;AACA,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,EAAO,KAAA,CAAM,SAAA,GAAY,MAAA;AAC9C,EAAA,OAAO,KAAA;AACT;AAOA,IAAM,YAAA,GAA8B;AAAA,EAClC,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,MAAA;AAAA,EACP,QAAA,EAAU,CAAA;AAAA,EACV,QAAA,EAAU;AACZ,CAAA;AAGO,IAAM,eAAA,GAAkB;AAgB/B,IAAM,WAAA,GACJ,iIAAA;AASK,IAAM,WAAA,GAAcW,UAAAA;AAAA,EACzB,SAASC,YAAAA,CACP;AAAA,IACE,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,MAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,EACA;AACA,IAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AACvB,IAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AACvB,IAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AACvB,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,IAAA,MAAM,EAAA,GAAK,OAAO,QAAA,CAAS,EAAA;AAC3B,IAAA,uBACEb,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,gBAAA,EAAgB,EAAA;AAAA,QAChB,uBAAA,EAAuB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,aAAa,SAAS,CAAA;AAAA,QAChE,gBAAA,EAAgB,WAAW,MAAA,GAAS,MAAA;AAAA,QACpC,SAAA,EAAW,EAAA;AAAA,UACT,iGAAA;AAAA,UACA,qEAAA;AAAA,UACA,QAAA,IAAY,gDAAA;AAAA,UACZ;AAAA,SACF;AAAA,QACA,KAAA,EAAO;AAAA,UACL,GAAG,YAAA;AAAA,UACH,GAAI,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,WAAW,KAAK,CAAA;AAAA,UAC/C,GAAG;AAAA,SACL;AAAA,QACC,GAAG,QAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,QAAA,oBACCA,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,qKAAA;AAAA,cACV,KAAA,EAAO,EAAE,MAAA,EAAQ,eAAA,EAAgB;AAAA,cAEjC,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EACb,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,kCACnCA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,8BAAA,EACb,QAAA,EAAA,MAAA,CAAO,SAAS,IAAA,EACnB;AAAA,iBAAA,EACF,CAAA;AAAA,gCACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,kBAAA,UAAA,oBACCC,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,MAAM,UAAA,CAAW,EAAE,CAAA;AAAA,sBAC5B,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,WAAW,CAAA;AAAA,sBAChD,YAAA,EAAW,mBAAA;AAAA,sBACX,KAAA,EAAM,mBAAA;AAAA,sBAEN,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,mBAChC;AAAA,kBAED,yBACCA,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,MAAM,KAAA,CAAM,EAAE,CAAA;AAAA,sBACvB,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,WAAW,CAAA;AAAA,sBACxD,YAAA,EAAW,cAAA;AAAA,sBACX,KAAA,EAAM,iDAAA;AAAA,sBAEN,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,mBAChC;AAAA,kBAED,0BACCA,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,MAAM,MAAA,CAAO,EAAE,CAAA;AAAA,sBACxB,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,WAAW,CAAA;AAAA,sBAC5C,YAAA,EAAW,wBAAA;AAAA,sBACX,KAAA,EAAM,wBAAA;AAAA,sBAEN,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,mBAChC;AAAA,kBAED,4BACCA,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,CAAA;AAAA,sBAC1B,SAAA,EAAW,EAAA,CAAG,mBAAA,EAAqB,WAAW,CAAA;AAAA,sBAC9C,YAAA,EAAW,kBAAA;AAAA,sBACX,KAAA,EAAM,kBAAA;AAAA,sBAEN,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AAC7B,iBAAA,EAEJ;AAAA;AAAA;AAAA,WACF;AAAA,UAED,CAAC,QAAA,IAAY,OAAA;AAAA,UACb;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;ACrKA,IAAM,cAAA,GAAgC;AAAA,EACpC,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,GAAA,EAAK,CAAA;AAAA,EACL,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,MAAA;AAAA,EACP,SAAA,EAAW,CAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,OAAA,EAAS,CAAA;AAAA,EACT,SAAA,EAAW,QAAA;AAAA,EACX,QAAA,EAAU,EAAA;AAAA,EACV,UAAA,EAAY;AACd,CAAA;AAQA,SAAS,aAAa,OAAA,EAAmD;AACvE,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AACjC,EAAA,IAAI,SAAS,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAQ,EAAA,EAAG;AACpD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAAA,IAC3B,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,IAAA,GAAO,CAAC;AAAA,GAChC;AACF;AAOA,SAAS,aAAA,CAAc,EAAE,OAAA,EAAS,SAAA,EAAU,EAAuB;AACjE,EAAA,MAAM,MAAA,GAASC,OAA6B,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIE,SAAS,KAAK,CAAA;AACxC,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAAU,OAAAA,EAAO,GAAI,aAAa,OAAO,CAAA;AAE7C,EAAAT,UAAU,MAAM;AACd,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,IAAA,IAAI,QAAQ,IAAA,EAAM;AAClB,IAAA,MAAM,UAAU,GAAA,CAAI,aAAA;AACpB,IAAA,IAAI,YAAY,IAAA,EAAM;AACtB,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,QAAA,CAAS,KAAK,CAAA;AACd,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,IAAI,MAAA,CAAO,YAAY,IAAA,EAAM;AAC7B,QAAA,QAAA,CAAS,OAAA,CAAQ,YAAA,GAAe,OAAA,CAAQ,YAAY,CAAA;AAAA,MACtD,CAAC,CAAA;AAAA,IACH,CAAA;AACA,IAAA,IAAA,EAAK;AACL,IAAA,IAAI,OAAO,mBAAmB,WAAA,EAAa;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,IAAI,CAAA;AACxC,IAAA,QAAA,CAAS,QAAQ,OAAO,CAAA;AACxB,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,UAAA,EAAW;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,uBACEJ,GAAAA,CAAC,GAAA,EAAA,EAAE,GAAA,EAAK,MAAA,EAAQ,SAAA,EAAsB,KAAA,EAAO,OAAA,EAC1C,QAAA,EAAA,KAAA,IAASa,OAAAA,KAAW,EAAA,GAAK,IAAA,GAAO,OAAA,EACnC,CAAA;AAEJ;AAOO,SAAS,mBAAA,CAAoB;AAAA,EAClC,OAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,uBACEb,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAW,mBAAA;AAAA,MACX,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACT,sGAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,kBAAAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,sCAAA;AAAA,UACV,KAAA,EAAO,EAAE,SAAA,EAAW,uCAAA;AAAwC;AAAA;AAC9D;AAAA,GACF;AAEJ;AAOO,SAAS,aAAA,CAAc,EAAE,QAAA,EAAU,OAAA,EAAQ,EAAuB;AACvE,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,6DAAA;AAAA,MACV,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,MAAA;AAAA,MACV,cAAY,OAAA,IAAW,gBAAA;AAAA,MACvB,eAAA,EAAe,QAAA;AAAA,MAEd,QAAA,EAAA,QAAA,KAAa,KAAA,mBACZD,IAAAA,CAAAe,UAAA,EACE,QAAA,EAAA;AAAA,wBAAAd,GAAAA,CAAC,EAAA,CAAG,QAAA,EAAH,EAAY,WAAU,UAAA,EAAW,CAAA;AAAA,wBAClCA,GAAAA,CAAC,EAAA,CAAG,QAAA,EAAH,EAAY,WAAU,UAAA,EAAW;AAAA,OAAA,EACpC,CAAA,GACE,QAAA,KAAa,OAAA,mBACfA,IAAC,EAAA,CAAG,QAAA,EAAH,EAAY,SAAA,EAAU,wBAAA,EAAyB,CAAA,mBAEhDD,IAAAA,CAAAe,UAAA,EACE,QAAA,EAAA;AAAA,wBAAAd,GAAAA,CAAC,EAAA,CAAG,QAAA,EAAH,EAAY,WAAU,YAAA,EAAa,CAAA;AAAA,wBACpCA,GAAAA,CAAC,EAAA,CAAG,QAAA,EAAH,EAAY,WAAU,aAAA,EAAc,CAAA;AAAA,wBACrCA,GAAAA,CAAC,EAAA,CAAG,QAAA,EAAH,EAAY,WAAU,aAAA,EAAc,CAAA;AAAA,wBACrCA,GAAAA,CAAC,EAAA,CAAG,QAAA,EAAH,EAAY,WAAU,YAAA,EAAa;AAAA,OAAA,EACtC;AAAA;AAAA,GAEJ;AAEJ;AASO,SAAS,WAAA,CAAY;AAAA,EAC1B,OAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAU,iIAAA;AAAA,MACV,KAAA,EAAO,cAAA;AAAA,MAEP,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,mCAAA,EAAoC,CAAA;AAAA,wBACrDA,GAAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAkB,WAAU,cAAA,EAAe,CAAA;AAAA,QACzD,IAAA,KAAS,UAAa,IAAA,KAAS,EAAA,oBAC9BA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sBAAA,EAAwB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,QAE3C,SAAA,KAAc,IAAA,IAAQ,OAAA,KAAY,MAAA,oBACjCA,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,SAAA,EAAU,MAAA;AAAA,YACV,OAAA,EAAS,OAAA;AAAA,YAET,QAAA,kBAAAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EACd,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,cAAE;AAAA,aAAA,EAEjC;AAAA;AAAA;AACF;AAAA;AAAA,GAEJ;AAEJ;AAOO,SAAS,YAAA,CAAa,EAAE,OAAA,EAAS,QAAA,EAAS,EAAsB;AACrE,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAMe,QAAO,KAAA,CAAM,IAAA;AACnB,EAAA,uBACEhB,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,kIAAA;AAAA,MACV,KAAA,EAAO,cAAA;AAAA,MAEP,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAACe,KAAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,wBACnCf,GAAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAkB,WAAU,cAAA,EAAe,CAAA;AAAA,QACzD;AAAA;AAAA;AAAA,GACH;AAEJ;AAcO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAW,SAAS,MAAA,GAAS,MAAA;AAAA,MAC7B,SAAA,EAAW,EAAA;AAAA,QACT,kBAAA;AAAA,QACA,MAAA,IAAU,0BAAA;AAAA,QACV;AAAA,OACF;AAAA,MACA,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,GAAG,KAAA,EAAM;AAAA,MAEvC,QAAA,EAAA;AAAA,QAAA,MAAA,oBACCC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,yCAAA;AAAA,YACV,KAAA,EAAO,EAAE,SAAA,EAAW,uCAAA;AAAwC;AAAA,SAC9D,EACF,CAAA;AAAA,wBAEFA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,+CAAA;AAAA,cACA,MAAA,IAAU;AAAA,aACZ;AAAA,YACA,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,OAAO,MAAA,EAAQ,OAAA,EAAS,MAAA,GAAS,GAAA,GAAM,CAAA,EAAE;AAAA,YAEjE;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAEJ;AAOO,SAAS,WAAA,CAAY,EAAE,OAAA,EAAS,IAAA,EAAK,EAAqB;AAC/D,EAAA,uBACEA,GAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,OAAA,IAAW,mCAC/B,QAAA,EAAA,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,EAAA,oBAC9BA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oBAAA,EAAsB,gBAAK,CAAA,EAE5C,CAAA;AAEJ;AAOO,SAAS,eAAA,CAAgB;AAAA,EAC9B,UAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,IAAA,GAAO,UAAA,KAAe,SAAA,GAAY,KAAA,CAAM,OAAO,KAAA,CAAM,KAAA;AAC3D,EAAA,MAAM,OACJ,UAAA,KAAe,QAAA,GACX,MAAA,GACA,UAAA,KAAe,YACb,SAAA,GACA,SAAA;AACR,EAAA,uBACEA,GAAAA;AAAA,IAAC,EAAA,CAAG,KAAA;AAAA,IAAH;AAAA,MACC,IAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA,EAAO,eAAe,UAAU,CAAA,CAAA;AAAA,MAEhC,QAAA,kBAAAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EACd,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,QACzB;AAAA,OAAA,EACH;AAAA;AAAA,GACF;AAEJ;AChQA,IAAM,aAAA,uBAAoB,GAAA,CAAI;AAAA,EAC5B,OAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAASgB,qBACP,MAAA,EAC+B;AAC/B,EAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,YAAA,IAAgB,EAAC,EAAG,IAAA;AAAA,IACtC,CAAC,WAAA,KACC,WAAA,CAAY,IAAA,KAAS,WAAA,IAAe,YAAY,IAAA,KAAS;AAAA,GAC7D;AACF;AAEA,IAAM,WAAA,GAA6B;AAAA,EACjC,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,MAAA;AAAA,EACP,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,UAAA,GAA4B;AAAA,EAChC,IAAA,EAAM,UAAA;AAAA,EACN,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,cAAA,GAGF;AAAA,EACF,GAAA,EAAK,YAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAOA,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,SAAA,EAAU,EAAoB;AACzD,EAAA,uBACEhB,GAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAA;AAAA,QACpB,OAAA,EAAS,MAAM,OAAA,IAAW,MAAA;AAAA,QAC1B,IAAA,EAAM,MAAM,WAAA,IAAe;AAAA,OAC7B;AAAA,MACC,GAAI,SAAA,KAAc,MAAA,GAAY,EAAC,GAAI,EAAE,SAAA;AAAU;AAAA,GAClD;AAEJ;AAQA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,OAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AACvB,EAAA,MAAM,cAAc,KAAA,CAAM,WAAA;AAC1B,EAAA,MAAM,UAAU,OAAA,CAAQ,GAAA;AACxB,EAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,IAAS,cAAA;AACnC,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,SAAA,EAAW,OAAO,IAAA;AACnC,EAAA,uBACED,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,uBAAoB,EAAA,EAC3D,QAAA,EAAA;AAAA,IAAA,OAAA,oBACCC,GAAAA;AAAA,MAAC,EAAA,CAAG,MAAA;AAAA,MAAH;AAAA,QACC,IAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAQ,OAAA;AAAA,QACR,SAAA,EAAU,YAAA;AAAA,QACV,KAAA,EAAM,YAAA;AAAA,QACN,SAAS,MAAM;AACb,UAAA,QAAA,CAAS,KAAK,CAAA;AAAA,QAChB,CAAA;AAAA,QAEA,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA,KACpC;AAAA,IAED,6BACCA,GAAAA;AAAA,MAAC,EAAA,CAAG,MAAA;AAAA,MAAH;AAAA,QACC,IAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAQ,OAAA;AAAA,QACR,SAAA,EAAU,cAAA;AAAA,QACV,KAAA,EAAM,cAAA;AAAA,QACN,SAAS,MAAM;AACb,UAAA,QAAA,CAAS,OAAO,CAAA;AAAA,QAClB,CAAA;AAAA,QAEA,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA;AACvC,GAAA,EAEJ,CAAA;AAEJ;AA6BO,SAAS,cAAA,CAAe;AAAA,EAC7B,MAAA;AAAA,EACA,SAAS,EAAC;AAAA,EACV,UAAU,EAAC;AAAA,EACX,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,QAAA;AAAA,IACA,GAAI,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAO;AAAA,IACzC,GAAI,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,EAAE,KAAA,EAAM;AAAA,IACvC,GAAI,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,QAAA,EAAS;AAAA,IAC7C,GAAI,UAAA,KAAe,MAAA,GAAY,EAAC,GAAI,EAAE,UAAA;AAAW,GACnD;AACA,EAAA,MAAM,SAAS,kBAAA,EAAmB;AAClC,EAAA,MAAM,UAAU,mBAAA,EAAoB;AACpC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIG,SAAgC,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,CAAC,CAAA;AAGlC,EAAA,MAAM,YAAA,GAAeF,OAAO,KAAK,CAAA;AAEjC,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,aAAa,SAAS,CAAA;AAC3D,EAAA,MAAM,KAAA,GAAQK,OAAAA;AAAA,IACZ,MACE,YAAA;AAAA,MACE,MAAA;AAAA,MACA,SAAA,KAAc,WAAW,QAAA,GAAY,SAAA;AAAA,MACrC,OAAA,CAAQ,kBAAkB;AAAC,KAC7B;AAAA,IACF,CAAC,MAAA,EAAQ,SAAA,EAAW,OAAA,CAAQ,cAAc;AAAA,GAC5C;AAEA,EAAA,MAAM,aAAA,GAAgBA,OAAAA;AAAA,IACpB,OAAO;AAAA,MACL,GAAG,OAAA;AAAA,MACH,GAAI,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAQ;AAAA,MAC3C,YAAA,EAAc,OAAA,CAAQ,YAAA,IAAgB,YAAA,CAAa,OAAA;AAAA,MACnD,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,OAAA,KAAY,MAAA;AAAA,MAC5C,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,OAAA;AAAA,MACpC,YAAA,EAAc,OAAA,CAAQ,YAAA,IAAgB,OAAA,CAAQ,MAAA;AAAA,MAC9C,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,MAAA,EAAQ,IAAA;AAAA,MACR,aAAa,QAAA,KAAa,MAAA;AAAA,MAC1B,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,SAAA,EAAW,QAAQ,SAAA,IAAa,IAAA;AAAA,MAChC,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,KAClC,CAAA;AAAA,IACA;AAAA,MACE,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,CAAQ,OAAA;AAAA,MACR,OAAA,CAAQ,MAAA;AAAA,MACR,MAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,WAAA,GAAcJ,WAAAA;AAAA,IAClB,CAAC,QAAyB,QAAA,KAAqB;AAC7C,MAAA,MAAM,IAAA,GAAO,WAAW,MAAM,CAAA;AAC9B,MAAA,MAAM,QAAQ,EAAE,OAAA,EAAS,cAAc,MAAA,EAAQ,IAAI,GAAG,IAAA,EAAK;AAC3D,MAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,QAAA,QAAA,CAAS,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,CAAA;AACpC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAA,KAAW,KAAA,EAAO,gBAAA,CAAiB,KAAA,EAAO,QAAQ,CAAA;AAAA,IACxD,CAAA;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,GACnB;AAEA,EAAA,MAAM,SAAA,GAAYI,OAAAA;AAAA,IAChB,OAAO;AAAA,MACL,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAC,GAAI,EAAE,aAAA,EAAc;AAAA,MACvD,GAAI,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAQ;AAAA,MAC3C,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAC,GAAI,EAAE,aAAA,EAAc;AAAA,MACvD,cAAA,EAAgB,CAAC,QAAA,EAAU,KAAA,KAAU;AACnC,QAAA,OAAA,CAAQ,SAAA,CAAU,UAAU,KAAK,CAAA;AAAA,MACnC,CAAA;AAAA,MACA,mBAAA,EAAqB,CAAC,QAAA,EAAUW,MAAAA,KAAU;AACxC,QAAA,OAAA,CAAQ,cAAA,CAAe,UAAUA,MAAK,CAAA;AAAA,MACxC,CAAA;AAAA,MACA,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,QAAA,MAAA,CAAO,SAAS,EAAE,IAAA,EAAM,SAAS,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AAAA,MAC3D,CAAA;AAAA,MACA,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,QAAA,WAAA,CAAY,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAA;AAAA,MAC9C;AAAA,KACF,CAAA;AAAA,IACA,CAAC,aAAA,EAAe,OAAA,EAAS,aAAA,EAAe,OAAA,EAAS,QAAQ,WAAW;AAAA,GACtE;AAEA,EAAA,MAAM,WAAA,GAAcf,WAAAA;AAAA,IAClB,CAAC,IAAA,KACC,MAAA,CAAO,SAAA,CAAU,SAAS,CAAA,IAC1B,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA,IACrB,MAAA,CAAO,SAAA,CAAU,OAAA;AAAA,IACnB,CAAC,MAAA,CAAO,SAAA,EAAW,SAAS;AAAA,GAC9B;AAEA,EAAA,MAAM,gBAAA,GAAmBc,qBAAoB,MAAM,CAAA;AACnD,EAAA,MAAM,aAAA,GAAgBV,OAAAA;AAAA,IACpB,MACE,kBAAkB,MAAA,IAAa,gBAAA,KAAqB,SAChD,MAAA,GACA,CAAC,IAAA,GAAgC,EAAC,KAAM;AACtC,MAAA,aAAA,CAAc,gBAAA,EAAkB;AAAA,QAC9B,QAAA,EAAU,OAAO,QAAA,CAAS,EAAA;AAAA,QAC1B;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACN,CAAC,aAAA,EAAe,gBAAA,EAAkB,MAAA,CAAO,SAAS,EAAE;AAAA,GACtD;AASA,EAAA,MAAM,eACJ,MAAA,CAAO,SAAA,CAAU,SAAS,CAAA,IAAK,OAAO,SAAA,CAAU,KAAA;AAElD,EAAA,IAAI,SAAA,KAAc,QAAA,IAAY,SAAA,KAAc,QAAA,EAAU;AACpD,IAAA,uBACEN,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAA;AAAA,QACC,GAAG,SAAA;AAAA,QAEJ,QAAA,kBAAAA,GAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,MAAA;AAAA,YACA,MAAA;AAAA,YACA,KAAA,EAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,SAAS,EAAE,CAAA;AAAA,YACzC,QAAA,EAAU,CAAC,EAAA,EAAI,KAAA,EAAOiB,MAAAA,KAAU;AAC9B,cAAA,OAAA,CAAQ,SAAA,CAAU,IAAI,KAAK,CAAA;AAC3B,cAAA,OAAA,CAAQ,cAAA,CAAe,IAAIA,MAAK,CAAA;AAAA,YAClC,CAAA;AAAA,YACA,SAAS,OAAA,CAAQ;AAAA;AAAA;AACnB;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,MAAM,UAAA,GAAa,wBAAA,CAAyB,MAAA,EAAQ,MAAA,EAAQ,aAAa,CAAA;AACzE,EAAA,YAAA,CAAa,UAAU,UAAA,CAAW,YAAA;AAClC,EAAA,MAAM,QAAQ,UAAA,CAAW,KAAA;AACzB,EAAA,MAAM,QAAQ,UAAA,CAAW,KAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,CAAM,KAAA;AAC3B,EAAA,MAAM,UAAA,GAAa,KAAA,EAAO,KAAA,CAAM,gBAAA,KAAqB,IAAA;AACrD,EAAA,MAAM,QAAA,GAAW,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,QAAA,KAAa,QAAA;AAC3D,EAAA,MAAM,WAAA,GAAc,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,QAAA,KAAa,QAAA;AAC9D,EAAA,MAAM,aAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,eAAe,SAAA,EAAU;AAEvE,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,aAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,EAAA,IAAI,aAAA,GAAgB,KAAA;AAEpB,EAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,IAAA,IAAA,mBAAOjB,IAAC,aAAA,EAAA,EAAc,QAAA,EAAU,MAAM,QAAA,EAAU,OAAA,EAAS,MAAM,OAAA,EAAS,CAAA;AAAA,EAC1E,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,IAAA,IAAA,mBACEA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAA,CAAM,OAAA;AAAA,QACd,GAAI,MAAM,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAK;AAAA,QACxD,WAAW,KAAA,CAAM,SAAA;AAAA,QAChB,GAAI,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA;AAAQ;AAAA,KAC9C;AAAA,EAEJ,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,IAAA,IAAA,mBAAOA,GAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,MAAM,OAAA,EAAS,CAAA;AAAA,EAC/C,CAAA,MAAA,IAAW,UAAU,MAAA,EAAW;AAC9B,IAAA,IAAA,mBAAOA,GAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAQ,mBAAA,EAAoB,CAAA;AAAA,EACnD,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,KAAA,EAAO;AAC/B,IAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,IAAA,mBACEA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,OAAA,EACE,aAAA,KAAkB,MAAA,GACd,MAAA,GACA,MAAM;AACJ,UAAA,aAAA,CAAc,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,CAAA;AAAA,QACtC;AAAA;AAAA,KAER;AAAA,EAEJ,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,IAAA,MAAM,gCACJA,GAAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,gBAAgB,QAAA,KAAa,MAAA;AAAA,QAC7B,QAAA,EAAU,CAAC,MAAA,KAAW;AACpB,UAAA,WAAA,CAAY,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,QAC5C;AAAA;AAAA,KACF;AAEF,IAAA,aAAA,GAAgB,aAAA;AAChB,IAAA,IAAA,GACE,YAAA,KAAiB,yBACfA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,YAAA;AAAA,QACT,SAAA,EAAU,uBAAA;AAAA,QACV,KAAA,EAAO,WAAA;AAAA,QACP,KAAA,EAAO;AAAA;AAAA,wBAGTA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,YAAA,EAAc,OAAA;AAAA,QACd,YAAA,EAAc,OAAA;AAAA,QACb,GAAI,aAAA,KAAkB,MAAA,GACnB,EAAC,GACD,EAAE,YAAY,aAAA,EAAc;AAAA,QAC/B,GAAI,cAAc,KAAA,KAAU,MAAA,GACzB,EAAC,GACD,EAAE,SAAS,aAAA;AAAc;AAAA,KAC/B;AAAA,EAEN,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAChC,IAAA,MAAM,kBACJ,KAAA,CAAM,aAAA,KAAkB,UAAA,GAAa,WAAA,CAAY,UAAU,CAAA,GAAI,MAAA;AACjE,IAAA,MAAM,SAAA,GAA2B;AAAA,MAC/B,SAAA,EAAW,MAAM,KAAA,CAAM,SAAA;AAAA,MACvB,QAAA,EAAU,MAAM,KAAA,CAAM,QAAA;AAAA,MACtB,UAAA,EAAY,MAAM,KAAA,CAAM,UAAA;AAAA,MACxB,KAAA,EAAO,MAAM,KAAA,CAAM,KAAA;AAAA,MACnB,UAAA,EAAY,MAAM,KAAA,CAAM,UAAA;AAAA,MACxB,aAAA,EAAe,MAAM,KAAA,CAAM,aAAA;AAAA,MAC3B,UAAA,EAAY,MAAM,KAAA,CAAM,UAAA;AAAA,MACxB,GAAG,MAAM,KAAA,CAAM;AAAA,KACjB;AACA,IAAA,IAAA,mBACEA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,sEAAA;AAAA,UACA,kBAAkB,MAAA,IAAa;AAAA,SACjC;AAAA,QACA,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,MAAA;AAAA,UACT,aAAA,EAAe,QAAA;AAAA,UACf,MAAA,EAAQ,MAAA;AAAA,UACR,SAAA,EAAW,CAAA;AAAA,UACX,cAAA,EAAgB,cAAA,CAAe,KAAA,CAAM,KAAA,CAAM,aAAa;AAAA,SAC1D;AAAA,QACA,OAAA,EACE,aAAA,KAAkB,MAAA,GACd,MAAA,GACA,MAAM;AACJ,UAAA,aAAA,EAAc;AAAA,QAChB,CAAA;AAAA,QAGL,8BAAoB,MAAA,mBACnBA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,WACV,QAAA,kBAAAA,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,eAAA;AAAA,YACT,SAAA,EAAU,gBAAA;AAAA,YACV,KAAA,EAAO;AAAA;AAAA,SACT,EACF,oBAEAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,yCAAA;AAAA,cACA,KAAA,CAAM,MAAM,QAAA,IAAY;AAAA,aAC1B;AAAA,YACA,KAAA,EAAO;AAAA,cACL,GAAG,SAAA;AAAA,cACH,GAAI,KAAA,CAAM,KAAA,CAAM,QAAA,GACZ;AAAA,gBACE,QAAA,EAAU,QAAA;AAAA,gBACV,YAAA,EAAc,UAAA;AAAA,gBACd,UAAA,EAAY;AAAA,kBAEd;AAAC,aACP;AAAA,YACA,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,QAAA,GAAW,MAAM,OAAA,GAAU,MAAA;AAAA,YAE7C,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA;AACT;AAAA,KAEJ;AAAA,EAEJ,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,IAAA,aAAA,GAAgB,IAAA;AAChB,IAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,IAAA,GACE,KAAA,CAAM,WAAW,IAAA,mBACfA,IAAC,YAAA,EAAA,EAAa,OAAA,EAAQ,UAAA,EAAW,CAAA,mBAEjCD,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,4DAAA;AAAA,UACA,kBAAkB,MAAA,IAAa;AAAA,SACjC;AAAA,QACA,OAAO,EAAE,QAAA,EAAU,YAAY,MAAA,EAAQ,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,QAC7D,OAAA,EACE,aAAA,KAAkB,MAAA,GACd,MAAA,GACA,MAAM;AACJ,UAAA,aAAA,EAAc;AAAA,QAChB,CAAA;AAAA,QAEN,IAAA,EAAM,aAAA,KAAkB,MAAA,GAAY,MAAA,GAAY,QAAA;AAAA,QAChD,QAAA,EAAU,aAAA,KAAkB,MAAA,GAAY,MAAA,GAAY,CAAA;AAAA,QAEpD,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,MAAM,MAAM,CAAA;AAAA,cACvC,KAAK,KAAA,CAAM,GAAA;AAAA,cACX,SAAA,EAAU,eAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,MAAA,EAAQ,MAAA;AAAA,gBACR,KAAA,EAAO,MAAA;AAAA,gBACP,WAAW,KAAA,CAAM;AAAA,eACnB;AAAA,cACA,SAAA,EAAW;AAAA;AAAA,WACb;AAAA,UACC,KAAA,KAAU,0BACTA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,6DAAA;AAAA,gBACA,cACI,wDAAA,GACA;AAAA,eACN;AAAA,cAEA,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAc,WAAU,YAAA,EAAa;AAAA;AAAA;AACnD;AAAA;AAAA,KAEJ;AAAA,EAEN,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,SAAA,EAAW;AACnC,IAAA,IAAA,mBAAOA,GAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,MAAM,OAAA,EAAS,CAAA;AAAA,EAC/C,CAAA,MAAA,IAAW,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AACxC,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AACtC,IAAA,IAAA,GACE,OAAA,KAAY,yBACVA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,CAAA,2BAAA,EAA8B,KAAA,CAAM,IAAI,CAAA,QAAA;AAAA;AAAA,wBAGnDA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,SAAA,EAAU,uBAAA;AAAA,QACV,KAAA,EAAO,WAAA;AAAA,QACP,KAAA,EAAO;AAAA;AAAA,KACT;AAAA,EAEN,CAAA,MAAO;AACL,IAAA,IAAA,mBAAOA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAS,CAAA,wBAAA,EAA2B,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,CAAA;AAAA,EACzE;AAEA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,UAAA;AACnD,EAAA,MAAM,UAAA,GAAa,KAAA,EAAO,IAAA,KAAS,OAAA,GAAU,MAAA,GAAS,MAAA;AAEtD,EAAA,uBACED,IAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,UAAA,IAAc,0BAAA,EAA4B,SAAS,CAAA;AAAA,MACjE,KAAA;AAAA,MACC,GAAI,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAQ;AAAA,MAC3C,GAAG,SAAA;AAAA,MACJ,qBAAmB,KAAA,CAAM,IAAA;AAAA,MAExB,QAAA,EAAA;AAAA,QAAA,UAAA,oBACCC,GAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,MAAA;AAAA,YACA,SAAA,EACE,gBAAgB,+BAAA,GAAkC,UAAA;AAAA,YAEnD,GAAI,aAAA,KAAkB,IAAA,GAAO,EAAC,GAAI,EAAE,SAAS,aAAA;AAAc;AAAA,SAC9D;AAAA,QAED,CAAC,UAAA,IAAc,CAAC,eAAA,IAAmB,QAAA,IAAY,KAAA,KAAU,MAAA,oBACxDA,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAc,SAAA,EAAW,UAAA,EAAY,CAAA;AAAA,QAElD,CAAC,UAAA,IACA,CAAC,eAAA,IACD,KAAA,KAAU,MAAA,IACV,aAAA,KAAkB,IAAA,oBAChBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CACZ,QAAA,EAAA,aAAA,EACH,CAAA;AAAA,wBAEJA,GAAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,UAAA;AAAA,YACR,SAAA,EAAU,gBAAA;AAAA,YACV,KAAA,EAAO,UAAA;AAAA,YAEN,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QACC,CAAC,UAAA,IACA,CAAC,eAAA,IACD,WAAA,IACA,KAAA,KAAU,MAAA,oBAAaA,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAc,SAAA,EAAU,MAAA,EAAO;AAAA;AAAA;AAAA,GACtE;AAEJ;AC3hBA,IAAM,aAAA,GAAgB,CAAA;AA0DtB,SAAS,iBAAA,CACP,UACA,QAAA,EAC2D;AAC3D,EAAA,MAAM,GAAA,GAAMC,OAA8B,IAAI,CAAA;AAC9C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIE,QAAAA,CAAS,YAAY,QAAQ,CAAA;AACvD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,QAAAA,CAAS,aAAa,MAAS,CAAA;AAC7D,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA;AAAA,IACF;AACA,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,IAAA,IAAI,YAAY,IAAA,EAAM;AACtB,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,QAAA,CAAS,OAAA,CAAQ,WAAA,GAAc,CAAA,GAAI,OAAA,CAAQ,cAAc,QAAQ,CAAA;AACjE,MAAA,UAAA,CAAW,IAAI,CAAA;AAAA,IACjB,CAAA;AACA,IAAA,OAAA,EAAQ;AACR,IAAA,IAAI,OAAO,mBAAmB,WAAA,EAAa;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,OAAO,CAAA;AAC3C,IAAA,QAAA,CAAS,QAAQ,OAAO,CAAA;AACxB,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,UAAA,EAAW;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,QAAQ,CAAC,CAAA;AACvB,EAAA,OAAO,CAAC,GAAA,EAAK,KAAA,EAAO,OAAO,CAAA;AAC7B;AAEA,IAAM,cAAA,uBAA0C,GAAA,CAAI;AAAA,EAClD,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,SAAS,iBAAiB,MAAA,EAA6C;AACrE,EAAA,MAAM,UAAA,GAAA,CAAc,MAAA,CAAO,aAAA,IAAiB,EAAC,EAAG,MAAA;AAAA,IAC9C,CAAC,MAAA,KAAmC,cAAA,CAAe,GAAA,CAAI,MAAM;AAAA,GAC/D;AACA,EAAA,IAAI,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG,OAAO,UAAA;AAClC,EAAA,MAAM,QAAA,GAAA,CAAY,mBAAA,CAAoB,aAAA,IAAiB,EAAC,EAAG,MAAA;AAAA,IACzD,CAAC,MAAA,KAAmC,cAAA,CAAe,GAAA,CAAI,MAAM;AAAA,GAC/D;AACA,EAAA,OAAO,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW,CAAC,IAAI,CAAA;AAC/C;AAEA,SAAS,UAAU,KAAA,EAAsC;AACvD,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,MAAA,EAAQ,IAAA,KAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA;AAC5E;AAEA,SAAS,WAAA,CACP,IAAA,EACA,SAAA,EACA,OAAA,EACA,QAAA,EACQ;AACR,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA;AACjC,EAAA,OAAO,IAAA,CAAK,GAAA;AAAA,IACV,CAAA;AAAA,IACA,QAAA,GAAW,YAAY,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,GAAW,CAAC,CAAA,GAAI,OAAA,GAAU,CAAA,GAAI;AAAA,GACnE;AACF;AAUO,SAAS,eAAA,CAAgB;AAAA,EAC9B,SAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAU,EAAC;AAAA,EACX,mBAAmB,EAAC;AAAA,EACpB,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,IAAA,GAAO,KAAA;AAAA,EACP,WAAA;AAAA,EACA,gBAAgB,EAAC;AAAA,EACjB,UAAA,EAAY,eAAA;AAAA,EACZ,oBAAoB,EAAC;AAAA,EACrB,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,SAAS,kBAAA,EAAmB;AAClC,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AAEnB,EAAA,MAAM,UAAA,GAAaE,OAAAA;AAAA,IACjB,OAAO;AAAA,MACL,GAAG,mBAAA;AAAA,MACH,GAAI,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ,QAAQ,EAAC;AAAA,MACpC,GAAI,mBAAmB;AAAC,KAC1B,CAAA;AAAA,IACA,CAAC,WAAW,eAAe;AAAA,GAC7B;AACA,EAAA,MAAM,UAAA,GAAaA,QAAQ,MAAM,iBAAA,CAAkB,SAAS,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAE1E,EAAA,MAAM,IAAA,GAAOA,OAAAA;AAAA,IACX,OAAO;AAAA,MACL,IAAI,aAAA,CAAc,IAAA,EAAM,IAAA,IAAQ,UAAA,CAAW,KAAK,IAAA,IAAQ,EAAA;AAAA,MACxD,IAAI,aAAA,CAAc,OAAA,EAAS,IAAA,IAAQ,UAAA,CAAW,QAAQ,IAAA,IAAQ,EAAA;AAAA,MAC9D,IAAI,aAAA,CAAc,MAAA,EAAQ,IAAA,IAAQ,UAAA,CAAW,OAAO,IAAA,IAAQ,EAAA;AAAA,MAC5D,IAAI,aAAA,CAAc,MAAA,EAAQ,IAAA,IAAQ,UAAA,CAAW,OAAO,IAAA,IAAQ,EAAA;AAAA,MAC5D,KAAK,aAAA,CAAc,MAAA,EAAQ,IAAA,IAAQ,UAAA,CAAW,OAAO,IAAA,IAAQ;AAAA,KAC/D,CAAA;AAAA,IACA,CAAC,YAAY,aAAa;AAAA,GAC5B;AAEA,EAAA,MAAM,iBAAA,GACJ,OAAO,UAAA,CAAW,OAAA,KAAY,QAAA,IAC9B,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,GAC9B,UAAA,CAAW,OAAA,GACX,MAAA;AAEN,EAAA,MAAM,cAAA,GACJ,UAAA,CAAW,cAAA,KAAmB,MAAA,IAC9B,UAAA,CAAW,mBAAmB,IAAA,GAC1B,MAAA,GACA,iBAAA,CAAkB,UAAA,CAAW,cAAc,CAAA;AACjD,EAAA,MAAM,iBAAA,GACJ,aAAA,KAAkB,MAAA,IAAa,cAAA,KAAmB,MAAA,GAC9C,KAAK,GAAA,CAAI,aAAA,EAAe,cAAc,CAAA,GACrC,aAAA,IAAiB,cAAA;AAExB,EAAA,MAAM,CAAC,YAAA,EAAc,KAAA,EAAO,OAAO,CAAA,GAAI,iBAAA;AAAA,IACrC,aAAA,KAAkB,SAAY,MAAA,GAAY,iBAAA;AAAA,IAC1C,iBAAA,IAAqB;AAAA,GACvB;AAEA,EAAA,MAAM,SAAA,GAAY,kBAAkB,KAAK,CAAA;AACzC,EAAA,MAAM,UAAA,GAAyB,cAAA,CAAe,SAAS,CAAA,IAAK,SAAA;AAC5D,EAAA,MAAM,WAAA,GAAcL,OAAyB,IAAI,CAAA;AACjD,EAAAG,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,WAAA,CAAY,OAAA,KAAY,SAAA,EAAW;AACnD,IAAA,WAAA,CAAY,OAAA,GAAU,SAAA;AACtB,IAAA,iBAAA,GAAoB,SAAS,CAAA;AAC7B,IAAA,kBAAA,GAAqB,UAAU,CAAA;AAAA,EACjC,GAAG,CAAC,OAAA,EAAS,WAAW,UAAA,EAAY,iBAAA,EAAmB,kBAAkB,CAAC,CAAA;AAE1E,EAAA,MAAM,QAAA,GAAWE,OAAAA;AAAA,IACf,MAAM,IAAI,GAAA,CAAI,iBAAiB,CAAA;AAAA,IAC/B,CAAC,iBAAiB;AAAA,GACpB;AACA,EAAA,MAAM,WAAA,GAAcA,QAAQ,MAAM;AAChC,IAAA,MAAM,MAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,MAAA,IAAI,CAAC,kBAAkB,MAAA,EAAQ,SAAS,KAAK,CAAC,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AAC9D,QAAA,GAAA,CAAI,EAAE,CAAA,GAAI,MAAA;AAAA,MACZ;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,SAAA,EAAW,QAAQ,CAAC,CAAA;AACjC,EAAA,MAAM,aAAA,GAAgBA,OAAAA;AAAA,IACpB,MAAM,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,IACtC,CAAC,WAAW;AAAA,GACd;AAIA,EAAA,MAAM,QAAA,GAAWA,OAAAA;AAAA,IACf,MACE,gBAAgB,MAAA,GACZ,gBAAA;AAAA,MACE,OAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA,EAAE,SAAS,KAAA;AAAM,KACnB,GACA,qBAAA,CAAsB,WAAA,EAAa,OAAA,EAAS,SAAS,CAAA;AAAA,IAC3D;AAAA,MACE,WAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,IAAA,GAAOA,OAAAA;AAAA,IACX,MACE,eAAA;AAAA,MACE,WAAA,KAAgB,MAAA,GACZ,QAAA,GACA,sBAAA,CAAuB,UAAU,IAAI,CAAA;AAAA,MACzC,IAAA;AAAA,MACA;AAAA,KACF;AAAA,IACF,CAAC,WAAA,EAAa,QAAA,EAAU,IAAA,EAAM,iBAAiB;AAAA,GACjD;AAEA,EAAA,MAAM,OAAA,GAAUA,OAAAA;AAAA,IACd,MACE,oBAAA;AAAA,MACE,IAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACF;AAAA,MACE,IAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA;AACF,GACF;AAIA,EAAA,MAAM,KAAA,GAAQA,OAAAA;AAAA,IACZ,MAAM,QAAA,CAAS,QAAA,EAAU,IAAA,EAAM,SAAS,CAAA;AAAA,IACxC,CAAC,QAAA,EAAU,IAAA,EAAM,SAAS;AAAA,GAC5B;AAEA,EAAA,MAAM,OAAA,GAAUA,QAA2B,MAAM;AAC/C,IAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,OAAA,EAAS,aAAa,CAAA;AACxD,IAAA,OAAO,QAAA,GAAW,MAAA,GAAS,kBAAA,CAAmB,MAAA,EAAQ,IAAI,CAAA;AAAA,EAC5D,GAAG,CAAC,OAAA,EAAS,aAAA,EAAe,QAAA,EAAU,IAAI,CAAC,CAAA;AAE3C,EAAA,MAAM,gBAAA,GAAmB,WAAW,UAAU,CAAA;AAC9C,EAAA,MAAM,MAAA,GAA2B;AAAA,IAC/B,gBAAA,CAAiB,MAAA,GAAS,CAAC,CAAA,IAAK,CAAA;AAAA,IAChC,gBAAA,CAAiB,MAAA,GAAS,CAAC,CAAA,IAAK;AAAA,GAClC;AACA,EAAA,MAAM,iBAAA,GACJ,gBAAA,CAAiB,gBAAA,IAAoB,UAAA,CAAW,gBAAA;AAClD,EAAA,MAAM,mBACJ,iBAAA,KAAsB,MAAA,IAAa,sBAAsB,IAAA,GACrD,MAAA,GACA,CAAC,iBAAA,CAAkB,CAAC,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,EAAG,iBAAA,CAAkB,CAAC,CAAA,IAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAC3E,EAAA,MAAM,QAAA,GAAW,KAAK,SAAS,CAAA;AAE/B,EAAA,MAAM,EAAE,WAAA,EAAa,gBAAA,EAAiB,GAAI,WAAA,CAAY,YAAY,IAAI,CAAA;AAEtE,EAAA,MAAM,cAAA,GAAiB,iBAAiB,UAAA,IAAc,EAAA;AACtD,EAAA,MAAM,WAAA,GAAA,CACH,KAAA,GAAQ,CAAA,GAAI,gBAAA,CAAiB,CAAC,IAAI,MAAA,CAAO,CAAC,CAAA,IAAK,QAAA,GAAW,CAAA,CAAA,IAAM,QAAA;AAGnE,EAAA,MAAM,eAAA,GAAkB,UAAA,KAAe,QAAA,IAAY,UAAA,KAAe,QAAA;AAClE,EAAA,MAAM,YAAA,GAAe,eAAA,GACjB,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,cAAA,EAAgB,CAAC,CAAA,GACvC,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,CAAC,CAAA;AAC3B,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,IACrB,CAAA;AAAA,IACA,cAAc,UAAU,CAAA,EAAG,cACxB,UAAA,CAAW,WAAA,KAAgB,QAAQ,cAAA,GAAiB,YAAA;AAAA,GACzD;AAIA,EAAA,MAAM,gBAAA,GACJ,iBAAA,KAAsB,MAAA,GAClB,MAAA,GACA,IAAA,CAAK,GAAA;AAAA,IACH,iBAAA;AAAA,IACA,aAAa,OAAO,CAAA;AAAA,IACpB,aAAa,OAAO;AAAA,GACtB;AAEN,EAAA,MAAM,YAAA,GAA6B,OAAA,CAAQ,SAAS,CAAA,IAAK,EAAC;AAC1D,EAAA,MAAM,SAAA,GAAY,UAAU,YAAY,CAAA;AACxC,EAAA,MAAM,aACJ,gBAAA,KAAqB,MAAA,GACjB,YACA,IAAA,CAAK,GAAA,CAAI,WAAW,gBAAgB,CAAA;AAC1C,EAAA,MAAM,eAAA,GAAkB,WAAA;AAAA,IACtB,UAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAO,CAAC,CAAA;AAAA,IACR,iBAAiB,CAAC;AAAA,GACpB;AACA,EAAA,MAAM,UAAA,GACJ,gBAAA,KAAqB,MAAA,GACjB,MAAA,GACA,WAAA;AAAA,IACE,gBAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAO,CAAC,CAAA;AAAA,IACR,iBAAiB,CAAC;AAAA,GACpB;AAEN,EAAA,MAAM,sBAAA,GAAyBJ,WAAAA;AAAA,IAC7B,CAAC,MAAA,KAAmB;AAClB,MAAA,IAAI,CAAC,QAAA,IAAY,cAAA,KAAmB,MAAA,EAAW;AAC/C,MAAA,MAAM,MAAA,GAAuB,MAAA,CAAO,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACjD,GAAG,IAAA,CAAK,CAAA;AAAA,QACR,GAAG,IAAA,CAAK,CAAA;AAAA,QACR,GAAG,IAAA,CAAK,CAAA;AAAA,QACR,GAAG,IAAA,CAAK,CAAA;AAAA,QACR,GAAG,IAAA,CAAK,CAAA;AAAA,QACR,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK;AAAA,QACrD,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK;AAAA,QACrD,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK;AAAA,QACrD,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA;AAAK,OACvD,CAAE,CAAA;AACF,MAAA,MAAM,MAAA,GAAS,6BAAA;AAAA,QACb,EAAE,CAAC,SAAS,GAAG,MAAA,EAAO;AAAA,QACtB,SAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,cAAA,CAAe,YAAA,CAAa,OAAA,EAAS,MAAM,CAAA,EAAG,SAAS,CAAA;AAAA,IACzD,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,cAAA,EAAgB,SAAA,EAAW,MAAM,OAAO;AAAA,GACrD;AAEA,EAAA,MAAM,OAAA,GAAUI,QAAQ,MAAM,qBAAA,CAAsB,SAAS,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAE3E,EAAA,MAAM,SAAA,GAA2B,EAAE,KAAA,EAAO,MAAA,EAAQ,GAAG,KAAA,EAAM;AAC3D,EAAA,IAAI,iBAAA,KAAsB,MAAA,EAAW,SAAA,CAAU,QAAA,GAAW,iBAAA;AAE1D,EAAA,MAAM,aAAA,GAAgBA,OAAAA;AAAA,IACpB,MAAM,iBAAiB,UAAU,CAAA;AAAA,IACjC,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,uBACEN,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACT,gEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO,SAAA;AAAA,MACP,uBAAA,EAAsB,EAAA;AAAA,MACtB,iBAAA,EAAiB,SAAA;AAAA,MACjB,iBAAA,EAAiB,UAAA;AAAA,MACjB,gBAAA,EAAgB,WAAW,MAAA,GAAS,MAAA;AAAA,MACpC,cAAA,EAAc,MAAA,CAAO,OAAA,GAAU,MAAA,GAAS,MAAA;AAAA,MAEvC,QAAA,EAAA,OAAA,oBACCD,IAAAA,CAAAe,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,QAAA,oBACCd,GAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,IAAA,EAAM,QAAA;AAAA,YACN,SAAA;AAAA,YACA,MAAA;AAAA,YACA,gBAAA;AAAA,YACA,MAAM,gBAAA,IAAoB,MAAA;AAAA,YAC1B,QAAQ,UAAA,IAAc,eAAA;AAAA,YACtB,KAAA,EAAM,yBAAA;AAAA,YACN,YAAA,EAAc,CAAA;AAAA,YACd,KAAA,EAAO,EAAE,OAAA,EAAS,IAAA;AAAK;AAAA,SACzB;AAAA,wBAEFA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,WAAA,EAAa,wBAAA;AAAA,YACb,IAAA;AAAA,YACA,OAAA;AAAA,YACA,SAAA;AAAA,YACA,MAAA;AAAA,YACA,gBAAA;AAAA,YACA,WAAA,EAAa,QAAA;AAAA,YACb,WAAA,EAAa,QAAA;AAAA,YACb,SAAA,EAAW,WAAW,SAAA,IAAa,IAAA;AAAA,YAClC,GAAI,OAAO,UAAA,CAAW,eAAA,KAAoB,QAAA,GACvC,EAAE,eAAA,EAAiB,UAAA,CAAW,eAAA,EAAgB,GAC9C,EAAC;AAAA,YACJ,GAAI,OAAO,UAAA,CAAW,eAAA,KAAoB,QAAA,GACvC,EAAE,eAAA,EAAiB,UAAA,CAAW,eAAA,EAAgB,GAC9C,EAAC;AAAA,YACL,aAAA;AAAA,YACA,WAAA;AAAA,YACA,gBAAA;AAAA,YACA,YAAA,EAAc,WAAW,YAAA,IAAgB,KAAA;AAAA,YACxC,GAAI,gBAAA,KAAqB,MAAA,GACtB,EAAC,GACD,EAAE,SAAS,gBAAA,EAAiB;AAAA,YAChC,KAAA,EAAO;AAAA,cACL,SAAA,EACE,QAAA,IAAY,UAAA,KAAe,MAAA,GACvB,UAAA,GACA;AAAA,aACR;AAAA,YACA,gBAAA,EAAgB,IAAA;AAAA,YAChB,UAAA,EAAY,sBAAA;AAAA,YACZ,YAAA,EAAc,sBAAA;AAAA,YAEb,QAAA,EAAA,MAAA,CAAO,QAAQ,WAAW,CAAA,CAAE,IAAI,CAAC,CAAC,EAAA,EAAI,MAAM,CAAA,KAAM;AACjD,cAAA,MAAM,MAAA,GAAS,QAAQ,EAAE,CAAA;AACzB,cAAA,uBACEA,GAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBAEC,gBAAA,EAAgB,EAAA;AAAA,kBAChB,SAAA,EAAW,EAAA;AAAA,oBACT,QAAA,IAAY;AAAA,mBACd;AAAA,kBAEA,QAAA,kBAAAA,GAAAA;AAAA,oBAAC,cAAA;AAAA,oBAAA;AAAA,sBACC,MAAA;AAAA,sBACC,GAAI,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAO;AAAA,sBAC1C,OAAA;AAAA,sBACA,OAAA,EAAS,OAAA,KAAY,IAAA,IAAQ,gBAAA,CAAiB,SAAS,EAAE,CAAA;AAAA,sBACzD,QAAA;AAAA,sBACC,GAAI,YAAA,KAAiB,MAAA,GAClB,EAAC,GACD,EAAE,QAAQ,YAAA,EAAa;AAAA,sBAC1B,GAAI,WAAA,KAAgB,MAAA,GACjB,EAAC,GACD,EAAE,OAAO,WAAA,EAAY;AAAA,sBACxB,GAAI,cAAA,KAAmB,MAAA,GACpB,EAAC,GACD,EAAE,UAAU,cAAA,EAAe;AAAA,sBAC9B,GAAI,gBAAA,KAAqB,MAAA,GACtB,EAAC,GACD,EAAE,YAAY,gBAAA,EAAiB;AAAA,sBACnC,OAAA,EACE,aAAA,KAAkB,MAAA,mBAChBA,GAAAA;AAAA,wBAAC,aAAA;AAAA,wBAAA;AAAA,0BACC,MAAA;AAAA,0BACC,GAAI,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAO;AAAA,0BACzC,GAAI,eAAA,KAAoB,MAAA,GACrB,EAAC,GACD;AAAA,4BACE,WAAW,MAAM;AACf,8BAAA,eAAA,CAAgB,EAAE,CAAA;AAAA,4BACpB;AAAA;AACF;AAAA,uBACN,GAEA,cAAc,MAAM,CAAA;AAAA,sBAGvB,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAC,GAAI,EAAE,aAAA,EAAc;AAAA,sBACvD,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAC,GAAI,EAAE,aAAA,EAAc;AAAA,sBACvD,GAAI,aAAA,KAAkB,MAAA,GACnB,EAAC,GACD;AAAA,wBACE,SAAS,MAAM;AACb,0BAAA,aAAA,CAAc,EAAE,CAAA;AAAA,wBAClB;AAAA;AACF;AAAA;AACN,iBAAA;AAAA,gBAlDK;AAAA,eAmDP;AAAA,YAEJ,CAAC;AAAA;AAAA,SACH;AAAA,QACC,QAAA,IAAY,KAAA,CAAM,MAAA,GAAS,CAAA,oBAC1BD,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kJAAA;AAAA,YACV,IAAA,EAAK,QAAA;AAAA,YAEJ,QAAA,EAAA;AAAA,cAAA,KAAA,CAAM,WAAW,CAAA,GACd,gJAAA,GACA,GAAG,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC,CAAA,mJAAA,CAAA;AAAA,cAC1B,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,cAAE;AAAA;AAAA;AAAA,SACpB;AAAA,QAED,QAAA,IACC,qBAAqB,MAAA,IACrB,iBAAA,KAAsB,0BACpBA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA;AAAA,YAAC,EAAA,CAAG,MAAA;AAAA,YAAH;AAAA,cACC,OAAA,EAAQ,WAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,SAAA,EAAU,UAAA;AAAA,cACV,KAAA,EAAM,UAAA;AAAA,cACN,SAAS,MAAM;AACb,gBAAA,iBAAA,CAAkB,mBAAmB,aAAa,CAAA;AAAA,cACpD,CAAA;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,gBAAE;AAAA;AAAA;AAAA,WAEnC;AAAA,0BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,iDAAA,EAE7C;AAAA,SAAA,EACF;AAAA,OAAA,EAEN;AAAA;AAAA,GAEJ;AAEJ;ACnlBO,SAAS,mBAAA,CAAoB;AAAA,EAClC,IAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,EAAA;AAAA,IACA,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAa;AACjB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIG,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAA6B,MAAS,CAAA;AACxE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAA6B,IAAI,CAAA;AACzE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,UAAA,GAAaF,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,eAAA,GAAkBA,OAAO,YAAY,CAAA;AAC3C,EAAAG,UAAU,MAAM;AACd,IAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,IAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,OAAA,EAAS,YAAY,CAAC,CAAA;AAE1B,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,SAAA,CAAU,qBAAA,KAA0B,MAAA,EAAW;AAC5D,IAAA,MAAM,eAAe,SAAA,CAAU,qBAAA;AAC/B,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,eAAe,IAAA,GAAsB;AACnC,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,CAACc,SAAAA,EAAU,SAAS,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,UAC9C,aAAa,EAAE,WAAA,EAAa,MAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA;AAAA,UACvD,UAAU,WAAA,CAAY,EAAE,aAAa,MAAA,EAAQ,UAAA,CAAW,QAAQ;AAAA,SACjE,CAAA;AACD,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,QAAA,CAASA,UAAS,QAAQ,CAAA;AAC1B,QAAA,QAAA,CAASA,UAAS,QAAQ,CAAA;AAC1B,QAAA,YAAA,CAAaA,UAAS,SAAS,CAAA;AAC/B,QAAA,eAAA,CAAgB,IAAI,GAAA,CAAI,MAAA,CAAO,KAAK,SAAA,CAAU,OAAO,CAAC,CAAC,CAAA;AAAA,MACzD,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA;AAAA,YACE,GAAA,YAAe,KAAA,GACX,GAAA,CAAI,OAAA,GACJ;AAAA,WACN;AAAA,QACF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,MAClC;AAAA,IACF;AACA,IAAA,KAAK,IAAA,EAAK;AACV,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,WAAA,EAAa,IAAI,CAAC,CAAA;AAEjC,EAAA,MAAM,OAAA,GAAUZ,QAAQ,MAAM,oBAAA,CAAqB,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAClE,EAAA,MAAM,MAAA,GAASA,QAAQ,MAAM;AAC3B,IAAA,IAAI,KAAA,KAAU,EAAA,EAAI,OAAO,EAAC;AAC1B,IAAA,MAAM,GAAA,GAAM,CAAC,GAAG,OAAA,CAAQ,MAAM,CAAA;AAC9B,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,UAAA,EAAY;AACpC,QAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG;AAC1B,UAAA,GAAA,CAAI,IAAA,CAAK,CAAA,OAAA,EAAU,GAAG,CAAA,wCAAA,CAA0C,CAAA;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,OAAA,CAAQ,EAAA,KAAO,IAAA,IAAQ,OAAA,CAAQ,OAAO,WAAA,EAAa;AACrD,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,CAAA,eAAA,EAAkB,OAAA,CAAQ,EAAE,CAAA,uBAAA,EAA0B,WAAW,CAAA,4BAAA;AAAA,OACnE;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,GAAG,CAAC,KAAA,EAAO,OAAA,EAAS,YAAA,EAAc,WAAW,CAAC,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAUA,QAAQ,MAAM,iBAAA,CAAkB,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAC/D,EAAA,MAAM,QAAQ,KAAA,KAAU,KAAA;AAExB,EAAA,SAAS,iBAAiB,IAAA,EAAqB;AAC7C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf;AACA,IAAA,eAAA,CAAgB,QAAQ,IAAI,CAAA;AAAA,EAC9B;AAEA,EAAA,eAAe,OAAA,GAAyB;AACtC,IAAA,IAAI,SAAA,CAAU,qBAAA,KAA0B,MAAA,IAAa,MAAA,CAAO,SAAS,CAAA,EAAG;AACtE,MAAA;AAAA,IACF;AACA,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,qBAAA,CAAsB;AAAA,QACnD,WAAA;AAAA,QACA,QAAA,EAAU,KAAA;AAAA,QACV,GAAI,SAAA,KAAc,KAAA,CAAA,GAAY,EAAC,GAAI,EAAE,mBAAmB,SAAA;AAAU,OACnE,CAAA;AACD,MAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AACxB,MAAA,YAAA,CAAa,OAAO,SAAS,CAAA;AAC7B,MAAA,MAAM,WAAW,OAAA,EAAQ;AACzB,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA;AAAA,QACE,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,OACvC;AAAA,IACF,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,uBACEN,GAAAA;AAAA,IAAC,EAAA,CAAG,KAAA;AAAA,IAAH;AAAA,MACC,IAAA;AAAA,MACA,IAAA,EAAK,IAAA;AAAA,MACL,KAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EAAY,uIAAA;AAAA,MACZ,YAAA,EAAc,gBAAA;AAAA,MACd,MAAA,kBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EACb,kBAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GACrB,CAAA,EAAG,OAAO,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAC,0BAChC,wBAAA,EACN,CAAA;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,EAAA,CAAG,MAAA;AAAA,YAAH;AAAA,cACC,OAAA,EAAQ,WAAA;AAAA,cACR,QAAA,EAAU,MAAA;AAAA,cACV,SAAS,MAAM;AACb,gBAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,cACxB,CAAA;AAAA,cACD,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAA,GAAAA;AAAA,YAAC,EAAA,CAAG,MAAA;AAAA,YAAH;AAAA,cACC,OAAA,EAAQ,SAAA;AAAA,cACR,QAAA,EACE,UAAU,OAAA,IAAW,CAAC,WAAW,CAAC,KAAA,IAAS,OAAO,MAAA,GAAS,CAAA;AAAA,cAE7D,SAAS,MAAM;AACb,gBAAA,KAAK,OAAA,EAAQ;AAAA,cACf,CAAA;AAAA,cAEC,mBAAS,WAAA,GAAc;AAAA;AAAA;AAC1B,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,MAGF,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACZ,QAAA,EAAA,OAAA,mBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mCAAA,EAAoC,QAAA,EAAA,2BAAA,EAEjD,CAAA,mBAEAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,QAAA,EAAS,MAAA;AAAA,YACT,UAAU,CAAC,OAAA;AAAA,YACX,OAAA;AAAA,YACA,SAAA,EAAU,gBAAA;AAAA,YACV,QAAA,EAAU;AAAA;AAAA,SACZ,EAEJ,CAAA;AAAA,QACC,KAAA,KAAU,uBACTA,GAAAA,CAAC,SAAI,SAAA,EAAU,mDAAA,EACZ,iBACH,CAAA,GACE,IAAA;AAAA,QACH,OAAO,MAAA,GAAS,CAAA,mBACfD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uDAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,QAAA,EAAA,0BAAA,EAAwB,CAAA;AAAA,0BACrDA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2CACX,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,qBACXA,GAAAA,CAAC,IAAA,EAAA,EAAgB,QAAA,EAAA,KAAA,EAAA,EAAR,KAAc,CACxB,CAAA,EACH;AAAA,SAAA,EACF,CAAA,GACE;AAAA,OAAA,EACN;AAAA;AAAA,GACF;AAEJ;ACrMA,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,IAAA,EAAM,UAAS,EAAoB;AAC9D,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACtD,QAAA;AAAA,IACA,uBACCA,GAAAA,CAAC,OAAE,SAAA,EAAU,mCAAA,EAAqC,gBAAK,CAAA,GACrD;AAAA,GAAA,EACN,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,MAAM,UAAU,KAAA,KAAU,EAAA;AAC1B,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,QAAA;AAAA,MACV,YAAA,EAAY,KAAA;AAAA,MACZ,OAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,2HAAA;AAAA,QACA,WACI,sCAAA,GACA,sCAAA;AAAA,QACJ,OAAA,IAAW,CAAC,QAAA,GAAW,4BAAA,GAA+B,EAAA;AAAA,QACtD,IAAA,IAAQ,CAAC,OAAA,GAAU,uBAAA,GAA0B;AAAA,OAC/C;AAAA,MAEA,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,OAAA,GAAU,uBAAA,GAA0B,EAAE,CAAA,EACnE,QAAA,EAAA,OAAA,GAAU,KAAA,GAAQ,KAAA,EACrB;AAAA;AAAA,GACF;AAEJ;AAEA,IAAM,OAAA,GAAU,uCAAA;AAmBT,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,IAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,EAAE,EAAA,EAAG,GAAI,YAAA,EAAa;AAC5B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,IAAIG,QAAAA,CAAS,SAAA,IAAa,CAAC,QAAQ,CAAA;AAC7D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,QAAAA,CAAS,SAAS,EAAE,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAUF,OAAuB,IAAI,CAAA;AAE3C,EAAAG,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,EAAS,aAAA,CAAc,OAAO,CAAA;AACpD,IAAA,KAAA,EAAO,KAAA,EAAM;AAAA,EACf,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,SAAS,OAAO,IAAA,EAAoB;AAClC,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,IAAI,IAAA,MAAU,KAAA,IAAS,EAAA,CAAA,EAAK,QAAA,CAAS,IAAI,CAAA;AAAA,EAC3C;AAEA,EAAA,uBACEJ,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAc,IAAA,EACvB,oCACCA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,OAAA;AAAA,MACL,QAAQ,MAAM;AACZ,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,QAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,QAAA,CAAS,SAAS,EAAE,CAAA;AACpB,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AAAA,MACF,CAAA;AAAA,MAEA,QAAA,kBAAAA,GAAAA;AAAA,QAAC,EAAA,CAAG,SAAA;AAAA,QAAH;AAAA,UACC,KAAA,EAAO,KAAA;AAAA,UACP,SAAA,EAAW,KAAA;AAAA,UACX,WAAA;AAAA,UACA,SAAA,EAAW,EAAA,CAAG,OAAA,EAAS,IAAA,GAAO,0BAA0B,EAAE,CAAA;AAAA,UAC1D,QAAA,EAAU,QAAA;AAAA,UACV,UAAU,MAAM;AACd,YAAA,MAAA,CAAO,KAAK,CAAA;AAAA,UACd;AAAA;AAAA;AACF;AAAA,sBAGFA,GAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,OAAO,KAAA,IAAS,EAAA;AAAA,MAChB,KAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAS,MAAM;AACb,QAAA,QAAA,CAAS,SAAS,EAAE,CAAA;AACpB,QAAA,UAAA,CAAW,IAAI,CAAA;AAAA,MACjB;AAAA;AAAA,GACF,EAEJ,CAAA;AAEJ;AAiBO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,EAAA,EAAG,GAAI,YAAA,EAAa;AAC5B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIG,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,UAAU,KAAK,CAAA;AAE9D,EAAA,uBACEH,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAc,IAAA,EACvB,oCACCA,GAAAA;AAAA,IAAC,EAAA,CAAG,MAAA;AAAA,IAAH;AAAA,MACC,OAAO,KAAA,IAAS,EAAA;AAAA,MAChB,OAAA;AAAA,MACA,SAAA,EAAW,KAAA;AAAA,MACX,WAAA,EAAa,KAAA;AAAA,MACb,SAAA,EAAW,OAAA;AAAA,MACX,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,QAAA,UAAA,CAAW,KAAK,CAAA;AAChB,QAAA,IAAI,IAAA,KAAS,KAAA,EAAO,QAAA,CAAS,IAAI,CAAA;AAAA,MACnC;AAAA;AAAA,sBAGFA,GAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,KAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAS,MAAM;AACb,QAAA,UAAA,CAAW,IAAI,CAAA;AAAA,MACjB;AAAA;AAAA,GACF,EAEJ,CAAA;AAEJ;AC1LA,IAAM,SAAA,GAAY,UAAA;AAClB,IAAM,mBAAA,GAAsB,mBAAA;AAM5B,SAAS,SAAA,CACP,OACA,gBAAA,EACQ;AACR,EAAA,MAAM,SAGA,KAAA,CAAM,UAAA;AACZ,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAA,CAAA;AACrC;AAEA,SAAS,aAAa,QAAA,EAA4B;AAChD,EAAA,IAAI,EAAA,GAAK,aAAA;AACT,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,QAAA,CAAS,QAAA,CAAS,EAAE,CAAA,EAAG;AAC5B,IAAA,EAAA,GAAK,eAAe,CAAC,CAAA,CAAA;AACrB,IAAA,CAAA,IAAK,CAAA;AAAA,EACP;AACA,EAAA,OAAO,EAAA;AACT;AASO,SAAS,YAAA,CAAa,YAAoB,MAAA,EAAwB;AACvE,EAAA,MAAM,IAAA,GAAO,WAAW,IAAA,EAAK;AAC7B,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,CAAA,IAAA,EAAO,MAAM,CAAA,CAAA,CAAA;AAC/B,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAClE,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,MAAM,CAAA,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC1B;AAGA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,OAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,EAAE,EAAA,EAAG,GAAI,YAAA,EAAa;AAC5B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIG,SAAS,EAAE,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,EAAY;AACzC,EAAA,MAAM,YACJ,MAAA,GACI,OAAA,CAAQ,MAAA,CAAO,CAAC,WAAW,MAAA,CAAO,WAAA,EAAY,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA,GAChE,OAAA,EACJ,KAAA,CAAM,GAAG,EAAE,CAAA;AAEb,EAAA,uBACEJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mCAAA,EAAoC,QAAA,EAAA,oEAAA,EAEjD,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,EAAA,CAAG,SAAA;AAAA,QAAH;AAAA,UACC,KAAA,EAAO,MAAA;AAAA,UACP,SAAA,EAAU,eAAA;AAAA,UACV,WAAA,EAAY,eAAA;AAAA,UACZ,QAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,oBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CACZ,QAAA,EAAA,QAAA,CAAS,MAAA,KAAW,oBACnBA,GAAAA,CAAC,OAAE,SAAA,EAAU,mCAAA,EACV,+BAAqB,MAAM,CAAA,CAAA,CAAA,EAC9B,IAEA,QAAA,CAAS,GAAA,CAAI,CAAC,MAAA,qBACZA,GAAAA;AAAA,MAAC,EAAA,CAAG,MAAA;AAAA,MAAH;AAAA,QAEC,IAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAQ,WAAA;AAAA,QACR,SAAA,EAAU,uBAAA;AAAA,QACV,SAAS,MAAM;AACb,UAAA,QAAA,CAAS,MAAM,CAAA;AAAA,QACjB,CAAA;AAAA,QAEC,QAAA,EAAA;AAAA,OAAA;AAAA,MARI;AAAA,KAUR,CAAA,EAEL;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,SAAA,CAAU;AAAA,EACjB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,EAAE,EAAA,EAAG,GAAI,YAAA,EAAa;AAC5B,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,MAAA,CAAO,UAAU,CAAA;AACjD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIG,QAAAA,CAAS,WAAW,IAAI,CAAA;AAExD,EAAA,uBACEJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,oBAAA;AAAA,UACN,OAAO,MAAA,CAAO,EAAA;AAAA,UACd,KAAA,EAAM,kBAAA;AAAA,UACN,WAAA,EAAY,WAAA;AAAA,UACZ,IAAA,EAAI,IAAA;AAAA,UACJ,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,QAAA,CAAS,EAAE,GAAG,MAAA,EAAQ,EAAA,EAAI,OAAO,CAAA;AAAA,UACnC;AAAA;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,kBAAA;AAAA,UACN,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,KAAA,EAAO,CAAA,YAAA,EAAe,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,UAC/B,aAAa,MAAA,CAAO,EAAA;AAAA,UACpB,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,QAAA,CAAS,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,KAAA,IAAS,MAAM,CAAA;AAAA,UAC9C;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,IAEC,YAAY,MAAA,KAAW,IAAA,mBACtBD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,gBAAA;AAAA,UACN,OAAO,MAAA,CAAO,UAAA;AAAA,UACd,KAAA,EAAM,uBAAA;AAAA,UACN,WAAA,EAAY,gBAAA;AAAA,UACZ,IAAA,EAAI,IAAA;AAAA,UACJ,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,QAAA,CAAS,EAAE,GAAG,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAA;AAAA,UAC3C;AAAA;AAAA,OACF;AAAA,MACC,CAAC,QAAA,IAAY,OAAA,CAAQ,MAAA,GAAS,oBAC7BA,GAAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,OAAA;AAAA,UACA,QAAA,EAAU,CAAC,MAAA,KAAW;AACpB,YAAA,QAAA,CAAS;AAAA,cACP,GAAG,MAAA;AAAA,cACH,UAAA,EAAY,YAAA,CAAa,MAAA,CAAO,UAAA,EAAY,MAAM;AAAA,aACnD,CAAA;AAAA,UACH;AAAA;AAAA,OACF,GACE;AAAA,KAAA,EACN,CAAA,mBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,aAAA;AAAA,UACN,OAAO,MAAA,CAAO,WAAA;AAAA,UACd,KAAA,EAAM,qBAAA;AAAA,UACN,QAAA;AAAA,UACA,OAAA,EAAS,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,YACpC,KAAA,EAAO,KAAA;AAAA,YACP,KAAA,EAAO;AAAA,WACT,CAAE,CAAA;AAAA,UACF,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,QAAA,CAAS;AAAA,cACP,GAAG,MAAA;AAAA,cACH,UAAA,EAAY,qBAAA;AAAA,gBACV,KAAA;AAAA,gBACA,MAAA,CAAO;AAAA;AACT,aACD,CAAA;AAAA,UACH;AAAA;AAAA,OACF;AAAA,MACC,OAAA,CAAQ,MAAA,GAAS,CAAA,mBAChBA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,QAAA;AAAA,UACN,OAAO,MAAA,CAAO,MAAA;AAAA,UACd,KAAA,EAAM,eAAA;AAAA,UACN,QAAA;AAAA,UACA,OAAA,EAAA,CAAU,QAAQ,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,GACpC,OAAA,GACA,CAAC,MAAA,CAAO,MAAA,EAAQ,GAAG,OAAO,CAAA,EAC5B,IAAI,CAAC,MAAA,MAAY,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,CAAE,CAAA;AAAA,UACpD,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,QAAA,CAAS;AAAA,cACP,GAAG,MAAA;AAAA,cACH,UAAA,EAAY,qBAAA,CAAsB,MAAA,CAAO,WAAA,EAAa,KAAK;AAAA,aAC5D,CAAA;AAAA,UACH;AAAA;AAAA,0BAGFA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,QAAA;AAAA,UACN,OAAO,MAAA,CAAO,MAAA;AAAA,UACd,KAAA,EAAM,iBAAA;AAAA,UACN,WAAA,EAAY,WAAA;AAAA,UACZ,IAAA,EAAI,IAAA;AAAA,UACJ,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,QAAA,CAAS;AAAA,cACP,GAAG,MAAA;AAAA,cACH,UAAA,EAAY,qBAAA,CAAsB,MAAA,CAAO,WAAA,EAAa,KAAK;AAAA,aAC5D,CAAA;AAAA,UACH;AAAA;AAAA;AACF,KAAA,EAEJ,CAAA;AAAA,oBAGFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,kEAAA;AAAA,UACV,SAAS,MAAM;AACb,YAAA,WAAA,CAAY,CAAC,OAAA,KAAY,CAAC,OAAO,CAAA;AAAA,UACnC,CAAA;AAAA,UAEC,QAAA,EAAA,QAAA,IAAY,MAAA,KAAW,IAAA,GACpB,gCAAA,GACA;AAAA;AAAA,OACN;AAAA,sBACAA,GAAAA;AAAA,QAAC,EAAA,CAAG,MAAA;AAAA,QAAH;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAQ,OAAA;AAAA,UACR,QAAA,EAAU,QAAA;AAAA,UACV,SAAA,EAAW,CAAA,cAAA,EAAiB,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,UACrC,OAAA,EAAS,QAAA;AAAA,UACV,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAmBO,SAAS,mBAAA,CAAoB;AAAA,EAClC,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,EAAE,SAAA,EAAW,EAAA,EAAG,GAAI,YAAA,EAAa;AACvC,EAAA,MAAM,OAAA,GAAUM,QAAQ,MAAM,gBAAA,CAAiB,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AACpE,EAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAS,GAAI,OAAA;AACjC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIH,SAAwB,IAAI,CAAA;AAEhE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC1D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAkC,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAsC,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM,QAAA,GACJ,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY,OAAA,CAAQ,EAAA,KAAO,UAAU,CAAA,IACpD,QAAA,CAAS,CAAC,CAAA,IACV,IAAA;AAGF,EAAA,MAAM,YAAA,GAAeG,QAAQ,MAAM;AACjC,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,MAAM,QACJ,UAAA,CAAW,IAAA,CAAK,CAAC,KAAA,KAAU,MAAM,EAAA,KAAO,QAAA,CAAS,WAAW,CAAA,IAC5D,WAAW,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,CAAA,IAC1C,IAAA;AACF,IAAA,OAAO,KAAA,EAAO,WAAA,IAAe,WAAA,CAAY,CAAC,GAAG,EAAA,IAAM,IAAA;AAAA,EACrD,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,QAAQ,CAAC,CAAA;AAEtC,EAAAF,UAAU,MAAM;AAEd,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACvB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,eAAe,IAAA,GAAsB;AACnC,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,mBAAA,CAAoB;AAAA,UACjD,YAAA;AAAA,UACA,QAAQ,UAAA,CAAW;AAAA,SACpB,CAAA;AACD,QAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,MAAM,CAAA;AAAA,MAClC,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,SAAA,CAAU,EAAE,CAAA;AACZ,QAAA,cAAA;AAAA,UACE,KAAA,YAAiB,KAAA,GACb,KAAA,CAAM,OAAA,GACN;AAAA,SACN;AAAA,MACF;AAAA,IACF;AACA,IAAA,KAAK,IAAA,EAAK;AACV,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,YAAA,EAAc,gBAAgB,CAAC,CAAA;AAE9C,EAAA,MAAM,KAAA,GAAQF,WAAAA;AAAA,IACZ,CAAC,MAAsB,UAAA,KAAwB;AAC7C,MAAA,QAAA,CAAS,aAAA,CAAc,QAAA,EAAU,IAAA,EAAM,UAAU,CAAC,CAAA;AAClD,MAAA,aAAA,CAAc,KAAK,EAAE,CAAA;AACrB,MAAA,UAAA,CAAW,IAAI,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAAC,UAAU,QAAQ;AAAA,GACrB;AAEA,EAAA,MAAM,MAAA,GAAS,QAAA,GAAW,QAAA,CAAS,MAAA,GAAS,IAAA;AAG5C,EAAA,MAAM,YAAA,GAAeI,QAAQ,MAAM;AACjC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,SAAe,EAAC;AAChC,IAAA,MAAM,OAAO,MAAA,CAAO,OAAA,CAAQ,gBAAA,EAAkB,EAAE,EAAE,WAAA,EAAY;AAC9D,IAAA,MAAM,QAAQ,MAAA,CAAO,IAAA;AAAA,MACnB,CAAC,UACC,CAAA,EAAG,KAAA,CAAM,UAAU,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAA,CAAA,CAAG,WAAA,OAAkB,IAAA,IAC3D,KAAA,CAAM,UAAU,WAAA,EAAY,KAAM,KAAK,KAAA,CAAM,GAAG,EAAE,GAAA;AAAI,KAC1D;AACA,IAAA,OAAO,KAAA,EAAO,WAAW,EAAC;AAAA,EAC5B,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAEnB,EAAA,MAAM,cAAc,YAAA,CAAa,GAAA,CAAI,CAAC,MAAA,KAAW,OAAO,IAAI,CAAA;AAE5D,EAAA,MAAM,cAAA,GAAiBA,QAAQ,MAAM;AACnC,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,IAAA,EAAK,CAAE,WAAA,EAAY;AAC9C,IAAA,MAAM,QAAA,GAAW,SACb,MAAA,CAAO,MAAA;AAAA,MAAO,CAAC,KAAA,KACb,CAAA,EAAG,KAAA,CAAM,UAAU,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAA,CAAA,CACnC,WAAA,EAAY,CACZ,QAAA,CAAS,MAAM;AAAA,KACpB,GACA,MAAA;AACJ,IAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,WAAA,EAAa,MAAM,CAAC,CAAA;AAExB,EAAA,SAAS,UAAA,GAAmB;AAC1B,IAAA,MAAM,EAAA,GAAK,aAAa,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,EAAE,CAAC,CAAA;AAC7D,IAAA,UAAA,CAAW,EAAE,CAAA;AACb,IAAA,KAAA,CAAM;AAAA,MACJ,EAAA;AAAA,MACA,IAAA,EAAM,IAAA;AAAA,MACN,WAAA,EAAa,WAAW,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,SAAS,GAAG,EAAA,IAAM,IAAA;AAAA,MAChE,MAAA,EAAQ,IAAA;AAAA,MACR,UAAA,EAAY,OAAA;AAAA,MACZ,WAAA,EAAa,IAAA;AAAA,MACb,YAAY,EAAC;AAAA,MACb,SAAS,EAAC;AAAA,MACV,MAAA,EAAQ,IAAA;AAAA,MACR,iBAAiB;AAAC,KACnB,CAAA;AAAA,EACH;AAEA,EAAA,eAAe,WAAW,OAAA,EAAwC;AAChE,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,UAAA;AAAA,QACE,MAAM,UAAU,cAAA,CAAe;AAAA,UAC7B,QAAA;AAAA,UACA,WAAW,OAAA,CAAQ,EAAA;AAAA,UACnB,KAAA,EAAO;AAAA,SACR;AAAA,OACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,eAAA;AAAA,QACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAC3C;AAAA,IACF,CAAA,SAAE;AACA,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,SAAS,eAAA,CACP,MAAA,EACA,aAAA,EACA,EAAA,EACM;AACN,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,aAAa,EAAA,GACf;AAAA,MACE,GAAG,QAAA,CAAS,UAAA;AAAA,MACZ;AAAA,QACE,EAAA,EAAI,OAAO,WAAA,EAAY;AAAA,QACvB,MAAA,EAAQ,MAAA,CAAO,WAAA,EAAY,KAAM,SAAS,IAAA,GAAO,MAAA;AAAA,QACjD,IAAA,EAAM,iBAAiB,aAAa,CAAA;AAAA,QACpC,MAAA,EAAQ,gBAAA,CAAiB,aAAa,CAAA,KAAM;AAAA;AAC9C,KACF,GACA,SAAS,UAAA,CAAW,MAAA;AAAA,MAClB,CAAC,eACE,SAAA,CAAU,MAAA,IAAU,UAAU,EAAA,EAAI,WAAA,EAAY,KAC/C,MAAA,CAAO,WAAA;AAAY,KACvB;AACJ,IAAA,KAAA,CAAM,EAAE,GAAG,QAAA,EAAU,UAAA,EAAY,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,EAAU,eAAA,IAAmB,EAAE,CAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,QAAA,EAAU,eAAA,IAAmB,EAAE,CAAA;AAG/D,EAAA,MAAM,MAAA,GAAS,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA;AAE7C,EAAA,MAAM,aAAA,GAAgB,OAAA;AAAA,IACpB,QAAA,EAAU,MAAA,IACR,QAAA,CAAS,WAAA,IACT,CAAC,SAAS,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,QAAA,CAAS,WAAW;AAAA,GACxD;AAEA,EAAA,uBACEP,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,wBAC7CA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,wGAAA,EAG7C;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,EAAA,CAAG,MAAA;AAAA,QAAH;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,QAAA,EAAU,QAAA;AAAA,UACV,OAAA,EAAS,UAAA;AAAA,UACV,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,IAEC,SAAS,MAAA,KAAW,CAAA,mBACnBA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mEAAA,EAAoE,QAAA,EAAA,uFAAA,EAGjF,oBAEAA,GAAAA,CAAC,SAAI,SAAA,EAAU,sBAAA,EACZ,mBAAS,GAAA,CAAI,CAAC,4BACbD,IAAAA;AAAA,MAAC,EAAA,CAAG,MAAA;AAAA,MAAH;AAAA,QAEC,IAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAS,OAAA,CAAQ,EAAA,KAAO,QAAA,EAAU,KAAK,SAAA,GAAY,WAAA;AAAA,QACnD,SAAS,MAAM;AACb,UAAA,aAAA,CAAc,QAAQ,EAAE,CAAA;AACxB,UAAA,UAAA,CAAW,IAAI,CAAA;AACf,UAAA,UAAA,CAAW,IAAI,CAAA;AAAA,QACjB,CAAA;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,OAAA,CAAQ,EAAA;AAAA,UACR,CAAC,OAAA,CAAQ,WAAA,mBACRC,GAAAA,CAAC,EAAA,CAAG,KAAA,EAAH,EAAS,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,MAAA,EAAO,gCAEzC,CAAA,GACE;AAAA;AAAA,OAAA;AAAA,MAdC,OAAA,CAAQ;AAAA,KAgBhB,CAAA,EACH,CAAA;AAAA,IAGD,QAAA,IAAY,SAAS,MAAA,GAAS,CAAA,mBAC7BD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qFAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA,sBAAA,EAAyB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,mCAAA,CAAA,EAC7D,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,6GAAA,EAGH,CAAA;AAAA,sBACAA,GAAAA,CAAC,EAAA,CAAG,MAAA,EAAH,EAAU,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,OAAA,EAAS,YAAA,EAC/C,QAAA,EAAA,CAAA,KAAA,EAAQ,QAAA,CAAS,EAAE,CAAA,QAAA,CAAA,EACtB;AAAA,KAAA,EACF,CAAA,GACE,IAAA;AAAA,IAEH,QAAA,IAAY,SAAS,MAAA,KAAW,CAAA,mBAC/BA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,IAAA,EAAM,SAAA,EAAW,CAAA,GAClC,IAAA;AAAA,IAEH,2BACCD,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAW,EAAA;AAAA,UACT,iCAAA;AAAA,UACA,QAAA,CAAS,eAAA,CAAgB,MAAA,GAAS,CAAA,GAAI,YAAA,GAAe;AAAA,SACvD;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,oBAAA;AAAA,gBACN,OAAO,QAAA,CAAS,EAAA;AAAA,gBAChB,KAAA,EAAM,mBAAA;AAAA,gBACN,WAAA,EAAY,aAAA;AAAA,gBACZ,IAAA,EAAI,IAAA;AAAA,gBACJ,QAAA,EAAU,MAAA;AAAA,gBACV,SAAA,EAAW,SAAS,EAAA,KAAO,OAAA;AAAA,gBAC3B,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,kBAAA,KAAA,CAAM,EAAE,GAAG,QAAA,EAAU,IAAI,KAAA,EAAM,EAAG,SAAS,EAAE,CAAA;AAAA,gBAC/C;AAAA;AAAA,aACF;AAAA,4BACAA,GAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,kBAAA;AAAA,gBACN,OAAO,QAAA,CAAS,IAAA;AAAA,gBAChB,KAAA,EAAO,CAAA,YAAA,EAAe,QAAA,CAAS,EAAE,CAAA,CAAA;AAAA,gBACjC,aAAa,QAAA,CAAS,EAAA;AAAA,gBACtB,QAAA,EAAU,MAAA;AAAA,gBACV,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,kBAAA,KAAA,CAAM,EAAE,GAAG,QAAA,EAAU,IAAA,EAAM,KAAA,IAAS,MAAM,CAAA;AAAA,gBAC5C;AAAA;AAAA;AACF,WAAA,EACF,CAAA;AAAA,0BAEAA,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,YAAA;AAAA,cACN,KAAA,EAAO,SAAS,WAAA,IAAe,mBAAA;AAAA,cAC/B,KAAA,EAAM,mBAAA;AAAA,cACN,QAAA,EAAU,MAAA;AAAA,cACV,OAAA,EAAS;AAAA,gBACP;AAAA,kBACE,KAAA,EAAO,mBAAA;AAAA,kBACP,KAAA,EAAO;AAAA,iBACT;AAAA,gBACA,GAAG,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,kBAC5B,OAAO,KAAA,CAAM,EAAA;AAAA,kBACb,KAAA,EAAO,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM;AAAA,iBAC7B,CAAE;AAAA,eACJ;AAAA,cACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,gBAAA,KAAA,CAAM;AAAA,kBACJ,GAAG,QAAA;AAAA,kBACH,WAAA,EAAa,KAAA,KAAU,mBAAA,GAAsB,IAAA,GAAO;AAAA,iBACrD,CAAA;AAAA,cACH;AAAA;AAAA,WACF;AAAA,0BAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,eAAA;AAAA,gBACN,OAAO,QAAA,CAAS,MAAA;AAAA,gBAChB,KAAA,EAAM,sBAAA;AAAA,gBACN,WAAA,EAAY,uCAAA;AAAA,gBACZ,IAAA,EAAI,IAAA;AAAA,gBACJ,QAAA,EAAU,MAAA;AAAA,gBACV,SAAA,EAAW,QAAA,CAAS,EAAA,KAAO,OAAA,IAAW,CAAC,QAAA,CAAS,MAAA;AAAA,gBAChD,IAAA,EAAK,4DAAA;AAAA,gBACL,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,kBAAA,KAAA,CAAM,EAAE,GAAG,QAAA,EAAU,MAAA,EAAQ,KAAA,IAAS,MAAM,CAAA;AAAA,gBAC9C;AAAA;AAAA,aACF;AAAA,YACC,WAAA,KAAgB,IAAA,mBACfA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,wBAAA,EACV,QAAA,EAAA,CAAA,uBAAA,EAA0B,WAAW,CAAA,+BAAA,CAAA,EACxC,CAAA,GACE,IAAA;AAAA,YACH,MAAA,KAAW,uBACVA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAgC,sCAE7C,CAAA,GACE,IAAA;AAAA,YACH,UAAU,MAAA,CAAO,MAAA,GAAS,oBACzBD,IAAAA,CAAAe,UAAA,EACE,QAAA,EAAA;AAAA,8BAAAd,GAAAA;AAAA,gBAAC,EAAA,CAAG,SAAA;AAAA,gBAAH;AAAA,kBACC,KAAA,EAAO,WAAA;AAAA,kBACP,SAAA,EAAU,yBAAA;AAAA,kBACV,WAAA,EAAY,yBAAA;AAAA,kBACZ,QAAA,EAAU;AAAA;AAAA,eACZ;AAAA,8BACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CACZ,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,KAAA,KAAU;AAC7B,gBAAA,MAAM,SAAA,GAAY,SAAA,CAAU,KAAW,CAAA;AACvC,gBAAA,uBACED,IAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBAEC,IAAA,EAAK,QAAA;AAAA,oBACL,QAAA,EAAU,MAAA;AAAA,oBACV,SAAA,EAAW,EAAA;AAAA,sBACT,uFAAA;AAAA,sBACA,SAAA,KAAc,QAAA,CAAS,MAAA,GACnB,sBAAA,GACA;AAAA,qBACN;AAAA,oBACA,SAAS,MAAM;AACb,sBAAA,KAAA,CAAM;AAAA,wBACJ,GAAG,QAAA;AAAA,wBACH,MAAA,EAAQ,SAAA;AAAA,wBACR,UAAA,EACE,KAAA,CAAM,SAAA,KAAc,MAAA,GAAS,MAAA,GAAS;AAAA,uBACzC,CAAA;AAAA,oBACH,CAAA;AAAA,oBAEA,QAAA,EAAA;AAAA,sCAAAC,GAAAA,CAAC,UAAM,QAAA,EAAA,CAAA,EAAG,KAAA,CAAM,UAAU,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAA,CAAA,EAAG,CAAA;AAAA,sCAChDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACb,gBAAM,SAAA,EACT;AAAA;AAAA,mBAAA;AAAA,kBArBK,CAAA,EAAG,KAAA,CAAM,UAAU,CAAA,CAAA,EAAI,MAAM,SAAS,CAAA;AAAA,iBAsB7C;AAAA,cAEJ,CAAC,CAAA,EACH;AAAA,aAAA,EACF,CAAA,GACE;AAAA,WAAA,EACN,CAAA;AAAA,0BAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,uCAAA;AAAA,gBACN,KAAA,EAAO,SAAS,WAAA,IAAe,SAAA;AAAA,gBAC/B,KAAA,EAAM,0BAAA;AAAA,gBACN,QAAA,EAAU,MAAA;AAAA,gBACV,OAAA,EAAS;AAAA,kBACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,kBACrC,GAAA,CAAI,WAAA,CAAY,MAAA,GAAS,CAAA,GACrB,WAAA,CAAY,GAAA,CAAI,CAAC,MAAA,KAAW,MAAA,CAAO,WAAA,EAAa,CAAA,GAChD,QAAA,CAAS,WAAA,GACP,CAAC,QAAA,CAAS,WAAW,CAAA,GACrB,EAAC,EACL,GAAA,CAAI,CAAC,MAAA,MAAY,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,CAAE;AAAA,iBACtD;AAAA,gBACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,kBAAA,KAAA,CAAM;AAAA,oBACJ,GAAG,QAAA;AAAA,oBACH,WAAA,EAAa,KAAA,KAAU,SAAA,GAAY,IAAA,GAAO;AAAA,mBAC3C,CAAA;AAAA,gBACH;AAAA;AAAA,aACF;AAAA,YACC,CAAC,SAAS,WAAA,mBACTA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0BAAA,EAA2B,QAAA,EAAA,kHAAA,EAGxC,CAAA,GACE;AAAA,WAAA,EACN,CAAA;AAAA,UAEC,aAAa,MAAA,GAAS,CAAA,mBACrBD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,wCAAA,EAE/C,CAAA;AAAA,4BACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0EACZ,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,MAAA,KAAW;AAC5B,cAAA,MAAM,EAAA,GAAK,SAAS,UAAA,CAAW,IAAA;AAAA,gBAC7B,CAAC,SAAA,KAAA,CACE,SAAA,CAAU,MAAA,IAAU,SAAA,CAAU,IAAI,WAAA,EAAY,KAC/C,MAAA,CAAO,IAAA,CAAK,WAAA;AAAY,eAC5B;AACA,cAAA,uBACEA,GAAAA;AAAA,gBAAC,EAAA,CAAG,QAAA;AAAA,gBAAH;AAAA,kBAEC,OAAA,EAAS,EAAA;AAAA,kBACT,QAAA,EAAU,MAAA;AAAA,kBACV,KAAA,kBACED,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iCAAA,EACd,QAAA,EAAA;AAAA,oCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,MAAA,CAAO,IAAA,CAAK,aAAY,EAAE,CAAA;AAAA,oCACjCA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBACb,QAAA,EAAA,gBAAA,CAAiB,MAAA,CAAO,QAAQ,CAAA,EACnC;AAAA,mBAAA,EACF,CAAA;AAAA,kBAEF,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,oBAAA,eAAA,CAAgB,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,QAAA,EAAU,OAAO,CAAA;AAAA,kBACvD;AAAA,iBAAA;AAAA,gBAbK,MAAA,CAAO;AAAA,eAcd;AAAA,YAEJ,CAAC,CAAA,EACH;AAAA,WAAA,EACF,CAAA,GACE,IAAA;AAAA,0BAEJD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,8BACtDA,GAAAA;AAAA,gBAAC,EAAA,CAAG,MAAA;AAAA,gBAAH;AAAA,kBACC,IAAA,EAAK,IAAA;AAAA,kBACL,OAAA,EAAQ,WAAA;AAAA,kBACR,QAAA,EAAU,MAAA;AAAA,kBACV,SAAS,MAAM;AACb,oBAAA,KAAA,CAAM;AAAA,sBACJ,GAAG,QAAA;AAAA,sBACH,OAAA,EAAS;AAAA,wBACP,GAAG,QAAA,CAAS,OAAA;AAAA,wBACZ;AAAA,0BACE,EAAA,EAAI,CAAA,OAAA,EAAU,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAC,CAAA,CAAA;AAAA,0BACzC,KAAA,EAAO,IAAA;AAAA,0BACP,UAAA,EAAY,qBAAA;AAAA,4BACV,KAAA;AAAA,4BACA,WAAA,CAAY,CAAC,CAAA,IAAK;AAAA,2BACpB;AAAA,0BACA,IAAA,EAAM;AAAA;AACR;AACF,qBACD,CAAA;AAAA,kBACH,CAAA;AAAA,kBACD,QAAA,EAAA;AAAA;AAAA;AAED,aAAA,EACF,CAAA;AAAA,YACC,SAAS,OAAA,CAAQ,MAAA,KAAW,CAAA,mBAC3BA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,2FAAA,EAG7C,IAEA,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAC,MAAA,EAAQ,0BAC5BA,GAAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBAEC,MAAA;AAAA,gBACA,OAAA,EAAS,WAAA;AAAA,gBACT,QAAA,EAAU,MAAA;AAAA,gBACV,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,kBAAA,KAAA,CAAM;AAAA,oBACJ,GAAG,QAAA;AAAA,oBACH,OAAA,EAAS,SAAS,OAAA,CAAQ,GAAA;AAAA,sBAAI,CAAC,KAAA,EAAO,CAAA,KACpC,CAAA,KAAM,QAAQ,IAAA,GAAO;AAAA;AACvB,mBACD,CAAA;AAAA,gBACH,CAAA;AAAA,gBACA,UAAU,MAAM;AACd,kBAAA,KAAA,CAAM;AAAA,oBACJ,GAAG,QAAA;AAAA,oBACH,OAAA,EAAS,SAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,KAAK;AAAA,mBACvD,CAAA;AAAA,gBACH;AAAA,eAAA;AAAA,cAjBK;AAAA,aAmBR;AAAA,WAAA,EAEL,CAAA;AAAA,0BAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA;AAAA,cAAC,EAAA,CAAG,QAAA;AAAA,cAAH;AAAA,gBACC,OAAA,EAAS,SAAS,MAAA,KAAW,IAAA;AAAA,gBAC7B,QAAA,EAAU,MAAA;AAAA,gBACV,KAAA,EAAM,wDAAA;AAAA,gBACN,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,kBAAA,KAAA,CAAM;AAAA,oBACJ,GAAG,QAAA;AAAA,oBACH,QAAQ,OAAA,GACJ;AAAA,sBACE,MAAA,EAAQ,IAAA;AAAA,sBACR,KAAA,EAAO,SAAS,UAAA,CAAW,GAAA;AAAA,wBACzB,CAAC,cAAc,SAAA,CAAU;AAAA,uBAC3B;AAAA,sBACA,SAAS,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAC,MAAA,KAAW,OAAO,EAAE;AAAA,qBACrD,GACA;AAAA,mBACL,CAAA;AAAA,gBACH;AAAA;AAAA,aACF;AAAA,YACC,SAAS,MAAA,mBACRD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,cAAA;AAAA,kBACN,KAAA,EAAO,SAAS,MAAA,CAAO,MAAA;AAAA,kBACvB,KAAA,EAAM,uBAAA;AAAA,kBACN,WAAA,EAAY,sCAAA;AAAA,kBACZ,IAAA,EAAI,IAAA;AAAA,kBACJ,QAAA,EAAU,MAAA;AAAA,kBACV,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,oBAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,oBAAA,IAAI,CAAC,MAAA,EAAQ;AACb,oBAAA,KAAA,CAAM;AAAA,sBACJ,GAAG,QAAA;AAAA,sBACH,QAAQ,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,SAAS,IAAA;AAAK,qBAC5C,CAAA;AAAA,kBACH;AAAA;AAAA,eACF;AAAA,8BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EACV,QAAA,EAAA,CAAA,sEAAA,EACC,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,IAAK,MACtC,CAAA,mKAAA,CAAA,EACF,CAAA;AAAA,cACC,aAAA,mBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BACV,QAAA,EAAA,CAAA,2BAAA,EAA8B,QAAA,CAAS,WAAW,CAAA,8FAAA,CAAA,EACrD,CAAA,GACE;AAAA,aAAA,EACN,CAAA,GACE;AAAA,WAAA,EACN,CAAA;AAAA,0BAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA;AAAA,cAAC,EAAA,CAAG,MAAA;AAAA,cAAH;AAAA,gBACC,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAQ,WAAA;AAAA,gBACR,QAAA,EAAU,UAAA,IAAc,CAAC,QAAA,CAAS,MAAA;AAAA,gBAClC,SAAS,MAAM;AACb,kBAAA,KAAK,WAAW,QAAQ,CAAA;AAAA,gBAC1B,CAAA;AAAA,gBAEC,uBAAa,YAAA,GAAe;AAAA;AAAA,aAC/B;AAAA,4BACAA,GAAAA;AAAA,cAAC,EAAA,CAAG,MAAA;AAAA,cAAH;AAAA,gBACC,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAQ,WAAA;AAAA,gBACR,QAAA,EAAU,QAAA;AAAA,gBACV,SAAS,MAAM;AACb,kBAAA,QAAA,CAAS,aAAA,CAAc,QAAA,EAAU,QAAA,CAAS,EAAE,CAAC,CAAA;AAC7C,kBAAA,aAAA,CAAc,IAAI,CAAA;AAClB,kBAAA,UAAA,CAAW,IAAI,CAAA;AAAA,gBACjB,CAAA;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAgC,QAAA,EAAA,6DAAA,EAEhD;AAAA,WAAA,EACF,CAAA;AAAA,UAEC,YAAA,KAAiB,uBAChBA,GAAAA,CAAC,OAAE,SAAA,EAAU,0BAAA,EAA4B,wBAAa,CAAA,GACpD,IAAA;AAAA,UAEH,OAAA,mBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACZ,QAAA,EAAA;AAAA,cAAA,CAAA,EAAG,QAAQ,QAAQ,CAAA,KAAA,CAAA;AAAA,cACnB,QAAQ,kBAAA,GACL,CAAA,YAAA,EAAe,OAAA,CAAQ,kBAAA,CAAmB,MAAM,CAAA,UAAA,CAAA,GAChD;AAAA,aAAA,EACN,CAAA;AAAA,4BACAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CACb,QAAA,kBAAAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,0BAAA,EACf,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,WAAM,SAAA,EAAU,UAAA,EACf,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EACE,kBAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACpBA,IAAC,IAAA,EAAA,EAAgB,SAAA,EAAU,yBACxB,QAAA,EAAA,MAAA,EAAA,EADM,MAET,CACD,CAAA,EACH,CAAA,EACF,CAAA;AAAA,8BACAA,GAAAA,CAAC,OAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,KAAK,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,qBACtBA,GAAAA,CAAC,IAAA,EAAA,EAAe,SAAA,EAAU,UAAA,EACvB,kBAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACpBA,GAAAA,CAAC,IAAA,EAAA,EAAgB,SAAA,EAAU,WAAA,EACxB,iBAAO,GAAA,CAAI,MAAM,CAAA,IAAK,EAAE,KADlB,MAET,CACD,CAAA,EAAA,EALM,KAMT,CACD,CAAA,EACH;AAAA,aAAA,EACF,CAAA,EACF,CAAA;AAAA,YACC,OAAA,CAAQ,GAAA,KAAQ,IAAA,mBACfA,GAAAA,CAAC,SAAI,SAAA,EAAU,sEAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,EACX,CAAA,GACE;AAAA,WAAA,EACN,CAAA,GACE,IAAA;AAAA,0BAEJA,IAAC,gBAAA,EAAA,EAAiB,QAAA,EAAU,gBAAgB,QAAA,EAAU,QAAA,CAAS,EAAE,CAAA,EAAG;AAAA;AAAA,OAAA;AAAA,MAjX/D,QAAA,CAAS;AAAA,KAkXhB,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AC52BO,SAAS,cAAA,CAAe;AAAA,EAC7B,WAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAiB,EAAC;AAAA,EAClB,cAAc,EAAC;AAAA,EACf,IAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAO,QAAA,KAAa,kBAAA,EAAmB;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIG,SAAS,WAAW,CAAA;AACtD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,aAAa,CAAA;AAC5D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GACxBA,SAAkC,cAAc,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAA2B,WAAW,CAAA;AAChE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAA6B,IAAI,CAAA;AAC7D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE5C,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,SAAA,CACG,YAAA,CAAa,EAAE,WAAA,EAAa,SAAA,EAAW,SAAS,CAAA,CAChD,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,SAAA,CAAU;AAAA,QACR,MAAM,IAAA,CAAK,SAAA;AAAA,QACX,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,IAAA,EAAM,KAAK,IAAA,IAAQ;AAAA,OACpB,CAAA;AACD,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAW,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,IACvD,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,OAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAC5C,CAAA;AAAA,IACH,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,IAClC,CAAC,CAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EAEF,GAAG,CAAC,IAAA,EAAM,WAAW,OAAA,EAAS,SAAA,EAAW,QAAQ,CAAC,CAAA;AAElD,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACvC,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,MAAM,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AACzC,IAAA,YAAA,CAAa,SAAS,EAAE,CAAA;AACxB,IAAA,cAAA,CAAe,SAAS,IAAI,CAAA;AAC5B,IAAA,UAAA,CAAW,SAAS,OAAO,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAkB;AACjC,IAAA,MAAM,MAAA,GAAS,MAAM,KAAK,CAAA;AAC1B,IAAA,IAAI,WAAW,MAAA,EAAW;AAC1B,IAAA,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,KAAK,CAAC,CAAA;AAC9B,IAAA,YAAA,CAAa,OAAO,EAAE,CAAA;AACtB,IAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAC1B,IAAA,UAAA,CAAW,OAAO,OAAO,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoBF,WAAAA;AAAA,IACxB,CAAC,aAAgC,OAAA,KAAsC;AACrE,MAAA,MAAM,MAAA,GAAS,wBAAA,CAAyB,WAAA,EAAa,OAAA,EAAS,OAAO,CAAA;AACrE,MAAA,IAAI,WAAA,CAAY,SAAS,YAAA,EAAc;AACrC,QAAA,UAAA,CAAW,EAAE,GAAG,OAAA,EAAS,GAAG,QAAQ,CAAA;AACpC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,gBAAyC,EAAC;AAChD,MAAA,IAAI,YAAY,YAAA,KAAiB,IAAA;AAC/B,QAAA,MAAA,CAAO,MAAA,CAAO,eAAe,OAAO,CAAA;AACtC,MAAA,MAAA,CAAO,MAAA,CAAO,eAAe,MAAM,CAAA;AAEnC,MAAA,IAAI,WAAA,CAAY,IAAA,KAAS,UAAA,IAAc,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACpE,QAAA,KAAA,CAAM,QAAA,GAAW,YAAY,MAAA,EAAQ;AAAA,UACnC,MAAA,EAAQ,YAAY,OAAA,KAAY,KAAA;AAAA,UAChC,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,WAAA,CAAY,YAAY,OAAA,EAAS;AACnC,QAAA,QAAA,CAAS,CAAC,GAAG,KAAA,EAAO,EAAE,EAAA,EAAI,WAAW,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,CAAC,CAAA;AAClE,QAAA,YAAA,CAAa,YAAY,MAAM,CAAA;AAC/B,QAAA,UAAA,CAAW,aAAa,CAAA;AACxB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,aAAA,CAAc,WAAA,CAAY,MAAA,EAAQ,eAAe,KAAA,EAAO;AAAA,QAClE,kBAAkB,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,aAAa,OAAA,EAAQ;AAAA,QAC9D,MAAA,EAAQ,YAAY,OAAA,KAAY;AAAA,OACjC,CAAA;AACD,MAAA,KAAA,CAAM,WAAW,GAAA,EAAK,EAAE,QAAQ,WAAA,CAAY,OAAA,KAAY,OAAO,CAAA;AAAA,IACjE,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,WAAW,WAAW;AAAA,GAChD;AAEA,EAAA,uBACEF,GAAAA;AAAA,IAAC,EAAA,CAAG,KAAA;AAAA,IAAH;AAAA,MACC,IAAA;AAAA,MACA,YAAA;AAAA,MACA,IAAA,EAAK,IAAA;AAAA,MACL,KAAA,EAAO,WAAA;AAAA,MACP,MAAA,kBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,EAAA,CAAG,MAAA,EAAH,EAAU,OAAA,EAAQ,OAAA,EAAQ,MAAK,IAAA,EAAK,SAAA,EAAU,QAAO,OAAA,EAAS,IAAA,EAC7D,0BAAAA,GAAAA,CAAC,KAAA,CAAM,aAAN,EAAkB,SAAA,EAAU,WAAU,CAAA,EACzC,CAAA;AAAA,QACC,KAAA,CAAM,MAAA,GAAS,CAAA,oBACdA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAW,YAAA;AAAA,YACX,SAAA,EAAU,iCAAA;AAAA,YAET,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,IAAA,EAAM,0BAChBD,IAAAA,CAAC,MAAA,EAAA,EAAmB,SAAA,EAAU,yBAAA,EAC5B,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,EAAA,CAAG,MAAA;AAAA,gBAAH;AAAA,kBACC,OAAA,EAAQ,MAAA;AAAA,kBACR,IAAA,EAAK,IAAA;AAAA,kBACL,SAAS,MAAM;AACb,oBAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,kBACf,CAAA;AAAA,kBAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,eACR;AAAA,8BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,GAAA,EAAC;AAAA,aAAA,EAAA,EAVhC,IAAA,CAAK,EAWhB,CACD;AAAA;AAAA,SACH;AAAA,wBAEFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAY,QAAA,EAAA,WAAA,EAAY;AAAA,OAAA,EAC1C,CAAA;AAAA,MAGF,QAAA,kBAAAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,kCAAA;AAAA,UACV,iBAAA,EAAe,IAAA;AAAA,UAGf,oBAAA,EAAoB,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,UAEzC,QAAA,EAAA,MAAA,KAAW,IAAA,mBACVA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gDAAA,EACV,QAAA,EAAA,OAAA,GAAU,mBAAA,GAAsB,iBAAA,EACnC,CAAA,mBAEAA,GAAAA;AAAA,YAAC,wBAAA;AAAA,YAAA;AAAA,cACC,OAAA;AAAA,cACA,SAAA,EAAW,CAAC,EAAA,EAAI,KAAA,KAAU;AACxB,gBAAA,UAAA,CAAW,EAAE,GAAG,OAAA,EAAS,CAAC,EAAE,GAAG,OAAO,CAAA;AAAA,cACxC,CAAA;AAAA,cAEA,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,eAAA;AAAA,gBAAA;AAAA,kBACC,WAAW,MAAA,CAAO,IAAA;AAAA,kBAClB,SAAS,MAAA,CAAO,OAAA;AAAA,kBAChB,SAAS,MAAA,CAAO,OAAA;AAAA,kBAChB,OAAA;AAAA,kBACA,aAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AACF;AAAA;AAEJ;AAAA,GACF;AAEJ;AC7MA,SAAS,SAAS,KAAA,EAAyB;AACzC,EAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAI,OAAO,KAAA;AAClE,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,MAAM,MAAA,GAAS,CAAA;AAChD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA;AAAA,MAC1B,CAAC,KAAA,KAAU,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,QAAQ,KAAA,KAAU;AAAA,KAChE;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,kBAAA,CAAmB;AAAA,EACjC,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,YAAA,KAAiB,mBAAA,EAAoB;AAC9D,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,QAAA,CAAS,KAAK,CAAC,CAAA;AAE5E,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,6DAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,uBAAqB,MAAA,CAAO,MAAA;AAAA,MAE3B,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,MAAA,KAAW,CAAA,mBACjBC,GAAAA,CAAC,UAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,oBAAA,EAAkB,CAAA,GAE1D,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,IAAI,KAAK,CAAA,qBACpBA,GAAAA,CAAC,EAAA,CAAG,KAAA,EAAH,EAAkB,IAAA,EAAK,QAAO,KAAA,EAAO,EAAA,EACnC,QAAA,EAAA,MAAA,CAAO,EAAE,CAAA,IAAK,MAAA,CAAO,KAAK,CAAA,EAAA,EADd,EAEf,CACD,CAAA;AAAA,QAEF,MAAA,CAAO,MAAA,GAAS,CAAA,oBACfA,IAAC,EAAA,CAAG,MAAA,EAAH,EAAU,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAQ,OAAA,EAAS,cAAc,QAAA,EAAA,OAAA,EAE5D,CAAA;AAAA,QAED,SAAA,KAAc,0BACbA,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAQ,OAAA;AAAA,YACR,SAAA,EAAU,mBAAA;AAAA,YACV,UAAU,UAAA,KAAe,IAAA;AAAA,YACzB,OAAA,EAAS,SAAA;AAAA,YAET,QAAA,kBAAAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EACd,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,KAAA,CAAM,OAAA;AAAA,gBAAN;AAAA,kBACC,SAAA,EAAW,EAAA;AAAA,oBACT,aAAA;AAAA,oBACA,eAAe,IAAA,IAAQ;AAAA;AACzB;AAAA,eACF;AAAA,cAAE;AAAA,aAAA,EAEJ;AAAA;AAAA;AACF;AAAA;AAAA,GAEJ;AAEJ;AC3CA,SAAS,cAAA,CAAe,SAAiB,MAAA,EAA8B;AACrE,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,MAAA;AAAA,IACL,KAAK,YAAA;AACH,MAAA,OAAO,OAAO,QAAA,IAAY,CAAA;AAAA,IAC5B,KAAK,OAAA;AACH,MAAA,OAAO,OAAO,SAAA,IAAa,CAAA;AAAA,IAC7B,KAAK,QAAA;AAAA,IACL,KAAK,aAAA;AACH,MAAA,OAAO,OAAO,UAAA,IAAc,CAAA;AAAA,IAC9B;AACE,MAAA,OAAO,OAAO,UAAA,IAAc,CAAA;AAAA;AAElC;AAEO,SAAS,oBAAA,CAAqB;AAAA,EACnC,OAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAU,EAAC;AAAA,EACX,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,cAAA,KAAmB,mBAAA,EAAoB;AACnE,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,KAAA;AACpC,EAAA,MAAM,WAAA,GACJ,MAAA,CAAO,WAAA,KAAgB,KAAA,IAAS,OAAO,eAAA,KAAoB,IAAA;AAC7D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,IAAIG,QAAAA,CAAS,MAAA,CAAO,qBAAqB,IAAI,CAAA;AAE3E,EAAA,MAAM,YAAA,GACJ,WAAA,KAAgB,MAAA,GACZ,QAAA,KAAa,QACb,WAAA,KAAgB,YAAA;AACtB,EAAA,MAAM,MAAA,GAAuB,MAAA,CAAO,MAAA,IAAU,EAAC;AAC/C,EAAA,MAAM,cAAA,GAAiB,OAAO,cAAA,IAAkB,GAAA;AAChD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,IAAO,MAAA,CAAO,GAAA,IAAO,EAAA;AACxC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA,IAAW,EAAA;AAEpD,EAAA,MAAM,YAA2B,YAAA,GAC7B;AAAA,IACE,OAAA,EAAS,MAAA;AAAA,IACT,mBAAA,EACE,MAAA,CAAO,OAAA,KAAY,MAAA,IAAa,MAAA,CAAO,OAAA,KAAY,IAAA,GAC/C,CAAA,wBAAA,EAA2B,cAAc,CAAA,SAAA,CAAA,GACzC,CAAA,OAAA,EAAU,MAAA,CAAO,OAAO,CAAA,iBAAA,CAAA;AAAA,IAC9B;AAAA,MAEF,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,UAAU,GAAA,EAAI;AAEpD,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEjC,EAAA,uBACEJ,IAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAW,mBAAA;AAAA,MACX,mBAAA,EAAmB,QAAA;AAAA,MACnB,SAAA,EAAW,EAAA;AAAA,QACT,mDAAA;AAAA,QACA,CAAC,YAAA,IAAgB,mCAAA;AAAA,QACjB;AAAA,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,GAAG,QAAA,CAAS;AAAA,UACV,OAAA;AAAA,UACA,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,KAAA,EAAO,YAAA,GAAe,MAAA,GAAa,MAAA,CAAO,KAAA,IAAS;AAAA,SACpD,CAAA;AAAA,QACD,GAAG;AAAA,OACL;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,WAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oGAAA,EACd,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,KAAA,CAAM,MAAA,EAAN,EAAa,WAAU,aAAA,EAAc,CAAA;AAAA,YAAE;AAAA,WAAA,EAE1C,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,EAAA,CAAG,MAAA;AAAA,YAAH;AAAA,cACC,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAQ,OAAA;AAAA,cACR,SAAA,EAAW,YAAY,cAAA,GAAiB,cAAA;AAAA,cACxC,SAAS,MAAM;AACb,gBAAA,YAAA,CAAa,CAAC,SAAS,CAAA;AAAA,cACzB,CAAA;AAAA,cAEC,sBAAY,MAAA,GAAS;AAAA;AAAA;AACxB,SAAA,EACF,CAAA;AAAA,QAED,CAAC,SAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,SAAA,EACT,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,UAAA,MAAM,QAAQ,gBAAA,CAAiB,MAAA,EAAQ,QAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAC,CAAA;AAClE,UAAA,uBACEA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cAEC,OACE,YAAA,GACI;AAAA,gBACE,YAAY,CAAA,KAAA,EAAQ,cAAA,CAAe,KAAA,CAAM,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA,eAC3D,GACA,MAAA;AAAA,cAGN,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,YAAA;AAAA,gBAAA;AAAA,kBACC,MAAA;AAAA,kBACC,GAAI,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,KAAM,MAAA,GACjC,EAAC,GACD,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EAAE;AAAA,kBAC1C,KAAA,EAAO,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,kBACjC,QAAA,EAAU,CAAC,EAAA,EAAI,KAAA,EAAO,KAAA,KAAU;AAC9B,oBAAA,SAAA,CAAU,IAAI,KAAK,CAAA;AACnB,oBAAA,cAAA,CAAe,IAAI,KAAK,CAAA;AAAA,kBAC1B,CAAA;AAAA,kBACA,OAAA,EAAS;AAAA;AAAA;AACX,aAAA;AAAA,YApBK,OAAO,QAAA,CAAS;AAAA,WAqBvB;AAAA,QAEJ,CAAC,CAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ;ACzHO,IAAM,iBAAA,GACX;AAAA,EACE,EAAE,KAAA,EAAO,cAAA,EAAgB,IAAA,EAAM,CAAA,EAAE;AAAA,EACjC,EAAE,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,EAAA,EAAG;AAAA,EAC5B,EAAE,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,EAAA,EAAG;AAAA,EAC5B,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,EAAA,EAAG;AAAA,EAC1B,EAAE,KAAA,EAAO,YAAA,EAAc,IAAA,EAAM,EAAA,EAAG;AAAA,EAChC,EAAE,KAAA,EAAO,YAAA,EAAc,IAAA,EAAM,EAAA;AAC/B;AAEF,IAAM,iBAAA,GAAqE;AAAA,EACzE,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAS;AAAA,EACjC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,EACrC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAC1B,CAAA;AAEA,IAAM,aAAA,GAAgB,aAAA;AAEtB,SAAS,KAAA,CAAM;AAAA,EACb,KAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAC/D,QAAA;AAAA,IACA,IAAA,KAAS,SAAY,IAAA,mBACpBA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,IAAA,EAAK;AAAA,GAAA,EAEvD,CAAA;AAEJ;AAEA,SAAS,oBAAoB,GAAA,EAAiC;AAC5D,EAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,EAAA,OAAO,MAAA,CAAO,SAAS,KAAK,CAAA,IAAK,QAAQ,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,GAAI,MAAA;AACnE;AASO,SAAS,iBAAA,CAAkB;AAAA,EAChC,SAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,EAAE,EAAA,EAAG,GAAI,YAAA,EAAa;AAC5B,EAAA,MAAM,UAAA,GAAa,kBAAkB,SAAS,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,EAAE,GAAG,mBAAA,EAAqB,GAAG,SAAA,CAAU,IAAA,CAAK,QAAQ,IAAA,EAAK;AAC3E,EAAA,MAAM,OAAO,EAAE,GAAG,SAAA,EAAW,GAAG,MAAM,UAAA,EAAW;AACjD,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,aAAA,CAAc,UAAU,CAAA;AAC/C,EAAA,MAAM,OAAO,QAAA,EAAU,IAAA,IAAQ,UAAA,CAAW,UAAU,EAAE,IAAA,IAAQ,EAAA;AAC9D,EAAA,MAAM,YAAY,QAAA,EAAU,SAAA;AAC5B,EAAA,MAAM,WAAA,GACJ,KAAA,CAAM,UAAA,CAAW,WAAA,KAAgB,MAAA,GAC7B,UAAU,IAAA,CAAK,MAAA,EAAQ,WAAA,GACvB,KAAA,CAAM,UAAA,CAAW,WAAA;AACvB,EAAA,MAAM,cAAA,GAAiB,KAAK,cAAA,IAAkB,MAAA;AAE9C,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAiD;AACpE,IAAA,KAAA,CAAM,eAAA,CAAgB,YAAY,KAAK,CAAA;AAAA,EACzC,CAAA;AAEA,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,aAAa,YAAA,EAC3B,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,gDAAA,EAE7C,CAAA;AAAA,IACC,UAAA,KAAe,MAAA,GAAY,IAAA,mBAC1BA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAK,2FAAA;AAAA,QAEL,QAAA,kBAAAA,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,SAAA,EAAU,YAAA;AAAA,YACV,OAAO,WAAA,IAAe,aAAA;AAAA,YACtB,OAAA,EAAS;AAAA,cACP,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,wBAAA,EAAyB;AAAA,cACxD,GAAG,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,gBAC5B,OAAO,KAAA,CAAM,EAAA;AAAA,gBACb,KAAA,EACE,KAAA,CAAM,MAAA,KAAW,MAAA,GACb,KAAA,CAAM,IAAA,GACN,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,MAAM,CAAA,CAAA;AAAA,eACtC,CAAE;AAAA,aACJ;AAAA,YACA,QAAA,EAAU,CAAC,KAAA,KACT,KAAA,CAAM,aAAA,CAAc;AAAA,cAClB,WAAA,EAAa,KAAA,KAAU,aAAA,GAAgB,IAAA,GAAO;AAAA,aAC/C;AAAA;AAAA;AAEL;AAAA,KACF;AAAA,oBAEFA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,eAAe,UAAU,CAAA,CAAA,CAAA;AAAA,QAChC,IAAA,EAAK,oCAAA;AAAA,QAEL,QAAA,kBAAAA,GAAAA;AAAA,UAAC,EAAA,CAAG,SAAA;AAAA,UAAH;AAAA,YACC,SAAA,EAAU,YAAA;AAAA,YACV,IAAA,EAAK,QAAA;AAAA,YACL,WAAA,EAAY,MAAA;AAAA,YACZ,KAAA,EAAO,SAAA,KAAc,MAAA,GAAY,EAAA,GAAK,OAAO,SAAS,CAAA;AAAA,YACtD,QAAA,EAAU,CAAC,GAAA,KAAQ;AACjB,cAAA,MAAM,KAAA,GAAQ,oBAAoB,GAAG,CAAA;AACrC,cAAA,WAAA,CAAY,UAAU,MAAA,GAAY,KAAK,EAAE,SAAA,EAAW,OAAO,CAAA;AAAA,YAC7D;AAAA;AAAA;AACF;AAAA,KACF;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAM,OAAO,CAAA,SAAA,EAAY,UAAU,KAClC,QAAA,kBAAAA,GAAAA;AAAA,MAAC,EAAA,CAAG,SAAA;AAAA,MAAH;AAAA,QACC,SAAA,EAAU,SAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,OAAO,IAAI,CAAA;AAAA,QAClB,QAAA,EAAU,CAAC,GAAA,KAAQ;AACjB,UAAA,MAAM,KAAA,GAAQ,oBAAoB,GAAG,CAAA;AACrC,UAAA,WAAA,CAAY,UAAU,MAAA,GAAY,KAAK,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA,QACxD;AAAA;AAAA,KACF,EACF,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,cAAc,UAAU,CAAA,CAAA,CAAA;AAAA,QAC/B,IAAA,EAAK,uEAAA;AAAA,QAEL,QAAA,kBAAAA,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,SAAA,EAAU,WAAA;AAAA,YACV,KAAA,EAAO,OAAO,IAAI,CAAA;AAAA,YAClB,OAAA,EAAS;AAAA,cACP,GAAG,iBAAA,CAAkB,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,gBACpC,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,gBACzB,OAAO,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,EAAA,EAAK,OAAO,IAAI,CAAA,CAAA;AAAA,eACxC,CAAE,CAAA;AAAA,cACF,GAAI,kBAAkB,IAAA,CAAK,CAAC,WAAW,MAAA,CAAO,IAAA,KAAS,IAAI,CAAA,GACvD,KACA,CAAC,EAAE,OAAO,MAAA,CAAO,IAAI,GAAG,KAAA,EAAO,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA,CAAA,EAAK;AAAA,aACzD;AAAA,YACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,cAAA,MAAM,IAAA,GAAO,oBAAoB,KAAK,CAAA;AACtC,cAAA,IAAI,SAAS,MAAA,EAAW,WAAA,CAAY,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,YACpD;AAAA;AAAA;AACF;AAAA,KACF;AAAA,oBACAA,GAAAA;AAAA,MAAC,EAAA,CAAG,QAAA;AAAA,MAAH;AAAA,QACC,SAAA,EAAU,mCAAA;AAAA,QACV,OAAA,EAAS,KAAK,SAAA,IAAa,IAAA;AAAA,QAC3B,KAAA,EAAM,cAAA;AAAA,QACN,QAAA,EAAU,CAAC,OAAA,KAAY,KAAA,CAAM,cAAc,EAAE,SAAA,EAAW,SAAS;AAAA;AAAA,KACnE;AAAA,oBACAA,GAAAA;AAAA,MAAC,EAAA,CAAG,QAAA;AAAA,MAAH;AAAA,QACC,SAAA,EAAU,mCAAA;AAAA,QACV,OAAA,EAAS,KAAK,gBAAA,IAAoB,KAAA;AAAA,QAClC,KAAA,EAAM,mBAAA;AAAA,QACN,QAAA,EAAU,CAAC,OAAA,KACT,KAAA,CAAM,cAAc,EAAE,gBAAA,EAAkB,SAAS;AAAA;AAAA,KAErD;AAAA,oBACAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,kBAAA;AAAA,QACN,IAAA,EAAK,kFAAA;AAAA,QAEL,QAAA,kBAAAA,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,SAAA,EAAU,kBAAA;AAAA,YACV,KAAA,EAAO,cAAA;AAAA,YACP,OAAA,EAAS,kBAAkB,GAAA,CAAI,CAAC,YAAY,EAAE,GAAG,QAAO,CAAE,CAAA;AAAA,YAC1D,QAAA,EAAU,CAAC,KAAA,KACT,KAAA,CAAM,aAAA,CAAc;AAAA,cAClB,cAAA,EACE,UAAU,QAAA,IACV,KAAA,KAAU,YACV,KAAA,KAAU,SAAA,IACV,KAAA,KAAU,MAAA,GACN,KAAA,GACA;AAAA,aACP;AAAA;AAAA;AAEL;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AC5MO,SAAS,kBAAA,CAAmB,EAAE,KAAA,EAAM,EAA4B;AACrE,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,uBACED,IAAAA,CAAAe,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAd,GAAAA;AAAA,MAAC,EAAA,CAAG,KAAA;AAAA,MAAH;AAAA,QACC,MAAM,KAAA,CAAM,iBAAA;AAAA,QACZ,IAAA,EAAK,IAAA;AAAA,QACL,KAAA,EAAM,8BAAA;AAAA,QACN,WAAA,EAAY,wFAAA;AAAA,QACZ,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,UAAA,IAAI,CAAC,IAAA,EAAM,KAAA,CAAM,WAAA,EAAY;AAAA,QAC/B,CAAA;AAAA,QACA,MAAA,kBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qCAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,GAAG,MAAA,EAAH,EAAU,SAAQ,OAAA,EAAQ,OAAA,EAAS,KAAA,CAAM,WAAA,EAAa,QAAA,EAAA,cAAA,EAEvD,CAAA;AAAA,0BACAA,GAAAA,CAAC,EAAA,CAAG,MAAA,EAAH,EAAU,SAAQ,WAAA,EAAY,OAAA,EAAS,KAAA,CAAM,cAAA,EAAgB,QAAA,EAAA,kBAAA,EAE9D,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,EAAA,CAAG,MAAA;AAAA,YAAH;AAAA,cACC,OAAA,EAAQ,SAAA;AAAA,cACR,UAAU,KAAA,CAAM,MAAA;AAAA,cAChB,SAAS,KAAA,CAAM,WAAA;AAAA,cAEd,QAAA,EAAA,KAAA,CAAM,SAAS,WAAA,GAAc;AAAA;AAAA;AAChC,SAAA,EACF,CAAA;AAAA,QAGF,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,0FAAA,EAG7C;AAAA;AAAA,KACF;AAAA,oBACAA,GAAAA;AAAA,MAAC,EAAA,CAAG,KAAA;AAAA,MAAH;AAAA,QACC,MAAM,KAAA,CAAM,kBAAA;AAAA,QACZ,IAAA,EAAK,IAAA;AAAA,QACL,KAAA,EAAM,kCAAA;AAAA,QACN,WAAA,EAAY,kIAAA;AAAA,QACZ,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,UAAA,IAAI,CAAC,IAAA,EAAM,KAAA,CAAM,mBAAA,EAAoB;AAAA,QACvC,CAAA;AAAA,QACA,MAAA,kBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qCAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,GAAG,MAAA,EAAH,EAAU,SAAQ,WAAA,EAAY,OAAA,EAAS,KAAA,CAAM,mBAAA,EAAqB,QAAA,EAAA,sBAAA,EAEnE,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,EAAA,CAAG,MAAA;AAAA,YAAH;AAAA,cACC,OAAA,EAAQ,SAAA;AAAA,cACR,UAAU,KAAA,CAAM,MAAA;AAAA,cAChB,SAAS,KAAA,CAAM,sBAAA;AAAA,cAEd,QAAA,EAAA,KAAA,CAAM,SAAS,WAAA,GAAc;AAAA;AAAA;AAChC,SAAA,EACF,CAAA;AAAA,QAGF,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,0GAAA,EAG7C;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AC7DA,IAAM,OAAA,GAAU,CAAC,UAAA,EAAY,SAAA,EAAW,QAAQ,CAAA;AAChD,IAAM,SAAA,GAAY,UAAA;AAMlB,SAAS,kBAAkB,OAAA,EAA+C;AACxE,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,EAAA,MAAM,OAAA,GAAU,QAAQ,UAAA,CAAW,GAAA;AAAA,IACjC,CAAC,SAAA,KAAc,SAAA,CAAU,MAAA,IAAU,SAAA,CAAU;AAAA,GAC/C;AACA,EAAA,KAAA,MAAW,MAAA,IAAU,QAAQ,OAAA,EAAS;AACpC,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,MAAA,CAAO,UAAU,CAAA;AACjD,IAAA,IAAI,MAAA,IAAU,CAAC,OAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAAA,EAC5E;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAAyB;AAC5C,EAAA,IAAI,EAAA,GAAK,YAAA;AACT,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,KAAA,CAAM,QAAA,CAAS,EAAE,CAAA,EAAG;AACzB,IAAA,EAAA,GAAK,cAAc,CAAC,CAAA,CAAA;AACpB,IAAA,CAAA,IAAK,CAAA;AAAA,EACP;AACA,EAAA,OAAO,EAAA;AACT;AAGA,SAAS,eAAA,CAAgB;AAAA,EACvB,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,OAAA,GAAU,SAAS,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,EAAA,KAAO,KAAK,OAAO,CAAA;AAClE,EAAA,MAAM,UAAA,GAAa,kBAAkB,OAAO,CAAA;AAC5C,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBACtDD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO,KAAK,OAAA,IAAW,IAAA;AAAA,UACvB,KAAA,EAAM,gBAAA;AAAA,UACN,QAAA;AAAA,UACA,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,YACjC,OAAO,MAAA,CAAO,EAAA;AAAA,YACd,KAAA,EAAO,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO;AAAA,WAC/B,CAAE,CAAA;AAAA,UACF,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,QAAA,CAAS,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AAAA,UACtC;AAAA;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,aAAA;AAAA,UACN,OAAO,IAAA,CAAK,WAAA;AAAA,UACZ,KAAA,EAAM,qBAAA;AAAA,UACN,QAAA;AAAA,UACA,OAAA,EAAS,YAAA,CAAa,GAAA,CAAI,CAAC,WAAA,MAAiB;AAAA,YAC1C,KAAA,EAAO,WAAA;AAAA,YACP,KAAA,EAAO;AAAA,WACT,CAAE,CAAA;AAAA,UACF,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,QAAA,CAAS,EAAE,GAAG,IAAA,EAAM,WAAA,EAAa,OAAsB,CAAA;AAAA,UACzD;AAAA;AAAA,OACF;AAAA,MACC,UAAA,CAAW,MAAA,GAAS,CAAA,mBACnBA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,KAAK,MAAA,IAAU,IAAA;AAAA,UACtB,KAAA,EAAM,eAAA;AAAA,UACN,QAAA;AAAA,UACA,OAAA,EAAA,CAAU,UAAA,CAAW,QAAA,CAAS,IAAA,CAAK,MAAM,KAAK,CAAC,IAAA,CAAK,MAAA,GAChD,UAAA,GACA,CAAC,IAAA,CAAK,QAAQ,GAAG,UAAU,CAAA,EAC7B,GAAA,CAAI,CAAC,MAAA,MAAY,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,CAAE,CAAA;AAAA,UACpD,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,QAAA,CAAS,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,UACrC;AAAA;AAAA,0BAGFA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,QAAA;AAAA,UACN,OAAO,IAAA,CAAK,MAAA;AAAA,UACZ,KAAA,EAAM,iBAAA;AAAA,UACN,WAAA,EAAY,WAAA;AAAA,UACZ,IAAA,EAAI,IAAA;AAAA,UACJ,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,QAAA,CAAS,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,UACrC;AAAA;AAAA;AACF,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAmBO,SAAS,kBAAA,CAAmB;AAAA,EACjC,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,EAAE,SAAA,EAAW,EAAA,EAAG,GAAI,YAAA,EAAa;AACvC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIG,QAAAA;AAAA,IAClC,OAAA,CAAQ,CAAC,CAAA,EAAG,EAAA,IAAM;AAAA,GACpB;AAEA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC1D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAsC,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM,QAAA,GACJ,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,EAAA,KAAO,UAAU,CAAA,IAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,IAAA;AACtE,EAAA,MAAM,KAAA,GAAQ,QAAA,GAAW,oBAAA,CAAqB,QAAA,CAAS,UAAU,CAAA,GAAI,IAAA;AACrE,EAAA,MAAM,UAAA,GAAa,QAAA,IAAa,QAAA,KAAa,IAAA,IAAQ,KAAA,KAAU,IAAA;AAE/D,EAAA,SAAS,KAAA,CAAM,MAA0B,UAAA,EAA2B;AAClE,IAAA,QAAA,CAAS,iBAAA,CAAkB,QAAA,EAAU,IAAA,EAAM,UAAU,CAAC,CAAA;AACtD,IAAA,aAAA,CAAc,KAAK,EAAE,CAAA;AACrB,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB;AAEA,EAAA,SAAS,SAAA,GAAkB;AACzB,IAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,CAAC,CAAA,IAAK,SAAS,CAAC,CAAA;AACxC,IAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,KAAK,CAAA,CAAE,CAAC,CAAA,IAAK,QAAA;AACnD,IAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,MAAM,CAAA,CAAE,CAAC,CAAA,IAAK,QAAA;AACrD,IAAA,MAAM,EAAA,GAAK,YAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,MAAA,CAAO,EAAE,CAAC,CAAA;AACzD,IAAA,UAAA,CAAW,EAAE,CAAA;AACb,IAAA,KAAA,CAAM;AAAA,MACJ,EAAA;AAAA,MACA,KAAA,EAAO,IAAA;AAAA,MACP,WAAA,EAAa,IAAA;AAAA,MACb,IAAA,EAAM,KAAA;AAAA,MACN,MAAA,EAAQ,IAAA;AAAA,MACR,UAAA,EAAY,eAAA;AAAA,QACV;AAAA,UACE,OAAA,EAAS,OAAO,EAAA,IAAM,SAAA;AAAA,UACtB,WAAA,EAAa,KAAA;AAAA,UACb,MAAA,EAAQ;AAAA,SACV;AAAA,QACA;AAAA,UACE,OAAA,EAAS,QAAQ,EAAA,IAAM,SAAA;AAAA,UACvB,WAAA,EAAa,KAAA;AAAA,UACb,MAAA,EAAQ;AAAA;AACV,OACF;AAAA,MACA,iBAAiB;AAAC,KACnB,CAAA;AACD,IAAA,WAAA,CAAY,KAAK,CAAA;AAAA,EACnB;AAEA,EAAA,eAAe,WAAW,MAAA,EAA2C;AACnE,IAAA,MAAM,UAAA,GAAa,oBAAA;AAAA,MACjB,MAAA,CAAO,UAAA;AAAA,MACP,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,QAAQ,EAAE;AAAA,KACtC;AACA,IAAA,MAAM,IAAA,GACJ,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY,OAAA,CAAQ,EAAA,KAAO,UAAA,CAAW,CAAC,CAAC,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA;AACxE,IAAA,IAAI,CAAC,IAAA,EAAM;AAGX,IAAA,MAAM,KAAA,GAAQ,KAAK,UAAA,CAAW,IAAA;AAAA,MAC5B,CAAC,SAAA,KAAc,SAAA,CAAU,MAAA,IAAU,UAAU,IAAA,KAAS;AAAA,KACxD;AACA,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,IAAI;AACF,MAAA,UAAA;AAAA,QACE,MAAM,UAAU,cAAA,CAAe;AAAA,UAC7B,QAAA;AAAA,UACA,WAAW,IAAA,CAAK,EAAA;AAAA,UAChB,KAAA,EAAO,EAAA;AAAA,UACP,OAAA,EAAS,CAAC,GAAI,KAAA,GAAQ,CAAC,KAAA,CAAM,EAAE,CAAA,GAAI,EAAC,EAAI,MAAA,CAAO,EAAE;AAAA,SAClD;AAAA,OACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,eAAA;AAAA,QACE,KAAA,YAAiB,KAAA,GACb,KAAA,CAAM,OAAA,GACN;AAAA,OACN;AAAA,IACF,CAAA,SAAE;AACA,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,QAAA,GACX,iBAAA,CAAkB,UAAU,QAAA,EAAU,aAAa,IACnD,EAAC;AAEL,EAAA,uBACEJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,wBACxDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,oIAAA,EAG7C;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,EAAA,CAAG,MAAA;AAAA,QAAH;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,QAAA,EAAU,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA;AAAA,UAC1C,KAAA,EACE,QAAA,CAAS,MAAA,KAAW,CAAA,GAChB,0DAAA,GACA,EAAA;AAAA,UAEN,OAAA,EAAS,SAAA;AAAA,UACV,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,IAEC,QAAQ,MAAA,KAAW,CAAA,mBAClBA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mEAAA,EAAoE,QAAA,EAAA,uGAAA,EAGjF,CAAA,mBAEAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,MAAA,MAAM,SACJ,iBAAA,CAAkB,MAAA,EAAQ,QAAA,EAAU,aAAa,EAAE,MAAA,GAAS,CAAA;AAC9D,MAAA,uBACED,IAAAA;AAAA,QAAC,EAAA,CAAG,MAAA;AAAA,QAAH;AAAA,UAEC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAS,MAAA,CAAO,EAAA,KAAO,QAAA,EAAU,KAAK,SAAA,GAAY,WAAA;AAAA,UAClD,SAAS,MAAM;AACb,YAAA,aAAA,CAAc,OAAO,EAAE,CAAA;AACvB,YAAA,UAAA,CAAW,IAAI,CAAA;AACf,YAAA,WAAA,CAAY,KAAK,CAAA;AACjB,YAAA,UAAA,CAAW,IAAI,CAAA;AAAA,UACjB,CAAA;AAAA,UAEC,QAAA,EAAA;AAAA,YAAA,MAAA,CAAO,EAAA;AAAA,YACP,MAAA,mBACCC,GAAAA,CAAC,EAAA,CAAG,KAAA,EAAH,EAAS,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,MAAA,EAAO,QAAA,EAAA,GAAA,EAEzC,CAAA,GACE;AAAA;AAAA,SAAA;AAAA,QAfC,MAAA,CAAO;AAAA,OAgBd;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,IAGD,QAAA,mBACCD,IAAAA,CAAC,KAAA,EAAA,EAAsB,WAAU,iCAAA,EAC9B,QAAA,EAAA;AAAA,MAAA,YAAA,CAAa,QAAA,CAAS,eAAe,CAAA,CAAE,MAAA,GAAS,oBAC/CA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qFAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA,CAAA,4BAAA,EAA+B,YAAA;AAAA,UAC9B,QAAA,CAAS;AAAA,SACX,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,mCAAA,CAAA,EACd,CAAA;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,yHAAA,EAGH,CAAA;AAAA,wBACAA,GAAAA,CAAC,EAAA,CAAG,MAAA,EAAH,EAAU,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,OAAA,EAAS,YAAA,EAAc,QAAA,EAAA,cAAA,EAEhE;AAAA,OAAA,EACF,CAAA,mBAEAA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,MAAM,aAAA,CAAc,QAAA,CAAS,eAAe,CAAA,EAAG,CAAA;AAAA,sBAGpED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,oBAAA;AAAA,YACN,OAAO,QAAA,CAAS,EAAA;AAAA,YAChB,KAAA,EAAM,kBAAA;AAAA,YACN,WAAA,EAAY,WAAA;AAAA,YACZ,IAAA,EAAI,IAAA;AAAA,YACJ,QAAA;AAAA,YACA,SAAA,EAAW,SAAS,EAAA,KAAO,OAAA;AAAA,YAC3B,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,cAAA,KAAA,CAAM,EAAE,GAAG,QAAA,EAAU,IAAI,KAAA,EAAM,EAAG,SAAS,EAAE,CAAA;AAAA,YAC/C;AAAA;AAAA,SACF;AAAA,wBACAA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,kBAAA;AAAA,YACN,OAAO,QAAA,CAAS,KAAA;AAAA,YAChB,KAAA,EAAO,CAAA,YAAA,EAAe,QAAA,CAAS,EAAE,CAAA,CAAA;AAAA,YACjC,aAAa,QAAA,CAAS,EAAA;AAAA,YACtB,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,cAAA,KAAA,CAAM,EAAE,GAAG,QAAA,EAAU,KAAA,EAAO,KAAA,IAAS,MAAM,CAAA;AAAA,YAC7C;AAAA;AAAA;AACF,OAAA,EACF,CAAA;AAAA,sBAEAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,0BAAA;AAAA,UACN,OAAO,QAAA,CAAS,WAAA;AAAA,UAChB,KAAA,EAAM,2BAAA;AAAA,UACN,WAAA,EAAY,qCAAA;AAAA,UACZ,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,KAAA,CAAM,EAAE,GAAG,QAAA,EAAU,WAAA,EAAa,KAAA,IAAS,MAAM,CAAA;AAAA,UACnD;AAAA;AAAA,OACF;AAAA,MAEC,UAAA,mBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,gBAAA;AAAA,YACN,OAAO,QAAA,CAAS,UAAA;AAAA,YAChB,KAAA,EAAM,sBAAA;AAAA,YACN,WAAA,EAAY,2EAAA;AAAA,YACZ,IAAA,EAAI,IAAA;AAAA,YACJ,QAAA;AAAA,YACA,IAAA,EAAK,+FAAA;AAAA,YACL,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,cAAA,KAAA,CAAM,EAAE,GAAG,QAAA,EAAU,UAAA,EAAY,OAAO,CAAA;AAAA,YAC1C;AAAA;AAAA,SACF;AAAA,QACC,KAAA,KAAU,uBACTA,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAQ,OAAA;AAAA,YACR,SAAS,MAAM;AACb,cAAA,WAAA,CAAY,KAAK,CAAA;AAAA,YACnB,CAAA;AAAA,YACD,QAAA,EAAA;AAAA;AAAA,SAED,GACE;AAAA,OAAA,EACN,IACE,KAAA,mBACFD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,aAAA;AAAA,YACN,MAAM,KAAA,CAAM,SAAA;AAAA,YACZ,QAAA;AAAA,YACA,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,cAAA,KAAA,CAAM;AAAA,gBACJ,GAAG,QAAA;AAAA,gBACH,UAAA,EAAY,eAAA,CAAgB,IAAA,EAAM,KAAA,CAAM,WAAW;AAAA,eACpD,CAAA;AAAA,YACH;AAAA;AAAA,SACF;AAAA,wBACAA,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,SAAA;AAAA,YACN,MAAM,KAAA,CAAM,WAAA;AAAA,YACZ,QAAA;AAAA,YACA,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,cAAA,KAAA,CAAM;AAAA,gBACJ,GAAG,QAAA;AAAA,gBACH,UAAA,EAAY,eAAA,CAAgB,KAAA,CAAM,SAAA,EAAW,IAAI;AAAA,eAClD,CAAA;AAAA,YACH;AAAA;AAAA,SACF;AAAA,wBACAA,GAAAA;AAAA,UAAC,EAAA,CAAG,QAAA;AAAA,UAAH;AAAA,YACC,OAAA,EAAS,SAAS,MAAA,KAAW,SAAA;AAAA,YAC7B,QAAA,EAAU,QAAA;AAAA,YACV,KAAA,EAAM,4CAAA;AAAA,YACN,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,cAAA,KAAA,CAAM;AAAA,gBACJ,GAAG,QAAA;AAAA;AAAA;AAAA;AAAA,gBAIH,UAAA,EAAY,eAAA;AAAA,kBACV,KAAA,CAAM,SAAA;AAAA,kBACN,KAAA,CAAM;AAAA,iBACR;AAAA,gBACA,MAAA,EAAQ,UAAU,SAAA,GAAY;AAAA,eAC/B,CAAA;AAAA,YACH;AAAA;AAAA,SACF;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,uHAAA,EAG7C,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAQ,OAAA;AAAA,YACR,SAAS,MAAM;AACb,cAAA,WAAA,CAAY,IAAI,CAAA;AAAA,YAClB,CAAA;AAAA,YACD,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF,CAAA,GACE,IAAA;AAAA,sBAEJA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,mBAAA;AAAA,UACN,KAAA,EAAO,SAAS,MAAA,IAAU,SAAA;AAAA,UAC1B,KAAA,EAAM,cAAA;AAAA,UACN,QAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,cAAA,EAAe;AAAA,YAC1C,GAAG;AAAA,cACD,GAAG,OAAA;AAAA,cACH,GAAI,QAAA,CAAS,MAAA,IAAU,CAAC,OAAA,CAAQ,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,GACpD,CAAC,QAAA,CAAS,MAAM,IAChB;AAAC,aACP,CAAE,IAAI,CAAC,MAAA,MAAY,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,CAAE;AAAA,WACtD;AAAA,UACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,KAAA,CAAM;AAAA,cACJ,GAAG,QAAA;AAAA,cACH,MAAA,EAAQ,KAAA,KAAU,SAAA,GAAY,IAAA,GAAO;AAAA,aACtC,CAAA;AAAA,UACH;AAAA;AAAA,OACF;AAAA,MAEC,OAAO,MAAA,GAAS,CAAA,mBACfA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,oCAAA,EACX,QAAA,EAAA,MAAA,CAAO,IAAI,CAAC,KAAA,qBACXA,GAAAA,CAAC,IAAA,EAAA,EAAgB,mBAAR,KAAc,CACxB,GACH,CAAA,GACE,IAAA;AAAA,sBAEJD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YACR,QAAA,EAAU,UAAA,IAAc,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,YACxC,SAAS,MAAM;AACb,cAAA,KAAK,WAAW,QAAQ,CAAA;AAAA,YAC1B,CAAA;AAAA,YAEC,uBAAa,YAAA,GAAe;AAAA;AAAA,SAC/B;AAAA,wBACAA,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YACR,QAAA,EAAU,QAAA;AAAA,YACV,SAAS,MAAM;AACb,cAAA,QAAA,CAAS,iBAAA,CAAkB,QAAA,EAAU,QAAA,CAAS,EAAE,CAAC,CAAA;AACjD,cAAA,aAAA,CAAc,IAAI,CAAA;AAClB,cAAA,UAAA,CAAW,IAAI,CAAA;AAAA,YACjB,CAAA;AAAA,YACD,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAgC,QAAA,EAAA,0EAAA,EAGhD;AAAA,OAAA,EACF,CAAA;AAAA,MAEC,YAAA,KAAiB,uBAChBA,GAAAA,CAAC,OAAE,SAAA,EAAU,0BAAA,EAA4B,wBAAa,CAAA,GACpD,IAAA;AAAA,MAEH,OAAA,mBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACZ,QAAA,EAAA;AAAA,UAAA,CAAA,EAAG,QAAQ,QAAQ,CAAA,KAAA,CAAA;AAAA,UACnB,QAAQ,kBAAA,GACL,CAAA,YAAA,EAAe,OAAA,CAAQ,kBAAA,CAAmB,MAAM,CAAA,UAAA,CAAA,GAChD;AAAA,SAAA,EACN,CAAA;AAAA,wBACAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CACb,QAAA,kBAAAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,0BAAA,EACf,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,WAAM,SAAA,EAAU,UAAA,EACf,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EACE,kBAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACpBA,IAAC,IAAA,EAAA,EAAgB,SAAA,EAAU,yBACxB,QAAA,EAAA,MAAA,EAAA,EADM,MAET,CACD,CAAA,EACH,CAAA,EACF,CAAA;AAAA,0BACAA,GAAAA,CAAC,OAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,KAAK,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,qBACtBA,GAAAA,CAAC,IAAA,EAAA,EAAe,SAAA,EAAU,UAAA,EACvB,kBAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACpBA,GAAAA,CAAC,IAAA,EAAA,EAAgB,SAAA,EAAU,WAAA,EACxB,iBAAO,GAAA,CAAI,MAAM,CAAA,IAAK,EAAE,KADlB,MAET,CACD,CAAA,EAAA,EALM,KAMT,CACD,CAAA,EACH;AAAA,SAAA,EACF,CAAA,EACF,CAAA;AAAA,QACC,OAAA,CAAQ,GAAA,KAAQ,IAAA,mBACfA,GAAAA,CAAC,SAAI,SAAA,EAAU,sEAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,EACX,CAAA,GACE;AAAA,OAAA,EACN,CAAA,GACE,IAAA;AAAA,sBAEJA,GAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,mBAAA,CAAoB,QAAA,EAAU,QAAA,CAAS,EAAE;AAAA;AAAA;AACrD,KAAA,EAAA,EAvPQ,QAAA,CAAS,EAwPnB,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AC/hBA,IAAM,aAAA,GAAgE;AAAA,EACpE,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,yCAAA,EAA0C;AAAA,EACzE,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,sBAAA,EAAuB;AAAA,EACrD,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,wCAAA,EAAyC;AAAA,EACxE,EAAE,KAAA,EAAO,cAAA,EAAgB,KAAA,EAAO,yBAAA;AAClC,CAAA;AAGA,IAAM,QAAA,GAAiC,CAAC,aAAA,EAAe,cAAc,CAAA;AAG9D,SAAS,gBAAgB,OAAA,EAA+C;AAC7E,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,EAAA,MAAM,OAAA,GAAU,QAAQ,UAAA,CAAW,GAAA;AAAA,IACjC,CAAC,SAAA,KAAc,SAAA,CAAU,MAAA,IAAU,SAAA,CAAU;AAAA,GAC/C;AACA,EAAA,IAAI,QAAQ,WAAA,IAAe,CAAC,QAAQ,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA,EAAG;AACjE,IAAA,OAAA,CAAQ,IAAA,CAAK,QAAQ,WAAW,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,mBAAA,CACP,IAAA,EACA,EAAA,EACA,KAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA;AAC7B,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AAC3B,IAAA,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AACnB,IAAA,CAAA,IAAK,CAAA;AAAA,EACP;AACA,EAAA,OAAO,IAAA;AACT;AAMA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,uBACEA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA,EAAM,iBAAA;AAAA,QACN,WAAA,EAAY,WAAA;AAAA,QACZ,IAAA,EAAI,IAAA;AAAA,QACJ,QAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,EAEJ;AACA,EAAA,uBACEA,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,OAAO,KAAA,IAAS,IAAA;AAAA,MAChB,KAAA,EAAM,eAAA;AAAA,MACN,QAAA;AAAA,MACA,OAAA,EAAA,CAAU,WAAW,QAAA,CAAS,KAAK,KAAK,CAAC,KAAA,GACrC,aACA,CAAC,KAAA,EAAO,GAAG,UAAU,CAAA,EACvB,IAAI,CAAC,MAAA,MAAY,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,CAAE,CAAA;AAAA,MACpD;AAAA;AAAA,GACF;AAEJ;AAmBO,SAAS,wBAAA,CAAyB;AAAA,EACvC,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAkC;AAChC,EAAA,MAAM,EAAE,EAAA,EAAG,GAAI,YAAA,EAAa;AAC5B,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIG,QAAAA;AAAA,IACtC,aAAA,CAAc,CAAC,CAAA,EAAG,IAAA,IAAQ;AAAA,GAC5B;AAEA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,QAAA,GACJ,aAAA,CAAc,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA,KAAS,YAAY,CAAA,IACzD,aAAA,CAAc,CAAC,CAAA,IACf,IAAA;AAEF,EAAA,SAAS,KAAA,CAAM,MAA2B,YAAA,EAA6B;AACrE,IAAA,QAAA,CAAS,kBAAA,CAAmB,QAAA,EAAU,IAAA,EAAM,YAAY,CAAC,CAAA;AACzD,IAAA,eAAA,CAAgB,KAAK,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,SAAS,eAAA,GAAwB;AAC/B,IAAA,MAAMgB,YAAAA,GAAc,SAAS,CAAC,CAAA;AAC9B,IAAA,MAAMC,UAAAA,GAAY,SAAS,CAAC,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAOD,cAAa,EAAA,IAAM,IAAA;AAChC,IAAA,MAAM,EAAA,GAAKC,YAAW,EAAA,IAAM,IAAA;AAG5B,IAAA,MAAM,MAAA,GACJD,YAAAA,EAAa,WAAA,IACb,eAAA,CAAgBC,UAAS,CAAA,CAAE,QAAA,CAASD,YAAAA,CAAY,WAAW,CAAA,GACvD,CAACA,YAAAA,CAAY,WAAW,IACxB,EAAC;AACP,IAAA,MAAM,IAAA,GAAO,mBAAA;AAAA,MACX,IAAA,IAAQ,MAAA;AAAA,MACR,EAAA,IAAM,OAAA;AAAA,MACN,aAAA,CAAc,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,IAAI;AAAA,KACzC;AACA,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,KAAA,CAAM;AAAA,MACJ,IAAA;AAAA,MACA,IAAA;AAAA,MACA,EAAA;AAAA,MACA,WAAA,EAAa,MAAA;AAAA,MACb,SAAA,EAAW,MAAA;AAAA,MACX,WAAA,EAAa,aAAA;AAAA,MACb,iBAAiB;AAAC,KACnB,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,WAAA,GAAc,SAAS,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,EAAA,KAAO,UAAU,IAAI,CAAA;AACxE,EAAA,MAAM,SAAA,GAAY,SAAS,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,EAAA,KAAO,UAAU,EAAE,CAAA;AACpE,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,IAChD,OAAO,OAAA,CAAQ,EAAA;AAAA,IACf,KAAA,EAAO,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ;AAAA,GACjC,CAAE,CAAA;AACF,EAAA,MAAM,SAAS,QAAA,GAAW,kBAAA,CAAmB,UAAU,QAAA,EAAU,MAAM,IAAI,EAAC;AAE5E,EAAA,uBACEpB,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,wBAClDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,iIAAA,EAG7C;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,EAAA,CAAG,MAAA;AAAA,QAAH;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,QAAA,EAAU,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA;AAAA,UACxC,KAAA,EACE,QAAA,CAAS,MAAA,GAAS,CAAA,GACd,iDAAA,GACA,EAAA;AAAA,UAEN,OAAA,EAAS,eAAA;AAAA,UACV,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,IAEC,cAAc,MAAA,KAAW,CAAA,mBACxBA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mEAAA,EAAoE,QAAA,EAAA,6FAAA,EAGjF,CAAA,mBAEAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACZ,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,YAAA,KAAiB;AACnC,MAAA,MAAM,SACJ,kBAAA,CAAmB,YAAA,EAAc,QAAA,EAAU,MAAM,EAAE,MAAA,GAAS,CAAA;AAC9D,MAAA,uBACED,IAAAA;AAAA,QAAC,EAAA,CAAG,MAAA;AAAA,QAAH;AAAA,UAEC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EACE,YAAA,CAAa,IAAA,KAAS,QAAA,EAAU,OAAO,SAAA,GAAY,WAAA;AAAA,UAErD,SAAS,MAAM;AACb,YAAA,eAAA,CAAgB,aAAa,IAAI,CAAA;AACjC,YAAA,YAAA,CAAa,IAAI,CAAA;AAAA,UACnB,CAAA;AAAA,UAEC,QAAA,EAAA;AAAA,YAAA,YAAA,CAAa,IAAA;AAAA,YACb,MAAA,mBACCC,GAAAA,CAAC,EAAA,CAAG,KAAA,EAAH,EAAS,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,MAAA,EAAO,QAAA,EAAA,GAAA,EAEzC,CAAA,GACE;AAAA;AAAA,SAAA;AAAA,QAfC,YAAA,CAAa;AAAA,OAgBpB;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,IAGD,QAAA,mBACCD,IAAAA,CAAC,KAAA,EAAA,EAAwB,WAAU,iCAAA,EAChC,QAAA,EAAA;AAAA,MAAA,YAAA,CAAa,QAAA,CAAS,eAAe,CAAA,CAAE,MAAA,GAAS,oBAC/CA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qFAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA,CAAA,6BAAA,EAAgC,YAAA;AAAA,UAC/B,QAAA,CAAS;AAAA,SACX,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,mCAAA,CAAA,EACd,CAAA;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,mHAAA,EAGH,CAAA;AAAA,wBACAA,GAAAA,CAAC,EAAA,CAAG,MAAA,EAAH,EAAU,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,OAAA,EAAS,YAAA,EAAc,QAAA,EAAA,cAAA,EAEhE;AAAA,OAAA,EACF,CAAA,mBAEAA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,MAAM,aAAA,CAAc,QAAA,CAAS,eAAe,CAAA,EAAG,CAAA;AAAA,sBAGpEA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,MAAA;AAAA,UACN,OAAO,QAAA,CAAS,IAAA;AAAA,UAChB,KAAA,EAAM,gBAAA;AAAA,UACN,WAAA,EAAY,4BAAA;AAAA,UACZ,IAAA,EAAI,IAAA;AAAA,UACJ,QAAA;AAAA,UACA,SAAA,EAAW,SAAS,IAAA,KAAS,SAAA;AAAA,UAC7B,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,KAAA,CAAM,EAAE,GAAG,QAAA,EAAU,MAAM,KAAA,EAAM,EAAG,SAAS,IAAI,CAAA;AAAA,UACnD;AAAA;AAAA,OACF;AAAA,sBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,cAAA;AAAA,YACN,OAAO,QAAA,CAAS,IAAA;AAAA,YAChB,KAAA,EAAM,gBAAA;AAAA,YACN,QAAA;AAAA,YACA,OAAA,EAAS,cAAA;AAAA,YACT,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,cAAA,KAAA,CAAM,EAAE,GAAG,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA;AAAA,YACpC;AAAA;AAAA,SACF;AAAA,wBACAA,GAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,eAAA;AAAA,YACN,OAAO,QAAA,CAAS,EAAA;AAAA,YAChB,KAAA,EAAM,gBAAA;AAAA,YACN,QAAA;AAAA,YACA,OAAA,EAAS,cAAA;AAAA,YACT,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,cAAA,KAAA,CAAM,EAAE,GAAG,QAAA,EAAU,EAAA,EAAI,OAAO,CAAA;AAAA,YAClC;AAAA;AAAA;AACF,OAAA,EACF,CAAA;AAAA,sBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,oBAAA,EAE/C,CAAA;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,0GAAA,EAG7C,CAAA;AAAA,QACC,QAAA,CAAS,WAAA,CAAY,MAAA,KAAW,CAAA,IACjC,SAAS,SAAA,CAAU,MAAA,KAAW,CAAA,mBAC5BA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0BAAA,EAA2B,0EAExC,CAAA,GACE,IAAA;AAAA,QACH,QAAA,CAAS,WAAA,CAAY,GAAA,CAAI,CAAC,MAAA,EAAQ,0BACjCD,IAAAA,CAAC,KAAA,EAAA,EAAgB,SAAA,EAAU,sBAAA,EACzB,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,SAAS,IAAA,IAAQ,MAAA;AAAA,cACxB,KAAA,EAAO,MAAA;AAAA,cACP,UAAA,EAAY,gBAAgB,WAAW,CAAA;AAAA,cACvC,QAAA;AAAA,cACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,gBAAA,KAAA,CAAM;AAAA,kBACJ,GAAG,QAAA;AAAA,kBACH,WAAA,EAAa,SAAS,WAAA,CAAY,GAAA;AAAA,oBAAI,CAAC,KAAA,EAAO,CAAA,KAC5C,CAAA,KAAM,QAAQ,KAAA,GAAQ;AAAA;AACxB,iBACD,CAAA;AAAA,cACH;AAAA;AAAA,WACF,EACF,CAAA;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAqC,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,0BACtDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UACb,QAAA,kBAAAA,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,SAAS,EAAA,IAAM,OAAA;AAAA,cACtB,KAAA,EAAO,QAAA,CAAS,SAAA,CAAU,KAAK,CAAA,IAAK,EAAA;AAAA,cACpC,UAAA,EAAY,gBAAgB,SAAS,CAAA;AAAA,cACrC,QAAA;AAAA,cACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,gBAAA,KAAA,CAAM;AAAA,kBACJ,GAAG,QAAA;AAAA,kBACH,SAAA,EAAW,SAAS,WAAA,CAAY,GAAA;AAAA,oBAAI,CAAC,GAAG,CAAA,KACtC,CAAA,KAAM,QAAQ,KAAA,GAAS,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,IAAK;AAAA;AAClD,iBACD,CAAA;AAAA,cACH;AAAA;AAAA,WACF,EACF,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,EAAA,CAAG,MAAA;AAAA,YAAH;AAAA,cACC,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAQ,OAAA;AAAA,cACR,QAAA,EAAU,QAAA;AAAA,cACV,SAAA,EAAU,kBAAA;AAAA,cACV,SAAS,MAAM;AACb,gBAAA,KAAA,CAAM;AAAA,kBACJ,GAAG,QAAA;AAAA,kBACH,WAAA,EAAa,SAAS,WAAA,CAAY,MAAA;AAAA,oBAChC,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM;AAAA,mBAClB;AAAA,kBACA,SAAA,EAAW,SAAS,SAAA,CAAU,MAAA;AAAA,oBAC5B,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM;AAAA;AAClB,iBACD,CAAA;AAAA,cACH,CAAA;AAAA,cACD,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EAAA,EApDQ,KAqDV,CACD,CAAA;AAAA,wBACDA,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YACR,QAAA,EAAU,QAAA;AAAA,YACV,SAAS,MAAM;AACb,cAAA,KAAA,CAAM;AAAA,gBACJ,GAAG,QAAA;AAAA,gBACH,WAAA,EAAa,CAAC,GAAG,QAAA,CAAS,aAAa,EAAE,CAAA;AAAA,gBACzC,SAAA,EAAW,CAAC,GAAG,QAAA,CAAS,WAAW,EAAE;AAAA,eACtC,CAAA;AAAA,YACH,CAAA;AAAA,YACD,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF,CAAA;AAAA,sBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,qBAAA;AAAA,YACN,OAAO,QAAA,CAAS,WAAA;AAAA,YAChB,KAAA,EAAM,sBAAA;AAAA,YACN,QAAA;AAAA,YACA,OAAA,EAAS,aAAA,CAAc,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,cACtC,OAAO,MAAA,CAAO,KAAA;AAAA,cACd,OAAO,MAAA,CAAO;AAAA,aAChB,CAAE,CAAA;AAAA,YACF,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,cAAA,KAAA,CAAM;AAAA,gBACJ,GAAG,QAAA;AAAA,gBACH,WAAA,EAAa;AAAA,eACd,CAAA;AAAA,YACH;AAAA;AAAA,SACF;AAAA,QACC,QAAA,CAAS,WAAA,IAAe,QAAA,CAAS,QAAA,CAAS,QAAA,CAAS,WAAW,CAAA,mBAC7DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wBAAA,EAAyB,kKAItC,CAAA,GACE;AAAA,OAAA,EACN,CAAA;AAAA,MAEC,OAAO,MAAA,GAAS,CAAA,mBACfA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,oCAAA,EACX,QAAA,EAAA,MAAA,CAAO,IAAI,CAAC,KAAA,qBACXA,GAAAA,CAAC,IAAA,EAAA,EAAgB,mBAAR,KAAc,CACxB,GACH,CAAA,GACE,IAAA;AAAA,sBAEJA,GAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,oBAAA,CAAqB,QAAA,EAAU,QAAA,CAAS,IAAI;AAAA;AAAA,OACxD;AAAA,sBAEAA,GAAAA;AAAA,QAAC,EAAA,CAAG,MAAA;AAAA,QAAH;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,QAAA,EAAU,QAAA;AAAA,UACV,SAAS,MAAM;AACb,YAAA,QAAA,CAAS,kBAAA,CAAmB,QAAA,EAAU,QAAA,CAAS,IAAI,CAAC,CAAA;AACpD,YAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,UACtB,CAAA;AAAA,UACD,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EAAA,EA9LQ,QAAA,CAAS,IA+LnB,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AC7ZA,IAAM,YAAA,GAAe,kBAAA;AAQrB,SAAS,cAAA,CAAe;AAAA,EACtB,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,EAAE,EAAA,EAAG,GAAI,YAAA,EAAa;AAC5B,EAAA,MAAM,MAAA,GAASM,OAAAA;AAAA,IACb,MAAM,gBAAA,CAAiB,QAAQ,CAAA,CAAE,UAAA;AAAA,IACjC,CAAC,QAAQ;AAAA,GACX;AACA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIH,QAAAA;AAAA,IAClC,MAAA,CAAO,CAAC,CAAA,EAAG,EAAA,IAAM;AAAA,GACnB;AAEA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC1D,EAAA,MAAM,QAAA,GACJ,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,EAAA,KAAO,UAAU,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,IAAK,IAAA;AAElE,EAAA,SAAS,KAAA,CAAM,MAAwB,UAAA,EAA2B;AAChE,IAAA,QAAA,CAAS,eAAA,CAAgB,QAAA,EAAU,IAAA,EAAM,UAAU,CAAC,CAAA;AACpD,IAAA,aAAA,CAAc,KAAK,EAAE,CAAA;AAAA,EACvB;AAEA,EAAA,SAAS,QAAA,GAAiB;AACxB,IAAA,MAAM,IAAA,GAAO,OAAA;AACb,IAAA,IAAI,EAAA,GAAK,IAAA;AACT,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,OAAO,OAAO,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,EAAA,KAAO,EAAE,CAAA,EAAG;AAC9C,MAAA,EAAA,GAAK,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AACjB,MAAA,CAAA,IAAK,CAAA;AAAA,IACP;AACA,IAAA,KAAA,CAAM;AAAA,MACJ,EAAA;AAAA,MACA,IAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAQ,IAAA;AAAA,MACR,WAAA,EAAa,WAAA,CAAY,CAAC,CAAA,EAAG,EAAA,IAAM,IAAA;AAAA,MACnC,SAAA,EAAW,OAAO,MAAA,KAAW;AAAA,KAC9B,CAAA;AACD,IAAA,UAAA,CAAW,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,MAAM,aAAa,WAAA,CAAY,IAAA;AAAA,IAC7B,CAAC,KAAA,KAAU,KAAA,CAAM,EAAA,KAAO,QAAA,EAAU;AAAA,GACpC;AAEA,EAAA,uBACEJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,wBAChDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,mGAAA,EAG7C;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,EAAA,CAAG,MAAA;AAAA,QAAH;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,QAAA,EAAU,QAAA;AAAA,UACV,OAAA,EAAS,QAAA;AAAA,UACV,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,IAEC,OAAO,MAAA,KAAW,CAAA,mBACjBA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mEAAA,EAAoE,QAAA,EAAA,2HAAA,EAGjF,oBAEAA,GAAAA,CAAC,SAAI,SAAA,EAAU,sBAAA,EACZ,iBAAO,GAAA,CAAI,CAAC,0BACXD,IAAAA;AAAA,MAAC,EAAA,CAAG,MAAA;AAAA,MAAH;AAAA,QAEC,IAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAS,KAAA,CAAM,EAAA,KAAO,QAAA,EAAU,KAAK,SAAA,GAAY,WAAA;AAAA,QACjD,SAAS,MAAM;AACb,UAAA,aAAA,CAAc,MAAM,EAAE,CAAA;AACtB,UAAA,UAAA,CAAW,IAAI,CAAA;AAAA,QACjB,CAAA;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,EAAA;AAAA,UACN,KAAA,CAAM,SAAA,mBACLC,GAAAA,CAAC,EAAA,CAAG,KAAA,EAAH,EAAS,IAAA,EAAK,SAAA,EAAU,SAAA,EAAU,MAAA,EAAO,QAAA,EAAA,SAAA,EAE1C,CAAA,GACE;AAAA;AAAA,OAAA;AAAA,MAbC,KAAA,CAAM;AAAA,KAed,CAAA,EACH,CAAA;AAAA,IAGD,QAAA,mBACCD,IAAAA,CAAC,KAAA,EAAA,EAAsB,WAAU,iCAAA,EAC/B,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,sBAAA;AAAA,YACN,OAAO,QAAA,CAAS,EAAA;AAAA,YAChB,KAAA,EAAM,iBAAA;AAAA,YACN,WAAA,EAAY,QAAA;AAAA,YACZ,IAAA,EAAI,IAAA;AAAA,YACJ,QAAA;AAAA,YACA,SAAA,EAAW,SAAS,EAAA,KAAO,OAAA;AAAA,YAC3B,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,cAAA,KAAA,CAAM,EAAE,GAAG,QAAA,EAAU,IAAI,KAAA,EAAM,EAAG,SAAS,EAAE,CAAA;AAAA,YAC/C;AAAA;AAAA,SACF;AAAA,wBACAA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,kBAAA;AAAA,YACN,OAAO,QAAA,CAAS,IAAA;AAAA,YAChB,KAAA,EAAO,CAAA,YAAA,EAAe,QAAA,CAAS,EAAE,CAAA,CAAA;AAAA,YACjC,aAAa,QAAA,CAAS,EAAA;AAAA,YACtB,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,cAAA,KAAA,CAAM,EAAE,GAAG,QAAA,EAAU,IAAA,EAAM,KAAA,IAAS,MAAM,CAAA;AAAA,YAC5C;AAAA;AAAA;AACF,OAAA,EACF,CAAA;AAAA,sBAEAA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,sBAAA;AAAA,UACN,KAAA,EAAO,SAAS,WAAA,IAAe,YAAA;AAAA,UAC/B,KAAA,EAAM,mBAAA;AAAA,UACN,QAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,+BAAA,EAAgC;AAAA,YAC9D,GAAG,WAAA,CAAY,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,cAC7B,OAAO,KAAA,CAAM,EAAA;AAAA,cACb,OAAO,KAAA,CAAM;AAAA,aACf,CAAE;AAAA,WACJ;AAAA,UACA,MACE,QAAA,CAAS,WAAA,GACL,cAAc,UAAA,EAAY,MAAA,IAAU,YAAY,CAAA,CAAA,CAAA,GAChD,sGAAA;AAAA,UAEN,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,KAAA,CAAM;AAAA,cACJ,GAAG,QAAA;AAAA,cACH,WAAA,EAAa,KAAA,KAAU,YAAA,GAAe,IAAA,GAAO,KAAA;AAAA,cAC7C,MAAA,EACE,WAAA,CAAY,IAAA,CAAK,CAAC,KAAA,KAAU,MAAM,EAAA,KAAO,KAAK,CAAA,EAAG,MAAA,IACjD,QAAA,CAAS;AAAA,aACZ,CAAA;AAAA,UACH;AAAA;AAAA,OACF;AAAA,sBAEAA,GAAAA;AAAA,QAAC,EAAA,CAAG,QAAA;AAAA,QAAH;AAAA,UACC,SAAS,QAAA,CAAS,SAAA;AAAA,UAClB,QAAA,EAAU,QAAA;AAAA,UACV,KAAA,EAAM,gDAAA;AAAA,UACN,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,YAAA,KAAA,CAAM,EAAE,GAAG,QAAA,EAAU,SAAA,EAAW,SAAS,CAAA;AAAA,UAC3C;AAAA;AAAA,OACF;AAAA,sBAEAA,GAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,iBAAA,CAAkB,QAAA,EAAU,QAAA,CAAS,EAAE;AAAA;AAAA,OACnD;AAAA,sBAEAA,GAAAA;AAAA,QAAC,EAAA,CAAG,MAAA;AAAA,QAAH;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,QAAA,EAAU,QAAA;AAAA,UACV,SAAS,MAAM;AACb,YAAA,QAAA,CAAS,eAAA,CAAgB,QAAA,EAAU,QAAA,CAAS,EAAE,CAAC,CAAA;AAC/C,YAAA,aAAA,CAAc,IAAI,CAAA;AAAA,UACpB,CAAA;AAAA,UACD,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EAAA,EA7EQ,QAAA,CAAS,EA8EnB,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAkBO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,SAAA,EAAW,EAAA,EAAG,GAAI,YAAA,EAAa;AACvC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIG,SAAqB,UAAU,CAAA;AACzD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAAA,CAAgC,EAAE,CAAA;AACxE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,OAAA,GAAUG,QAAQ,MAAM,gBAAA,CAAiB,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEpE,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,eAAe,IAAA,GAAsB;AACnC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,eAAA,CAAgB;AAAA,UAC7C,QAAQ,UAAA,CAAW;AAAA,SACpB,CAAA;AACD,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,cAAA,CAAe,MAAM,CAAA;AACrB,UAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,QAC1B;AAAA,MACF,CAAA,CAAA,MAAQ;AAGN,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,cAAA,CAAe,EAAE,CAAA;AACjB,UAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AACA,IAAA,KAAK,IAAA,EAAK;AACV,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,0BAAA,GAA6B,QAAQ,QAAA,CAAS,MAAA;AAAA,IAClD,CAAC,OAAA,KAAY,CAAC,OAAA,CAAQ;AAAA,GACxB,CAAE,MAAA;AACF,EAAA,MAAM,mBAAA,GAAsB,QAAQ,aAAA,CAAc,MAAA;AAAA,IAChD,CAAC,iBACC,kBAAA,CAAmB,YAAA,EAAc,QAAQ,QAAA,EAAU,OAAA,CAAQ,UAAU,CAAA,CAClE,MAAA,GAAS;AAAA,GAChB,CAAE,MAAA;AACF,EAAA,MAAM,aAAA,GAAgB,QAAQ,YAAA,CAAa,MAAA;AAAA,IACzC,CAAC,WACC,iBAAA,CAAkB,MAAA,EAAQ,QAAQ,QAAA,EAAU,OAAA,CAAQ,aAAa,CAAA,CAC9D,MAAA,GAAS;AAAA,GAChB,CAAE,MAAA;AAEF,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,uBACEJ,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,QAAA,EAAA,oCAAA,EAAkC,CAAA;AAAA,sBAC/DA,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,OAAA,EAAU,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAA,CAAA,EAAI,CAAA;AAAA,sBAC5DA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,0FAAA,EAGH,CAAA;AAAA,sBACAA,GAAAA,CAAC,EAAA,CAAG,MAAA,EAAH,EAAU,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,OAAA,EAAS,YAAA,EAAc,QAAA,EAAA,mBAAA,EAEhE;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,IAAA,GAMA;AAAA,IACJ;AAAA,MACE,EAAA,EAAI,aAAA;AAAA,MACJ,KAAA,EAAO,aAAA;AAAA,MACP,KAAA,EAAO,QAAQ,UAAA,CAAW,MAAA;AAAA,MAC1B,MAAA,EAAQ,CAAA;AAAA,MACR,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,EAAA,EAAI,UAAA;AAAA,MACJ,KAAA,EAAO,UAAA;AAAA,MACP,KAAA,EAAO,QAAQ,QAAA,CAAS,MAAA;AAAA,MACxB,MAAA,EAAQ,0BAAA;AAAA,MACR,WAAA,EAAa,GAAG,0BAA0B,CAAA,0BAAA;AAAA,KAC5C;AAAA,IACA;AAAA,MACE,EAAA,EAAI,eAAA;AAAA,MACJ,KAAA,EAAO,eAAA;AAAA,MACP,KAAA,EAAO,QAAQ,aAAA,CAAc,MAAA;AAAA,MAC7B,MAAA,EAAQ,mBAAA;AAAA,MACR,WAAA,EAAa,GAAG,mBAAmB,CAAA,4BAAA;AAAA,KACrC;AAAA,IACA;AAAA,MACE,EAAA,EAAI,SAAA;AAAA,MACJ,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO,QAAQ,YAAA,CAAa,MAAA;AAAA,MAC5B,MAAA,EAAQ,aAAA;AAAA,MACR,WAAA,EAAa,GAAG,aAAa,CAAA,mCAAA;AAAA;AAC/B,GACF;AAEA,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,sCAAA,EACZ,eAAK,GAAA,CAAI,CAAC,0BACTD,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,MAAM;AACb,UAAA,QAAA,CAAS,MAAM,EAAE,CAAA;AAAA,QACnB,CAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,uEAAA;AAAA,UACA,KAAA,CAAM,EAAA,KAAO,KAAA,GACT,sBAAA,GACA;AAAA,SACN;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,CAAM,KAAA,EAAM,CAAA;AAAA,0BACnBD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,YAAA,KAAA,CAAM,MAAA,GAAS,CAAA,mBACdC,GAAAA,CAAC,GAAG,KAAA,EAAH,EAAS,IAAA,EAAK,QAAA,EAAS,KAAA,EAAO,KAAA,CAAM,WAAA,EAClC,QAAA,EAAA,KAAA,CAAM,QACT,CAAA,GACE,IAAA;AAAA,4BACJA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EACb,gBAAM,KAAA,EACT;AAAA,WAAA,EACF;AAAA;AAAA,OAAA;AAAA,MAtBK,KAAA,CAAM;AAAA,KAwBd,CAAA,EACH,CAAA;AAAA,oBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,KAAU,gCACTC,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,QAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA;AAAA,OACF,GACE,IAAA;AAAA,MACH,KAAA,KAAU,6BACTA,GAAAA;AAAA,QAAC,mBAAA;AAAA,QAAA;AAAA,UACC,QAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA;AAAA,UACA,WAAA;AAAA,UACA,gBAAA;AAAA,UACA;AAAA;AAAA,OACF,GACE,IAAA;AAAA,MACH,KAAA,KAAU,kCACTA,GAAAA;AAAA,QAAC,wBAAA;AAAA,QAAA;AAAA,UACC,QAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,QAAQ,OAAA,CAAQ,UAAA;AAAA,UAChB,eAAe,OAAA,CAAQ,aAAA;AAAA,UACvB;AAAA;AAAA,OACF,GACE,IAAA;AAAA,MACH,KAAA,KAAU,4BACTA,GAAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,QAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,eAAe,OAAA,CAAQ,aAAA;AAAA,UACvB,SAAS,OAAA,CAAQ,YAAA;AAAA,UACjB;AAAA;AAAA,OACF,GACE;AAAA,KAAA,EACN;AAAA,GAAA,EACF,CAAA;AAEJ;;;ACjZA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AACjC,EAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AACrC;AAGO,SAAS,SAAA,CAAU,GAAA,EAAa,GAAA,mBAAY,IAAI,MAAK,EAAW;AACrE,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA;AACzB,EAAA,IAAI,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,GAAG,OAAO,SAAA;AACzC,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA;AAAA,IACnB,CAAA;AAAA,IACA,IAAA,CAAK,OAAO,GAAA,CAAI,OAAA,KAAY,IAAA,CAAK,OAAA,MAAa,GAAI;AAAA,GACpD;AACA,EAAA,IAAI,OAAA,GAAU,IAAI,OAAO,UAAA;AACzB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,EAAA,IAAI,OAAA,GAAU,EAAA,EAAI,OAAO,CAAA,EAAG,OAAO,CAAA,KAAA,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACrC,EAAA,IAAI,KAAA,GAAQ,EAAA,EAAI,OAAO,CAAA,EAAG,KAAK,CAAA,KAAA,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAA;AAClC,EAAA,IAAI,IAAA,GAAO,EAAA,EAAI,OAAO,CAAA,EAAG,IAAI,CAAA,KAAA,CAAA;AAC7B,EAAA,OAAO,KAAK,kBAAA,EAAmB;AACjC;AAEO,SAAS,eAAA,CACd,OAAA,EACA,GAAA,mBAAY,IAAI,MAAK,EACJ;AACjB,EAAA,MAAM,WACJ,OAAA,CAAQ,YAAA,KAAiB,IACrB,WAAA,GACA,CAAA,EAAG,QAAQ,YAAY,CAAA,SAAA,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,SAAA,CAAU,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA;AAAA,IAChC,QAAA;AAAA,IACA,UAAA,CAAW,QAAQ,SAAS;AAAA,GAC9B;AACA,EAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,QAAQ,IAAI,CAAA;AACzC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAA,QAAA,EAAW,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,IACjC,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,KAAK;AAAA,GAC1B;AACF;ACnCO,IAAM,kBAAA,GAAqB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAY3B,SAAS,gBACd,WAAA,EACU;AACV,EAAA,OAAO;AAAA,IACL,GAAG,YAAY,KAAA,CAAM,MAAA,CAAO,IAAI,CAAC,KAAA,KAAU,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AAAA,IAC5D,GAAG,YAAY,WAAA,CAAY,OAAA;AAAA,MAAQ,CAAC,KAAA,KAClC,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,WAAA,EAAc,KAAA,CAAM,EAAE,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE;AAAA,KAChE;AAAA,IACA,GAAG,YAAY,QAAA,CAAS,OAAA;AAAA,MAAQ,CAAC,OAAA,KAC/B,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,QAAA,EAAW,OAAA,CAAQ,EAAE,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE;AAAA,KACjE;AAAA,IACA,GAAG,YAAY,aAAA,CAAc,OAAA;AAAA,MAAQ,CAAC,YAAA,KACpC,YAAA,CAAa,MAAA,CAAO,GAAA;AAAA,QAClB,CAAC,KAAA,KAAU,CAAA,aAAA,EAAgB,YAAA,CAAa,IAAI,KAAK,KAAK,CAAA;AAAA;AACxD,KACF;AAAA,IACA,GAAG,YAAY,OAAA,CAAQ,OAAA;AAAA,MAAQ,CAAC,MAAA,KAC9B,MAAA,CAAO,MAAA,CAAO,GAAA;AAAA,QACZ,CAAC,UAAU,CAAA,OAAA,EAAU,MAAA,CAAO,OAAO,MAAA,CAAO,EAAE,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA;AAAA;AACzD;AACF,GACF;AACF;AAEO,SAAS,eACd,WAAA,EACU;AACV,EAAA,OAAO,YAAY,WAAA,CAAY,OAAA;AAAA,IAAQ,CAAC,KAAA,KAAA,CACrC,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,WAAA,EAAc,KAAA,CAAM,EAAE,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE;AAAA,GACrE;AACF;AAgBO,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,YAAA,EAAc,SAAQ,EAAqB;AAC7E,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,EAAA;AAAA,IACA,MAAA,EAAQ,UAAA;AAAA,IACR,OAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAa;AACjB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIG,SAAS,kBAAkB,CAAA;AACrD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,kBAAkB,CAAA;AAC/D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAChCA,SAA2C,IAAI,CAAA;AACjD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,QAAAA,CAAwB,EAAE,CAAA;AACpE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAA0B,SAAS,CAAA;AAC3D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAuC,IAAI,CAAA;AAC3E,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAElE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,OAAO,CAAA;AAEhD,EAAA,MAAM,QAAQ,KAAA,KAAU,UAAA;AACxB,EAAA,MAAM,WAAW,OAAA,IAAW,QAAA;AAG5B,EAAA,MAAM,aAAA,GAAgBG,QAAQ,MAAM,iBAAA,CAAkB,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACrE,EAAA,MAAM,OAAA,GAAUA,OAAAA;AAAA,IACd,MAAO,aAAA,CAAc,MAAA,GAAS,CAAA,GAAI,aAAA,GAAgB,aAAA;AAAA,IAClD,CAAC,eAAe,aAAa;AAAA,GAC/B;AAEA,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,eAAe,IAAA,GAAsB;AACnC,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,SAAA,CAAU,EAAE,MAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA;AACrE,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,IAAY,kBAAA;AAC/B,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA,WAAA,CAAY,MAAM,QAAQ,CAAA;AAAA,MAC5B,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA;AAAA,YACE,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,WACvC;AAAA,QACF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,MAClC;AAAA,IACF;AACA,IAAA,KAAK,IAAA,EAAK;AACV,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,IAAI,CAAC,CAAA;AAEpB,EAAA,MAAM,KAAA,GAAQF,YAAY,MAAM;AAC9B,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,gBAAA,CAAiB,EAAE,CAAA;AACnB,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,cAAA,GAAiBA,YAAY,YAAY;AAC7C,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,SAAA,CAAU,cAAc,EAAE,QAAA,EAAU,OAAO,CAAA;AAChE,MAAA,cAAA,CAAe,MAAM,CAAA;AACrB,MAAA,gBAAA,CAAiB,oBAAA,CAAqB,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,IACtD,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA;AAAA,QACE,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,OACvC;AAAA,IACF,CAAA,SAAE;AACA,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,KAAK,CAAC,CAAA;AAErB,EAAA,MAAM,UAAA,GAAaA,YAAY,YAAY;AACzC,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AAGF,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,SAAS,MAAM,SAAA,CAAU,cAAc,EAAE,QAAA,EAAU,OAAO,CAAA;AAChE,QAAA,cAAA,CAAe,MAAM,CAAA;AACrB,QAAA,gBAAA,CAAiB,oBAAA,CAAqB,KAAA,EAAO,MAAM,CAAC,CAAA;AACpD,QAAA,MAAM,MAAA,GAAS,iBAAiB,MAAM,CAAA;AACtC,QAAA,IAAI,SAAS,CAAA,EAAG;AACd,UAAA,aAAA,CAAc,IAAI,CAAA;AAClB,UAAA,QAAA;AAAA,YACE,GAAG,MAAM,CAAA,CAAA,EAAI,MAAA,KAAW,CAAA,GAAI,UAAU,QAAQ,CAAA,2EAAA;AAAA,WAEhD;AACA,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,EAAE,QAAA,EAAU,OAAO,CAAA;AAC7C,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,aAAA,CAAc,IAAI,CAAA;AAElB,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,QAAA,CAAS,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,eAAe,CAAA;AACpD,MAAA,MAAM,OAAA,IAAU;AAChB,MAAA,KAAA,EAAM;AAAA,IACR,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA;AAAA,QACE,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,OACvC;AAAA,IACF,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,QAAA,EAAU,SAAS,UAAA,EAAY,SAAA,EAAW,KAAK,CAAC,CAAA;AAE3D,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,eAAe,CAAC,QAAA,IAAY,aAAa,IAAA,EAAM;AAC7D,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,eAAe,IAAA,GAAsB;AACnC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,iBAAA,CAAkB;AAAA,UAC/C,QAAQ,UAAA,CAAW;AAAA,SACpB,CAAA;AACD,QAAA,IAAI,CAAC,SAAA,EAAW,WAAA,CAAY,MAAM,CAAA;AAAA,MACpC,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,QAAA;AAAA,UACE,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,SACvC;AACA,QAAA,WAAA,CAAY,EAAE,CAAA;AAAA,MAChB;AAAA,IACF;AACA,IAAA,KAAK,IAAA,EAAK;AACV,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB,CAAA;AAAA,EACF,GAAG,CAAC,SAAA,EAAW,aAAa,IAAA,EAAM,QAAA,EAAU,QAAQ,CAAC,CAAA;AAErD,EAAA,MAAM,aAAA,GAAgBF,WAAAA;AAAA,IACpB,OAAO,OAAA,KAAoB;AACzB,MAAA,cAAA,CAAe,OAAO,CAAA;AACtB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,SAAA,CAAU,gBAAA,CAAiB,EAAE,SAAS,CAAA;AAC7D,QAAA,QAAA,CAAS,SAAS,QAAQ,CAAA;AAC1B,QAAA,aAAA,CAAc,OAAO,CAAA;AACrB,QAAA,cAAA,CAAe,IAAI,CAAA;AACnB,QAAA,gBAAA,CAAiB,EAAE,CAAA;AAAA,MACrB,SAAS,GAAA,EAAK;AACZ,QAAA,QAAA;AAAA,UACE,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,SACvC;AAAA,MACF,CAAA,SAAE;AACA,QAAA,cAAA,CAAe,IAAI,CAAA;AAAA,MACrB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,OAAO,OAAA,KAAoB;AACzB,MAAA,cAAA,CAAe,OAAO,CAAA;AACtB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,MAAM,SAAA,CAAU,mBAAA,CAAoB,EAAE,SAAS,CAAA;AAC7D,QAAA,QAAA,CAAS,MAAM,QAAQ,CAAA;AACvB,QAAA,aAAA,CAAc,MAAM,QAAQ,CAAA;AAC5B,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA,aAAA,CAAc,KAAK,CAAA;AACnB,QAAA,WAAA,CAAY,IAAI,CAAA;AAChB,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAS,WAAW,OAAO,CAAA,cAAA;AAAA,SAC5B,CAAA;AACD,QAAA,MAAM,OAAA,IAAU;AAAA,MAClB,SAAS,GAAA,EAAK;AACZ,QAAA,QAAA;AAAA,UACE,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,SACvC;AAAA,MACF,CAAA,SAAE;AACA,QAAA,cAAA,CAAe,IAAI,CAAA;AAAA,MACrB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS;AAAA,GAC/B;AAEA,EAAA,MAAM,UAAA,GAAa,WAAA,GAAc,gBAAA,CAAiB,WAAW,CAAA,GAAI,CAAA;AACjE,EAAA,MAAM,gBAAA,GACJ,UAAA,KAAe,IAAA,KACd,QAAA,EAAU,IAAA;AAAA,IACT,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,KAAY,cAAc,KAAA,CAAM;AAAA,GACnD,IACE,KAAA,CAAA;AACJ,EAAA,MAAM,iBAAA,GAAoB,cAAc,CAAC,CAAA;AAEzC,EAAA,uBACEF,GAAAA;AAAA,IAAC,EAAA,CAAG,KAAA;AAAA,IAAH;AAAA,MACC,IAAA;AAAA,MACA,IAAA,EAAK,IAAA;AAAA,MACL,OACE,QAAA,GACI,CAAA,cAAA,EAAiB,KAAA,GAAQ,oBAAA,GAAuB,EAAE,CAAA,CAAA,GAClD,4BAAA;AAAA,MAEN,WAAA,EAAY,+LAAA;AAAA,MACZ,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,QAAA,IAAI,CAAC,MAAM,KAAA,EAAM;AAAA,MACnB,CAAA;AAAA,MACA,MAAA,kBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,EAAA,CAAG,MAAA,EAAH,EAAU,OAAA,EAAQ,WAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,KAAA,EACvD,QAAA,EAAA,QAAA,GAAW,QAAA,GAAW,OAAA,EACzB,CAAA;AAAA,QACC,2BACCA,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,UAAU,MAAA,IAAU,OAAA;AAAA,YACpB,SAAS,MAAM;AACb,cAAA,KAAK,UAAA,EAAW;AAAA,YAClB,CAAA;AAAA,YAEC,uBAAa,aAAA,GAAgB;AAAA;AAAA,SAChC,GACE;AAAA,OAAA,EACN,CAAA;AAAA,MAGF,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAEX,QAAA,EAAA;AAAA,YACE,CAAC,WAAW,SAAS,CAAA;AAAA,YACrB,CAAC,QAAQ,MAAM;AAAA,YAEjB,GAAA,CAAI,CAAC,CAAC,EAAA,EAAI,KAAK,sBACfA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,gBAAc,IAAA,KAAS,EAAA;AAAA,cACvB,SAAA,EAAW,EAAA;AAAA,gBACT,2BAAA;AAAA,gBACA,IAAA,KAAS,KACL,sBAAA,GACA;AAAA,eACN;AAAA,cACA,SAAS,MAAM;AACb,gBAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,cACZ,CAAA;AAAA,cAEC,QAAA,EAAA;AAAA,aAAA;AAAA,YAbI;AAAA,WAeR,CAAA,EACH,CAAA;AAAA,UAEC,QAAA,mBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA;AAAA,cAAC,EAAA,CAAG,IAAA;AAAA,cAAH;AAAA,gBACC,SAAA,EAAU,mBAAA;AAAA,gBACV,yBACEA,GAAAA;AAAA,kBAAC,EAAA,CAAG,MAAA;AAAA,kBAAH;AAAA,oBACC,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAQ,WAAA;AAAA,oBACR,QAAA,EAAU,WAAW,IAAA,KAAS,MAAA;AAAA,oBAC9B,KAAA,EACE,IAAA,KAAS,MAAA,GACL,sCAAA,GACA,iDAAA;AAAA,oBAEP,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gBAEF,KAAA,EAAO,eAAA,CAAgB,GAAA,CAAI,CAAC,QAAA,MAAc;AAAA,kBACxC,IAAI,QAAA,CAAS,EAAA;AAAA,kBACb,OAAO,QAAA,CAAS,KAAA;AAAA,kBAChB,UAAU,IAAA,KAAS,MAAA;AAAA,kBACnB,UAAU,MAAM;AACd,oBAAA,QAAA;AAAA,sBAAS,CAAC,OAAA,KACR,mBAAA,CAAoB,OAAA,EAAS,QAAQ;AAAA,qBACvC;AAAA,kBACF;AAAA,iBACF,CAAE;AAAA;AAAA,aACJ;AAAA,4BACAA,GAAAA;AAAA,cAAC,EAAA,CAAG,MAAA;AAAA,cAAH;AAAA,gBACC,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAS,cAAc,SAAA,GAAY,WAAA;AAAA,gBACnC,QAAA,EAAU,OAAA;AAAA,gBACV,SAAS,MAAM;AACb,kBAAA,cAAA,CAAe,CAAC,OAAA,KAAY,CAAC,OAAO,CAAA;AAAA,gBACtC,CAAA;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BACAA,GAAAA;AAAA,cAAC,EAAA,CAAG,MAAA;AAAA,cAAH;AAAA,gBACC,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAQ,WAAA;AAAA,gBACR,UAAU,UAAA,IAAc,OAAA;AAAA,gBACxB,SAAS,MAAM;AACb,kBAAA,KAAK,cAAA,EAAe;AAAA,gBACtB,CAAA;AAAA,gBAEC,uBAAa,eAAA,GAAkB;AAAA;AAAA;AAClC,WAAA,EACF,CAAA,GACE;AAAA,SAAA,EACN,CAAA;AAAA,QAEC,eAAe,IAAA,mBACdD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sFAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,UACE,QAAA,EAAA,gBAAA,GACG,CAAA,gBAAA,EAAmB,UAAU,CAAA,uCAAA,CAAA,GAC7B,CAAA,gBAAA,EAAmB,UAAU,CAAA,+DAAA,CAAA,EACnC,CAAA;AAAA,UACC,CAAC,mCACAA,GAAAA;AAAA,YAAC,EAAA,CAAG,MAAA;AAAA,YAAH;AAAA,cACC,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAQ,WAAA;AAAA,cACR,UAAU,WAAA,KAAgB,IAAA;AAAA,cAC1B,SAAS,MAAM;AACb,gBAAA,KAAK,cAAc,UAAU,CAAA;AAAA,cAC/B,CAAA;AAAA,cAEC,6BAAmB,UAAU,CAAA;AAAA;AAAA,WAChC,GACE;AAAA,SAAA,EACN,CAAA,GACE,IAAA;AAAA,wBAEJD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACZ,oCACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mCAAA,EAAoC,QAAA,EAAA,uBAAA,EAEjD,CAAA,GACE,IAAA,KAAS,4BACXA,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,QAAA,EAAU,KAAA;AAAA,cACV,QAAA,EAAU,QAAA;AAAA,cACV,UAAU,CAAC,QAAA;AAAA,cACX,cAAc,MAAM;AAClB,gBAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,cAChB;AAAA;AAAA,8BAGFA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,KAAA;AAAA,cACA,QAAA,EAAS,MAAA;AAAA,cACT,UAAU,CAAC,QAAA;AAAA,cACX,OAAA;AAAA,cACA,SAAA,EAAU,qBAAA;AAAA,cACV,QAAA,EAAU;AAAA;AAAA,WACZ,EAEJ,CAAA;AAAA,UAEC,YAAY,WAAA,mBACXD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2CAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,4BACnDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+CAA8C,QAAA,EAAA,qHAAA,EAG3D,CAAA;AAAA,YACC,QAAA,KAAa,IAAA,mBACZA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,oBAAA,EAE7C,CAAA,GACE,QAAA,CAAS,MAAA,KAAW,CAAA,mBACtBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,yFAAA,EAG7C,CAAA,mBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,WAAA,EACX,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY;AACzB,cAAA,MAAM,KAAA,GAAQ,gBAAgB,OAAO,CAAA;AACrC,cAAA,uBACED,IAAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBAEC,SAAA,EAAW,EAAA;AAAA,oBACT,+BAAA;AAAA,oBACA,OAAA,CAAQ,YACJ,mCAAA,GACA;AAAA,mBACN;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACZ,QAAA,EAAA;AAAA,sBAAA,KAAA,CAAM,KAAA;AAAA,sBACN,OAAA,CAAQ,4BACPC,GAAAA;AAAA,wBAAC,EAAA,CAAG,KAAA;AAAA,wBAAH;AAAA,0BACC,IAAA,EAAK,SAAA;AAAA,0BACL,KAAA,EAAM,iCAAA;AAAA,0BACP,QAAA,EAAA;AAAA;AAAA,uBAED,GACE;AAAA,qBAAA,EACN,CAAA;AAAA,oCACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACZ,gBAAM,MAAA,EACT,CAAA;AAAA,oCACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACb,QAAA,EAAA;AAAA,sCAAAC,GAAAA;AAAA,wBAAC,EAAA,CAAG,MAAA;AAAA,wBAAH;AAAA,0BACC,IAAA,EAAK,IAAA;AAAA,0BACL,OAAA,EAAQ,WAAA;AAAA,0BACR,UAAU,WAAA,KAAgB,IAAA;AAAA,0BAC1B,SAAS,MAAM;AACb,4BAAA,KAAK,aAAA,CAAc,QAAQ,OAAO,CAAA;AAAA,0BACpC,CAAA;AAAA,0BACD,QAAA,EAAA;AAAA;AAAA,uBAED;AAAA,sCACAA,GAAAA;AAAA,wBAAC,EAAA,CAAG,MAAA;AAAA,wBAAH;AAAA,0BACC,IAAA,EAAK,IAAA;AAAA,0BACL,OAAA,EAAQ,WAAA;AAAA,0BACR,QAAA,EAAU,WAAA,KAAgB,IAAA,IAAQ,OAAA,CAAQ,SAAA;AAAA,0BAC1C,OACE,OAAA,CAAQ,SAAA,GACJ,oDAAA,GACA,CAAA,aAAA,EAAgB,QAAQ,OAAO,CAAA,WAAA,CAAA;AAAA,0BAErC,SAAS,MAAM;AACb,4BAAA,KAAK,aAAA,CAAc,QAAQ,OAAO,CAAA;AAAA,0BACpC,CAAA;AAAA,0BACD,QAAA,EAAA;AAAA;AAAA;AAED,qBAAA,EACF;AAAA;AAAA,iBAAA;AAAA,gBAhDK,OAAA,CAAQ;AAAA,eAiDf;AAAA,YAEJ,CAAC,CAAA,EACH;AAAA,WAAA,EAEJ,CAAA,GACE;AAAA,SAAA,EACN,CAAA;AAAA,QAEC,KAAA,KAAU,uBACTA,GAAAA,CAAC,SAAI,SAAA,EAAU,2FAAA,EACZ,iBACH,CAAA,GACE,IAAA;AAAA,QAEH,iBAAA,mBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8EAAA,EACZ,QAAA,EAAA,CAAA,4BAAA,EAA+B,iBAAA,CAAkB,OAAO,CAAA,OAAA,EAAU,iBAAA,CAAkB,eAAe,KACtG,CAAA,GACE,IAAA;AAAA,QAEH,WAAA,mBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4EAAA,EACZ,QAAA,EAAA;AAAA,UAAA,UAAA,KAAe,CAAA,mBACdC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACZ,QAAA,EAAA,CAAA,gBAAA,EAAmB,WAAA,CAAY,WAAA,CAAY,MAAM,CAAA,cAAA,EAAiB,WAAA,CAAY,QAAA,CAAS,MAAM,CAAA,WAAA,EAAc,WAAA,CAAY,aAAA,CAAc,MAAM,CAAA,gBAAA,EAAmB,WAAA,CAAY,OAAA,CAAQ,MAAM,CAAA,SAAA,CAAA,EAC3L,CAAA,mBAEAD,IAAAA,CAAAe,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAd,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA,CAAA,EAAG,UAAU,CAAA,mCAAA,CAAA,EAChB,CAAA;AAAA,YACC,eAAA,CAAgB,WAAW,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBACvCA,GAAAA,CAAC,KAAA,EAAA,EAAgB,SAAA,EAAU,uBAAA,EACxB,QAAA,EAAA,IAAA,EAAA,EADO,KAEV,CACD;AAAA,WAAA,EACH,CAAA;AAAA,UAED,eAAe,WAAW,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,KAAA,qBACtCA,GAAAA,CAAC,KAAA,EAAA,EAA0B,WAAU,uBAAA,EAClC,QAAA,EAAA,IAAA,EAAA,EADO,CAAA,KAAA,EAAQ,KAAK,EAEvB,CACD;AAAA,SAAA,EACH,CAAA,GACE;AAAA,OAAA,EACN;AAAA;AAAA,GACF;AAEJ;ACxiBO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,uBACED,IAAAA;AAAA,IAAC,EAAA,CAAG,KAAA;AAAA,IAAH;AAAA,MACC,IAAA;AAAA,MACA,YAAA;AAAA,MACA,IAAA,EAAK,IAAA;AAAA,MACL,KAAA,EAAO,SAAA,KAAc,EAAA,GAAK,iBAAA,GAAoB,eAAe,SAAS,CAAA,CAAA;AAAA,MAErE,QAAA,EAAA;AAAA,QAAA,OAAA,oBACCC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,uCAAA,EAElD,CAAA;AAAA,QAED,CAAC,OAAA,IAAW,KAAA,KAAU,IAAA,oBACrBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,IAAA,EAAK,OAAA,EAC/C,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,QAED,CAAC,WAAW,KAAA,KAAU,IAAA,IAAQ,WAAW,IAAA,oBACxCD,IAAAA,CAAAe,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAd,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EACV,QAAA,EAAA,MAAA,CAAO,SAAA,GACJ,CAAA,kBAAA,EAAqB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,cAAA,EAAgB,CAAA,IAAA,EAAO,MAAA,CAAO,SAAA,CAAU,cAAA,EAAgB,CAAA,eAAA,CAAA,GAChG,CAAA,EAAG,MAAA,CAAO,SAAA,CAAU,cAAA,EAAgB,CAAA,UAAA,EAAa,MAAA,CAAO,SAAA,KAAc,CAAA,GAAI,KAAA,GAAQ,MAAM,CAAA,CAAA,CAAA,EAC9F,CAAA;AAAA,0BACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCACb,QAAA,kBAAAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gCAAA,EACf,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,OAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EACE,iBAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACnBA,GAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBAEC,KAAA,EAAM,KAAA;AAAA,gBACN,SAAA,EAAU,mDAAA;AAAA,gBAET,QAAA,EAAA,MAAA,CAAO;AAAA,eAAA;AAAA,cAJH,MAAA,CAAO;AAAA,aAMf,GACH,CAAA,EACF,CAAA;AAAA,4BACAD,KAAC,OAAA,EAAA,EACE,QAAA,EAAA;AAAA,cAAA,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,0BACrBC,GAAAA,CAAC,IAAA,EAAA,EAAe,SAAA,EAAU,0BACvB,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,2BACnBA,GAAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBAEC,SAAA,EAAU,6BAAA;AAAA,kBAET,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC;AAAA,iBAAA;AAAA,gBAHpB,MAAA,CAAO;AAAA,eAKf,CAAA,EAAA,EARM,KAST,CACD,CAAA;AAAA,cACA,OAAO,IAAA,CAAK,MAAA,KAAW,qBACtBA,GAAAA,CAAC,QACC,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,SAAS,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,kBAC1C,SAAA,EAAU,6CAAA;AAAA,kBACX,QAAA,EAAA;AAAA;AAAA,eAED,EACF;AAAA,aAAA,EAEJ;AAAA,WAAA,EACF,CAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ;;;ACyMO,IAAM,mBAAA,GAAN,cAAkC,KAAA,CAAM;AAAA,EACpC,QAAA,GAAW,IAAA;AAAA,EACpB,WAAA,CAAY,UAAU,qCAAA,EAAuC;AAC3D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAEO,SAAS,iBAAiB,KAAA,EAAyB;AACxD,EAAA,OAAO,KAAA,YAAiB,mBAAA;AAC1B;AC3SA,IAAM,qCAAqB,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,OAAA,EAAS,UAAU,CAAC,CAAA;AAUzD,SAAS,gBAAA,CAAiB;AAAA,EAC/B,OAAA;AAAA,EACA,UAAU,EAAC;AAAA,EACX,SAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,KAAA,EAAO,OAAO,IAAA;AACtC,EAAA,MAAM,OAAA,GAAW,OAAA,CAAQ,OAAA,IAAW,EAAC;AACrC,EAAA,MAAM,UAAU,OAAA,CAAQ,MAAA;AAAA,IAAO,CAAC,WAC9B,kBAAA,CAAmB,GAAA,CAAI,OAAO,MAAA,CAAO,IAAA,CAAK,SAAA,IAAa,EAAE,CAAC;AAAA,GAC5D;AACA,EAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,MAAA,KAAW,QAAW,OAAO,IAAA;AAEjE,EAAA,MAAM,YAAA,GAA8B;AAAA,IAClC,GAAG,QAAA,CAAS;AAAA,MACV,OAAA,EAAS,QAAQ,OAAA,IAAW,EAAA;AAAA,MAC5B,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,IACD,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,UAAA,GACJ,QAAQ,aAAA,KAAkB,QAAA,GACtB,iBACA,OAAA,CAAQ,aAAA,KAAkB,WACxB,WAAA,GACA,aAAA;AAER,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,SAAS,CAAA,EAAG,KAAA,EAAO,YAAA,EACtD,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,oCAAA,EAAsC,UAAU,CAAA,EAChE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,GAAAA,CAAC,KAAA,EAAA,EAA6B,SAAA,EAAU,gBAAA,EACtC,QAAA,kBAAAA,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACC,GAAI,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,KAAM,MAAA,GACjC,EAAC,GACD,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EAAE;AAAA,MAC1C,SAAA,EAAU;AAAA;AAAA,OANJ,MAAA,CAAO,QAAA,CAAS,EAQ1B,CACD,GACH,CAAA,EACF,CAAA;AAEJ;AC0BA,IAAM,aAAA,GAAkC;AAAA,EACtC,IAAA,EAAM,KAAA;AAAA,EACN,KAAA,EAAO,EAAA;AAAA,EACP,OAAA,EAAS,KAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAMO,SAAS,eAAA,CAAgB;AAAA,EAC9B,SAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA,EAAS,eAAA;AAAA,EACT,cAAA;AAAA,EACA,OAAA,EAAS,iBAAA;AAAA,EACT,eAAA;AAAA,EACA,OAAA,EAAS,eAAA;AAAA,EACT,OAAA,GAAU,IAAA;AAAA,EACV,MAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAS,EAAC;AAAA,EACV,aAAA,GAAgB,IAAA;AAAA,EAChB,SAAA,EAAW,aAAA;AAAA,EACX,iBAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAS,GAAI,kBAAA,EAAmB;AACnD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIG,QAAAA,CAAkC,EAAE,CAAA;AACxE,EAAA,MAAM,UAAU,iBAAA,IAAqB,UAAA;AACrC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,QAAAA;AAAA,IAClC,kBAAkB;AAAC,GACrB;AACA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,iBAAA,EAAmB,aAAa,CAAA,GAAIA,QAAAA,CAAmB,EAAE,CAAA;AAChE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAKhB,IAAI,CAAA;AACd,EAAA,MAAM,CAACU,OAAAA,EAAQ,SAAS,CAAA,GAAIV,SAA2B,aAAa,CAAA;AACpE,EAAA,MAAM,QAAA,GAAWF,OAAO,CAAC,CAAA;AACzB,EAAA,MAAM,OAAA,GAAU,WAAA,IAAe,SAAA,CAAU,QAAA,CAAS,EAAA;AAElD,EAAA,MAAM,UAAU,eAAA,IAAmB,UAAA;AACnC,EAAA,MAAM,UAAU,eAAA,IAAmB,OAAA;AAInC,EAAA,MAAM,WAAA,GAAcA,OAAO,cAAc,CAAA;AACzC,EAAAG,UAAU,MAAM;AACd,IAAA,IACE,cAAA,KAAmB,MAAA,IACnB,WAAA,CAAY,OAAA,KAAY,cAAA,EACxB;AACA,MAAA;AAAA,IACF;AACA,IAAA,WAAA,CAAY,OAAA,GAAU,cAAA;AACtB,IAAA,aAAA,CAAc,cAAc,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAAA,UAAU,MAAM;AACd,IAAA,eAAA,GAAkB,OAAO,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,OAAA,EAAS,eAAe,CAAC,CAAA;AAE7B,EAAA,MAAM,UAAA,GAAaF,WAAAA;AAAA,IACjB,CAAC,IAAA,KAAkC;AACjC,MAAA,IAAI,eAAA,KAAoB,MAAA,EAAW,aAAA,CAAc,IAAI,CAAA;AACrD,MAAA,eAAA,GAAkB,IAAI,CAAA;AAAA,IACxB,CAAA;AAAA,IACA,CAAC,eAAe;AAAA,GAClB;AAEA,EAAA,MAAM,GAAA,GAAMA,WAAAA;AAAA,IACV,CAAC,WAAA,KAAyC;AACxC,MAAA,MAAM,KAAA,GAAQ,SAAS,OAAA,GAAU,CAAA;AACjC,MAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,SAAA,CACG,YAAA,CAAa;AAAA,QACZ,WAAA,EAAa,OAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACV,CAAA,CACA,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,QAAA,IAAI,QAAA,CAAS,YAAY,KAAA,EAAO;AAChC,QAAA,aAAA,CAAc,KAAK,OAAO,CAAA;AAAA,MAC5B,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,QAAA,IAAI,QAAA,CAAS,YAAY,KAAA,EAAO;AAChC,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,OAAA;AAAA,UACN,OAAA,EACE,KAAA,YAAiB,KAAA,GACb,KAAA,CAAM,OAAA,GACN;AAAA,SACP,CAAA;AAAA,MACH,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,QAAA,IAAI,QAAA,CAAS,OAAA,KAAY,KAAA,EAAO,UAAA,CAAW,KAAK,CAAA;AAAA,MAClD,CAAC,CAAA;AAAA,IACL,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,OAAA,EAAS,QAAQ;AAAA,GAC/B;AAEA,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,QAAA,KAAqB;AACpB,MAAA,aAAA,CAAc,CAAC,OAAA,KAAY,CAAC,GAAG,OAAA,EAAS,QAAQ,CAAC,CAAA;AACjD,MAAA,SAAA,CACG,SAAA,CAAU,EAAE,WAAA,EAAa,OAAA,EAAS,QAAA,EAAU,SAAS,CAAA,CACrD,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,QAAA,aAAA,CAAc,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,QAAQ,GAAG,MAAA,EAAO,CAAE,CAAA;AAAA,MACjE,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,OAAA;AAAA,UACN,OAAA,EACE,KAAA,YAAiB,KAAA,GACb,KAAA,CAAM,OAAA,GACN;AAAA,SACP,CAAA;AAAA,MACH,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,QAAA,aAAA,CAAc,CAAC,YAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,KAAO,QAAQ,CAAC,CAAA;AAAA,MACpE,CAAC,CAAA;AAAA,IACL,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,OAAA,EAAS,OAAA,EAAS,QAAQ;AAAA,GACxC;AAIA,EAAA,MAAM,OAAA,GAAUD,MAAAA;AAAA,IACd,cAAA,KAAmB,MAAA,GAAY,IAAA,GAAO,IAAA,CAAK,UAAU,OAAO;AAAA,GAC9D;AACA,EAAAG,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,eAAA,KAAoB,MAAA,EAAW;AAC/C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AACxC,IAAA,IAAI,OAAA,CAAQ,YAAY,SAAA,EAAW;AACnC,IAAA,OAAA,CAAQ,OAAA,GAAU,SAAA;AAClB,IAAA,GAAA,CAAI,OAAO,CAAA;AAAA,EACb,GAAG,CAAC,OAAA,EAAS,eAAA,EAAiB,OAAA,EAAS,GAAG,CAAC,CAAA;AAE3C,EAAA,MAAM,iBAAA,GAAoBF,WAAAA;AAAA,IACxB,CAAC,aAAgC,OAAA,KAAsC;AACrE,MAAA,IAAI,WAAA,CAAY,IAAA,KAAS,WAAA,IAAe,WAAA,CAAY,YAAY,OAAA,EAAS;AACvE,QAAA,QAAA,CAAS;AAAA,UACP,IAAI,WAAA,CAAY,MAAA;AAAA,UAChB,IAAA,EAAM,YAAY,KAAA,IAAS,SAAA;AAAA,UAC3B,SACE,WAAA,CAAY,YAAA,KAAiB,OACzB,EAAE,GAAG,SAAS,GAAI,OAAA,CAAQ,IAAA,IAAQ,IAAI,GACtC,EAAE,GAAI,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG;AAAA,UAChC,OAAO;AAAC,SACT,CAAA;AACD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,WAAA,CAAY,SAAS,YAAA,EAAc;AACrC,QAAA,UAAA,CAAW,EAAE,GAAG,OAAA,EAAS,GAAI,QAAQ,IAAA,IAAQ,IAAK,CAAA;AAAA,MACpD;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAS,UAAU;AAAA,GACtB;AAEA,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACxB,CAAC,OAAA,KAAgC;AAC/B,MAAA,MAAM,YAAY,SAAA,CAAU,eAAA;AAC5B,MAAA,IAAI,cAAc,MAAA,EAAW;AAC7B,MAAA,SAAA,CAAU;AAAA,QACR,IAAA,EAAM,IAAA;AAAA,QACN,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,OAAA,EAAS,IAAA;AAAA,QACT,KAAA,EAAO,IAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,SAAA,CAAU;AAAA,QACR,WAAA,EAAa,OAAA;AAAA,QACb,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,OAAA;AAAA,QACA,MAAM,OAAA,CAAQ,OAAA;AAAA,QACd,OAAO,OAAA,CAAQ;AAAA,OAChB,CAAA,CACE,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,QAAA,SAAA,CAAU;AAAA,UACR,IAAA,EAAM,IAAA;AAAA,UACN,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,IAAA;AAAA,UACP;AAAA,SACD,CAAA;AAAA,MACH,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,QAAA,SAAA,CAAU;AAAA,UACR,IAAA,EAAM,IAAA;AAAA,UACN,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EACE,KAAA,YAAiB,KAAA,GACb,KAAA,CAAM,OAAA,GACN,2CAAA;AAAA,UACN,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACL,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,OAAA,EAAS,OAAO;AAAA,GAC9B;AAEA,EAAA,MAAM,aAAA,GAAgBI,OAAAA;AAAA,IACpB,MACE,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,MAAA,KAAW;AACxC,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,aAAa,EAAE,CAAA;AACpD,MAAA,OAAO,SAAA,KAAc,YAAY,SAAA,KAAc,QAAA;AAAA,IACjD,CAAC,CAAA;AAAA,IACH,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,IAAA,GAAOA,QAAQ,MAAM,aAAA,CAAc,SAAS,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAChE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,SAA6B,MAAS,CAAA;AAClE,EAAA,MAAM,UAAA,GAAa,aAAA,IAAiB,MAAA,IAAU,YAAA,CAAa,IAAI,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAeD,WAAAA;AAAA,IACnB,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,aAAA,KAAkB,MAAA,EAAW,SAAA,CAAU,KAAK,CAAA;AAChD,MAAA,iBAAA,GAAoB,KAAK,CAAA;AAAA,IAC3B,CAAA;AAAA,IACA,CAAC,eAAe,iBAAiB;AAAA,GACnC;AACA,EAAA,MAAM,UAAA,GAAaI,QAAQ,MAAM;AAC/B,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,OAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,CAAC,KAAA,KAAU,MAAM,EAAA,KAAO,UAAU,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA;AACnE,IAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,OAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,YAAA,CAAa,GAAG,CAAC,CAAA;AACrC,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,CAAA,EAAG,OAAO,OAAA;AAC3B,IAAA,OAAO,MAAA,CAAO,WAAA;AAAA,MACZ,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,EAAE,CAAA,KAAM,GAAA,CAAI,GAAA,CAAI,EAAE,CAAC;AAAA,KACtD;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,UAAA,EAAY,OAAO,CAAC,CAAA;AAE9B,EAAA,MAAM,KAAA,GAAQ,kBAAkB,SAAS,CAAA;AACzC,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ,MAAA;AAC7C,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ,MAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA;AAAA,IACvC,CAAC,MAAA,KAAW,mBAAA,CAAoB,MAAM,CAAA,KAAM;AAAA,GAC9C;AAEA,EAAA,uBACEN,GAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,SAAA,EAAW,CAAC,EAAA,EAAI,KAAA,KAAU;AACxB,QAAA,UAAA,CAAW,EAAE,GAAG,OAAA,EAAS,CAAC,EAAE,GAAG,OAAO,CAAA;AAAA,MACxC,CAAA;AAAA,MAEA,QAAA,kBAAAD,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,EAAA,CAAG,4CAAA,EAA8C,SAAS,CAAA;AAAA,UACrE,mBAAA,EAAmB,UAAU,QAAA,CAAS,EAAA;AAAA,UACtC,kBAAA,EAAkB,YAAY,MAAA,GAAS,MAAA;AAAA,UAEvC,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,uBAAoB,OAAA,EAAkB,CAAA;AAAA,YACtC,MAAA;AAAA,YACA,aAAA,KAAkB,UAAa,aAAA,KAAkB,IAAA,oBAChDA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,aAAA,EAAe,OAAA,EAAkB,CAAA;AAAA,YAE7D,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,OAAA,KAAY,yBACxCA,GAAAA;AAAA,cAAC,oBAAA;AAAA,cAAA;AAAA,gBACC,MAAA,EAAQ,KAAA;AAAA,gBACR,OAAA,EAAS,aAAA;AAAA,gBACT;AAAA;AAAA,aACF;AAAA,YAED,iCACCA,GAAAA;AAAA,cAAC,kBAAA;AAAA,cAAA;AAAA,gBACC,WAAW,MAAM;AACf,kBAAA,GAAA,CAAI,OAAO,CAAA;AAAA,gBACb,CAAA;AAAA,gBACA,UAAA,EAAY;AAAA;AAAA,aACd;AAAA,YAED,IAAA,CAAK,MAAA,GAAS,CAAA,oBACbA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,uDAAA;AAAA,gBACV,IAAA,EAAK,SAAA;AAAA,gBAEJ,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACTA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBAEC,IAAA,EAAK,QAAA;AAAA,oBACL,IAAA,EAAK,KAAA;AAAA,oBACL,eAAA,EAAe,IAAI,EAAA,KAAO,UAAA;AAAA,oBAC1B,eAAa,GAAA,CAAI,EAAA;AAAA,oBACjB,SAAA,EAAW,EAAA;AAAA,sBACT,qBAAA;AAAA,sBACA,GAAA,CAAI,EAAA,KAAO,UAAA,GACP,yCAAA,GACA;AAAA,qBACN;AAAA,oBACA,SAAS,MAAM;AACb,sBAAA,YAAA,CAAa,IAAI,EAAE,CAAA;AAAA,oBACrB,CAAA;AAAA,oBAEC,QAAA,EAAA,GAAA,CAAI;AAAA,mBAAA;AAAA,kBAfA,GAAA,CAAI;AAAA,iBAiBZ;AAAA;AAAA,aACH;AAAA,4BAEFA,GAAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBACC,SAAA;AAAA,gBACA,OAAA,EAAS,UAAA;AAAA,gBACT,OAAA;AAAA,gBACA,OAAA;AAAA,gBACA,aAAA,EAAe,iBAAA;AAAA,gBACf,aAAA,EAAe,iBAAA;AAAA,gBACf,eAAA,EAAiB,aAAA;AAAA,gBACjB,aAAA,EAAe,aAAA;AAAA,gBACf,gBAAA,EAAkB,iBAAA;AAAA,gBACjB,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAC,GAAI,EAAE,aAAA,EAAc;AAAA,gBACvD,GAAG;AAAA;AAAA,aACN;AAAA,YACC,aAAA,KAAkB,UAAa,aAAA,KAAkB,IAAA,oBAChDA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,aAAA,EAAe,OAAA,EAAkB,CAAA;AAAA,YAE7D,KAAA,KAAU,wBACTA,GAAAA;AAAA,cAAC,cAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAI,IAAA;AAAA,gBACJ,aAAa,KAAA,CAAM,EAAA;AAAA,gBACnB,eAAe,KAAA,CAAM,IAAA;AAAA,gBACrB,gBAAgB,KAAA,CAAM,OAAA;AAAA,gBACtB,aAAa,KAAA,CAAM,KAAA;AAAA,gBACnB,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,kBAAA,IAAI,CAAC,IAAA,EAAM,QAAA,CAAS,IAAI,CAAA;AAAA,gBAC1B;AAAA;AAAA,aACF;AAAA,4BAEFA,GAAAA;AAAA,cAAC,gBAAA;AAAA,cAAA;AAAA,gBACC,MAAMa,OAAAA,CAAO,IAAA;AAAA,gBACb,WAAWA,OAAAA,CAAO,KAAA;AAAA,gBAClB,SAASA,OAAAA,CAAO,OAAA;AAAA,gBAChB,OAAOA,OAAAA,CAAO,KAAA;AAAA,gBACd,QAAQA,OAAAA,CAAO,MAAA;AAAA,gBACf,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,kBAAA,IAAI,CAAC,IAAA,EAAM,SAAA,CAAU,aAAa,CAAA;AAAA,gBACpC;AAAA;AAAA;AACF;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;AC1YO,SAAS,qBAAA,CAAsB;AAAA,EACpC,WAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA,GAAc,CAAA;AAAA,EACd,QAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAA+B;AAC7B,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,kBAAA,EAAmB;AACzC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIV,SAAiC,IAAI,CAAA;AACjE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,QAAAA;AAAA,IAC5B,WAAW;AAAC,GACd;AACA,EAAA,MAAM,KAAA,GAAQF,OAAO,CAAC,CAAA;AACtB,EAAA,MAAM,UAAA,GAAaA,OAAO,WAAW,CAAA;AACrC,EAAA,MAAM,UAAA,GAAaA,OAAO,OAAO,CAAA;AACjC,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAGrB,EAAA,MAAM,WAAA,GAAcA,OAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,EAAA,MAAM,kBAAA,GAAqBA,OAAO,eAAe,CAAA;AACjD,EAAA,kBAAA,CAAmB,OAAA,GAAU,eAAA;AAC7B,EAAA,MAAM,aAAA,GAAgBC,WAAAA,CAAY,CAAC,IAAA,KAAkC;AACnE,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,kBAAA,CAAmB,UAAU,IAAI,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,OAAA,IAAW,IAAI,CAAA;AAEhD,EAAA,MAAM,IAAA,GAAOA,WAAAA;AAAA,IACX,CAAC,OAAuC,OAAA,KAAqB;AAC3D,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,GAAU,CAAA;AAChC,MAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAChB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA,MACnB,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,UAAA,CAAW,KAAA,IAAS,EAAE,CAAA;AAAA,MACxB;AACA,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,SAAA,CACG,YAAA,CAAa;AAAA,QACZ,WAAA;AAAA,QACA,GAAI,KAAA,KAAU,IAAA,GAAO,EAAC,GAAI,EAAE,SAAS,KAAA;AAAM,OAC5C,CAAA,CACA,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,QAAA,IAAI,KAAA,CAAM,YAAY,OAAA,EAAS;AAC/B,QAAA,MAAM,IAAA,GAAO;AAAA,UACX,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,SAAS,IAAA,CAAK;AAAA,SAChB;AACA,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,WAAA,CAAY,UAAU,IAAI,CAAA;AAAA,MAC5B,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,MAAA,KAAoB;AAC1B,QAAA,IAAI,KAAA,CAAM,YAAY,OAAA,EAAS;AAC/B,QAAA,QAAA;AAAA,UACE,MAAA,YAAkB,KAAA,GACd,MAAA,CAAO,OAAA,GACP;AAAA,SACN;AAAA,MACF,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,QAAA,IAAI,KAAA,CAAM,OAAA,KAAY,OAAA,EAAS,YAAA,CAAa,KAAK,CAAA;AAAA,MACnD,CAAC,CAAA;AAAA,IACL,CAAA;AAAA,IACA,CAAC,WAAW,WAAW;AAAA,GACzB;AAEA,EAAAE,UAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAClC,IAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAEpB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,UAAA,CAAW,YAAY,WAAA,EAAa;AACxC,IAAA,UAAA,CAAW,OAAA,GAAU,WAAA;AACrB,IAAA,IAAA,CAAK,UAAA,CAAW,SAAS,IAAI,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,WAAA,EAAa,IAAI,CAAC,CAAA;AAEtB,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,MAAA,KAAW,IAAA,EAAM;AACrC,IAAA,uBAAOJ,GAAAA,CAAC,WAAA,EAAA,EAAY,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,uBAAOA,GAAAA,CAAC,aAAA,EAAA,EAAc,QAAA,EAAS,SAAA,EAAU,SAAQ,mBAAA,EAAoB,CAAA;AAAA,EACvE;AACA,EAAA,uBACEA,GAAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,WAAA;AAAA,MACA,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,gBAAgB,MAAA,CAAO,OAAA;AAAA,MACvB,OAAA,EAAS,OAAA;AAAA,MACT,eAAA,EAAiB,aAAA;AAAA,MACjB,MAAA;AAAA,MACC,GAAI,SAAA,KAAc,MAAA,GAAY,EAAC,GAAI,EAAE,SAAA,EAAU;AAAA,MAC/C,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAC,GAAI,EAAE,aAAA,EAAc;AAAA,MACvD,GAAI,SAAA,GAAY,EAAE,OAAA,EAAS,IAAA,KAAS,EAAC;AAAA,MACrC,GAAI,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAO;AAAA,MACzC,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAC,GAAI,EAAE,aAAA,EAAc;AAAA,MACvD,GAAI,SAAA,KAAc,MAAA,GAAY,EAAC,GAAI,EAAE,SAAA,EAAU;AAAA,MAC/C,GAAI,iBAAA,KAAsB,MAAA,GAAY,EAAC,GAAI,EAAE,iBAAA,EAAkB;AAAA,MAC/D,GAAI,eAAA,KAAoB,MAAA,GAAY,EAAC,GAAI,EAAE,eAAA;AAAgB;AAAA,GAC9D;AAEJ;ACtDA,SAAS,OAAA,CAAQ,GAAsB,CAAA,EAA+B;AACpE,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAC,CAAA;AACrB,EAAA,OAAO,EAAE,KAAA,CAAM,CAAC,OAAO,GAAA,CAAI,GAAA,CAAI,EAAE,CAAC,CAAA;AACpC;AAQO,SAAS,cAAA,CAAe;AAAA,EAC7B,WAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,OAAA;AAAA,EACA;AACF,CAAA,EAAuC;AACrC,EAAA,MAAM,QAAA,GAAW,uBAAuB,WAAW,CAAA,CAAA;AACnD,EAAA,MAAM,CAAC,QAAA,EAAU,gBAAgB,CAAA,GAAIG,SAAS,KAAK,CAAA;AACnD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAAA;AAAA,IACpC;AAAA,GACF;AACA,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,QAAAA;AAAA,IACtC;AAAA,GACF;AACA,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,QAAAA,CAAwB,EAAE,CAAA;AACpE,EAAA,MAAM,CAAC,UAAA,EAAY,kBAAkB,CAAA,GAAIA,QAAAA,CAAgC,EAAE,CAAA;AAC3E,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAA+B,MAAS,CAAA;AACxE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAoB,IAAI,CAAA;AACtE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChE,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClE,EAAA,MAAM,WAAA,GAAcF,OAA4B,IAAI,CAAA;AACpD,EAAA,MAAM,QAAA,GAAWA,OAAO,KAAK,CAAA;AAC7B,EAAA,MAAM,UAAA,GAAaA,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,UAAA,GAAaA,OAAO,OAAO,CAAA;AACjC,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAErB,EAAA,MAAM,aAAA,GAAgB,SAAA,EAAW,iBAAA,IAAqB,EAAC;AACvD,EAAA,MAAM,oBAAoB,QAAA,IAAY,aAAA;AAEtC,EAAAG,UAAU,MAAM;AACd,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,OAAA,KAAY,IAAA,EAAM;AAC1C,IAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AACpC,IAAA,IAAI,QAAQ,IAAA,EAAM;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,cAAA,CAAe,OAAO,MAAM,CAAA;AAC5B,MAAA,IAAI,MAAA,CAAO,OAAA,KAAY,KAAA,CAAA,EAAW,eAAA,CAAgB,OAAO,OAAO,CAAA;AAChE,MAAA,IAAI,MAAA,CAAO,aAAA,EAAe,gBAAA,CAAiB,MAAA,CAAO,aAAa,CAAA;AAC/D,MAAA,IAAI,MAAA,CAAO,UAAA,EAAY,kBAAA,CAAmB,MAAA,CAAO,UAAU,CAAA;AAC3D,MAAA,IAAI,MAAA,CAAO,iBAAA,EAAmB,WAAA,CAAY,MAAA,CAAO,iBAAiB,CAAA;AAClE,MAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,WAAW,QAAQ,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA;AAEtB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,CAAC,QAAA,EAAU;AACnC,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA,OAAA,CAAQ,WAAW,QAAQ,CAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAsB;AAAA,MAC1B,MAAA,EAAQ,WAAA;AAAA,MACR,GAAI,YAAA,KAAiB,MAAA,GAAY,EAAC,GAAI,EAAE,SAAS,YAAA,EAAa;AAAA,MAC9D,aAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,EAClD,CAAA,EAAG;AAAA,IACD,OAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,iBAAA,GACJ,gBAAgB,MAAA,IAChB,YAAA,KAAiB,UACjB,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,MAAA,GAAS,CAAA,IACpC,OAAO,IAAA,CAAK,UAAU,EAAE,MAAA,GAAS,CAAA,IAChC,aAAa,MAAA,IAAa,CAAC,OAAA,CAAQ,QAAA,EAAU,aAAa,CAAA;AAE7D,EAAA,MAAM,UAAA,GAAaF,YAAY,MAAM;AACnC,IAAA,cAAA,CAAe,MAAS,CAAA;AACxB,IAAA,eAAA,CAAgB,MAAS,CAAA;AACzB,IAAA,gBAAA,CAAiB,EAAE,CAAA;AACnB,IAAA,kBAAA,CAAmB,EAAE,CAAA;AACrB,IAAA,WAAA,CAAY,MAAS,CAAA;AACrB,IAAA,OAAA,EAAS,WAAW,QAAQ,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA;AAEtB,EAAA,MAAM,cAAA,GAAiBA,WAAAA;AAAA,IACrB,CAAC,SAA4B,SAAA,KAAyB;AACpD,MAAA,kBAAA,CAAmB,SAAS,CAAA;AAC5B,MAAA,cAAA,CAAe,OAAO,CAAA;AAAA,IACxB,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACtB,CACE,YACA,QAAA,KACG;AACH,MAAA,gBAAA,CAAiB,CAAC,OAAA,MAAa;AAAA,QAC7B,GAAG,OAAA;AAAA,QACH,CAAC,UAAU,GAAG,EAAE,GAAG,OAAA,CAAQ,UAAU,CAAA,EAAG,GAAG,QAAA;AAAS,OACtD,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,aAAA,GAAgBA,WAAAA,CAAY,CAAC,MAAA,KAAkC;AACnE,IAAA,kBAAA,CAAmB,CAAC,OAAA,MAAa,EAAE,GAAG,OAAA,EAAS,GAAG,QAAO,CAAE,CAAA;AAAA,EAC7D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiBA,WAAAA;AAAA,IACrB,CAAC,QAAA,KAAqB;AACpB,MAAA,WAAA,CAAY,CAAC,OAAA,KAAY;AACvB,QAAA,MAAM,OAAO,OAAA,IAAW,aAAA;AACxB,QAAA,OAAO,IAAA,CAAK,SAAS,QAAQ,CAAA,GAAI,OAAO,CAAC,GAAG,MAAM,QAAQ,CAAA;AAAA,MAC5D,CAAC,CAAA;AACD,MAAA,cAAA,CAAe,CAAC,OAAA,KAAY;AAC1B,QAAA,IAAI,OAAA,KAAY,QAAW,OAAO,OAAA;AAClC,QAAA,MAAM,OAA0B,EAAC;AACjC,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,UAAA,IAAA,CAAK,GAAG,IAAI,KAAA,EAAO,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,QACzD;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,aAAa;AAAA,GAChB;AAEA,EAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,IAClB,CAAC,QAAA,KAAqB;AACpB,MAAA,MAAM,YAAA,GAAA,CAAgB,YAAY,aAAA,EAAe,MAAA;AAAA,QAC/C,CAAC,OAAO,EAAA,KAAO;AAAA,OACjB;AACA,MAAA,WAAA,CAAY,YAAY,CAAA;AACxB,MAAA,IAAI,cAAc,IAAA,EAAM;AACxB,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA;AACzC,MAAA,IAAI,WAAW,MAAA,EAAW;AAC1B,MAAA,MAAM,IAAA,GAAO;AAAA,QACX,GAAG,mBAAA;AAAA,QACH,GAAG,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ;AAAA,OACtC;AACA,MAAA,MAAM,cAAA,GAAiB,YAAA,IAAgB,IAAA,CAAK,OAAA,IAAW,MAAA;AACvD,MAAA,MAAM,IAAA,GACJ,gBAAgB,MAAA,GACZ,gBAAA;AAAA,QACE,SAAA,CAAU,OAAA;AAAA,QACV,SAAA,CAAU,SAAA;AAAA,QACV,aAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACF,GACA,qBAAA;AAAA,QACE,WAAA;AAAA,QACA,SAAA,CAAU,OAAA;AAAA,QACV,SAAA,CAAU;AAAA,OACZ;AACN,MAAA,MAAMmB,aAAAA,GAAe,sBAAA;AAAA,QACnB,IAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA,CAAU,SAAA;AAAA,QACV,aAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAIA,aAAAA,KAAiB,MAAA,IAAaA,aAAAA,KAAiB,cAAA,EAAgB;AACjE,QAAA,eAAA,CAAgBA,aAAY,CAAA;AAAA,MAC9B;AACA,MAAA,cAAA;AAAA,QACE,kBAAA;AAAA,UACE,IAAA;AAAA,UACA,MAAA;AAAA,UACA,SAAA,CAAU,SAAA;AAAA,UACV,aAAA;AAAA,UACAA,aAAAA,IAAgB;AAAA;AAClB,OACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,SAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,IAAA,GAAOnB,WAAAA;AAAA,IACX,OAAO,EAAE,KAAA,GAAQ,KAAA,EAAM,GAAyB,EAAC,KAAwB;AACvE,MAAA,IAAI,SAAA,KAAc,IAAA,IAAQ,UAAA,KAAe,MAAA,EAAW,OAAO,KAAA;AAC3D,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO;AAAA,UACX,GAAG,mBAAA;AAAA,UACH,GAAG,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ;AAAA,SACtC;AACA,QAAA,MAAM,OAAA,GAAU,YAAA,IAAgB,IAAA,CAAK,OAAA,IAAW,KAAA,CAAA;AAChD,QAAA,MAAM,iBACJ,UAAA,CAAW,cAAA,KAAmB,SACzB,IAAA,CAAK,cAAA,IAAkB,SACxB,UAAA,CAAW,cAAA;AACjB,QAAA,MAAM,YAAA,GAAuD;AAAA,UAC3D,GAAI,WAAW,SAAA,KAAc,KAAA,CAAA,GACzB,EAAC,GACD,EAAE,SAAA,EAAW,UAAA,CAAW,SAAA,EAAU;AAAA,UACtC,GAAI,WAAW,gBAAA,KAAqB,KAAA,CAAA,GAChC,EAAC,GACD,EAAE,gBAAA,EAAkB,UAAA,CAAW,gBAAA;AAAiB,SACtD;AACA,QAAA,MAAM,MAAA,GACJ,gBAAgB,KAAA,CAAA,GACZ,gBAAA;AAAA,UACE,SAAA,CAAU,OAAA;AAAA,UACV,SAAA,CAAU,SAAA;AAAA,UACV,aAAA;AAAA,UACA,iBAAA;AAAA,UACA;AAAA,SACF,GACA,qBAAA;AAAA,UACE,WAAA;AAAA,UACA,SAAA,CAAU,OAAA;AAAA,UACV,SAAA,CAAU;AAAA,SACZ;AACN,QAAA,MAAM,OAAA,GAA6B;AAAA,UACjC,WAAA;AAAA,UACA,OAAA,EAAS,eAAe,MAAM,CAAA;AAAA,UAC9B,aAAA;AAAA,UACA,iBAAA;AAAA,UACA,GAAI,OAAA,KAAY,KAAA,CAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAQ;AAAA,UAC3C,GAAI,cAAA,KAAmB,KAAA,CAAA,GAAY,EAAC,GAAI,EAAE,cAAA,EAAe;AAAA,UACzD,GAAI,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,MAAA,KAAW,CAAA,GACrC,EAAC,GACD,EAAE,IAAA,EAAM,YAAA,EAAa;AAAA,UACzB,GAAI,WAAW,WAAA,KAAgB,KAAA,CAAA,GAC3B,EAAC,GACD,EAAE,WAAA,EAAa,UAAA,CAAW,WAAA,EAAY;AAAA,UAC1C,GAAI,KAAA,IAAS,SAAA,CAAU,SAAA,KAAc,KAAA,CAAA,GACjC,EAAC,GACD,EAAE,iBAAA,EAAmB,SAAA,CAAU,SAAA;AAAU,SAC/C;AACA,QAAA,MAAM,WAAW,OAAO,CAAA;AACxB,QAAA,UAAA,EAAW;AACX,QAAA,qBAAA,CAAsB,KAAK,CAAA;AAC3B,QAAA,MAAM,WAAW,OAAA,IAAU;AAC3B,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,iBAAiB,mBAAA,EAAqB;AACxC,UAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,QAC5B,CAAA,MAAO;AACL,UAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,UAAA,UAAA,CAAW,OAAA;AAAA,YACT,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,WAC3C;AAAA,QACF;AACA,QAAA,OAAO,KAAA;AAAA,MACT,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,SAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,MAAM,QAAQ,WAAA,CAAY,OAAA;AAC1B,IAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,KAAA,EAAM;AAAA,IACR;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,IAClB,CAAC,IAAA,KAAkB;AACjB,MAAA,IAAI,IAAA,IAAQ,CAAC,iBAAA,EAAmB;AAC9B,QAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,QAAA;AAAA,MACF;AACA,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,MAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,IAC3B,CAAA;AAAA,IACA,CAAC,iBAAiB;AAAA,GACpB;AAEA,EAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,IAClB,CAAC,KAAA,KAAsB;AACrB,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,iBAAA,EAAmB;AACnC,QAAA,KAAA,EAAM;AACN,QAAA;AAAA,MACF;AACA,MAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,MAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,IAC3B,CAAA;AAAA,IACA,CAAC,UAAU,iBAAiB;AAAA,GAC9B;AAEA,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,IAAA,KAAK,IAAA,EAAK,CAAE,IAAA,CAAK,CAAC,EAAA,KAAO;AACvB,MAAA,IAAI,IAAI,UAAA,EAAW;AAAA,IACrB,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,IAAA,EAAM,UAAU,CAAC,CAAA;AAErB,EAAA,MAAM,cAAA,GAAiBA,YAAY,MAAM;AACvC,IAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,IAAA,UAAA,EAAW;AACX,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,UAAA,EAAY,UAAU,CAAC,CAAA;AAE3B,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,IAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AAAA,EACxB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,sBAAA,GAAyBA,YAAY,MAAM;AAC/C,IAAA,KAAK,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,EAAA,KAAO;AACtC,MAAA,IAAI,EAAA,IAAM,WAAA,CAAY,OAAA,KAAY,IAAA,EAAM,UAAA,EAAW;AAAA,IACrD,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,IAAA,EAAM,UAAU,CAAC,CAAA;AAErB,EAAA,MAAM,mBAAA,GAAsBA,YAAY,MAAM;AAC5C,IAAA,qBAAA,CAAsB,KAAK,CAAA;AAC3B,IAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,IAAA,UAAA,EAAW;AACX,IAAA,KAAK,WAAW,OAAA,IAAU;AAAA,EAC5B,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,OAAOI,OAAAA;AAAA,IACL,OAAO;AAAA,MACL,QAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA,iBAAA;AAAA,MACA,eAAA;AAAA,MACA,kBAAA;AAAA,MACA,iBAAA;AAAA,MACA,MAAA;AAAA,MACA,cAAA;AAAA,MACA,iBAAA,EAAmB,eAAA;AAAA,MACnB,eAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA,EAAO,UAAA;AAAA,MACP,iBAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,kBAAA;AAAA,MACA,sBAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,QAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA,iBAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,MAAA;AAAA,MACA,cAAA;AAAA,MACA,eAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA;AAAA,MACA,iBAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,kBAAA;AAAA,MACA,sBAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;ACtfO,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,EAAE,SAAA,EAAW,EAAA,EAAI,WAAA,KAAgB,YAAA,EAAa;AACpD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIH,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAmC,IAAI,CAAA;AACvE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,UAAU,SAAA,CAAU,eAAA;AAC1B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,uBACEH,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAoC,QAAA,EAAA,uCAAA,EAEjD,CAAA;AAAA,EAEJ;AAEA,EAAA,eAAe,GAAA,GAAqB;AAClC,IAAA,IAAI,CAAC,OAAA,IAAW,WAAA,CAAY,IAAA,OAAW,EAAA,EAAI;AAC3C,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ;AAAA,QAC3B,WAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA,EAAa,YAAY,IAAA,EAAK;AAAA,QAC9B;AAAA,OACD,CAAA;AACD,MAAA,WAAA,CAAY,MAAM,CAAA;AAAA,IACpB,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA;AAAA,QACE,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,OACvC;AAAA,IACF,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACZ,QAAA,EAAA;AAAA,IAAA,OAAA,mBACCC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iFAAA,EAAkF,iIAG/F,CAAA,GACE,IAAA;AAAA,oBACJA,GAAAA;AAAA,MAAC,EAAA,CAAG,SAAA;AAAA,MAAH;AAAA,QACC,KAAA,EAAO,WAAA;AAAA,QACP,SAAA,EAAU,qBAAA;AAAA,QACV,WAAA,EAAY,qDAAA;AAAA,QACZ,QAAA,EAAU,cAAA;AAAA,QACV,UAAU,MAAM;AACd,UAAA,KAAK,GAAA,EAAI;AAAA,QACX;AAAA;AAAA,KACF;AAAA,oBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,EAAA,CAAG,MAAA;AAAA,QAAH;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,QAAA,EAAU,MAAA,IAAU,WAAA,CAAY,IAAA,EAAK,KAAM,EAAA;AAAA,UAC3C,SAAS,MAAM;AACb,YAAA,KAAK,GAAA,EAAI;AAAA,UACX,CAAA;AAAA,UAEC,mBAAS,YAAA,GAAe;AAAA;AAAA,OAC3B;AAAA,sBACAA,GAAAA,CAAC,EAAA,CAAG,MAAA,EAAH,EAAU,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,aAAA,EAAe,QAAA,EAAA,kBAAA,EAEjE;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,KAAA,KAAU,uBACTA,GAAAA,CAAC,OAAE,SAAA,EAAU,0BAAA,EAA4B,iBAAM,CAAA,GAC7C,IAAA;AAAA,IAEH,QAAA,mBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAW,mBAAS,OAAA,EAAQ,CAAA;AAAA,sBACzCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kFAAA,EACZ,mBAAS,QAAA,EACZ,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAQ,SAAA;AAAA,YACR,SAAS,MAAM;AACb,cAAA,OAAA,CAAQ,QAAA,CAAS,QAAA,EAAU,QAAA,CAAS,EAAE,CAAA;AAAA,YACxC,CAAA;AAAA,YACD,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACAA,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAQ,OAAA;AAAA,YACR,SAAS,MAAM;AACb,cAAA,IAAI,UAAU,qBAAA,EAAuB;AACnC,gBAAA,KAAK,UAAU,qBAAA,CAAsB;AAAA,kBACnC,YAAY,QAAA,CAAS,EAAA;AAAA,kBACrB,OAAA,EAAS;AAAA,iBACV,CAAA;AAAA,cACH;AACA,cAAA,WAAA,CAAY,IAAI,CAAA;AAAA,YAClB,CAAA;AAAA,YACD,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF;AAAA,KAAA,EACF,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;;;ACzHO,SAAS,YAAA,CACd,MAAA,EACA,GAAA,EACA,OAAA,EACe;AACf,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,CAAC,GAAG,MAAA,CAAO,OAAA,EAAS,GAAG,CAAA,EAAE;AAAA,EACxD;AAGA,EAAA,MAAM,QAAA,GAAW,EAAE,GAAG,MAAA,CAAO,QAAA,EAAS;AACtC,EAAA,KAAA,MAAW,QAAQ,CAAC,GAAA,EAAK,YAAY,OAAA,EAAS,QAAA,EAAU,OAAO,CAAA,EAAY;AACzE,IAAA,IAAI,SAAS,IAAI,CAAA,KAAM,GAAA,EAAK,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA;AAAA,EAC/C;AACA,EAAA,MAAM,KAAA,GAAsB;AAAA,IAC1B,GAAG,MAAA,CAAO,KAAA;AAAA,IACV,IAAA,EAAM,OAAO,KAAA,CAAM,IAAA,CAAK,OAAO,CAAC,KAAA,KAAU,UAAU,GAAG,CAAA;AAAA,IACvD,OAAA,EAAS,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAC,KAAA,KAAU,UAAU,GAAG,CAAA;AAAA,IAC7D,QAAA,EAAU,OAAO,KAAA,CAAM,QAAA,CAAS,OAAO,CAAC,OAAA,KAAY,OAAA,CAAQ,KAAA,KAAU,GAAG,CAAA;AAAA,IACzE,SAAS,MAAA,CAAO,KAAA,CAAM,YAAY,GAAA,GAAM,IAAA,GAAO,OAAO,KAAA,CAAM,OAAA;AAAA,IAC5D,aACE,MAAA,CAAO,KAAA,CAAM,gBAAgB,GAAA,GAAM,IAAA,GAAO,OAAO,KAAA,CAAM,WAAA;AAAA,IACzD,gBACE,MAAA,CAAO,KAAA,CAAM,mBAAmB,GAAA,GAAM,IAAA,GAAO,OAAO,KAAA,CAAM;AAAA,GAC9D;AACA,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,SAAS,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAC,MAAA,KAAW,WAAW,GAAG,CAAA;AAAA,IACzD,QAAA;AAAA,IACA,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,UAAU,GAAG,CAAA;AAAA,IAC3D;AAAA,GACF;AACF;AAEO,SAAS,UAAA,CACd,MAAA,EACA,IAAA,EACA,KAAA,EACe;AACf,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,QAAA,EAAU;AAAA,MACR,GAAG,MAAA,CAAO,QAAA;AAAA,MACV,CAAC,IAAI,GAAG,KAAA,KAAU,QAAQ,IAAA,GAAO;AAAA;AACnC,GACF;AACF;AASO,SAAS,OAAA,CAAQ,QAAuB,KAAA,EAA8B;AAC3E,EAAA,MAAM,MAAA,GAAS,KAAA,KAAU,KAAA,GAAQ,IAAA,GAAO,KAAA;AACxC,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,QAAA,EAAU,EAAE,GAAG,MAAA,CAAO,UAAU,CAAA,EAAG,MAAA,EAAQ,UAAU,MAAA;AAAO,GAC9D;AACF;AAGO,SAAS,UAAA,CACd,QACA,SAAA,EACe;AACf,EAAA,IAAI,SAAA,KAAc,MAAA,CAAO,SAAA,EAAW,OAAO,MAAA;AAC3C,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,SAAA;AAAA;AAAA;AAAA,IAGA,SAAS,EAAC;AAAA,IACV,QAAA,EAAU;AAAA,MACR,CAAA,EAAG,IAAA;AAAA,MACH,QAAA,EAAU,IAAA;AAAA,MACV,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,IAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAAA,IACA,QAAQ;AAAC,GACX;AACF;AAEO,SAAS,SAAA,CAAU,QAAuB,KAAA,EAA8B;AAC7E,EAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,CAAC,GAAG,MAAA,CAAO,MAAA,EAAQ,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,CAAA,EAAE;AACxE;AAEO,SAAS,YAAA,CACd,MAAA,EACA,KAAA,EACA,KAAA,EACe;AACf,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,SAAS,CAAA,KAAO,CAAA,KAAM,KAAA,GAAQ,KAAA,GAAQ,OAAQ;AAAA,GAC3E;AACF;AAEO,SAAS,YAAA,CACd,QACA,KAAA,EACe;AACf,EAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,KAAK,CAAA,EAAE;AAC1E;AAGO,SAAS,eAAA,CACd,QACA,OAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,KAAA,KAAU,KAAA,CAAM,KAAK,CAAC,CAAA;AAC9D,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,CAAC,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,GAAA,IAAO,IAAA;AACjE;AAEO,SAAS,UAAA,CAAW,OAAqB,KAAA,EAA6B;AAC3E,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,QAAA,EAAU;AAAA,MACR,GAAG,KAAA,CAAM,QAAA;AAAA,MACT,EAAE,OAAO,GAAA,EAAK,KAAA,EAAO,OAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,IAAA;AAAK;AACjE,GACF;AACF;AAEO,SAAS,aAAA,CACd,KAAA,EACA,KAAA,EACA,OAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,QAAA,EAAU,MAAM,QAAA,CAAS,GAAA;AAAA,MAAI,CAAC,OAAA,EAAS,CAAA,KACrC,CAAA,KAAM,QAAQ,OAAA,GAAU;AAAA,KAC1B;AAAA;AAAA;AAAA,IAGA,OAAA,EACE,KAAA,CAAM,OAAA,KAAY,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,EAAG,KAAA,GACrC,OAAA,CAAQ,KAAA,GACR,KAAA,CAAM,OAAA;AAAA,IACZ,WAAA,EACE,KAAA,CAAM,WAAA,KAAgB,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,EAAG,KAAA,GACzC,OAAA,CAAQ,KAAA,GACR,KAAA,CAAM,WAAA;AAAA,IACZ,cAAA,EACE,KAAA,CAAM,cAAA,KAAmB,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,EAAG,KAAA,GAC5C,OAAA,CAAQ,KAAA,GACR,KAAA,CAAM;AAAA,GACd;AACF;AAEO,SAAS,aAAA,CACd,OACA,KAAA,EACc;AACd,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,EAAG,KAAA;AACvC,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,QAAA,EAAU,MAAM,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,KAAK,CAAA;AAAA,IACrD,OAAA,EAAS,KAAA,CAAM,OAAA,KAAY,OAAA,GAAU,OAAO,KAAA,CAAM,OAAA;AAAA,IAClD,WAAA,EAAa,KAAA,CAAM,WAAA,KAAgB,OAAA,GAAU,OAAO,KAAA,CAAM,WAAA;AAAA,IAC1D,cAAA,EACE,KAAA,CAAM,cAAA,KAAmB,OAAA,GAAU,OAAO,KAAA,CAAM;AAAA,GACpD;AACF;AAEO,SAAS,QAAA,CAAS,QAAuB,MAAA,EAAyB;AACvE,EAAA,OACE,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,QAAQ,EAAE,QAAA,CAAS,MAAM,CAAA,IAC9C,MAAA,CAAO,OAAO,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,UAAU,MAAM,CAAA;AAExD;AAEO,IAAM,WAAA,GAAc;AAAA,EACzB,SAAA;AAAA,EACA,mBAAA;AAAA,EACA,kCAAA;AAAA,EACA,8BAAA;AAAA,EACA,0BAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF;AASO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,OAAA,GACJ,MAAA,EAAQ,SAAA,KAAc,OAAA,IAAW,QAAQ,SAAA,KAAc,WAAA;AACzD,EAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,KAAc,aAAA;AACpC,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,MAAA,IAAU,OAAO,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,MAAA,GAAS;AAAA,GAC3E;AACA,EAAA,OAAO;AAAA,IACL,OAAA,CAAQ,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,EAAE,CAAA;AAAA,IACpC,OAAA,CAAQ,SAAS,SAAS,CAAA;AAAA,IAC1B,OAAA,CAAQ,QAAQ,SAAS,CAAA;AAAA,IAAA,CACxB,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,CAAA,IAAK,CAAA;AAAA,IAChC,MAAA,GACI,KAAA,GACE,YAAA,GACA,OAAA,GACE,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GACxB,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GACjC,KAAA;AAAA;AAAA;AAAA,IAGJ,QAAQ,MAAM,CAAA;AAAA,IACd,OAAA,CAAQ,MAAM,CAAA,IAAK,MAAA,CAAO,MAAA,KAAW;AAAA,GACvC;AACF;AC1KA,IAAM,UAAA,GAIA;AAAA,EACJ,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,OAAO,mBAAA,EAAoB;AAAA,EAC5D,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,eAAA,EAAiB,OAAO,YAAA,EAAa;AAAA,EACzD,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,OAAO,kBAAA,EAAmB;AAAA,EACzD,EAAE,EAAA,EAAI,WAAA,EAAa,KAAA,EAAO,kBAAA,EAAoB,OAAO,sBAAA,EAAuB;AAAA,EAC5E,EAAE,EAAA,EAAI,aAAA,EAAe,KAAA,EAAO,aAAA,EAAe,OAAO,uBAAA,EAAwB;AAAA,EAC1E,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,OAAO,iBAAA,EAAkB;AAAA,EACtD,EAAE,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,OAAO,iBAAA,EAAkB;AAAA,EAC9D,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,OAAO,iBAAA,EAAkB;AAAA,EACxD,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,gBAAA,EAAkB,OAAO,iBAAA;AAClD,CAAA;AAEA,IAAM,kBAAA,GAAuD;AAAA,EAC3D,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK,UAAA;AAAA,EACL,GAAA,EAAK,SAAA;AAAA,EACL,KAAA,EAAO,eAAA;AAAA,EACP,cAAA,EAAgB;AAClB,CAAA;AAEA,IAAM,aAAA,GAA8C;AAAA,EAClD,MAAA,EAAQ,gCAAA;AAAA,EACR,QAAA,EAAU,kCAAA;AAAA,EACV,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,eAAA,GAAkD;AAAA,EACtD,SAAA,EAAW,+CAAA;AAAA,EACX,QAAA,EAAU,2CAAA;AAAA,EACV,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,YAAA,GAA0C;AAAA,EAC9C,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AAGA,IAAM,aAAA,GAAgB,YAAA;AAEtB,SAAS,WAAW,MAAA,EAAwB;AAC1C,EAAA,OAAO,uBAAuB,MAAM,CAAA,CAAA;AACtC;AAOA,SAAS,iBAAA,CAAkB;AAAA,EACzB,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EASG;AACD,EAAA,MAAM,MAAA,GAAS,MAAA,KAAW,IAAA,IAAQ,MAAA,IAAU,KAAK,MAAA,GAAS,UAAA;AAC1D,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,UAAA,EAAY,SAAS,CAAA,EAAG;AAClD,IAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,EACzB;AACA,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,IAAA;AAAA,QACA,OACE,MAAA,KAAW,IAAA,IAAQ,UAAU,UAAA,GACzB,KAAA,GACA,SACE,aAAA,GACA,GAAA;AAAA,QAER,WAAA,EAAY,UAAA;AAAA,QACZ,QAAA;AAAA,QACA,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,UAAA,EAAW;AAAA,UAClC,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,CAAA,eAAA,EAAkB,UAAU,CAAA,CAAA,CAAA,EAAI;AAAA,UACrD,GAAI,YAAA,CAAa,MAAA,GAAS,CAAA,GACtB,CAAC,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,QAAA,EAAU,CAAA,GAC1C;AAAC,SACP;AAAA,QACA,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,UAAA,QAAA,CAAS,UAAU,KAAA,GAAQ,IAAA,GAAO,KAAA,KAAU,GAAA,GAAM,IAAI,CAAC,CAAA;AAAA,QACzD;AAAA;AAAA,KACF;AAAA,IACC,yBACCA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,OAAO,MAAM,CAAA;AAAA,QACpB,WAAA,EAAY,GAAA;AAAA,QACZ,QAAA;AAAA,QACA,OAAA,EAAS,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,UACpC,KAAA,EAAO,OAAO,KAAK,CAAA;AAAA,UACnB,KAAA,EAAO,UAAU,CAAA,GAAI,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,GAAK,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,SACrD,CAAE,CAAA;AAAA,QACF,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,UAAA,QAAA,CAAS,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACxB;AAAA;AAAA,KACF,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAGA,SAAS,aAAa,IAAA,EAAiC;AACrD,EAAA,MAAM,SAAS,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,MAAA,KAAW,aAAa,CAAA,GAAI,MAAA,CAAA;AAClE,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,GAAU,SAAA,GAAY,UAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,KAAW,SAAA,GAAY,MAAA,GAAS,SAAA;AACnD,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,IAC1C,KAAA,EAAO,IAAA,CAAK,MAAA,KAAW,SAAA,GAAY,SAAA,GAAY,SAAA;AAAA,IAC/C,QAAA,EAAU,IAAA,CAAK,MAAA,KAAW,SAAA,GAAY,UAAA,GAAa,QAAA;AAAA,IACnD,qBAAA,EAAuB,MAAA;AAAA,IACvB,qBAAA,EAAuB,MAAA,KAAW,IAAA,CAAK,MAAA,KAAW,YAAY,CAAA,GAAI,CAAA;AAAA,GACnE,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACf,EAAA,OAAO,CAAA,EAAG,KAAK,MAAA,IAAU,EAAE,GAAG,IAAI,CAAA,EAAG,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA,CAAA;AACxD;AAQA,SAAS,gBAAA,CAAiB;AAAA,EACxB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,OAAO,MAAA,CAAO,UAAA;AACpB,EAAA,MAAM,GAAA,GAAM,CAAC,KAAA,KAA4C;AACvD,IAAA,QAAA,CAAS,EAAE,GAAG,IAAA,EAAM,GAAG,OAAO,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,IAAI,MAAA,CAAO,cAAc,KAAA,EAAO;AAC9B,IAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,2BAAA;AAAA,YACN,IAAA,EAAK,wIAAA;AAAA,YACL,OAAO,IAAA,CAAK,MAAA;AAAA,YACZ,WAAA,EAAY,QAAA;AAAA,YACZ,QAAA;AAAA,YACA,OAAA,EAAS,cAAA,CAAe,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,cACvC,KAAA,EAAO,MAAA;AAAA,cACP,KAAA,EAAO,cAAc,MAAM;AAAA,aAC7B,CAAE,CAAA;AAAA,YACF,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,cAAA,GAAA,CAAI;AAAA,gBACF,MAAA,EAAS,cAAA,CAAqC,QAAA,CAAS,KAAK,IACvD,KAAA,GACD;AAAA,eACL,CAAA;AAAA,YACH;AAAA;AAAA,SACF;AAAA,wBACAA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,2BAAA;AAAA,YACN,IAAA,EAAK,oHAAA;AAAA,YACL,OAAO,IAAA,CAAK,QAAA;AAAA,YACZ,WAAA,EAAY,wBAAA;AAAA,YACZ,GAAA,EAAK,CAAA;AAAA,YACL,GAAA,EAAK,CAAA;AAAA,YACL,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,cAAA,GAAA,CAAI,EAAE,QAAA,EAAU,KAAA,EAAO,CAAA;AAAA,YACzB;AAAA;AAAA,SACF;AAAA,wBACAA,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,mBAAA;AAAA,YACN,IAAA,EAAK,mFAAA;AAAA,YACL,KAAA,EAAO,KAAK,MAAA,IAAU,EAAA;AAAA,YACtB,WAAA,EAAY,SAAA;AAAA,YACZ,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,cAAA,GAAA,CAAI,EAAE,MAAA,EAAQ,KAAA,CAAM,IAAA,EAAK,IAAK,MAAM,CAAA;AAAA,YACtC;AAAA;AAAA,SACF;AAAA,wBACAA,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,mBAAA;AAAA,YACN,IAAA,EAAK,yGAAA;AAAA,YACL,KAAA,EAAO,KAAK,MAAA,IAAU,EAAA;AAAA,YACtB,WAAA,EAAY,SAAA;AAAA,YACZ,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,cAAA,GAAA,CAAI,EAAE,MAAA,EAAQ,KAAA,CAAM,IAAA,EAAK,IAAK,MAAM,CAAA;AAAA,YACtC;AAAA;AAAA;AACF,OAAA,EACF,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,uBAAA;AAAA,YACN,IAAA,EAAK,2EAAA;AAAA,YACL,SAAS,IAAA,CAAK,OAAA;AAAA,YACd,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,cAAA,GAAA,CAAI,EAAE,OAAA,EAAS,OAAA,EAAS,CAAA;AAAA,YAC1B;AAAA;AAAA,SACF;AAAA,wBACAA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,0BAAA;AAAA,YACN,IAAA,EAAK,kFAAA;AAAA,YACL,OAAA,EAAS,KAAK,aAAA,KAAkB,QAAA;AAAA,YAChC,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,cAAA,GAAA,CAAI,EAAE,aAAA,EAAe,OAAA,GAAU,QAAA,GAAW,OAAO,CAAA;AAAA,YACnD;AAAA;AAAA;AACF,OAAA,EACF,CAAA;AAAA,sBACAA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yEACV,QAAA,EAAA,CAAA,kBAAA,EAAqB,YAAA,CAAa,IAAI,CAAC,CAAA,qBAAA,CAAA,EAC1C;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,MAAA,CAAO,cAAc,SAAA,EAAW;AAClC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,CAAA,IAAK,OAAO,QAAA,CAAS,QAAA;AAClD,IAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,iBAAA;AAAA,YACN,IAAA,EAAK,4HAAA;AAAA,YACL,SAAS,IAAA,CAAK,UAAA;AAAA,YACd,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,cAAA,GAAA,CAAI,EAAE,UAAA,EAAY,OAAA,EAAS,CAAA;AAAA,YAC7B;AAAA;AAAA,SACF;AAAA,wBACAA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,4BAAA;AAAA,YACN,IAAA,EAAK,qHAAA;AAAA,YACL,SAAS,IAAA,CAAK,UAAA;AAAA,YACd,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,cAAA,GAAA,CAAI,EAAE,UAAA,EAAY,OAAA,EAAS,CAAA;AAAA,YAC7B;AAAA;AAAA;AACF,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,4BAAA;AAAA,UACN,IAAA,EAAK,yJAAA;AAAA,UACL,OAAO,IAAA,CAAK,SAAA;AAAA,UACZ,WAAA,EAAY,yBAAA;AAAA,UACZ,QAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,yBAAA,EAA0B;AAAA,YAClD,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,WAAA,EAAY;AAAA,YACnC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,YAAA;AAAa,WACvC;AAAA,UACA,MACE,IAAA,GACI,CAAA,UAAA,EAAa,cAAA,CAAe,IAAI,CAAC,CAAA,CAAA,CAAA,GACjC,uCAAA;AAAA,UAEN,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,YAAA,GAAA,CAAI,EAAE,SAAA,EAAW,KAAA,EAAoB,CAAA;AAAA,UACvC;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,MAAA,CAAO,SAAA,KAAc,OAAA,IAAW,MAAA,CAAO,cAAc,WAAA,EAAa;AACpE,IAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,0BAAA;AAAA,YACN,IAAA,EAAK,8HAAA;AAAA,YACL,OAAO,IAAA,CAAK,QAAA;AAAA,YACZ,WAAA,EAAY,eAAA;AAAA,YACZ,GAAA,EAAK,CAAA;AAAA,YACL,GAAA,EAAK,GAAA;AAAA,YACL,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,cAAA,GAAA,CAAI,EAAE,QAAA,EAAU,KAAA,EAAO,CAAA;AAAA,YACzB;AAAA;AAAA,SACF;AAAA,QACC,MAAA,CAAO,SAAA,KAAc,WAAA,mBACpBA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,2BAAA;AAAA,YACN,IAAA,EAAK,qHAAA;AAAA,YACL,KAAA,EAAO,KAAK,OAAA,IAAW,KAAA;AAAA,YACvB,WAAA,EAAY,aAAA;AAAA,YACZ,QAAA;AAAA,YACA,OAAA,EAAS;AAAA,cACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,aAAA,EAAc;AAAA,cACrC,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,gBACzB,OAAO,MAAA,CAAO,GAAA;AAAA,gBACd,OAAO,MAAA,CAAO;AAAA,eAChB,CAAE;AAAA,aACJ;AAAA,YACA,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,cAAA,GAAA,CAAI,EAAE,OAAA,EAAS,KAAA,KAAU,KAAA,GAAQ,IAAA,GAAO,OAAO,CAAA;AAAA,YACjD;AAAA;AAAA,SACF,GACE;AAAA,OAAA,EACN,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,+BAAA;AAAA,UACN,IAAA,EAAK,6HAAA;AAAA,UACL,SAAS,IAAA,CAAK,QAAA;AAAA,UACd,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,YAAA,GAAA,CAAI,EAAE,QAAA,EAAU,OAAA,EAAS,CAAA;AAAA,UAC3B;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,8DAAA,EAE7C,CAAA;AAEJ;AAGA,SAAS,eACP,KAAA,EACoC;AACpC,EAAA,OAAO,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,IACtC,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,cAAA,CAAe,QAAQ,KAAK;AAAA,GACtD,CAAE,CAAA;AACJ;AAQA,SAAS,iBAAA,CAAkB;AAAA,EACzB,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,EAAE,EAAA,EAAG,GAAI,YAAA,EAAa;AAC5B,EAAA,MAAM,GAAA,GAAM,CAAC,KAAA,KAAuC;AAClD,IAAA,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,GAAG,OAAO,CAAA;AAAA,EACjC,CAAA;AACA,EAAA,MAAM,OAAO,MAAA,CAAO,MAAA;AAAA,IAClB,CAAC,MAAA,KACC,CAAC,KAAA,CAAM,KAAK,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA,IAAK,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,GAAG;AAAA,GAC1E;AACA,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AAAA,IACrB,CAAC,MAAA,KAAW,CAAC,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY,OAAA,CAAQ,KAAA,KAAU,MAAA,CAAO,GAAG;AAAA,GAC5E;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,IAAK,QAAQ,CAAC,CAAA;AAEpC,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,4BAAA;AAAA,QACN,KAAA,EAAM,uCAAA;AAAA,QACN,IAAA,EAAK,2IAAA;AAAA,QACL,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,CAAC,MAAA,KAAW,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,QACtE,UAAU,KAAA,CAAM,IAAA;AAAA,QAChB,QAAA;AAAA,QACA,QAAA,EAAU,CAAC,GAAA,EAAK,OAAA,KAAY;AAC1B,UAAA,GAAA,CAAI;AAAA,YACF,IAAA,EAAM,OAAA,GACF,CAAC,GAAG,MAAM,IAAA,EAAM,GAAG,CAAA,GACnB,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,CAAC,KAAA,KAAU,UAAU,GAAG;AAAA,WAC/C,CAAA;AAAA,QACH;AAAA;AAAA,KACF;AAAA,oBACAA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,gCAAA;AAAA,QACN,KAAA,EAAM,uCAAA;AAAA,QACN,IAAA,EAAK,oGAAA;AAAA,QACL,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,CAAC,MAAA,KAAW,CAAC,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,QACnE,UAAU,KAAA,CAAM,OAAA;AAAA,QAChB,QAAA;AAAA,QACA,QAAA,EAAU,CAAC,GAAA,EAAK,OAAA,KAAY;AAC1B,UAAA,GAAA,CAAI;AAAA,YACF,OAAA,EAAS,OAAA,GACL,CAAC,GAAG,MAAM,OAAA,EAAS,GAAG,CAAA,GACtB,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAA,KAAU,UAAU,GAAG;AAAA,WAClD,CAAA;AAAA,QACH;AAAA;AAAA,KACF;AAAA,IACC,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,MAAA,GAAS,CAAA,mBACpCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mCAAA,EAAoC,QAAA,EAAA,mHAAA,EAGjD,CAAA,GACE,IAAA;AAAA,oBAEJD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,+BAAA;AAAA,UACL,IAAA,EAAK;AAAA;AAAA,OACP;AAAA,MACC,KAAA,CAAM,SAAS,MAAA,KAAW,CAAA,mBACzBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,yDAAA,EAE7C,CAAA,mBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACZ,QAAA,EAAA,KAAA,CAAM,SAAS,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,qBAC5BD,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,kEAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAC,GAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,SAAA;AAAA,gBACN,OAAO,OAAA,CAAQ,KAAA;AAAA,gBACf,WAAA,EAAY,gBAAA;AAAA,gBACZ,QAAA;AAAA,gBACA,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,kBAChC,OAAO,MAAA,CAAO,GAAA;AAAA,kBACd,OAAO,MAAA,CAAO;AAAA,iBAChB,CAAE,CAAA;AAAA,gBACF,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,kBAAA,QAAA;AAAA,oBACE,aAAA,CAAc,OAAO,KAAA,EAAO,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,OAAO;AAAA,mBAC1D;AAAA,gBACF;AAAA;AAAA,aACF;AAAA,4BACAA,GAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,oBAAA;AAAA,gBACN,IAAA,EAAK,mHAAA;AAAA,gBACL,OAAO,OAAA,CAAQ,GAAA;AAAA,gBACf,WAAA,EAAY,KAAA;AAAA,gBACZ,QAAA;AAAA,gBACA,OAAA,EAAS,kBAAA,CAAmB,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,kBACxC,KAAA,EAAO,GAAA;AAAA,kBACP,KAAA,EAAO,mBAAmB,GAAG;AAAA,iBAC/B,CAAE,CAAA;AAAA,gBACF,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,kBAAA,QAAA;AAAA,oBACE,aAAA,CAAc,OAAO,KAAA,EAAO;AAAA,sBAC1B,GAAG,OAAA;AAAA,sBACH,KAAM,kBAAA,CAAyC,QAAA;AAAA,wBAC7C;AAAA,0BAEG,KAAA,GACD;AAAA,qBACL;AAAA,mBACH;AAAA,gBACF;AAAA;AAAA,aACF;AAAA,4BACAA,GAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,mBAAA;AAAA,gBACN,IAAA,EAAK,6DAAA;AAAA,gBACL,KAAA,EAAO,QAAQ,MAAA,IAAU,KAAA;AAAA,gBACzB,WAAA,EAAY,aAAA;AAAA,gBACZ,QAAA;AAAA,gBACA,OAAA,EAAS;AAAA,kBACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,aAAA,EAAc;AAAA,kBACrC,GAAG,cAAA,CAAe,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,oBACjC,KAAA,EAAO,MAAA;AAAA,oBACP,KAAA,EAAO,cAAc,MAAM;AAAA,mBAC7B,CAAE;AAAA,iBACJ;AAAA,gBACA,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,kBAAA,QAAA;AAAA,oBACE,aAAA,CAAc,OAAO,KAAA,EAAO;AAAA,sBAC1B,GAAG,OAAA;AAAA,sBACH,MAAA,EACE,KAAA,KAAU,KAAA,GAAQ,IAAA,GAAQ;AAAA,qBAC7B;AAAA,mBACH;AAAA,gBACF;AAAA;AAAA,aACF;AAAA,4BACAA,GAAAA;AAAA,cAAC,EAAA,CAAG,MAAA;AAAA,cAAH;AAAA,gBACC,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAQ,OAAA;AAAA,gBACR,SAAA,EAAU,UAAA;AAAA,gBACV,QAAA,EAAU,QAAA;AAAA,gBACV,SAAA,EAAW,CAAA,OAAA,EAAU,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,gBAClC,SAAS,MAAM;AACb,kBAAA,QAAA,CAAS,aAAA,CAAc,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,gBACtC,CAAA;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BACAA,GAAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,oBAAA;AAAA,gBACN,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,gBACxB,WAAA,EAAa,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAAA,gBACzC,QAAA;AAAA,gBACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,kBAAA,QAAA;AAAA,oBACE,aAAA,CAAc,OAAO,KAAA,EAAO;AAAA,sBAC1B,GAAG,OAAA;AAAA,sBACH,KAAA,EAAO,KAAA,CAAM,IAAA,EAAK,IAAK;AAAA,qBACxB;AAAA,mBACH;AAAA,gBACF;AAAA;AAAA,aACF;AAAA,4BACAA,GAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,2BAAA;AAAA,gBACN,OAAO,OAAA,CAAQ,QAAA;AAAA,gBACf,WAAA,EAAY,wBAAA;AAAA,gBACZ,GAAA,EAAK,CAAA;AAAA,gBACL,GAAA,EAAK,CAAA;AAAA,gBACL,QAAA;AAAA,gBACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,kBAAA,QAAA;AAAA,oBACE,aAAA,CAAc,OAAO,KAAA,EAAO;AAAA,sBAC1B,GAAG,OAAA;AAAA,sBACH,QAAA,EAAU;AAAA,qBACX;AAAA,mBACH;AAAA,gBACF;AAAA;AAAA;AACF;AAAA,SAAA;AAAA,QAzGK,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,OA2GjC,CAAA,EACH,CAAA;AAAA,sBAEFA,GAAAA;AAAA,QAAC,EAAA,CAAG,MAAA;AAAA,QAAH;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,QAAA,EAAU,YAAY,KAAA,KAAU,MAAA;AAAA,UAChC,KAAA,EAAO,KAAA,KAAU,MAAA,GAAY,gCAAA,GAAmC,EAAA;AAAA,UAChE,SAAS,MAAM;AACb,YAAA,IAAI,OAAO,QAAA,CAAS,UAAA,CAAW,KAAA,EAAO,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,UAClD,CAAA;AAAA,UACD,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAGA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,GAAA,GAAM,CAAC,KAAA,KAAuC;AAClD,IAAA,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,GAAG,OAAO,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,gBAAA;AAAA,UACN,IAAA,EAAK,2EAAA;AAAA,UACL,SAAS,KAAA,CAAM,YAAA;AAAA,UACf,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,YAAA,GAAA,CAAI,EAAE,YAAA,EAAc,OAAA,EAAS,CAAA;AAAA,UAC/B;AAAA;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,qBAAA;AAAA,UACN,IAAA,EAAK,uDAAA;AAAA,UACL,SAAS,KAAA,CAAM,SAAA;AAAA,UACf,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,YAAA,GAAA,CAAI,EAAE,SAAA,EAAW,OAAA,EAAS,CAAA;AAAA,UAC5B;AAAA;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,kBAAA;AAAA,UACN,IAAA,EAAK,wGAAA;AAAA,UACL,SAAS,KAAA,CAAM,UAAA;AAAA,UACf,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,YAAA,GAAA,CAAI,EAAE,UAAA,EAAY,OAAA,EAAS,CAAA;AAAA,UAC7B;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,oBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,qBAAA;AAAA,UACN,IAAA,EAAK,mGAAA;AAAA,UACL,OAAO,KAAA,CAAM,SAAA;AAAA,UACb,WAAA,EAAY,WAAA;AAAA,UACZ,QAAA;AAAA,UACA,OAAA,EAAS,eAAA,CAAgB,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,YACxC,KAAA,EAAO,MAAA;AAAA,YACP,KAAA,EAAO,gBAAgB,MAAM;AAAA,WAC/B,CAAE,CAAA;AAAA,UACF,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,YAAA,GAAA,CAAI;AAAA,cACF,SAAA,EAAY,eAAA,CAAsC,QAAA,CAAS,KAAK,IAC3D,KAAA,GACD;AAAA,aACL,CAAA;AAAA,UACH;AAAA;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,2BAAA;AAAA,UACN,IAAA,EAAK,2HAAA;AAAA,UACL,KAAA,EAAO,MAAM,UAAA,IAAc,EAAA;AAAA,UAC3B,WAAA,EAAY,GAAA;AAAA,UACZ,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,GAAA,CAAI,EAAE,UAAA,EAAY,KAAA,CAAM,IAAA,EAAK,IAAK,MAAM,CAAA;AAAA,UAC1C;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,oBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,iBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,+BAAA;AAAA,UACN,IAAA,EAAK,+FAAA;AAAA,UACL,QAAQ,KAAA,CAAM,cAAA;AAAA,UACd,UAAA,EAAY,MAAM,IAAA,CAAK,MAAA;AAAA,UACvB,IAAA,EAAK,WAAA;AAAA,UACL,UAAA,EAAW,gCAAA;AAAA,UACX,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,MAAA,KAAW;AACpB,YAAA,GAAA,CAAI,EAAE,cAAA,EAAgB,MAAA,EAAQ,CAAA;AAAA,UAChC;AAAA;AAAA,OACF;AAAA,MACC,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,CAAA,mBACtBA,GAAAA;AAAA,QAAC,iBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,kCAAA;AAAA,UACN,IAAA,EAAK,+DAAA;AAAA,UACL,QAAQ,KAAA,CAAM,qBAAA;AAAA,UACd,UAAA,EAAY,MAAM,OAAA,CAAQ,MAAA;AAAA,UAC1B,IAAA,EAAK,cAAA;AAAA,UACL,UAAA,EAAW,gCAAA;AAAA,UACX,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,MAAA,KAAW;AACpB,YAAA,GAAA,CAAI,EAAE,qBAAA,EAAuB,MAAA,EAAQ,CAAA;AAAA,UACvC;AAAA;AAAA,OACF,GACE;AAAA,KAAA,EACN,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,2CAAA;AAAA,QACN,IAAA,EAAK,8IAAA;AAAA,QACL,KAAA,EAAO,MAAM,OAAA,IAAW,KAAA;AAAA,QACxB,WAAA,EAAY,YAAA;AAAA,QACZ,QAAA;AAAA,QACA,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,YAAA,EAAa;AAAA,UACpC,GAAG,eAAe,KAAK;AAAA,SACzB;AAAA,QACA,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,UAAA,GAAA,CAAI,EAAE,OAAA,EAAS,KAAA,KAAU,KAAA,GAAQ,IAAA,GAAO,OAAO,CAAA;AAAA,QACjD;AAAA;AAAA,KACF;AAAA,oBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,6BAAA;AAAA,UACN,IAAA,EAAK,mFAAA;AAAA,UACL,KAAA,EAAO,MAAM,WAAA,IAAe,KAAA;AAAA,UAC5B,WAAA,EAAY,gBAAA;AAAA,UACZ,QAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,YACxC,GAAG,eAAe,KAAK;AAAA,WACzB;AAAA,UACA,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,YAAA,GAAA,CAAI,EAAE,WAAA,EAAa,KAAA,KAAU,KAAA,GAAQ,IAAA,GAAO,OAAO,CAAA;AAAA,UACrD;AAAA;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,oBAAA;AAAA,UACN,IAAA,EAAK,wEAAA;AAAA,UACL,KAAA,EAAO,MAAM,aAAA,IAAiB,KAAA;AAAA,UAC9B,WAAA,EAAa,KAAA,CAAM,WAAA,GAAc,eAAA,GAAkB,QAAA;AAAA,UACnD,QAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP;AAAA,cACE,KAAA,EAAO,KAAA;AAAA,cACP,KAAA,EAAO,KAAA,CAAM,WAAA,GAAc,eAAA,GAAkB;AAAA,aAC/C;AAAA,YACA,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,eAAA,EAAgB;AAAA,YACxC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,gBAAA;AAAiB,WAC1C;AAAA,UACA,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,YAAA,GAAA,CAAI;AAAA,cACF,eAAgB,gBAAA,CAAuC,QAAA;AAAA,gBACrD;AAAA,kBAEG,KAAA,GACD;AAAA,aACL,CAAA;AAAA,UACH;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,oBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,uCAAA;AAAA,UACN,IAAA,EAAK,iHAAA;AAAA,UACL,OAAO,KAAA,CAAM,OAAA;AAAA,UACb,WAAA,EAAY,WAAA;AAAA,UACZ,GAAA,EAAK,CAAA;AAAA,UACL,GAAA,EAAK,GAAA;AAAA,UACL,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,GAAA,CAAI,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,UACxB;AAAA;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,0BAAA;AAAA,UACN,IAAA,EAAK,6CAAA;AAAA,UACL,KAAA,EAAO,MAAM,cAAA,IAAkB,KAAA;AAAA,UAC/B,WAAA,EAAY,iBAAA;AAAA,UACZ,QAAA,EAAU,QAAA,IAAY,KAAA,CAAM,OAAA,KAAY,IAAA;AAAA,UACxC,OAAA,EAAS;AAAA,YACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,iBAAA,EAAkB;AAAA,YACzC,GAAG,eAAe,KAAK;AAAA,WACzB;AAAA,UACA,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,YAAA,GAAA,CAAI,EAAE,cAAA,EAAgB,KAAA,KAAU,KAAA,GAAQ,IAAA,GAAO,OAAO,CAAA;AAAA,UACxD;AAAA;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,yBAAA;AAAA,UACN,IAAA,EAAK,mGAAA;AAAA,UACL,SAAS,KAAA,CAAM,YAAA;AAAA,UACf,QAAA,EAAU,QAAA,IAAY,KAAA,CAAM,OAAA,KAAY,IAAA;AAAA,UACxC,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,YAAA,GAAA,CAAI,EAAE,YAAA,EAAc,OAAA,EAAS,CAAA;AAAA,UAC/B;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,oBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,oCAAA;AAAA,UACN,IAAA,EAAK,4FAAA;AAAA,UACL,OAAO,KAAA,CAAM,aAAA;AAAA,UACb,WAAA,EAAY,kBAAA;AAAA,UACZ,GAAA,EAAK,CAAA;AAAA,UACL,GAAA,EAAK,GAAA;AAAA,UACL,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,GAAA,CAAI,EAAE,aAAA,EAAe,KAAA,EAAO,CAAA;AAAA,UAC9B;AAAA;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,qCAAA;AAAA,UACN,IAAA,EAAK,+FAAA;AAAA,UACL,OAAO,KAAA,CAAM,WAAA;AAAA,UACb,WAAA,EAAY,kBAAA;AAAA,UACZ,GAAA,EAAK,CAAA;AAAA,UACL,GAAA,EAAK,GAAA;AAAA,UACL,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,GAAA,CAAI,EAAE,WAAA,EAAa,KAAA,EAAO,CAAA;AAAA,UAC5B;AAAA;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,0BAAA;AAAA,UACN,IAAA,EAAK,2HAAA;AAAA,UACL,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,YAAA,GAAA,CAAI,EAAE,OAAA,EAAS,OAAA,EAAS,CAAA;AAAA,UAC1B;AAAA;AAAA;AACF,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAGA,SAAS,YAAA,CAAa,EAAE,IAAA,EAAK,EAAwB;AACnD,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gGAAA,EACZ,sBAAY,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBACvBD,IAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MAEC,IAAA,EAAM,CAAA,CAAA,EAAI,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,MAC/B,SAAA,EAAW,EAAA;AAAA,QACT,uEAAA;AAAA,QACA,IAAA,CAAK,KAAK,CAAA,GACN,iDAAA,GACA;AAAA,OACN;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wFAAA,EACb,kBAAQ,CAAA,EACX,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA,KAAA;AAAA,IAZR;AAAA,GAcR,CAAA,EACH,CAAA;AAEJ;AAkBO,SAAS,aAAA,CAAc;AAAA,EAC5B,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,EAAE,SAAA,EAAW,EAAA,EAAG,GAAI,YAAA,EAAa;AACvC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIG,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,CAAC,CAAA;AACtC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAsC,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAElD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,eAAe,IAAA,GAAsB;AACnC,MAAA,IAAI;AACF,QAAA,MAAMkB,MAAAA,GAAQ,MAAM,SAAA,CAAU,SAAA,CAAU,EAAE,MAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA;AACrE,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,YAAA,CAAaA,OAAM,QAAQ,CAAA;AAC3B,UAAA,aAAA,CAAc,IAAI,CAAA;AAAA,QACpB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,aAAA;AAAA,YACE,KAAA,YAAiB,KAAA,GACb,KAAA,CAAM,OAAA,GACN;AAAA,WACN;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,KAAK,IAAA,EAAK;AACV,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,MAAM,CAAC,CAAA;AAEtB,EAAA,MAAM,OAAA,GAAUhB,QAAQ,MAAM,iBAAA,CAAkB,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AACrE,EAAA,MAAM,KAAA,GAAyBA,QAAQ,MAAM;AAC3C,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,SAAA,IAAa,EAAE,CAAA;AAC/C,IAAA,OAAO;AAAA,MACL,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,cAAc,MAAA,CAAO;AAAA,KACvB;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,EAAA,MAAM,OAAA,GAAUA,OAAAA;AAAA,IACd,MAAM,aAAA,CAAc,MAAA,EAAQ,SAAA,IAAa,MAAM,KAAK,CAAA;AAAA,IACpD,CAAC,MAAA,EAAQ,SAAA,EAAW,KAAK;AAAA,GAC3B;AACA,EAAA,MAAM,MAAA,GAASA,OAAAA;AAAA,IACb,MAAO,MAAA,GAAS,YAAA,CAAa,MAAA,EAAQ,KAAK,IAAI,EAAC;AAAA,IAC/C,CAAC,QAAQ,KAAK;AAAA,GAChB;AAEA,EAAA,SAAS,MAAM,IAAA,EAA2B;AACxC,IAAA,QAAA,CAAS,WAAA,CAAY,QAAA,EAAU,IAAI,CAAC,CAAA;AACpC,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB;AAEA,EAAA,SAAS,cAAc,SAAA,EAAyB;AAC9C,IAAA,QAAA,CAAS,cAAA,CAAe,QAAA,EAAU,SAAS,CAAC,CAAA;AAC5C,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB;AAEA,EAAA,eAAe,WAAW,OAAA,EAAuC;AAC/D,IAAA,IAAI,SAAA,KAAc,IAAA,IAAQ,CAAC,OAAA,CAAQ,SAAA,EAAW;AAC9C,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,cAAA,CAAe;AAAA,QAC5C,QAAA,EAAU,SAAA;AAAA,QACV,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,KAAA,EAAO,EAAA;AAAA,QACP,SAAS,OAAA,CAAQ;AAAA,OAClB,CAAA;AACD,MAAA,UAAA,CAAW,MAAM,CAAA;AAAA,IACnB,SAAS,KAAA,EAAO;AACd,MAAA,eAAA;AAAA,QACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAC3C;AAAA,IACF,CAAA,SAAE;AACA,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,uBACEN,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,QAAA,EAAA,qCAAA,EAAmC,CAAA;AAAA,sBAChEA,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,OAAA,EAAU,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAA,CAAA,EAAI,CAAA;AAAA,sBAC5DA,GAAAA,CAAC,EAAA,CAAG,MAAA,EAAH,EAAU,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,OAAA,EAAS,YAAA,EAAc,QAAA,EAAA,mBAAA,EAEhE;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AACzB,EAAA,MAAM,cAAc,MAAA,EAAQ,OAAA,IAAW,EAAC,EAAG,SACvC,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,QAAQ,OAAA,CAAQ,QAAA,CAAS,OAAO,GAAG,CAAC,IAC/D,EAAC;AACL,EAAA,MAAM,MAAA,GAAS,aAAa,UAAU,CAAA;AACtC,EAAA,MAAM,OAAA,GAAU,eAAe,UAAU,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,KAAc,SAAA;AACpC,EAAA,MAAM,MAAA,GAAS,QAAQ,SAAA,KAAc,KAAA;AACrC,EAAA,MAAM,OAAA,GACJ,MAAA,EAAQ,SAAA,KAAc,OAAA,IAAW,QAAQ,SAAA,KAAc,WAAA;AACzD,EAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,KAAc,aAAA;AACpC,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,MAAA,IAAU,OAAO,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,MAAA,GAAS;AAAA,GAC3E;AACA,EAAA,MAAM,YAAY,gBAAA,CAAiB,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAQ,CAAA;AAE/D,EAAA,SAAS,eACP,MAAA,EACoC;AACpC,IAAA,OAAO;AAAA,MACL,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,SAAA,EAAU;AAAA,MACjC,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,MAAA,MAAY,EAAE,KAAA,EAAO,MAAA,CAAO,GAAA,EAAK,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,CAAE;AAAA,KACxE;AAAA,EACF;AAEA,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,oBAE/BA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,WAAW,CAAC,CAAA;AAAA,QACpB,MAAA,EAAQ,CAAA;AAAA,QACR,KAAA,EAAM,SAAA;AAAA,QACN,KAAA,EAAM,oEAAA;AAAA,QACN,IAAA,EAAK,oJAAA;AAAA,QACL,IAAA,EAAM,SAAA,CAAU,CAAC,CAAA,IAAK,KAAA;AAAA,QAEtB,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,OAAA;AAAA,cACN,KAAA,EAAO,SAAS,IAAA,IAAQ,EAAA;AAAA,cACxB,WAAA,EAAY,iBAAA;AAAA,cACZ,QAAA;AAAA,cACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,gBAAA,QAAA,CAAS,aAAA,CAAc,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAC,CAAA;AAAA,cACjD;AAAA;AAAA,WACF;AAAA,0BACAA,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,IAAA;AAAA,cACN,OAAO,QAAA,CAAS,EAAA;AAAA,cAChB,WAAA,EAAY,iBAAA;AAAA,cACZ,IAAA,EAAK,uDAAA;AAAA,cACL,IAAA,EAAK,0JAAA;AAAA,cACL,IAAA,EAAI,IAAA;AAAA,cACJ,QAAA;AAAA,cACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,gBAAA,QAAA,CAAS,aAAA,CAAc,QAAA,EAAU,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,cAC/C;AAAA;AAAA;AACF,SAAA,EACF;AAAA;AAAA,KACF;AAAA,oBAEAD,IAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,WAAW,CAAC,CAAA;AAAA,QACpB,MAAA,EAAQ,CAAA;AAAA,QACR,KAAA,EAAM,mBAAA;AAAA,QACN,KAAA,EAAM,6GAAA;AAAA,QACN,IAAA,EAAK,iIAAA;AAAA,QACL,IAAA,EAAI,IAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,UAAA,CAAW,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,gBACnC,IAAI,MAAA,CAAO,EAAA;AAAA,gBACX,OAAO,MAAA,CAAO,KAAA;AAAA,gBACd,OAAO,MAAA,CAAO;AAAA,eAChB,CAAE,CAAA;AAAA,cACF,OACG,cAAA,CAAqC,QAAA,CAAS,SAAS,SAAS,CAAA,GAC5D,SAAS,SAAA,GACV,IAAA;AAAA,cAEN,QAAA;AAAA,cACA,MAAA,EAAQ;AAAA;AAAA,WACV;AAAA,UACC,SAAS,MAAA,mBACRD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,YAAA,EAE5D,CAAA;AAAA,8BACAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,gKAAA,EAAiK;AAAA,aAAA,EAC9K,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,kBAClC,EAAA,EAAI,IAAA;AAAA,kBACJ,KAAA,EAAO,aAAa,IAAI;AAAA,iBAC1B,CAAE,CAAA;AAAA,gBACF,OAAO,MAAA,CAAO,SAAA;AAAA,gBACd,QAAA;AAAA,gBACA,OAAA,EAAS,CAAA;AAAA,gBACT,MAAA,EAAQ,CAAC,IAAA,KAAS;AAChB,kBAAA,KAAA,CAAM,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAW,MAAM,CAAA;AAAA,gBACtC;AAAA;AAAA;AACF,WAAA,EACF,CAAA,GACE;AAAA;AAAA;AAAA,KACN;AAAA,IAEC,CAAC,MAAA,GACA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,MAAA,qBACnBD,IAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QAEC,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,QACzB,MAAA;AAAA,QACA,KAAA,EAAO,WAAA,CAAY,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA;AAAA,QAElC,QAAA,EAAA;AAAA,0BAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EACV,QAAA,EAAA,OAAA,CAAQ,kBACP,0CAAA,EACJ,CAAA;AAAA,0BACAA,GAAAA,CAAC,EAAA,CAAG,MAAA,EAAH,EAAU,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,OAAA,EAAS,YAAA,EAAc,QAAA,EAAA,mBAAA,EAEhE;AAAA;AAAA,OAAA;AAAA,MAXK;AAAA,KAaR,CAAA,mBAEDD,IAAAA,CAAAe,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAd,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,WAAW,CAAC,CAAA;AAAA,UACpB,MAAA,EAAQ,CAAA;AAAA,UACR,KAAA,EAAM,kCAAA;AAAA,UACN,KAAA,EAAM,yEAAA;AAAA,UACN,IAAA,EAAK,oQAAA;AAAA,UACL,IAAA,EAAM,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA;AAAA,UAE7B,yBAAe,IAAA,mBACdD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0BAAA,EACV,QAAA,EAAA,CAAA,mCAAA,EAAsC,UAAU,CAAA,CAAA,EACnD,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,EAAA,CAAG,MAAA;AAAA,cAAH;AAAA,gBACC,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAQ,WAAA;AAAA,gBACR,SAAS,MAAM;AACb,kBAAA,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,gBACxB,CAAA;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF,CAAA,GACE,cAAc,IAAA,mBAChBA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,+BAAA,EAE7C,CAAA,GACE,MAAM,QAAA,CAAS,MAAA,KAAW,oBAC5BA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,2FAAA,EAG7C,CAAA,mBAEAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,gBACxC,IAAI,OAAA,CAAQ,EAAA;AAAA,gBACZ,KAAA,EAAO,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,EAAA;AAAA,gBAC/B,KAAA,EAAO,QAAQ,MAAA,IAAU;AAAA,eAC3B,CAAE,CAAA;AAAA,cACF,OAAO,MAAA,CAAO,SAAA;AAAA,cACd,QAAA;AAAA,cACA,MAAA,EAAQ,CAAC,SAAA,KAAc;AACrB,gBAAA,KAAA,CAAM,UAAA,CAAW,MAAA,EAAQ,SAAS,CAAC,CAAA;AAAA,cACrC;AAAA;AAAA;AACF;AAAA,OAEJ;AAAA,sBAEAA,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,WAAW,CAAC,CAAA;AAAA,UACpB,MAAA,EAAQ,CAAA;AAAA,UACR,KAAA,EAAM,8BAAA;AAAA,UACN,KAAA,EAAM,kFAAA;AAAA,UACN,IAAA,EAAK,4LAAA;AAAA,UACL,IAAA,EAAM,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAA,UAE7B,QAAA,EAAA,CAAC,MAAA,CAAO,SAAA,mBACPA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,iCAAA,EAE7C,CAAA,mBAEAD,IAAAA,CAAAe,UAAA,EACE,QAAA,EAAA;AAAA,4BAAAd,GAAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EACE,SAAS,iCAAA,GAAoC,UAAA;AAAA,gBAE/C,KAAA,EAAM,sCAAA;AAAA,gBACN,IAAA,EACE,SACI,kIAAA,GACA,sFAAA;AAAA,gBAEN,OAAA,EAAS,aAAa,OAAO,CAAA;AAAA,gBAC7B,UAAU,MAAA,CAAO,OAAA;AAAA,gBACjB,QAAA;AAAA,gBACA,QAAA,EAAU,CAAC,GAAA,EAAK,OAAA,KAAY;AAC1B,kBAAA,KAAA,CAAM,YAAA,CAAa,MAAA,EAAQ,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,gBAC1C;AAAA;AAAA,aACF;AAAA,YACC,yBACCA,GAAAA,CAAC,OAAE,SAAA,EAAU,mCAAA,EAAoC,oKAIjD,CAAA,GACE,IAAA;AAAA,4BACJA,GAAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,SAAA;AAAA,gBACN,KAAA,EAAM,mCAAA;AAAA,gBACN,IAAA,EAAK,oFAAA;AAAA,gBACL,OAAA,EAAS,eAAe,OAAO,CAAA;AAAA,gBAC/B,UAAU,MAAA,CAAO,OAAA;AAAA,gBACjB,QAAA;AAAA,gBACA,QAAA,EAAU,CAAC,GAAA,EAAK,OAAA,KAAY;AAC1B,kBAAA,KAAA,CAAM,YAAA,CAAa,MAAA,EAAQ,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,gBAC1C;AAAA;AAAA,aACF;AAAA,YACC,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,MAAM,CAAA,mBACrCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mCAAA,EAAoC,mKAIjD,CAAA,GACE;AAAA,WAAA,EACN;AAAA;AAAA,OAEJ;AAAA,sBAEAA,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,WAAW,CAAC,CAAA;AAAA,UACpB,MAAA,EAAQ,CAAA;AAAA,UACR,KAAA,EAAM,0BAAA;AAAA,UACN,KAAA,EAAM,6GAAA;AAAA,UACN,IAAA,EAAK,gLAAA;AAAA,UACL,IAAA,EACE,KAAA,GACI,YAAA,GACA,OAAA,GACE,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GACxB,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAAA,UAGpC,QAAA,EAAA,KAAA,GACC,MAAA,CAAO,OAAA,CAAQ,MAAA,KAAW,CAAA,mBACxBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,oCAAA,EAE7C,CAAA,mBAEAA,GAAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,OAAO,MAAA,CAAO,KAAA;AAAA,cACd,MAAA;AAAA,cACA,OAAA;AAAA,cACA,QAAA;AAAA,cACA,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,gBAAA,KAAA,CAAM,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA;AAAA,cAClC;AAAA;AAAA,WACF,GAEA,OAAA,mBACFA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,wJAAA,EAI7C,CAAA,GACE,MAAA,CAAO,OAAA,CAAQ,MAAA,KAAW,CAAA,mBAC5BA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,oCAAA,EAE7C,CAAA,GACE,MAAA,CAAO,SAAA,KAAc,KAAA,mBACvBD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,YAAA;AAAA,gBACN,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,KAAA,IAAS,KAAA;AAAA,gBAChC,WAAA,EAAY,gBAAA;AAAA,gBACZ,QAAA;AAAA,gBACA,IAAA,EAAK,2HAAA;AAAA,gBACL,OAAA,EAAS,eAAe,OAAO,CAAA;AAAA,gBAC/B,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,kBAAA,KAAA,CAAM,UAAA,CAAW,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,gBAC1C;AAAA;AAAA,aACF;AAAA,4BACAA,GAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,wCAAA;AAAA,gBACN,IAAA,EAAK,4HAAA;AAAA,gBACL,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,KAAA,IAAS,KAAA;AAAA,gBAChC,WAAA,EAAY,SAAA;AAAA,gBACZ,QAAA;AAAA,gBACA,OAAA,EAAS,cAAA;AAAA,kBACP,OAAA,CAAQ,MAAA;AAAA,oBACN,CAAC,MAAA,KAAW,MAAA,CAAO,GAAA,KAAQ,OAAO,QAAA,CAAS;AAAA;AAC7C,iBACF;AAAA,gBACA,IAAA,EAAK,2DAAA;AAAA,gBACL,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,kBAAA,KAAA,CAAM,UAAA,CAAW,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,gBAC1C;AAAA;AAAA,aACF;AAAA,YACC,MAAA,CAAO,QAAA,CAAS,KAAA,mBACfA,GAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,yBAAA;AAAA,gBACN,IAAA,EAAK,mHAAA;AAAA,gBACL,OAAO,MAAA,CAAO,WAAA;AAAA,gBACd,WAAA,EAAY,YAAA;AAAA,gBACZ,QAAA;AAAA,gBACA,OAAA,EAAS;AAAA,kBACP;AAAA,oBACE,KAAA,EAAO,SAAA;AAAA,oBACP,KAAA,EAAO;AAAA,mBACT;AAAA,kBACA,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,6BAAA,EAA8B;AAAA,kBACxD;AAAA,oBACE,KAAA,EAAO,UAAA;AAAA,oBACP,KAAA,EAAO;AAAA;AACT,iBACF;AAAA,gBACA,MAAM,CAAA,cAAA,EAAiB,cAAA,CAAe,MAAA,CAAO,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,gBAC5D,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,kBAAA,KAAA,CAAM;AAAA,oBACJ,GAAG,MAAA;AAAA,oBACH,WAAA,EACE,aAAA,CACA,QAAA,CAAS,KAAK,IACX,KAAA,GACD;AAAA,mBACL,CAAA;AAAA,gBACH;AAAA;AAAA,aACF,GACE;AAAA,WAAA,EACN,CAAA,mBAEAD,IAAAA,CAAAe,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAf,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,WAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EACE,MAAA,CAAO,SAAA,KAAc,KAAA,GACjB,uBAAA,GACA,qBAAA;AAAA,kBAEN,KAAA,EAAA,CACG,OAAO,SAAA,KAAc,KAAA,GAClB,OAAO,QAAA,CAAS,QAAA,GAChB,MAAA,CAAO,QAAA,CAAS,CAAA,KAAM,KAAA;AAAA,kBAE5B,WAAA,EAAY,eAAA;AAAA,kBACZ,QAAA;AAAA,kBACA,IAAA,EACE,MAAA,CAAO,SAAA,KAAc,KAAA,GACjB,sCAAA,GACA,wEAAA;AAAA,kBAEN,OAAA,EAAS,eAAe,MAAM,CAAA;AAAA,kBAC9B,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,oBAAA,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,KAAK,CAAC,CAAA;AAAA,kBAC9B;AAAA;AAAA,eACF;AAAA,8BACAA,GAAAA;AAAA,gBAAC,WAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,WAAA;AAAA,kBACN,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,KAAA,IAAS,KAAA;AAAA,kBAChC,WAAA,EAAY,gBAAA;AAAA,kBACZ,QAAA;AAAA,kBACA,IAAA,EAAK,4GAAA;AAAA,kBACL,OAAA,EAAS,eAAe,OAAO,CAAA;AAAA,kBAC/B,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,oBAAA,KAAA,CAAM,UAAA,CAAW,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,kBAC1C;AAAA;AAAA;AACF,aAAA,EACF,CAAA;AAAA,4BAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,yBAAA;AAAA,kBACL,IAAA,EAAK;AAAA;AAAA,eACP;AAAA,cACC,MAAA,CAAO,OAAO,MAAA,KAAW,CAAA,mBACxBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,iHAAA,EAG7C,CAAA,mBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACZ,QAAA,EAAA,MAAA,CAAO,OAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBACzBD,IAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBAEC,SAAA,EAAU,8DAAA;AAAA,kBAEV,QAAA,EAAA;AAAA,oCAAAC,GAAAA;AAAA,sBAAC,WAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAM,SAAA;AAAA,wBACN,OAAO,KAAA,CAAM,KAAA;AAAA,wBACb,WAAA,EAAY,gBAAA;AAAA,wBACZ,QAAA;AAAA,wBACA,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,0BAChC,OAAO,MAAA,CAAO,GAAA;AAAA,0BACd,OAAO,MAAA,CAAO;AAAA,yBAChB,CAAE,CAAA;AAAA,wBACF,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,0BAAA,KAAA;AAAA,4BACE,YAAA,CAAa,QAAQ,KAAA,EAAO;AAAA,8BAC1B,GAAG,KAAA;AAAA,8BACH,KAAA,EAAO;AAAA,6BACR;AAAA,2BACH;AAAA,wBACF;AAAA;AAAA,qBACF;AAAA,oCACAA,GAAAA;AAAA,sBAAC,SAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAM,aAAA;AAAA,wBACN,KAAA,EAAO,MAAM,IAAA,IAAQ,EAAA;AAAA,wBACrB,aAAa,KAAA,CAAM,KAAA;AAAA,wBACnB,QAAA;AAAA,wBACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,0BAAA,KAAA;AAAA,4BACE,YAAA,CAAa,QAAQ,KAAA,EAAO;AAAA,8BAC1B,GAAG,KAAA;AAAA,8BACH,MAAM,KAAA,IAAS;AAAA,6BAChB;AAAA,2BACH;AAAA,wBACF;AAAA;AAAA,qBACF;AAAA,oCACAA,GAAAA;AAAA,sBAAC,EAAA,CAAG,MAAA;AAAA,sBAAH;AAAA,wBACC,IAAA,EAAK,IAAA;AAAA,wBACL,OAAA,EAAQ,OAAA;AAAA,wBACR,SAAA,EAAU,UAAA;AAAA,wBACV,QAAA,EAAU,QAAA;AAAA,wBACV,SAAA,EAAW,CAAA,cAAA,EAAiB,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,wBACvC,SAAS,MAAM;AACb,0BAAA,KAAA,CAAM,YAAA,CAAa,MAAA,EAAQ,KAAK,CAAC,CAAA;AAAA,wBACnC,CAAA;AAAA,wBACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,iBAAA;AAAA,gBA9CK,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,eAgD/B,CAAA,EACH,CAAA;AAAA,8BAEFA,GAAAA;AAAA,gBAAC,EAAA,CAAG,MAAA;AAAA,gBAAH;AAAA,kBACC,IAAA,EAAK,IAAA;AAAA,kBACL,OAAA,EAAQ,WAAA;AAAA,kBACR,QAAA,EAAU,QAAA,IAAY,OAAA,CAAQ,MAAA,KAAW,CAAA;AAAA,kBACzC,KAAA,EACE,OAAA,CAAQ,MAAA,KAAW,CAAA,GACf,gCAAA,GACA,EAAA;AAAA,kBAEN,SAAS,MAAM;AACb,oBAAA,MAAM,QACJ,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,GAAA;AAClD,oBAAA,IAAI,KAAA,EAAO,KAAA,CAAM,SAAA,CAAU,MAAA,EAAQ,KAAK,CAAC,CAAA;AAAA,kBAC3C,CAAA;AAAA,kBACD,QAAA,EAAA;AAAA;AAAA;AAED,aAAA,EACF;AAAA,WAAA,EACF;AAAA;AAAA,OAEJ;AAAA,sBAEAA,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,WAAW,CAAC,CAAA;AAAA,UACpB,MAAA,EAAQ,CAAA;AAAA,UACR,KAAA,EAAM,kBAAA;AAAA,UACN,KAAA,EAAM,uGAAA;AAAA,UACN,IAAA,EAAK,oGAAA;AAAA,UACL,IAAA,EAAI,IAAA;AAAA,UAEH,kCACCA,GAAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,OAAO,MAAA,CAAO,KAAA;AAAA,cACd,QAAA;AAAA,cACA,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,gBAAA,KAAA,CAAM,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA;AAAA,cAClC;AAAA;AAAA,8BAGFA,GAAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,MAAA;AAAA,cACA,MAAA;AAAA,cACA,QAAA;AAAA,cACA,QAAA,EAAU,CAAC,UAAA,KAAe;AACxB,gBAAA,KAAA,CAAM,EAAE,GAAG,MAAA,EAAQ,UAAA,EAAY,CAAA;AAAA,cACjC;AAAA;AAAA;AACF;AAAA,OAEJ;AAAA,sBAEAD,IAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,WAAW,CAAC,CAAA;AAAA,UACpB,MAAA,EAAQ,CAAA;AAAA,UACR,KAAA,EAAM,wBAAA;AAAA,UACN,KAAA,EAAM,4GAAA;AAAA,UACN,IAAA,EAAK,8JAAA;AAAA,UACL,IAAA,EAAM,OAAO,MAAA,KAAW,CAAA;AAAA,UAEvB,QAAA,EAAA;AAAA,YAAA,MAAA,CAAO,MAAA,GAAS,CAAA,mBACfC,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,gFAAA,EACX,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,qBACXA,IAAC,IAAA,EAAA,EAAgB,QAAA,EAAA,KAAA,EAAA,EAAR,KAAc,CACxB,CAAA,EACH,CAAA,mBAEAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,kCAAA,EAE7C,CAAA;AAAA,4BAGFA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCACb,QAAA,kBAAAA,GAAAA;AAAA,cAAC,EAAA,CAAG,MAAA;AAAA,cAAH;AAAA,gBACC,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAQ,WAAA;AAAA,gBACR,QAAA,EAAU,UAAA,IAAc,CAAC,MAAA,CAAO,aAAa,SAAA,KAAc,IAAA;AAAA,gBAC3D,SAAS,MAAM;AACb,kBAAA,KAAK,WAAW,MAAM,CAAA;AAAA,gBACxB,CAAA;AAAA,gBAEC,uBAAa,YAAA,GAAe;AAAA;AAAA,aAC/B,EACF,CAAA;AAAA,YAEC,YAAA,KAAiB,uBAChBA,GAAAA,CAAC,OAAE,SAAA,EAAU,0BAAA,EAA4B,wBAAa,CAAA,GACpD,IAAA;AAAA,YAEH,OAAA,mBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,CAAA,EAAG,QAAQ,QAAQ,CAAA,KAAA,CAAA;AAAA,gBACnB,QAAQ,kBAAA,GACL,CAAA,YAAA,EAAe,OAAA,CAAQ,kBAAA,CAAmB,MAAM,CAAA,UAAA,CAAA,GAChD;AAAA,eAAA,EACN,CAAA;AAAA,8BACAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CACb,QAAA,kBAAAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,0BAAA,EACf,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,UAAA,EACf,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACpBA,GAAAA;AAAA,kBAAC,IAAA;AAAA,kBAAA;AAAA,oBAEC,SAAA,EAAW,EAAA;AAAA,sBACT,uBAAA;AAAA,sBACA,QAAA,CAAS,MAAA,EAAQ,MAAM,CAAA,GAAI,cAAA,GAAiB;AAAA,qBAC9C;AAAA,oBAEC,QAAA,EAAA;AAAA,mBAAA;AAAA,kBANI;AAAA,iBAQR,GACH,CAAA,EACF,CAAA;AAAA,gCACAA,GAAAA,CAAC,OAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,KAAK,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,qBACtBA,GAAAA,CAAC,IAAA,EAAA,EAAe,SAAA,EAAU,UAAA,EACvB,kBAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACpBA,GAAAA,CAAC,IAAA,EAAA,EAAgB,SAAA,EAAU,WAAA,EACxB,iBAAO,GAAA,CAAI,MAAM,CAAA,IAAK,EAAE,KADlB,MAET,CACD,CAAA,EAAA,EALM,KAMT,CACD,CAAA,EACH;AAAA,eAAA,EACF,CAAA,EACF;AAAA,aAAA,EACF,CAAA,GACE;AAAA;AAAA;AAAA;AACN,KAAA,EACF,CAAA;AAAA,oBAGFA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,QAAA,EAAU,cAAA,CAAe,QAAQ,CAAA,EAAG;AAAA,GAAA,EACxD,CAAA;AAEJ;ACliDO,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,EAAE,SAAA,EAAW,EAAA,EAAI,WAAA,KAAgB,YAAA,EAAa;AACpD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIG,SAA2C,IAAI,CAAA;AACvE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAGtD,EAAA,MAAM,SAAA,GAAY,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,GAAI,EAAA;AACtD,EAAA,MAAM,KAAA,GAAQG,OAAAA;AAAA,IACZ,MACE,SAAA,KAAc,EAAA,GACV,IAAA,GACC,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,IAC3B,CAAC,SAAS;AAAA,GACZ;AAEA,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,QAAA,EAAU;AACtB,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,QAAA;AACX,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,eAAe,IAAA,GAAsB;AACnC,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,cAAA,CAAe;AAAA,UAC5C,WAAA;AAAA,UACA,QAAA,EAAU,EAAA;AAAA,UACV,GAAI,KAAA,GAAQ,EAAE,OAAA,EAAS,KAAA,KAAU,EAAC;AAAA,UAClC,QAAQ,UAAA,CAAW;AAAA,SACpB,CAAA;AACD,QAAA,IAAI,CAAC,SAAA,EAAW,OAAA,CAAQ,MAAM,CAAA;AAAA,MAChC,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,oBAAoB,CAAA;AAAA,QACpE;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,MAClC;AAAA,IACF;AACA,IAAA,KAAK,IAAA,EAAK;AACV,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB,CAAA;AAAA,EACF,GAAG,CAAC,SAAA,EAAW,aAAa,IAAA,EAAM,QAAA,EAAU,KAAK,CAAC,CAAA;AAElD,EAAA,uBACEJ,GAAAA;AAAA,IAAC,EAAA,CAAG,KAAA;AAAA,IAAH;AAAA,MACC,IAAA;AAAA,MACA,IAAA,EAAK,IAAA;AAAA,MACL,KAAA,EAAM,oBAAA;AAAA,MACN,WAAA,EACE,QAAA,GAAW,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,GAAK,0BAAA;AAAA,MAE/C,YAAA;AAAA,MAEA,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,QAAA,OAAA,mBACCC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,oCAE7C,CAAA,GACE,IAAA;AAAA,QAEH,KAAA,KAAU,uBACTA,GAAAA,CAAC,SAAI,SAAA,EAAU,qFAAA,EACZ,iBACH,CAAA,GACE,IAAA;AAAA,QAEH,CAAC,OAAA,IAAW,IAAA,mBACXD,IAAAA,CAAAe,UAAA,EACE,QAAA,EAAA;AAAA,0BAAAf,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,YAAA,YAAA;AAAA,YAClC,GAAA;AAAA,4BACXC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EACb,eAAK,SAAA,EACR;AAAA,WAAA,EACF,CAAA;AAAA,UAEC,KAAK,KAAA,KAAU,MAAA,mBACdD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0FAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,8CAAA,EAErC,CAAA;AAAA,4BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACZ,eAAK,KAAA,EACR;AAAA,WAAA,EACF,CAAA,GACE,IAAA;AAAA,UAEH,IAAA,CAAK,QAAQ,MAAA,KAAW,CAAA,mBACvBA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+BAAA,EAAgC,QAAA,EAAA,gFAAA,EAG7C,IAEA,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,KAAA,EAAO,0BACvBD,IAAAA,CAAC,KAAA,EAAA,EAAgB,SAAA,EAAU,iCAAA,EACzB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,KAAA,CAAM,KAAK,WAAA,EAAY;AAAA,gBACvB,KAAA,CAAM,IAAA,GAAO,CAAA,GAAA,EAAM,KAAA,CAAM,IAAI,CAAA,CAAA,GAAK;AAAA,eAAA,EACrC,CAAA;AAAA,cACC,KAAA,CAAM,WAAA,KAAgB,IAAA,mBACrBC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACZ,QAAA,EAAA,CAAA,YAAA,EAAe,KAAA,CAAM,WAAW,CAAA,CAAA,EACnC,CAAA,GACE;AAAA,aAAA,EACN,CAAA;AAAA,YAEC,KAAA,CAAM,WAAA,KAAgB,IAAA,mBACrBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACZ,QAAA,EAAA,CAAA,cAAA,EAAiB,KAAA,CAAM,WAAW,CAAA,CAAA,EACrC,CAAA,GACE,IAAA;AAAA,YAEH,KAAA,CAAM,uBAAuB,IAAA,mBAC5BA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCACZ,QAAA,EAAA,CAAA,qBAAA,EACC,KAAA,CAAM,mBAAmB,MAAA,GAAS,CAAA,GAC9B,MAAM,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA,GAClC,YACN,IACF,CAAA,GACE,IAAA;AAAA,4BAEJA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACZ,QAAA,EAAA,KAAA,CAAM,GAAA,EACT,CAAA,EACF,CAAA;AAAA,YAEC,MAAM,KAAA,KAAU,MAAA,mBACfD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+BAAA,EACZ,QAAA,EAAA;AAAA,cAAA,CAAA,eAAA,EAAkB,MAAM,KAAK,CAAA,CAAA;AAAA,cAC7B,MAAM,eAAA,KAAoB,MAAA,GACvB,CAAA,MAAA,EAAS,KAAA,CAAM,eAAe,CAAA,EAAA,CAAA,GAC9B;AAAA,aAAA,EACN,CAAA,GACE,IAAA;AAAA,YAEH,MAAM,QAAA,KAAa,MAAA,mBAClBA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+BAAA,EACZ,QAAA,EAAA;AAAA,cAAA,CAAA,SAAA,EAAY,MAAM,QAAQ,CAAA,IAAA,EACzB,MAAM,QAAA,KAAa,CAAA,GAAI,KAAK,GAC9B,CAAA,CAAA;AAAA,cACC,KAAA,CAAM,eAAA,IAAmB,KAAA,CAAM,eAAA,CAAgB,MAAA,GAAS,CAAA,GACrD,CAAA,EAAA,EAAK,KAAA,CAAM,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GACrC;AAAA,aAAA,EACN,CAAA,GACE,IAAA;AAAA,YAEH,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,CAAE,MAAA,GAAS,CAAA,mBAClCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,cAAQ,GAAA;AAAA,8BAC7CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EACZ,QAAA,EAAA,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EACvC;AAAA,aAAA,EACF,CAAA,GACE;AAAA,WAAA,EAAA,EA9DI,KA+DV,CACD,CAAA;AAAA,UAGF,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,oBACjCD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,YACjD,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACfA,GAAAA,CAAC,KAAA,EAAA,EAAe,SAAA,EAAU,+BAAA,EACvB,QAAA,EAAA,IAAA,EAAA,EADO,IAEV,CACD;AAAA,WAAA,EACH,CAAA,GACE,IAAA;AAAA,UAEH,KAAK,OAAA,mBACJD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,4BAChDD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACZ,QAAA,EAAA;AAAA,cAAA,CAAA,EAAG,IAAA,CAAK,QAAQ,QAAQ,CAAA,IAAA,EACvB,KAAK,OAAA,CAAQ,QAAA,KAAa,CAAA,GAAI,EAAA,GAAK,GACrC,CAAA,mBAAA,CAAA;AAAA,cACC,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,MAAA,GAAS,CAAA,GACpC,CAAA,EAAA,EAAK,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAC7C;AAAA,aAAA,EACN,CAAA;AAAA,YACC,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,YAAY,CAAA,CAAE,GAAA;AAAA,cACzC,CAAC,CAAC,IAAA,EAAM,KAAK,sBACXC,GAAAA,CAAC,KAAA,EAAA,EAAe,SAAA,EAAU,iCACvB,QAAA,EAAA,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,KAAK,MADV,IAEV;AAAA,aAEJ;AAAA,YACC,KAAK,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,0BACxBA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,qFAAA;AAAA,gBAET,QAAA,EAAA;AAAA,eAAA;AAAA,cAHI;AAAA,aAKR;AAAA,WAAA,EACH,CAAA,GACE;AAAA,SAAA,EACN,CAAA,GACE;AAAA,OAAA,EACN;AAAA;AAAA,GACF;AAEJ;AC7NA,IAAM,aAAA,GAAmD;AAAA,EACvD,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,UAAA,EAAY,YAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;AAwBO,SAAS,eAAA,CAAgB;AAAA,EAC9B,OAAA;AAAA,EACA,iBAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,EAAE,SAAA,EAAW,EAAA,EAAI,aAAa,OAAA,EAAS,QAAA,KAAa,YAAA,EAAa;AACvE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIG,SAA4B,KAAK,CAAA;AAC/D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GACpCA,SAA4B,QAAQ,CAAA;AACtC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE9C,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,iBAAiB,CAAA;AAC1C,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA;AAAA,IAAK,CAAC,GAAG,CAAA,KAC3C,CAAA,CAAE,SAAS,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,QAAA,CAAS,IAAI;AAAA,GAC/C;AAEA,EAAA,eAAe,MAAA,GAAwB;AACrC,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,eAAe,OAAA,EAAS;AAAA,QACvC,GAAI,OAAA,GAAU,EAAE,IAAA,EAAM,OAAA,KAAY,EAAC;AAAA,QACnC,GAAI,OAAA,KAAY,QAAA,GAAW,EAAE,aAAA,EAAe,aAAA,KAAkB;AAAC,OAChE,CAAA;AACD,MAAA,MAAM,UAAU,MAAM,SAAA,CAAU,aAAa,EAAE,WAAA,EAAa,UAAU,CAAA;AACtE,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA,MAAM,SAAA,CAAU,QAAQ,QAAQ,CAAA;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,OAAA,EAAS,0BAAA;AAAA,QACT,GAAI,iBAAiB,KAAA,GAAQ,EAAE,QAAQ,KAAA,CAAM,OAAA,KAAY;AAAC,OAC3D,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,WAAA,CAAY,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,uBACEH,GAAAA;AAAA,IAAC,EAAA,CAAG,KAAA;AAAA,IAAH;AAAA,MACC,IAAA;AAAA,MACA,IAAA,EAAK,IAAA;AAAA,MACL,KAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAY,wGAAA;AAAA,MACZ,YAAA;AAAA,MAEA,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAA;AAAA,QAAA,qBAAA,mBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,mBAAA,EAAiB,CAAA;AAAA,0BACtDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,8EAAA,EAG7C,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,EAAA,CAAG,MAAA;AAAA,YAAH;AAAA,cACC,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAQ,SAAA;AAAA,cACR,UAAU,CAAC,OAAA;AAAA,cACX,OAAA,EAAS,qBAAA;AAAA,cACV,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF,CAAA,GACE,IAAA;AAAA,wBAEJD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,2BAAA,EAAyB,CAAA;AAAA,0BAC9DA,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,MAAA;AAAA,cACN,KAAA,EAAO,OAAA;AAAA,cACP,WAAA,EAAY,KAAA;AAAA,cACZ,UAAU,CAAC,OAAA;AAAA,cACX,OAAA,EAAS,mBAAA,CAAoB,GAAA,CAAI,CAAC,SAAA,MAAe;AAAA,gBAC/C,KAAA,EAAO,SAAA;AAAA,gBACP,KAAA,EAAO,uBAAuB,SAAS;AAAA,eACzC,CAAE,CAAA;AAAA,cACF,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,gBAAA,IAAK,mBAAA,CAA0C,QAAA,CAAS,KAAK,CAAA,EAAG;AAC9D,kBAAA,UAAA,CAAW,KAA0B,CAAA;AAAA,gBACvC;AAAA,cACF;AAAA;AAAA,WACF;AAAA,UACC,OAAA,KAAY,2BACXA,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,SAAA;AAAA,cACN,KAAA,EAAO,aAAA;AAAA,cACP,WAAA,EAAY,QAAA;AAAA,cACZ,UAAU,CAAC,OAAA;AAAA,cACX,OAAA,EAAS,eAAA,CAAgB,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,gBACzC,KAAA,EAAO,OAAA;AAAA,gBACP,KAAA,EAAO,cAAc,OAAO;AAAA,eAC9B,CAAE,CAAA;AAAA,cACF,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,gBAAA,IAAK,eAAA,CAAsC,QAAA,CAAS,KAAK,CAAA,EAAG;AAC1D,kBAAA,gBAAA,CAAiB,KAA0B,CAAA;AAAA,gBAC7C;AAAA,cACF;AAAA;AAAA,WACF,GACE,IAAA;AAAA,0BACJA,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,iBAAA;AAAA,cACN,KAAA,EAAO,OAAA;AAAA,cACP,WAAA,EAAY,iBAAA;AAAA,cACZ,UAAU,CAAC,OAAA;AAAA,cACX,QAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAA,GAAAA;AAAA,YAAC,EAAA,CAAG,MAAA;AAAA,YAAH;AAAA,cACC,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAQ,SAAA;AAAA,cACR,QAAA,EAAU,YAAY,CAAC,OAAA;AAAA,cACvB,SAAS,MAAM;AACb,gBAAA,KAAK,MAAA,EAAO;AAAA,cACd,CAAA;AAAA,cAEC,qBAAW,WAAA,GAAc;AAAA;AAAA;AAC5B,SAAA,EACF,CAAA;AAAA,wBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACZ,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,MAAA,KAAW,oBACfC,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAgC,uEAE7C,CAAA,GACE,IAAA;AAAA,UACH,IAAA,CAAK,GAAA,CAAI,CAAC,MAAA,KAAW;AACpB,YAAA,MAAM,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,SAAS,EAAE,CAAA;AAClD,YAAA,uBACED,IAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,+DAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,oCAAAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACZ,QAAA,EAAA,MAAA,CAAO,SAAS,IAAA,EACnB,CAAA;AAAA,oCACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EACb,QAAA,EAAA;AAAA,sCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,MAAA,CAAO,IAAA,CAAK,SAAA,EAAU,CAAA;AAAA,sCAC7BA,GAAAA,CAAC,EAAA,CAAG,KAAA,EAAH,EAAS,IAAA,EAAM,UAAA,GAAa,SAAA,GAAY,MAAA,EACtC,QAAA,EAAA,UAAA,GAAa,YAAA,GAAe,SAAA,EAC/B;AAAA,qBAAA,EACF;AAAA,mBAAA,EACF,CAAA;AAAA,kCACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,mBAAA,mBACCC,GAAAA;AAAA,sBAAC,EAAA,CAAG,MAAA;AAAA,sBAAH;AAAA,wBACC,IAAA,EAAK,IAAA;AAAA,wBACL,OAAA,EAAQ,OAAA;AAAA,wBACR,SAAA,EAAW,CAAA,KAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,mBAAA,CAAA;AAAA,wBACvC,UAAU,CAAC,OAAA;AAAA,wBACX,SAAS,MAAM;AACb,0BAAA,mBAAA,CAAoB,MAAA,CAAO,SAAS,EAAE,CAAA;AAAA,wBACxC,CAAA;AAAA,wBACD,QAAA,EAAA;AAAA;AAAA,qBAED,GACE,IAAA;AAAA,oCACJA,GAAAA;AAAA,sBAAC,EAAA,CAAG,MAAA;AAAA,sBAAH;AAAA,wBACC,IAAA,EAAK,IAAA;AAAA,wBACL,OAAA,EAAQ,OAAA;AAAA,wBACR,SAAA,EAAW,CAAA,KAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,CAAA;AAAA,wBACvC,SAAS,MAAM;AACb,0BAAA,MAAA,CAAO,MAAA,CAAO,SAAS,EAAE,CAAA;AAAA,wBAC3B,CAAA;AAAA,wBACD,QAAA,EAAA;AAAA;AAAA,qBAED;AAAA,oCACAA,GAAAA;AAAA,sBAAC,EAAA,CAAG,MAAA;AAAA,sBAAH;AAAA,wBACC,IAAA,EAAK,IAAA;AAAA,wBACL,OAAA,EAAQ,OAAA;AAAA,wBACR,UAAU,CAAC,OAAA;AAAA,wBACX,SAAA,EACE,UAAA,GACI,CAAA,IAAA,EAAO,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,YAAA,CAAA,GAC3B,CAAA,OAAA,EAAU,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,cAAA,CAAA;AAAA,wBAEpC,SAAS,MAAM;AACb,0BAAA,IAAI,UAAA,EAAY,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,+BACnC,QAAA,CAAS,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,wBAClC,CAAA;AAAA,wBAEC,uBAAa,aAAA,GAAgB;AAAA;AAAA,qBAChC;AAAA,oCACAA,GAAAA;AAAA,sBAAC,EAAA,CAAG,MAAA;AAAA,sBAAH;AAAA,wBACC,IAAA,EAAK,IAAA;AAAA,wBACL,OAAA,EAAQ,OAAA;AAAA,wBACR,UAAU,CAAC,OAAA;AAAA,wBACX,SAAA,EAAW,CAAA,OAAA,EAAU,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,CAAA;AAAA,wBACzC,SAAS,MAAM;AACb,0BAAA,KAAK,QAAA,CAAS,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,wBAClC,CAAA;AAAA,wBACD,QAAA,EAAA;AAAA;AAAA;AAED,mBAAA,EACF;AAAA;AAAA,eAAA;AAAA,cAjEK,OAAO,QAAA,CAAS;AAAA,aAkEvB;AAAA,UAEJ,CAAC;AAAA,SAAA,EACH;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;AC1NO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,EAAA;AAAA,IACA,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAa;AACjB,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,CAAU,eAAA,KAAoB,UAAA;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIG,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,QAAAA,CAA2B,eAAe,SAAS,CAAA;AAC3E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AAErC,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAI1E,EAAA,MAAM,UAAA,GAAaF,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,gBAAA,GAAmBA,OAAO,aAAa,CAAA;AAC7C,EAAA,MAAM,eAAA,GAAkBA,OAAO,YAAY,CAAA;AAC3C,EAAAG,UAAU,MAAM;AACd,IAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,IAAA,gBAAA,CAAiB,OAAA,GAAU,aAAA;AAC3B,IAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,OAAA,EAAS,aAAA,EAAe,YAAY,CAAC,CAAA;AAEzC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,OAAA,CAAQ,eAAe,SAAS,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,IAAA,EAAM,WAAA,EAAa,QAAQ,CAAC,CAAA;AAEhC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,IAAA,EAAM;AACxB,IAAA,MAAM,EAAA,GAAK,QAAA;AACX,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,eAAe,IAAA,GAAsB;AACnC,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAMc,SAAAA,GAAW,MAAM,SAAA,CAAU,kBAAA,CAAmB;AAAA,UAClD,WAAA;AAAA,UACA,QAAA,EAAU,EAAA;AAAA,UACV,QAAQ,UAAA,CAAW;AAAA,SACpB,CAAA;AACD,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAASA,UAAS,QAAQ,CAAA;AAC1B,UAAA,QAAA,CAASA,UAAS,QAAQ,CAAA;AAAA,QAC5B;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA;AAAA,YACE,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,WACvC;AAAA,QACF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,MAClC;AAAA,IACF;AACA,IAAA,KAAK,IAAA,EAAK;AACV,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB,CAAA;AAAA,EACF,GAAG,CAAC,SAAA,EAAW,WAAA,EAAa,QAAA,EAAU,IAAI,CAAC,CAAA;AAE3C,EAAAd,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,eAAe,SAAA,GAA2B;AACxC,MAAA,IAAI;AACF,QAAA,MAAMkB,MAAAA,GAAQ,MAAM,SAAA,CAAU,SAAA,CAAU,EAAE,MAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA;AACrE,QAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAaA,MAAAA,CAAM,QAAQ,CAAA;AAAA,MAC7C,CAAA,CAAA,MAAQ;AAGN,QAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,IAAI,CAAA;AAAA,MACnC;AAAA,IACF;AACA,IAAA,KAAK,SAAA,EAAU;AACf,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,IAAI,CAAC,CAAA;AAEpB,EAAA,MAAM,KAAA,GAAgChB,QAAQ,MAAM;AAClD,IAAA,IAAI,SAAA,KAAc,MAAM,OAAO,IAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,iBAAiB,SAAS,CAAA;AACzC,IAAA,OAAO;AAAA,MACL,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,cAAc,MAAA,CAAO;AAAA,KACvB;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AASd,EAAA,MAAM,MAAA,GAASA,QAAQ,MAAM;AAC3B,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,SAAc,EAAC;AAC9B,IAAA,MAAM,OAAA,GAAU,kBAAkB,KAAK,CAAA;AACvC,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,OAAO,CAAC,CAAA,0BAAA,EAA6B,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,EAAC;AAC7B,IAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AAGjB,EAAA,MAAM,OAAA,GAAUA,OAAAA;AAAA,IACd,MAAO,KAAA,IAAS,KAAA,GAAQ,cAAc,KAAA,EAAO,KAAK,IAAI,EAAC;AAAA,IACvD,CAAC,OAAO,KAAK;AAAA,GACf;AAEA,EAAA,SAAS,iBAAiB,SAAA,EAA0B;AAClD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,IACzB;AACA,IAAA,eAAA,CAAgB,QAAQ,SAAS,CAAA;AAAA,EACnC;AAOA,EAAA,SAAS,eAAA,GAA2B;AAClC,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,UAAA,EAAY,OAAO,KAAA;AAC9C,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,eAAe,QAAQ,WAAA,EAAqC;AAC1D,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,IAAI,iBAAgB,EAAG;AACvB,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,UAAU,UAAA,CAAW,EAAE,aAAa,QAAA,EAAU,QAAA,EAAU,OAAO,CAAA;AACrE,MAAA,IAAI,eAAA,IAAmB,UAAU,qBAAA,EAAuB;AAGtD,QAAA,KAAK,UAAU,qBAAA,CAAsB;AAAA,UACnC,UAAA,EAAY,eAAA;AAAA,UACZ,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AACA,MAAA,MAAM,WAAW,OAAA,EAAQ;AACzB,MAAA,IAAI,WAAA,EAAa,gBAAA,CAAiB,OAAA,GAAU,QAAQ,CAAA;AACpD,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA;AAAA,QACE,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,OACvC;AAAA,IACF,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAsC;AAAA,IAC1C,GAAI,SAAU,CAAC,CAAC,OAAO,KAAK,CAAC,IAAqC,EAAC;AAAA,IACnE,CAAC,WAAW,SAAS,CAAA;AAAA,IACrB,CAAC,QAAQ,MAAM;AAAA,GACjB;AAEA,EAAA,uBACEN,GAAAA;AAAA,IAAC,EAAA,CAAG,KAAA;AAAA,IAAH;AAAA,MACC,IAAA;AAAA,MACA,IAAA,EAAK,IAAA;AAAA,MACL,KAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAY,6JAAA;AAAA,MACZ,YAAA,EAAc,gBAAA;AAAA,MACd,MAAA,kBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,QAAA,EAAU,MAAA;AAAA,YACV,SAAS,MAAM;AACb,cAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,YACxB,CAAA;AAAA,YACD,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,QACC,gCACCA,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,QAAA,EAAU,MAAA,IAAU,OAAA,IAAW,CAAC,YAAY,CAAC,OAAA;AAAA,YAC7C,SAAS,MAAM;AACb,cAAA,KAAK,QAAQ,IAAI,CAAA;AAAA,YACnB,CAAA;AAAA,YACD,QAAA,EAAA;AAAA;AAAA,SAED,GACE,IAAA;AAAA,wBACJA,GAAAA;AAAA,UAAC,EAAA,CAAG,MAAA;AAAA,UAAH;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,QAAA,EAAU,MAAA,IAAU,OAAA,IAAW,CAAC,YAAY,CAAC,OAAA;AAAA,YAC7C,SAAS,MAAM;AACb,cAAA,KAAK,QAAQ,KAAK,CAAA;AAAA,YACpB,CAAA;AAAA,YACD,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF,CAAA;AAAA,MAGF,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACZ,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,CAAC,EAAA,EAAI,KAAK,sBACpBA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,gBAAc,IAAA,KAAS,EAAA;AAAA,YACvB,SAAS,MAAM;AACb,cAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,YACZ,CAAA;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACT,2BAAA;AAAA,cACA,IAAA,KAAS,KACL,sBAAA,GACA;AAAA,aACN;AAAA,YAEC,QAAA,EAAA;AAAA,WAAA;AAAA,UAbI;AAAA,SAeR,GACH,CAAA,EACF,CAAA;AAAA,wBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCACZ,QAAA,EAAA,OAAA,mBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mCAAA,EAAoC,QAAA,EAAA,wBAAA,EAEjD,CAAA,GACE,IAAA,KAAS,wBACXA,GAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,QAAA;AAAA,YACA,QAAA,EAAU,KAAA;AAAA,YACV,SAAS,KAAA,KAAU,KAAA;AAAA,YACnB,OAAA,EAAS,CAAC,QAAA,EAAU,UAAA,KAAe;AACjC,cAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,cAAA,kBAAA,CAAmB,UAAU,CAAA;AAC7B,cAAA,aAAA,CAAc,KAAK,CAAA;AACnB,cAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,YACnB,CAAA;AAAA,YACA,eAAe,MAAM;AACnB,cAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,YACnB;AAAA;AAAA,SACF,GACE,IAAA,KAAS,SAAA,mBACXA,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,KAAA;AAAA,YACV,UAAU,CAAC,OAAA;AAAA,YACX,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,cAAA,QAAA,CAAS,IAAI,CAAA;AACb,cAAA,aAAA,CAAc,KAAK,CAAA;AAAA,YACrB,CAAA;AAAA,YACA,cAAc,MAAM;AAClB,cAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,YAChB;AAAA;AAAA,4BAGFA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,QAAA,EAAS,MAAA;AAAA,YACT,UAAU,CAAC,OAAA;AAAA,YACX,OAAA;AAAA,YACA,SAAA,EAAU,aAAA;AAAA,YACV,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,cAAA,QAAA,CAAS,IAAI,CAAA;AACb,cAAA,aAAA,CAAc,KAAK,CAAA;AAAA,YACrB;AAAA;AAAA,SACF,EAEJ,CAAA;AAAA,QAEC,KAAA,KAAU,uBACTA,GAAAA,CAAC,SAAI,SAAA,EAAU,mDAAA,EACZ,iBACH,CAAA,GACE,IAAA;AAAA,QAEH,OAAO,MAAA,GAAS,CAAA,mBACfD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uDAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA,UAAA,GACG,uEACA,gCAAA,EACN,CAAA;AAAA,0BACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2CACX,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,qBACXA,GAAAA,CAAC,IAAA,EAAA,EAAgB,QAAA,EAAA,KAAA,EAAA,EAAR,KAAc,CACxB,CAAA,EACH;AAAA,SAAA,EACF,CAAA,GACE;AAAA,OAAA,EACN;AAAA;AAAA,GACF;AAEJ;ACxVO,SAAS,WAAA,CACd,QACA,IAAA,EACa;AACb,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIG,SAAmB,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,CAAC,CAAA;AAElC,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,CACrB,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,MAAA,IAAI,UAAA,CAAW,OAAO,OAAA,EAAS;AAC/B,MAAA,OAAA,CAAQ,KAAK,CAAA;AACb,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,OAAA,KAAqB;AAC3B,MAAA,IAAI,UAAA,CAAW,OAAO,OAAA,EAAS;AAC/B,MAAA,QAAA,CAAS,mBAAmB,KAAA,GAAQ,OAAA,CAAQ,OAAA,GAAU,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IACvE,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,IAAI,CAAC,UAAA,CAAW,MAAA,CAAO,OAAA,aAAoB,KAAK,CAAA;AAAA,IAClD,CAAC,CAAA;AACH,IAAA,OAAO,MAAM,WAAW,KAAA,EAAM;AAAA,EAChC,CAAA,EAAG,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AAElB,EAAA,MAAM,MAAA,GAASF,WAAAA,CAAY,MAAM,OAAA,CAAQ,CAAC,UAAU,KAAA,GAAQ,CAAC,CAAA,EAAG,EAAE,CAAA;AAClE,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,MAAA,EAAO;AACxC;ACzBA,IAAM,WAAA,GAA8C;AAAA,EAClD,IAAA,EAAM,qDAAA;AAAA,EACN,OAAA,EAAS,iDAAA;AAAA,EACT,OAAA,EAAS,6CAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAEO,SAAS,UAAA,CAAW,EAAE,OAAA,EAAQ,EAAmC;AACtE,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACjC,EAAA,uBACEF,GAAAA,CAAC,IAAA,EAAA,EAAG,YAAA,EAAW,SAAA,EAAU,SAAA,EAAU,WAAA,EAChC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,qBACpBD,IAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,qCAAA;AAAA,QACA,WAAA,CAAY,OAAO,IAAI;AAAA,OACzB;AAAA,MAGC,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,OAAA;AAAA,QACP,MAAA,CAAO,MAAA,KAAW,MAAA,GAAY,IAAA,mBAC7BC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA2B,QAAA,EAAA,MAAA,CAAO,MAAA,EAAO;AAAA;AAAA,KAAA;AAAA,IAJtD,GAAG,MAAA,CAAO,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,GAO1C,CAAA,EACH,CAAA;AAEJ;AAGO,SAAS,QAAA,CAAS,MAAY,QAAA,EAAwB;AAC3D,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACzC,EAAA,MAAA,CAAO,IAAA,GAAO,GAAA;AACd,EAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAClB,EAAA,MAAA,CAAO,GAAA,GAAM,UAAA;AACb,EAAA,QAAA,CAAS,IAAA,CAAK,OAAO,MAAM,CAAA;AAC3B,EAAA,MAAA,CAAO,KAAA,EAAM;AACb,EAAA,MAAA,CAAO,MAAA,EAAO;AACd,EAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AACzB;AAcO,SAAS,UAAA,CAAW;AAAA,EACzB,WAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,OAAO,SAAA,CAAU,iBAAA;AACvB,EAAA,MAAM,WAAW,SAAA,CAAU,cAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACd,CAAC,MAAA,KAAY,IAAA,KAAS,MAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA,GAAI,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA;AAAA,IACvE,CAAC,IAAI;AAAA,GACP;AACA,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIG,SAAS,KAAK,CAAA;AACtC,EAAA,IAAI,IAAA,KAAS,MAAA,IAAa,QAAA,KAAa,MAAA,EAAW,OAAO,IAAA;AACzD,EAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AAEvB,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,KAAmB;AACpC,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS;AAAA,QAC5B,WAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA,EAAS,WAAW;AAAC,OACtB,CAAA;AACD,MAAA,QAAA,CAAS,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,QAAQ,CAAA;AACrC,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,CAAA,WAAA,EAAc,MAAA,CAAO,QAAQ,CAAA,CAAA;AAAA,QACtC,QAAQ,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,MAAA;AAAA,OACpC,CAAA;AAAA,IACH,SAAS,OAAA,EAAS;AAChB,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,OAAA,EAAS,mBAAA;AAAA,QACT,GAAI,mBAAmB,KAAA,GAAQ,EAAE,QAAQ,OAAA,CAAQ,OAAA,KAAY;AAAC,OAC/D,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,IAClD,IAAI,MAAA,CAAO,MAAA;AAAA,IACX,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAA,EAAU,MAAM,KAAK,GAAA,CAAI,OAAO,MAAM;AAAA,GACxC,CAAE,CAAA;AACF,EAAA,IAAI,OAAA,CAAQ,UAAU,IAAA,EAAM;AAC1B,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,EAAA,EAAI,OAAA;AAAA,MACJ,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,UAAU,MAAM;AAAA,KACjB,CAAA;AAAA,EACH;AACA,EAAA,uBACEH,GAAAA;AAAA,IAAC,EAAA,CAAG,IAAA;AAAA,IAAH;AAAA,MACC,SAAA,EAAU,QAAA;AAAA,MACV,KAAA;AAAA,MACA,OAAA,kBACED,IAAAA,CAAC,EAAA,CAAG,MAAA,EAAH,EAAU,QAAA,EAAU,IAAA,EAAM,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,WAAA,EAC3C,QAAA,EAAA;AAAA,wBAAAC,IAAC,QAAA,EAAA,EAAS,CAAA;AAAA,QAAE;AAAA,OAAA,EAEd;AAAA;AAAA,GAEJ;AAEJ;AAaA,IAAM,kBAAA,GAAkE;AAAA,EACtE,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACvC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,cAAA;AACzB,CAAA;AAOO,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,KAAK,QAAA,EAAS;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIG,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAA2B,IAAI,CAAA;AAC3D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,MAAM,CAAA;AACnD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,SAAS,SAAA,CAAU,gBAAA;AACzB,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,CAAC,WACC,MAAA,KAAW,MAAA,IAAa,MAAM,IAAA,EAAK,KAAM,KACrC,OAAA,CAAQ,OAAA,CAAqB,EAAE,CAAA,GAC/B,OAAO,EAAE,KAAA,EAAO,MAAM,IAAA,EAAK,EAAG,QAAQ,CAAA;AAAA,IAC5C,CAAC,QAAQ,KAAK;AAAA,GAChB;AACA,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AAEpB,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,KAA2C;AAC5D,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,SAAA,CAAU,MAAM,QAAQ,CAAA;AAAA,IAC1B,SAAS,OAAA,EAAS;AAChB,MAAA,QAAA,CAAS,mBAAmB,KAAA,GAAQ,OAAA,CAAQ,OAAA,GAAU,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IACvE,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cACJ,MAAA,EAAQ,WAAA,KAAgB,WAAW,MAAA,GAAY,KAAA,CAAM,MAAK,GAAI,EAAA,CAAA;AAChE,EAAA,MAAM,KAAA,uBAAY,GAAA,CAAI;AAAA,IACpB,GAAG,SAAA,CAAU,MAAA,CAAO,IAAI,CAAC,KAAA,KAAU,MAAM,WAAW;AAAA,GACrD,CAAA;AACD,EAAA,MAAM,WAAA,GAAA,CAAe,UAAA,CAAW,IAAA,IAAQ,EAAC,EAAG,MAAA;AAAA,IAC1C,CAAC,SAAA,KAAc,CAAC,KAAA,CAAM,GAAA,CAAI,UAAU,WAAW;AAAA,GACjD;AACA,EAAA,MAAM,oBAAoB,kBAAA,CAAmB,MAAA;AAAA,IAC3C,CAAC,MAAA,KAAW,MAAA,CAAO,KAAA,KAAU,SAAS,SAAA,CAAU;AAAA,GAClD;AACA,EAAA,IACE,CAAC,kBAAkB,IAAA,CAAK,CAAC,WAAW,MAAA,CAAO,KAAA,KAAU,SAAA,CAAU,UAAU,CAAA,EACzE;AACA,IAAA,iBAAA,CAAkB,IAAA,CAAK;AAAA,MACrB,OAAO,SAAA,CAAU,UAAA;AAAA,MACjB,OAAO,SAAA,CAAU;AAAA,KAClB,CAAA;AAAA,EACH;AAEA,EAAA,uBACEH,GAAAA;AAAA,IAAC,EAAA,CAAG,KAAA;AAAA,IAAH;AAAA,MACC,WAAA,EAAY,0DAAA;AAAA,MACZ,YAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA,EAAO,CAAA,MAAA,EAAS,SAAA,CAAU,IAAI,CAAA,CAAA;AAAA,MAE9B,0BAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,eAAY,cAAA,EACrC,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,0BAChDA,GAAAA;AAAA,YAAC,EAAA,CAAG,MAAA;AAAA,YAAH;AAAA,cACC,SAAA,EAAU,YAAA;AAAA,cACV,QAAA,EAAU,IAAA,IAAQ,SAAA,CAAU,aAAA,KAAkB,MAAA;AAAA,cAC9C,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,gBAAA,MAAM,MAAM,SAAA,CAAU,aAAA;AACtB,gBAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,gBAAA,KAAK,GAAA;AAAA,kBAAI,MACP,IAAI,EAAE,WAAA,EAAa,UAAU,WAAA,EAAa,UAAA,EAAY,OAAO;AAAA,iBAC/D;AAAA,cACF,CAAA;AAAA,cACA,OAAA,EAAS,iBAAA;AAAA,cACT,OAAO,SAAA,CAAU;AAAA;AAAA,WACnB;AAAA,UACC,SAAA,CAAU,aAAa,IAAA,mBACtBA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,iEAAA,EAE7C;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,UACvD,SAAA,CAAU,OAAO,MAAA,KAAW,CAAA,mBAC3BA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+BAAA,EAAgC,QAAA,EAAA,2BAAA,EAE7C,oBAEAA,GAAAA,CAAC,QAAG,SAAA,EAAU,wDAAA,EACX,oBAAU,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,qBACrBD,IAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,qDAAA;AAAA,cAGV,QAAA,EAAA;AAAA,gCAAAA,KAAC,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,kBAAA,KAAA,CAAM,eAAe,KAAA,CAAM,WAAA;AAAA,kCAC5BC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EACb,gBAAM,UAAA,EACT;AAAA,iBAAA,EACF,CAAA;AAAA,gBACC,SAAA,CAAU,WAAA,KAAgB,MAAA,GAAY,IAAA,mBACrCA,GAAAA;AAAA,kBAAC,EAAA,CAAG,MAAA;AAAA,kBAAH;AAAA,oBACC,SAAA,EAAW,CAAA,OAAA,EAAU,KAAA,CAAM,WAAA,IAAe,MAAM,WAAW,CAAA,CAAA;AAAA,oBAC3D,QAAA,EAAU,IAAA;AAAA,oBACV,SAAS,MAAM;AACb,sBAAA,MAAM,SAAS,SAAA,CAAU,WAAA;AACzB,sBAAA,IAAI,WAAW,MAAA,EAAW;AAC1B,sBAAA,KAAK,GAAA;AAAA,wBAAI,MACP,MAAA,CAAO;AAAA,0BACL,aAAa,SAAA,CAAU,WAAA;AAAA,0BACvB,aAAa,KAAA,CAAM;AAAA,yBACpB;AAAA,uBACH;AAAA,oBACF,CAAA;AAAA,oBACA,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBAER,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAM;AAAA;AAAA;AACT;AAAA,aAAA;AAAA,YA1BG,KAAA,CAAM;AAAA,WA6Bd,CAAA,EACH;AAAA,SAAA,EAEJ,CAAA;AAAA,QAEC,SAAA,CAAU,kBAAkB,MAAA,GAAY,IAAA,mBACvCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBACb,QAAA,EAAA,MAAA,KAAW,MAAA,GAAY,sBAAsB,cAAA,EAChD,CAAA;AAAA,8BACAA,GAAAA;AAAA,gBAAC,EAAA,CAAG,SAAA;AAAA,gBAAH;AAAA,kBACC,SAAA,EACE,MAAA,KAAW,MAAA,GACP,sBAAA,GACA,eAAA;AAAA,kBAEN,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,oBAAA,QAAA,CAAS,KAAK,CAAA;AACd,oBAAA,SAAA,CAAU,IAAI,CAAA;AAAA,kBAChB,CAAA;AAAA,kBACA,WAAA,EACE,MAAA,KAAW,MAAA,GACP,yBAAA,GACA,aAAA;AAAA,kBAEN,KAAA,EAAO,MAAA,KAAW,IAAA,GAAO,KAAA,GAAQ,MAAA,CAAO;AAAA;AAAA;AAC1C,aAAA,EACF,CAAA;AAAA,4BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,8BAC5CA,GAAAA;AAAA,gBAAC,EAAA,CAAG,MAAA;AAAA,gBAAH;AAAA,kBACC,SAAA,EAAU,QAAA;AAAA,kBACV,QAAA,EAAU,aAAA;AAAA,kBACV,OAAA,EAAS;AAAA,oBACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,oBAC/B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO,mBACjC;AAAA,kBACA,KAAA,EAAO;AAAA;AAAA;AACT,aAAA,EACF,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,EAAA,CAAG,MAAA;AAAA,cAAH;AAAA,gBACC,QAAA,EAAU,QAAQ,WAAA,KAAgB,EAAA;AAAA,gBAClC,SAAS,MAAM;AACb,kBAAA,MAAM,UAAU,SAAA,CAAU,aAAA;AAC1B,kBAAA,IAAI,YAAY,MAAA,EAAW;AAC3B,kBAAA,MAAM,MAAA,GAAS;AAAA,oBACb,GAAG,SAAA,CAAU,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,sBAClC,aAAa,KAAA,CAAM,WAAA;AAAA,sBACnB,YAAY,KAAA,CAAM;AAAA,qBACpB,CAAE,CAAA;AAAA,oBACF,EAAE,aAAa,UAAA;AAAW,mBAC5B;AACA,kBAAA,KAAK,GAAA;AAAA,oBAAI,MACP,OAAA,CAAQ,EAAE,aAAa,SAAA,CAAU,WAAA,EAAa,QAAQ;AAAA,mBACxD;AACA,kBAAA,QAAA,CAAS,EAAE,CAAA;AACX,kBAAA,SAAA,CAAU,IAAI,CAAA;AAAA,gBAChB,CAAA;AAAA,gBACA,OAAA,EAAQ,SAAA;AAAA,gBACT,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF,CAAA;AAAA,UACC,WAAW,MAAA,IACZ,MAAA,KAAW,QACX,WAAA,CAAY,MAAA,GAAS,oBACnBA,GAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,YAAA,EAAW,iBAAA;AAAA,cACX,SAAA,EAAU,kEAAA;AAAA,cAET,sBAAY,GAAA,CAAI,CAAC,8BAChBA,GAAAA,CAAC,QACC,QAAA,kBAAAD,IAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,+EAAA;AAAA,kBACV,OAAA,EAAS,MAAM,SAAA,CAAU,SAAS,CAAA;AAAA,kBAClC,IAAA,EAAK,QAAA;AAAA,kBAEL,QAAA,EAAA;AAAA,oCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,SAAA,CAAU,WAAA,EAAY,CAAA;AAAA,oBAC5B,SAAA,CAAU,MAAA,KAAW,MAAA,GAAY,IAAA,mBAChCA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA,SAAA,CAAU,MAAA,EACb;AAAA;AAAA;AAAA,eAEJ,EAAA,EAZO,SAAA,CAAU,WAanB,CACD;AAAA;AAAA,WACH,GACE;AAAA,SAAA,EACN,CAAA;AAAA,QAED,KAAA,KAAU,OAAO,IAAA,mBAChBA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAA4B,QAAA,EAAA,KAAA,EAAM;AAAA,OAAA,EAEnD;AAAA;AAAA,GACF;AAEJ;AC7UA,IAAM,eAAA,GAA2C;AAAA,EAC/C,SAAS,EAAC;AAAA,EACV,mBAAmB;AACrB,CAAA;AAGA,IAAM,SAAA,GAAyD;AAAA,EAC7D,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,GAAA,EAAI;AAAA,EAC9B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,GAAA,EAAI;AAAA,EAC9B,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,IAAA,EAAK;AAAA,EAChC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,IAAA;AAC1B,CAAA;AAEA,IAAM,kBAAA,GAAiD;AAAA,EACrD,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,QAAA;AAAA,EACJ,EAAA,EAAI,QAAA;AAAA,EACJ,GAAA,EAAK;AACP,CAAA;AAKA,SAAS,gBACP,UAAA,EACkD;AAClD,EAAA,QAAQ,UAAA;AAAY,IAClB,KAAK,UAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,KAAA;AAAA,IACL,KAAK,cAAA;AACH,MAAA,OAAO,cAAA;AAAA,IACT;AACE,MAAA,OAAO,QAAA;AAAA;AAEb;AA0CA,SAAS,gBAAA,GAAoE;AAC3E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIG,SAAS,IAAI,CAAA;AACvC,EAAA,MAAM,QAAA,GAAWF,OAA8B,IAAI,CAAA;AACnD,EAAA,MAAM,MAAA,GAASC,WAAAA,CAAY,CAAC,IAAA,KAAgC;AAC1D,IAAA,QAAA,CAAS,SAAS,UAAA,EAAW;AAC7B,IAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,IAAA,IAAI,SAAS,IAAA,EAAM;AACnB,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KACf,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAC,CAAA;AAC3C,IAAA,OAAA,CAAQ,IAAA,CAAK,qBAAA,EAAsB,CAAE,KAAK,CAAA;AAC1C,IAAA,MAAM,OAAA,GAAU,IAAI,cAAA,CAAe,CAAC,OAAA,KAAY;AAC9C,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,MAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,KAAA,CAAM,YAAY,KAAK,CAAA;AAAA,IAC1D,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA;AACpB,IAAA,QAAA,CAAS,OAAA,GAAU,OAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,OAAO,CAAC,QAAQ,KAAK,CAAA;AACvB;AAEO,SAAS,mBAAmB,KAAA,EAAgC;AACjE,EAAA,MAAM,EAAE,WAAW,EAAA,EAAI,KAAA,EAAO,WAAW,KAAA,EAAO,MAAA,EAAQ,UAAS,GAAI,KAAA;AACrE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,QAAAA,CAA4B,EAAE,CAAA;AAC5D,EAAA,MAAM,UAAA,GAAaD,WAAAA;AAAA,IACjB,CAAC,MAAA,KAAW;AACV,MAAA,UAAA,CAAW,CAAC,OAAA,KAAY,CAAC,MAAA,EAAQ,GAAG,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACxD,MAAA,QAAA,GAAW,MAAM,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AACA,EAAA,uBACEF,GAAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAU,UAAA;AAAA,MACV,SAAA;AAAA,MACC,GAAI,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAO;AAAA,MACzC,GAAI,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,EAAE,KAAA,EAAM;AAAA,MACvC,GAAI,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,EAAE,KAAA,EAAM;AAAA,MACvC,GAAI,SAAA,KAAc,MAAA,GAAY,EAAC,GAAI,EAAE,SAAA,EAAU;AAAA,MAC/C,GAAI,EAAA,KAAO,MAAA,GAAY,EAAC,GAAI,EAAE,EAAA,EAAG;AAAA,MAElC,0BAAAA,GAAAA,CAAC,aAAA,EAAA,EAAe,GAAG,KAAA,EAAO,SAAkB,UAAA,EAAwB;AAAA;AAAA,GACtE;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,WAAA;AAAA,EACA,SAAA;AAAA,EACA,kBAAA;AAAA,EACA,UAAA;AAAA,EACA,EAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,eAAA,GAAkB,KAAA;AAAA,EAClB,OAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,MAAM,QAAA,EAAS;AACrB,EAAA,MAAM,SAAS,QAAA,EAAS;AACxB,EAAA,MAAMa,OAAAA,GAAS,WAAA;AAAA,IACb,CAAC,MAAA,KAAW,UAAA,CAAW,cAAc,EAAE,WAAA,EAAa,QAAQ,CAAA;AAAA,IAC5D,CAAC,YAAY,WAAW;AAAA,GAC1B;AACA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIV,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,eAAe,CAAA;AAC1D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAA2B,SAAS,CAAA;AACxE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,QAAAA;AAAA,IAChD;AAAA,GACF;AACA,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA;AAAA,IAC9B,UAAU,CAAC,CAAA,IAAK,EAAE,KAAA,EAAO,SAAA,EAAW,OAAO,IAAA;AAAK,GAClD;AACA,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,MAAM,CAAA;AACrD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA;AAAA,IAC1C,WAAW;AAAC,GACd;AACA,EAAA,MAAM,kBAAA,GAAqBF,OAAO,eAAe,CAAA;AACjD,EAAA,kBAAA,CAAmB,OAAA,GAAU,eAAA;AAC7B,EAAA,MAAM,YAAA,GAAeC,WAAAA,CAAY,CAAC,IAAA,KAAkC;AAClE,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,kBAAA,CAAmB,UAAU,IAAI,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,SAAS,CAAC,CAAA;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAiC,IAAI,CAAA;AACjE,EAAA,MAAM,CAAC,aAAA,EAAe,aAAa,CAAA,GAAI,gBAAA,EAAiB;AAExD,EAAA,MAAM,OAAA,GACJ,kBAAA,KAAuB,MAAA,KAAcU,OAAAA,CAAO,MAAM,QAAA,IAAY,KAAA,CAAA;AAEhE,EAAA,MAAM,gBAAA,GAAmBX,YAAY,YAAY;AAC/C,IAAA,IAAI,uBAAuB,MAAA,EAAW;AACtC,IAAA,IAAI;AACF,MAAA,YAAA,CAAa,MAAM,kBAAA,CAAmB,WAAA,CAAY,EAAE,WAAA,EAAa,CAAC,CAAA;AAAA,IACpE,SAAS,OAAA,EAAS;AAChB,MAAA,UAAA,CAAW;AAAA,QACT,IAAA,EAAM,OAAA;AAAA,QACN,OAAA,EAAS,4BAAA;AAAA,QACT,GAAI,mBAAmB,KAAA,GAAQ,EAAE,QAAQ,OAAA,CAAQ,OAAA,KAAY;AAAC,OAC/D,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,CAAC,kBAAA,EAAoB,WAAA,EAAa,UAAU,CAAC,CAAA;AAGhD,EAAA,MAAM,MAAA,GAASA,YAAY,YAAY;AACrC,IAAA,MAAM,gBAAA,EAAiB;AACvB,IAAAW,QAAO,MAAA,EAAO;AACd,IAAA,cAAA,CAAe,CAAC,KAAA,KAAU,KAAA,GAAQ,CAAC,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,gBAAA,EAAkBA,OAAM,CAAC,CAAA;AAE7B,EAAA,MAAM,SAAA,GAAYP,QAAqC,MAAM;AAC3D,IAAA,IAAI,MAAA,KAAW,MAAM,OAAO,IAAA;AAC5B,IAAA,MAAM,KAAA,GAAQO,QAAO,IAAA,EAAM,SAAA;AAC3B,IAAA,OAAO;AAAA,MACL,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,mBAAmB,SAAA,CAAU,iBAAA;AAAA,MAC7B,GAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,SAAY,EAAC,GAAI,EAAE,SAAA,EAAW,KAAA;AAAM,KACtE;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAA,CAAU,mBAAmBA,OAAAA,CAAO,IAAA,EAAM,SAAS,CAAC,CAAA;AAEhE,EAAA,MAAM,QAAQ,cAAA,CAAe;AAAA,IAC3B,WAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAI,UAAU,UAAA,KAAe,MAAA,GACzB,EAAC,GACD,EAAE,UAAA,EAAY,SAAA,CAAU,UAAA,EAAW;AAAA,IACvC,OAAA,EACE,YAAY,KAAA,CAAA,GACR,OAAA,GACA,OAAO,MAAA,KAAW,WAAA,GAChB,OACA,MAAA,CAAO,YAAA;AAAA,IACf,OAAA,EAAS,MAAA;AAAA,IACT,OAAA,EAAS,CAAC,OAAA,KACR,UAAA,CAAW;AAAA,MACT,IAAA,EAAM,OAAA;AAAA,MACN,OAAA,EAAS,uBAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACT;AAAA,GACJ,CAAA;AAED,EAAA,MAAM,aAAA,GAAgBZ,OAAO,eAAe,CAAA;AAC5C,EAAAG,UAAU,MAAM;AACd,IAAA,IAAI,aAAA,CAAc,WAAW,OAAA,EAAS;AACpC,MAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,MAAA,KAAA,CAAM,YAAY,IAAI,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,KAAK,CAAC,CAAA;AAEnB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,IAAY,OAAA,IAAW,CAAC,OAAA;AAE9C,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,OAAA,OAAc,gBAAA,EAAiB;AAAA,EACrC,CAAA,EAAG,CAAC,OAAA,EAAS,gBAAgB,CAAC,CAAA;AAE9B,EAAA,MAAM,UAAA,GAAaF,WAAAA,CAAY,CAAC,QAAA,EAAkB,IAAA,KAA2B;AAC3E,IAAA,eAAA,CAAgB,QAAQ,CAAA;AACxB,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,EACxB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,MAAA,KAA4B;AAC3B,MAAA,IAAI,gBAAgB,MAAA,EAAW;AAC/B,MAAA,KAAA,CAAM,WAAA,CAAY,MAAM,WAAA,CAAY,MAAA,EAAQ,WAAW,CAAC,CAAA;AAAA,IAC1D,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,WAAA,EAAa,WAAW;AAAA,GAClC;AAEA,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,OAAO,KAAA,KAAmD;AACxD,MAAA,IAAI,kBAAA,EAAoB,0BAA0B,MAAA,EAAW;AAC7D,MAAA,IAAI;AACF,QAAA,MAAM,mBAAmB,qBAAA,CAAsB;AAAA,UAC7C,WAAA;AAAA,UACA,GAAG;AAAA,SACJ,CAAA;AACD,QAAAW,QAAO,MAAA,EAAO;AAAA,MAChB,SAAS,OAAA,EAAS;AAChB,QAAA,UAAA,CAAW;AAAA,UACT,IAAA,EAAM,OAAA;AAAA,UACN,OAAA,EAAS,gCAAA;AAAA,UACT,GAAI,mBAAmB,KAAA,GAAQ,EAAE,QAAQ,OAAA,CAAQ,OAAA,KAAY;AAAC,SAC/D,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA,CAAC,kBAAA,EAAoB,WAAA,EAAaA,OAAAA,EAAQ,UAAU;AAAA,GACtD;AAEA,EAAA,MAAM,aAAA,GAAgBX,YAAY,YAAY;AAC5C,IAAA,IAAI,kBAAA,EAAoB,kBAAkB,MAAA,EAAW;AACrD,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAM,kBAAA,CAAmB,aAAA,CAAc,EAAE,aAAa,CAAA;AACnE,MAAA,UAAA,CAAW,EAAE,MAAM,SAAA,EAAW,OAAA,EAAS,aAAa,IAAA,CAAK,WAAW,IAAI,CAAA;AACxE,MAAA,eAAA,GAAkB,KAAK,WAAW,CAAA;AAAA,IACpC,SAAS,OAAA,EAAS;AAChB,MAAA,UAAA,CAAW;AAAA,QACT,IAAA,EAAM,OAAA;AAAA,QACN,OAAA,EAAS,8BAAA;AAAA,QACT,GAAI,mBAAmB,KAAA,GAAQ,EAAE,QAAQ,OAAA,CAAQ,OAAA,KAAY;AAAC,OAC/D,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,kBAAA,EAAoB,WAAA,EAAa,eAAA,EAAiB,UAAU,CAAC,CAAA;AAEjE,EAAA,MAAM,cAAA,GAAiBA,WAAAA;AAAA,IACrB,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,UAAU,QAAA,EAAU;AACtB,QAAA,WAAA,CAAY,EAAE,OAAO,QAAA,EAAU,KAAA,EAAO,OAAO,WAAW,CAAA,IAAK,MAAM,CAAA;AACnE,QAAA;AAAA,MACF;AACA,MAAA,MAAM,SAAS,SAAA,CAAU,IAAA;AAAA,QACvB,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,aAAY,KAAM;AAAA,OACzC;AACA,MAAA,IAAI,MAAA,cAAoB,MAAM,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,gBAAA,GAAmB,kBAAA,CAAmB,KAAA,CAAM,eAAe,CAAA,IAAK,MAAA;AACtE,EAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AACzB,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AAEvB,EAAA,IAAIW,OAAAA,CAAO,UAAU,IAAA,EAAM;AACzB,IAAA,uBACEd,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,WAAA,EAAa,SAAS,CAAA,EAAG,aAAA,EAAY,WAAA,EACrD,QAAA,EAAA;AAAA,MAAA,MAAA,KAAW,MAAA,GAAY,IAAA,mBACtBA,IAAAA,CAAC,GAAA,CAAI,MAAA,EAAJ,EAAW,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,OAAA,EAC7C,QAAA,EAAA;AAAA,wBAAAC,IAAC,SAAA,EAAA,EAAU,CAAA;AAAA,QAAE;AAAA,OAAA,EAEf,CAAA;AAAA,sBAEFA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,wFAAA,EACV,QAAA,EAAAa,QAAO,KAAA,EACV;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAIA,OAAAA,CAAO,SAAS,IAAA,EAAM;AACxB,IAAA,uBACEd,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,WAAA,EAAa,SAAS,CAAA,EAAG,aAAA,EAAY,WAAA,EACtD,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,GAAA,CAAI,QAAA,EAAJ,EAAa,WAAU,UAAA,EAAW,CAAA;AAAA,sBACnCA,GAAAA,CAAC,GAAA,CAAI,QAAA,EAAJ,EAAa,WAAU,aAAA,EAAc;AAAA,KAAA,EACxC,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,YAAYa,OAAAA,CAAO,IAAA;AACzB,EAAA,MAAM,aAAA,GAAgB,OAAA,GAAU,QAAA,CAAS,KAAA,GAAQ,aAAA;AAEjD,EAAA,MAAM,gCACJb,GAAAA;AAAA,IAAC,GAAA,CAAI,MAAA;AAAA,IAAJ;AAAA,MACC,SAAA,EAAU,mBAAA;AAAA,MACV,QAAA,EAAU,OAAA;AAAA,MACV,SAAS,MAAM,cAAA,CAAe,CAAC,KAAA,KAAU,QAAQ,CAAC,CAAA;AAAA,MAClD,IAAA,EAAK,IAAA;AAAA,MACL,KAAA,EAAM,mBAAA;AAAA,MACN,OAAA,EAAQ,OAAA;AAAA,MAER,0BAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,WAAW,EAAA,CAAG,OAAA,IAAW,cAAc,CAAA,EAAG;AAAA;AAAA,GACrD;AAGF,EAAA,MAAM,6BACJA,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,WAAA;AAAA,MACA,OAAA,EAAS,cAAA;AAAA,MACT,QAAA,EAAU,UAAA;AAAA,MACV,SAAA,EAAW;AAAA;AAAA,GACb;AAGF,EAAA,MAAM,8BACJD,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,6CAAA;AAAA,MACV,GAAA,EAAK,aAAA;AAAA,MAEL,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,qBAAA;AAAA,UAAA;AAAA,YACC,WAAA;AAAA,YACC,GAAI,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAQ;AAAA,YAC5C,eAAA,EAAiB,YAAA;AAAA,YACjB,QAAA,EAAU,SAAA;AAAA,YACV,eAAA,EAAiB,UAAA;AAAA,YACjB,WAAA;AAAA,YACA,aAAA;AAAA,YACA,MAAA,EAAQ;AAAA,cACN,QAAA,EAAU,OAAA;AAAA,cACV,IAAA;AAAA,cACA,eAAe,KAAA,CAAM,aAAA;AAAA,cACrB,UAAA,EACE,KAAA,CAAM,YAAA,KAAiB,MAAA,GACnB,KAAA,CAAM,UAAA,GACN,EAAE,GAAG,KAAA,CAAM,UAAA,EAAY,OAAA,EAAS,KAAA,CAAM,YAAA,EAAa;AAAA,cACzD,mBAAmB,KAAA,CAAM,iBAAA;AAAA,cACzB,gBAAgB,KAAA,CAAM,cAAA;AAAA,cACtB,mBAAmB,KAAA,CAAM,kBAAA;AAAA,cACzB,mBAAmB,KAAA,CAAM,iBAAA;AAAA,cACzB,YAAA,EAAc,CAAC,QAAA,KAAa,UAAA,CAAW,UAAU,SAAS,CAAA;AAAA,cAC1D,WAAA,EAAa,CAAC,QAAA,KAAa,UAAA,CAAW,UAAU,KAAK,CAAA;AAAA,cACrD,gBAAA,EAAkB,CAAC,QAAA,KAAa;AAC9B,gBAAA,oBAAA,CAAqB,QAAQ,CAAA;AAC7B,gBAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,cACzB,CAAA;AAAA,cACA,gBAAgB,KAAA,CAAM,cAAA;AAAA,cACtB,GAAI,MAAM,WAAA,KAAgB,MAAA,GACtB,EAAC,GACD,EAAE,WAAA,EAAa,KAAA,CAAM,WAAA;AAAY;AACvC;AAAA,SACF;AAAA,wBACAA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,KAAA,EAAc;AAAA;AAAA;AAAA,GACpC;AAGF,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,uBACED,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,gDAAA;AAAA,QACV,aAAA,EAAY,mBAAA;AAAA,QAEZ,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8GAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,IAAAA;AAAA,gBAAC,GAAA,CAAI,MAAA;AAAA,gBAAJ;AAAA,kBACC,OAAA,EAAS,MAAM,UAAA,CAAW,KAAK,CAAA;AAAA,kBAC/B,IAAA,EAAK,IAAA;AAAA,kBACL,OAAA,EAAQ,OAAA;AAAA,kBAER,QAAA,EAAA;AAAA,oCAAAC,IAAC,KAAA,EAAA,EAAM,CAAA;AAAA,oBAAE;AAAA;AAAA;AAAA,eAEX;AAAA,8BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,oBAAU,IAAA,EAAK;AAAA,aAAA,EACxD,CAAA;AAAA,4BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EAAiD,QAAA,EAAA,UAAA,EAEjE,CAAA;AAAA,gCACAA,GAAAA;AAAA,kBAAC,GAAA,CAAI,MAAA;AAAA,kBAAJ;AAAA,oBACC,SAAA,EAAU,UAAA;AAAA,oBACV,SAAA,EAAU,MAAA;AAAA,oBACV,QAAA,EAAU,cAAA;AAAA,oBACV,OAAA,EAAS;AAAA,sBACP,GAAG,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,wBAC1B,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,WAAA,EAAY;AAAA,wBAC9B,OAAO,IAAA,CAAK;AAAA,uBACd,CAAE,CAAA;AAAA,sBACF,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS,qBACrC;AAAA,oBACA,KAAA,EAAO,QAAA,CAAS,KAAA,CAAM,WAAA;AAAY;AAAA,iBACpC;AAAA,gBACC,QAAA,CAAS,KAAA,KAAU,QAAA,mBAClBA,GAAAA;AAAA,kBAAC,GAAA,CAAI,SAAA;AAAA,kBAAJ;AAAA,oBACC,SAAA,EAAU,cAAA;AAAA,oBACV,SAAA,EAAU,MAAA;AAAA,oBACV,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,sBAAA,cAAA,CAAe,KAAK,CAAA;AACpB,sBAAA,WAAA,CAAY;AAAA,wBACV,KAAA,EAAO,QAAA;AAAA,wBACP,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,IAAK;AAAA,uBACzB,CAAA;AAAA,oBACH,CAAA;AAAA,oBACA,IAAA,EAAK,QAAA;AAAA,oBACL,KAAA,EAAO;AAAA;AAAA,iBACT,GACE,IAAA;AAAA,gCACJD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EACb,QAAA,EAAA;AAAA,kBAAA,QAAA,CAAS,KAAA;AAAA,kBAAM;AAAA,iBAAA,EAClB;AAAA,eAAA,EACF,CAAA;AAAA,cACC,UAAA;AAAA,cACA;AAAA,aAAA,EACH;AAAA,WAAA,EACF,CAAA;AAAA,0BACAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CACb,QAAA,kBAAAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,SAAA;AAAA,cACV,OAAO,EAAE,KAAA,EAAO,SAAS,KAAA,GAAQ,EAAA,EAAI,UAAU,MAAA,EAAO;AAAA,cAErD,QAAA,EAAA;AAAA;AAAA,WACH,EACF;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,EAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,EAAA,MAAM,IAAA,mBACJD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,WAAA,EAAa,SAAS,CAAA,EAAG,aAAA,EAAY,WAAA,EACtD,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,MAAA,KAAW,MAAA,GAAY,uBACtBA,IAAAA;AAAA,UAAC,GAAA,CAAI,MAAA;AAAA,UAAJ;AAAA,YACC,SAAA,EAAU,kCAAA;AAAA,YACV,OAAA,EAAS,MAAM,KAAA,CAAM,WAAA,CAAY,MAAM,CAAA;AAAA,YACvC,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAQ,OAAA;AAAA,YAER,QAAA,EAAA;AAAA,8BAAAC,IAAC,SAAA,EAAA,EAAU,CAAA;AAAA,cAAE;AAAA;AAAA;AAAA,SAEf;AAAA,QAED,OAAA,mBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,qBAAA;AAAA,cACN,KAAA,EAAM,MAAA;AAAA,cACN,QAAA,EAAU,CAAC,KAAA,KAAU,KAAK,aAAa,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA,cACtD,OAAO,SAAA,CAAU;AAAA;AAAA,WACnB;AAAA,0BACAA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,mBAAA;AAAA,cACN,KAAA,EAAM,aAAA;AAAA,cACN,QAAA,EAAU,CAAC,KAAA,KAAU,KAAK,aAAa,EAAE,WAAA,EAAa,OAAO,CAAA;AAAA,cAC7D,OAAO,SAAA,CAAU;AAAA;AAAA;AACnB,SAAA,EACF,CAAA,mBAEAD,IAAAA,CAAAe,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAf,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EACX,oBAAU,IAAA,EACb,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBACC,UAAA,EAAY,eAAA,CAAgB,SAAA,CAAU,UAAU;AAAA;AAAA,aAClD;AAAA,4BACAA,IAAC,GAAA,CAAI,KAAA,EAAJ,EAAU,IAAA,EAAK,SAAA,EAAW,oBAAU,UAAA,EAAW;AAAA,WAAA,EAClD,CAAA;AAAA,UACC,SAAA,CAAU,WAAA,KAAgB,IAAA,IAC3B,SAAA,CAAU,WAAA,KAAgB,EAAA,mBACxBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iDAAA,EACV,QAAA,EAAA,SAAA,CAAU,aACb,CAAA,GACE;AAAA,SAAA,EACN;AAAA,OAAA,EAEJ,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACZ,QAAA,EAAA;AAAA,QAAA,SAAA,CAAU,OAAA,mBACTA,IAAAA,CAAC,GAAA,CAAI,MAAA,EAAJ,EAAW,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA,EAAG,IAAA,EAAK,IAAA,EAClD,QAAA,EAAA;AAAA,0BAAAC,IAAC,KAAA,EAAA,EAAM,CAAA;AAAA,UAAE;AAAA,SAAA,EAEX,CAAA,GACE,IAAA;AAAA,QACH,kBAAA,EAAoB,aAAA,KAAkB,MAAA,GAAY,IAAA,mBACjDD,IAAAA;AAAA,UAAC,GAAA,CAAI,MAAA;AAAA,UAAJ;AAAA,YACC,QAAA,EAAU,OAAA;AAAA,YACV,OAAA,EAAS,MAAM,KAAK,aAAA,EAAc;AAAA,YAClC,IAAA,EAAK,IAAA;AAAA,YACL,KAAA,EAAM,sCAAA;AAAA,YAEN,QAAA,EAAA;AAAA,8BAAAC,IAAC,IAAA,EAAA,EAAK,CAAA;AAAA,cAAE;AAAA;AAAA;AAAA,SAEV;AAAA,QAED,0BACCA,GAAAA;AAAA,UAAC,GAAA,CAAI,QAAA;AAAA,UAAJ;AAAA,YACC,SAAS,KAAA,CAAM,QAAA;AAAA,YACf,KAAA,EAAM,WAAA;AAAA,YACN,UAAU,KAAA,CAAM;AAAA;AAAA,4BAGlBA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,+BAAA;AAAA,YACV,KAAA,EAAM,wDAAA;AAAA,YACP,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,QAED,0BACCA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EACE,OACI,0GAAA,GACA,8HAAA;AAAA,YAGN,QAAA,kBAAAA,GAAAA;AAAA,cAAC,GAAA,CAAI,QAAA;AAAA,cAAJ;AAAA,gBACC,OAAA,EAAS,IAAA;AAAA,gBACT,KAAA,EAAO,OAAO,iBAAA,GAAoB,gBAAA;AAAA,gBAClC,QAAA,EAAU;AAAA;AAAA;AACZ;AAAA,SACF,GACE,IAAA;AAAA,QACH,0BACCA,GAAAA;AAAA,UAAC,GAAA,CAAI,OAAA;AAAA,UAAJ;AAAA,YACC,KAAA,EAAM,KAAA;AAAA,YACN,SAAA,EAAU,MAAA;AAAA,YACV,YAAA,EAAc,WAAA;AAAA,YACd,IAAA,EAAM,QAAA;AAAA,YACN,yBACED,IAAAA,CAAC,IAAI,MAAA,EAAJ,EAAW,MAAK,IAAA,EACf,QAAA,EAAA;AAAA,8BAAAC,IAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,cAAE;AAAA,aAAA,EAEb,CAAA;AAAA,YAGD,QAAA,EAAA,MAAA,KAAW,IAAA,GAAO,IAAA,mBACjBA,GAAAA;AAAA,cAAC,iBAAA;AAAA,cAAA;AAAA,gBACC,UAAA,EAAY,gBAAA;AAAA,gBACZ,WAAW,MAAA,CAAO,SAAA;AAAA,gBAClB;AAAA;AAAA;AACF;AAAA,SAEJ,GACE,IAAA;AAAA,QACH,OAAA,mBACCD,IAAAA,CAAC,GAAA,CAAI,MAAA,EAAJ,EAAW,OAAA,EAAS,MAAM,WAAA,CAAY,IAAI,CAAA,EAAG,IAAA,EAAK,IAAA,EACjD,QAAA,EAAA;AAAA,0BAAAC,IAAC,IAAA,EAAA,EAAK,CAAA;AAAA,UAAE;AAAA,SAAA,EAEV,CAAA,GACE,IAAA;AAAA,QACH,0BACCD,IAAAA;AAAA,UAAC,GAAA,CAAI,MAAA;AAAA,UAAJ;AAAA,YACC,QAAA,EAAU,KAAA,CAAM,MAAA,IAAU,CAAC,KAAA,CAAM,iBAAA;AAAA,YACjC,OAAA,EAAS,MAAM,KAAK,KAAA,CAAM,IAAA,EAAK;AAAA,YAC/B,IAAA,EAAK,IAAA;AAAA,YACL,KAAA,EACE,KAAA,CAAM,iBAAA,GACF,6BAAA,GACA,8BAAA;AAAA,YAEN,OAAA,EAAS,KAAA,CAAM,iBAAA,GAAoB,SAAA,GAAY,WAAA;AAAA,YAE9C,QAAA,EAAA;AAAA,cAAA,KAAA,CAAM,MAAA,mBAASC,GAAAA,CAAC,MAAA,EAAA,EAAO,WAAU,cAAA,EAAe,CAAA,mBAAKA,GAAAA,CAAC,IAAA,EAAA,EAAK,CAAA;AAAA,cAAG;AAAA;AAAA;AAAA,SAEjE,GACE,IAAA;AAAA,QACH,OAAA,mBACCD,IAAAA,CAAC,GAAA,CAAI,MAAA,EAAJ,EAAW,OAAA,EAAS,KAAA,CAAM,KAAA,EAAO,IAAA,EAAK,IAAA,EACrC,QAAA,EAAA;AAAA,0BAAAC,IAAC,IAAA,EAAA,EAAK,CAAA;AAAA,UAAE;AAAA,SAAA,EAEV,CAAA,GACE,IAAA;AAAA,QACH,OAAA,IAAW,WAAA,KAAgB,MAAA,mBAC1BD,IAAAA;AAAA,UAAC,GAAA,CAAI,MAAA;AAAA,UAAJ;AAAA,YACC,OAAA,EAAS,MAAM,aAAA,CAAc,QAAQ,CAAA;AAAA,YACrC,IAAA,EAAK,IAAA;AAAA,YACL,KAAA,EAAM,kEAAA;AAAA,YACN,OAAA,EAAQ,SAAA;AAAA,YAER,QAAA,EAAA;AAAA,8BAAAC,IAAC,QAAA,EAAA,EAAS,CAAA;AAAA,cAAE;AAAA;AAAA;AAAA,SAEd,GACE,IAAA;AAAA,QACH,OAAA,IAAW,WAAA,KAAgB,MAAA,mBAC1BD,IAAAA;AAAA,UAAC,GAAA,CAAI,MAAA;AAAA,UAAJ;AAAA,YACC,OAAA,EAAS,MAAM,aAAA,CAAc,MAAM,CAAA;AAAA,YACnC,IAAA,EAAK,IAAA;AAAA,YACL,KAAA,EAAM,iFAAA;AAAA,YAEN,QAAA,EAAA;AAAA,8BAAAC,IAAC,QAAA,EAAA,EAAS,CAAA;AAAA,cAAE;AAAA;AAAA;AAAA,SAEd,GACE,IAAA;AAAA,QACH,OAAA,mBACCD,IAAAA,CAAC,GAAA,CAAI,MAAA,EAAJ,EAAW,OAAA,EAAS,MAAM,gBAAA,CAAiB,IAAI,CAAA,EAAG,IAAA,EAAK,IAAA,EACtD,QAAA,EAAA;AAAA,0BAAAC,IAAC,MAAA,EAAA,EAAO,CAAA;AAAA,UAAE;AAAA,SAAA,EAEZ,CAAA,GACE,IAAA;AAAA,QACH,OAAA,IAAW,YAAA,mBACVA,GAAAA,CAAC,IAAI,MAAA,EAAJ,EAAW,OAAA,EAAS,MAAM,aAAa,IAAI,CAAA,EAAG,IAAA,EAAK,IAAA,EAAK,4BAEzD,CAAA,GACE,IAAA;AAAA,wBACJD,IAAAA,CAAC,GAAA,CAAI,MAAA,EAAJ,EAAW,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG,IAAA,EAAK,IAAA,EAChD,QAAA,EAAA;AAAA,0BAAAC,IAAC,GAAA,EAAA,EAAI,CAAA;AAAA,UAAE;AAAA,SAAA,EAET,CAAA;AAAA,QACC,UAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,OAAA,IAAW,KAAA,CAAM,iBAAA,mBAChBD,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,iLAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QAEL,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,0BAC5BA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,mFAAA,EAGN;AAAA;AAAA;AAAA,KACF,GACE,IAAA;AAAA,oBAEJA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAkB,CAAA;AAAA,IAE7B,uBAAuB,MAAA,GAAY,IAAA,mBAClCD,IAAAA,CAAAe,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAd,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,CAAC,QAAA,KAAa;AACnB,YAAA,KAAA,CAAM,YAAY,IAAI,CAAA;AACtB,YAAA,KAAA,CAAM,YAAY,QAAQ,CAAA;AAAA,UAC5B,CAAA;AAAA,UACA,SAAA,EAAW,CAAC,QAAA,KAAa;AACvB,YAAA,UAAA,CAAW,UAAU,SAAS,CAAA;AAC9B,YAAA,OAAO,MAAA,EAAO;AAAA,UAChB,CAAA;AAAA,UACA,uBACE,WAAA,KAAgB,MAAA,GACZ,MAAA,GACA,MAAM,cAAc,QAAQ,CAAA;AAAA,UAElC,mBAAA,EAAqB,CAAC,QAAA,KAAa,UAAA,CAAW,UAAU,KAAK,CAAA;AAAA,UAC7D,QAAA,EAAU,OAAO,QAAA,KAAa;AAC5B,YAAA,MAAM,kBAAA,CAAmB,YAAA,CAAa,EAAE,WAAA,EAAa,UAAU,CAAA;AAC/D,YAAA,MAAM,MAAA,EAAO;AAAA,UACf,CAAA;AAAA,UACA,MAAA,EAAQ,CAAC,QAAA,KAAa,UAAA,CAAW,UAAU,SAAS,CAAA;AAAA,UACpD,YAAA,EAAc,gBAAA;AAAA,UACd,QAAA,EAAU,CAAC,QAAA,KAAa;AACtB,YAAA,KAAK,kBAAA,CACF,uBAAuB,EAAE,WAAA,EAAa,UAAU,CAAA,CAChD,KAAK,MAAM,CAAA;AAAA,UAChB,CAAA;AAAA,UACA,IAAA,EAAM,aAAA;AAAA,UACN,mBAAmB,SAAA,CAAU,iBAAA;AAAA,UAC7B,SAAS,SAAA,CAAU;AAAA;AAAA,OACrB;AAAA,sBACAA,GAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,WAAA,EAAa,UAAA;AAAA,UACb,aAAA,EAAe,CAAC,QAAA,KAAa;AAC3B,YAAA,KAAA,CAAM,YAAY,IAAI,CAAA;AACtB,YAAA,KAAA,CAAM,YAAY,QAAQ,CAAA;AAAA,UAC5B,CAAA;AAAA,UACA,YAAA,EAAc,aAAA;AAAA,UACd,OAAA,EAAS,MAAA;AAAA,UACT,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACAA,GAAAA;AAAA,QAAC,iBAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAc,kBAAA;AAAA,UACd,IAAA,EAAM,eAAA;AAAA,UACN,QAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACAA,GAAAA;AAAA,QAAC,mBAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAc,WAAA;AAAA,UACd,SAAS,YAAY;AACnB,YAAA,KAAA,CAAM,KAAA,EAAM;AACZ,YAAA,MAAM,MAAA,EAAO;AAAA,UACf,CAAA;AAAA,UACA,IAAA,EAAM;AAAA;AAAA,OACR;AAAA,sBACAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAc,YAAA;AAAA,UACd,OAAA,EAAS,MAAA;AAAA,UACT,IAAA,EAAM;AAAA;AAAA;AACR,KAAA,EACF,CAAA;AAAA,IAGD,WAAA;AAAA,oBAEDA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,SAAA,EAAW,MAAMa,OAAAA,CAAO,MAAA,EAAO;AAAA,QAC/B,YAAA,EAAc,YAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,SAAA,EAAW;AAAA;AAAA;AACb,GAAA,EACF,CAAA;AAGF,EAAA,IAAI,kBAAA,KAAuB,QAAW,OAAO,IAAA;AAC7C,EAAA,uBACEb,GAAAA;AAAA,IAAC,0BAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA,EAAU,UAAA;AAAA,MACV,SAAA,EAAW,kBAAA;AAAA,MACV,GAAI,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAO;AAAA,MACzC,GAAI,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,EAAE,KAAA,EAAM;AAAA,MACvC,GAAI,EAAA,KAAO,MAAA,GAAY,EAAC,GAAI,EAAE,EAAA,EAAG;AAAA,MAEjC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;ACzzBA,IAAM,gBAAA,GAAsC,CAAC,KAAA,EAAO,cAAA,EAAgB,QAAQ,CAAA;AAE5E,SAAS,UAAU,IAAA,EAAiC;AAClD,EAAA,OAAO,gBAAA,CAAiB,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA;AAClD;AAGO,IAAM,eAAA,GAA6C;AAAA,EACxD;AAAA,IACE,OAAO,CAAC,IAAA,KAAS,KAAK,OAAA,IAAW,CAAC,UAAU,IAAI,CAAA;AAAA,IAChD,KAAA,EAAO,eAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,CAAC,IAAA,KAAS,CAAC,KAAK,OAAA,IAAW,CAAC,UAAU,IAAI,CAAA;AAAA,IACjD,KAAA,EAAO,gBAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EACE;AAAA;AAEN;AAmBO,SAAS,QAAQ,IAAA,EAAsB;AAC5C,EAAA,OAAO,IAAA,CACJ,aAAY,CACZ,SAAA,CAAU,MAAM,CAAA,CAChB,OAAA,CAAQ,oBAAoB,EAAE,CAAA,CAC9B,QAAQ,aAAA,EAAe,GAAG,EAC1B,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CACtB,KAAA,CAAM,GAAG,EAAE,CAAA;AAChB;AAEA,IAAM,gBAAA,GAA2C;AAAA,EAC/C,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,cAAA;AAAA,EACL,YAAA,EAAc,cAAA;AAAA,EACd,MAAA,EAAQ;AACV,CAAA;AAEO,SAAS,aAAA,CAAc;AAAA,EAC5B,UAAA;AAAA,EACA,MAAA;AAAA,EACA,EAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU,eAAA;AAAA,EACV,KAAA,GAAQ,YAAA;AAAA,EACR,WAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA,GAAgB,UAAA;AAAA,EAChB;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,GAAA,GAAMM,QAAQ,MAAM,kBAAA,CAAmB,EAAE,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AACtD,EAAA,MAAM,MAAA,GAASA,QAAQ,MAAM,UAAA,CAAW,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACvD,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CAAC,MAAA,KAAW,UAAA,CAAW,cAAA,CAAe,EAAE,QAAQ,CAAA;AAAA,IAChD,CAAC,UAAU;AAAA,GACb;AACA,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIH,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,QAAAA;AAAA,IACxC;AAAA,GACF;AACA,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,EAAA,MAAM,SAAS,YAAY;AACzB,IAAA,MAAM,OAAO,UAAA,CAAW,eAAA;AACxB,IAAA,IAAI,SAAS,MAAA,EAAW;AACxB,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAI,CAAA,IAAK,WAAA;AAC9B,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK;AAAA,QACzB,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,QAChB,aAAa,KAAA,CAAM,IAAA,OAAW,EAAA,GAAK,IAAA,GAAO,MAAM,IAAA,EAAK;AAAA,QACrD,WAAA,EAAa,IAAA;AAAA,QACb,UAAU,iBAAA,CAAkB;AAAA,UAC1B,IAAA;AAAA,UACA,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,UAChB,WAAA,EAAa,MAAM,IAAA;AAAK,SACzB,CAAA;AAAA,QACD,UAAA,EAAY;AAAA,OACb,CAAA;AACD,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA,OAAA,CAAQ,EAAE,CAAA;AACV,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,IAC/C,SAAS,OAAA,EAAS;AAChB,MAAA,QAAA,CAAS,mBAAmB,KAAA,GAAQ,OAAA,CAAQ,OAAA,GAAU,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IACvE,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,IAAA,KAA2B;AAC/C,IAAA,MAAM,OAAO,UAAA,CAAW,eAAA;AACxB,IAAA,IAAI,SAAS,MAAA,EAAW;AACxB,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,EAAE,WAAA,EAAa,IAAA,CAAK,aAAa,CAAA;AAC5C,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA,QAAA,CAAS,MAAA,EAAO;AAAA,IAClB,SAAS,OAAA,EAAS;AAChB,MAAA,QAAA,CAAS,mBAAmB,KAAA,GAAQ,OAAA,CAAQ,OAAA,GAAU,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IACvE,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,IAAQ,EAAC;AAChC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AACpC,IAAA,MAAM,UAAU,KAAA,CAAM,MAAA;AAAA,MACpB,CAAC,IAAA,KACC,IAAA,CAAK,OAAA,IAAW,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,WAAW,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,IAAI;AAAA,KACtE;AACA,IAAA,KAAA,MAAW,MAAA,IAAU,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,WAAW,CAAA;AAC5D,IAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AAAA,EAC1B,CAAC,CAAA;AACD,EAAA,MAAM,OAAO,KAAA,CAAM,MAAA;AAAA,IACjB,CAAC,SAAS,IAAA,CAAK,OAAA,IAAW,CAAC,OAAA,CAAQ,GAAA,CAAI,KAAK,WAAW;AAAA,GACzD;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,OAAO,EAAE,KAAA,EAAO,MAAM,IAAA,EAAM,OAAO,kBAAA,EAAmB;AAAA,MACtD,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,uBACEJ,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,WAAA,EAAa,SAAS,CAAA,EAAG,aAAA,EAAY,gBAAA,EACtD,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QAC5D,WAAA,KAAgB,SAAY,IAAA,mBAC3BA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,WAAA,EAAY;AAAA,OAAA,EAE9D,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QACA,UAAA,CAAW,eAAA,KAAoB,MAAA,GAAY,IAAA,mBAC1CA,IAAAA,CAAC,GAAA,CAAI,MAAA,EAAJ,EAAW,SAAS,MAAM,WAAA,CAAY,IAAI,CAAA,EAAG,SAAQ,SAAA,EACpD,QAAA,EAAA;AAAA,0BAAAC,IAAC,IAAA,EAAA,EAAK,CAAA;AAAA,UAAE;AAAA,SAAA,EAEV;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,QAAA,CAAS,KAAA,KAAU,IAAA,GAAO,IAAA,mBACzBA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0BAAA,EAA4B,QAAA,EAAA,QAAA,CAAS,KAAA,EAAM,CAAA;AAAA,IAGzD,SAAS,OAAA,IAAW,QAAA,CAAS,SAAS,IAAA,mBACrCA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,QAAA,EAAA,CAAC,GAAG,CAAA,EAAG,CAAC,EAAE,GAAA,CAAI,CAAC,0BACdA,GAAAA,CAAC,GAAA,CAAI,QAAA,EAAJ,EAAa,SAAA,EAAU,MAAA,EAAA,EAAY,KAAO,CAC5C,CAAA,EACH,IAEA,MAAA,CAAO,GAAA,CAAI,CAAC,EAAE,OAAO,OAAA,EAAQ,qBAC3BD,IAAAA,CAAC,SAAA,EAAA,EAAQ,WAAU,WAAA,EACjB,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAyB,gBAAM,KAAA,EAAM,CAAA;AAAA,QAClD,KAAA,CAAM,KAAA,KAAU,MAAA,GAAY,IAAA,mBAC3BA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,KAAA,CAAM,KAAA,EAAM;AAAA,OAAA,EAE9D,CAAA;AAAA,MACC,QAAQ,MAAA,KAAW,CAAA,mBAClBA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,6FAAA,EAA8F,QAAA,EAAA,mBAAA,EAE3G,oBAEAA,GAAAA,CAAC,SAAI,SAAA,EAAU,0CAAA,EACZ,kBAAQ,GAAA,CAAI,CAAC,yBACZD,IAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,6IAAA;AAAA,UAGV,QAAA,EAAA;AAAA,4BAAAA,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,kHAAA;AAAA,gBACV,OAAA,EAAS,MACP,MAAA,CAAO,IAAA,CAAK,aAAa,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,gBAE7C,IAAA,EAAK,QAAA;AAAA,gBAEL,QAAA,EAAA;AAAA,kCAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+CAAA,EACd,QAAA,EAAA;AAAA,oCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qDAAA,EACb,eAAK,IAAA,EACR,CAAA;AAAA,oCACAA,GAAAA,CAAC,GAAA,CAAI,KAAA,EAAJ,EAAU,IAAA,EAAK,MAAA,EACb,QAAA,EAAA,gBAAA,CAAiB,IAAA,CAAK,UAAU,CAAA,IAAK,IAAA,CAAK,UAAA,EAC7C;AAAA,mBAAA,EACF,CAAA;AAAA,kCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+BAAA,EACb,QAAA,EAAA,IAAA,CAAK,eAAe,iBAAA,EACvB,CAAA;AAAA,kCACAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8EAAA,EACd,QAAA,EAAA;AAAA,oCAAAA,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,sBAAA,SAAA;AAAA,sBAAQ,KAAK,SAAA,IAAa;AAAA,qBAAA,EAAU,CAAA;AAAA,oCAC1CC,IAAC,GAAA,CAAI,KAAA,EAAJ,EAAU,IAAA,EAAK,SAAA,EAAW,eAAK,UAAA,EAAW,CAAA;AAAA,oBAC1C,IAAA,CAAK,eAAA,GAAkB,CAAA,mBACtBD,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,sBAAA,cAAA;AAAA,sBAAa,IAAA,CAAK;AAAA,qBAAA,EAAgB,CAAA,GACtC;AAAA,mBAAA,EACN;AAAA;AAAA;AAAA,aACF;AAAA,YACC,IAAA,CAAK,OAAA,IACN,UAAA,CAAW,eAAA,KAAoB,MAAA,mBAC7BC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,cAAC,GAAA,CAAI,MAAA;AAAA,cAAJ;AAAA,gBACC,SAAA,EAAW,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,gBAC9B,SAAS,MAAM;AACb,kBAAA,QAAA,CAAS,IAAI,CAAA;AACb,kBAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,gBACvB,CAAA;AAAA,gBACA,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAQ,OAAA;AAAA,gBAER,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAM;AAAA;AAAA,eAEX,CAAA,GACE;AAAA;AAAA,SAAA;AAAA,QA3CC,IAAA,CAAK;AAAA,OA6Cb,CAAA,EACH;AAAA,KAAA,EAAA,EA9DgC,KAAA,CAAM,KAgE1C,CACD,CAAA;AAAA,oBAGHA,GAAAA;AAAA,MAAC,GAAA,CAAI,KAAA;AAAA,MAAJ;AAAA,QACC,WAAA,EAAY,wHAAA;AAAA,QACZ,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,UAAA,WAAA,CAAY,IAAI,CAAA;AAChB,UAAA,IAAI,CAAC,IAAA,EAAM,QAAA,CAAS,IAAI,CAAA;AAAA,QAC1B,CAAA;AAAA,QACA,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAM,eAAA;AAAA,QAEN,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uCAAA,EACf,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,4BACVA,GAAAA;AAAA,cAAC,GAAA,CAAI,SAAA;AAAA,cAAJ;AAAA,gBACC,QAAA,EAAU,OAAA;AAAA,gBACV,WAAA,EAAY,qBAAA;AAAA,gBACZ,KAAA,EAAO;AAAA;AAAA;AACT,WAAA,EACF,CAAA;AAAA,0BACAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uCAAA,EACf,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,4BACjBA,IAAC,GAAA,CAAI,SAAA,EAAJ,EAAc,QAAA,EAAU,QAAA,EAAU,OAAO,KAAA,EAAO;AAAA,WAAA,EACnD,CAAA;AAAA,UACC,KAAA,KAAU,OAAO,IAAA,mBAChBA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAA4B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BAEjDD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,IAAI,MAAA,EAAJ,EAAW,SAAS,MAAM,WAAA,CAAY,KAAK,CAAA,EAAG,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BACrDA,GAAAA;AAAA,cAAC,GAAA,CAAI,MAAA;AAAA,cAAJ;AAAA,gBACC,QAAA,EAAU,IAAA,IAAQ,IAAA,CAAK,IAAA,EAAK,KAAM,EAAA;AAAA,gBAClC,OAAA,EAAS,MAAM,KAAK,MAAA,EAAO;AAAA,gBAC3B,OAAA,EAAQ,SAAA;AAAA,gBACT,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA,KACF;AAAA,oBAEAD,IAAAA;AAAA,MAAC,GAAA,CAAI,KAAA;AAAA,MAAJ;AAAA,QACC,WAAA,EAAY,qEAAA;AAAA,QACZ,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,UAAA,IAAI,CAAC,IAAA,EAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,QAClC,CAAA;AAAA,QACA,MAAM,aAAA,KAAkB,IAAA;AAAA,QACxB,OAAO,aAAA,KAAkB,IAAA,GAAO,EAAA,GAAK,CAAA,OAAA,EAAU,cAAc,IAAI,CAAA,CAAA,CAAA;AAAA,QAEhE,QAAA,EAAA;AAAA,UAAA,KAAA,KAAU,OAAO,IAAA,mBAChBC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BAEtDD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,IAAI,MAAA,EAAJ,EAAW,SAAS,MAAM,gBAAA,CAAiB,IAAI,CAAA,EAAG,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BACzDA,GAAAA;AAAA,cAAC,GAAA,CAAI,MAAA;AAAA,cAAJ;AAAA,gBACC,QAAA,EAAU,IAAA;AAAA,gBACV,SAAS,MAAM;AACb,kBAAA,IAAI,aAAA,KAAkB,IAAA,EAAM,KAAK,MAAA,CAAO,aAAa,CAAA;AAAA,gBACvD,CAAA;AAAA,gBACA,OAAA,EAAQ,SAAA;AAAA,gBACT,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;;;ACnSA,eAAsB,YAAY,QAAA,EAAqC;AACrE,EAAA,MAAM,UAAW,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAGvD,EAAA,MAAMa,UAAS,OAAA,EAAS,MAAA;AACxB,EAAA,IAAI,OAAOA,OAAAA,KAAW,QAAA,EAAU,OAAOA,OAAAA;AACvC,EAAA,IAAIA,YAAW,IAAA,IAAQ,OAAOA,OAAAA,KAAW,QAAA,IAAY,aAAaA,OAAAA,EAAQ;AACxE,IAAA,MAAM,UAAWA,OAAAA,CAAiC,OAAA;AAClD,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AAAA,EAC1C;AACA,EAAA,OAAO,CAAA,oBAAA,EAAuB,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA,CAAA;AACvD;AAEA,SAAS,KAAK,OAAA,EAAqC;AACjD,EAAA,MAAM,GAAA,GAAM,QAAQ,KAAA,IAAS,KAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KAAyB;AAC1C,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,IAAS,EAAE,CAAA;AAClD,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACjC,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,OAAO,EAAE,QAAA,EAAS;AACrD,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,EAAG,MAAM,CAAA,CAAA;AAAA,EAC1D,CAAA;AACA,EAAA,MAAM,GAAA,GAAM,OACV,IAAA,EACA,IAAA,GAAoB,EAAC,KACC;AACtB,IAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAC1B,IAAA,MAAM,QAAA,GAAwB;AAAA,MAC5B,GAAG,IAAA;AAAA,MACH,GAAI,IAAA,CAAK,IAAA,KAAS,MAAA,GACd,EAAC,GACD;AAAA,QACE,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,GAAI,IAAA,CAAK;AAAA;AACX;AACF,KACN;AACA,IAAA,OAAO,MAAM,IAAI,GAAA,EAAK,OAAA,CAAQ,UAAU,GAAA,EAAK,QAAQ,KAAK,QAAQ,CAAA;AAAA,EACpE,CAAA;AACA,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,IAAA,EAAM,OAAU,IAAA,EAAc,IAAA,GAAoB,EAAC,KAAkB;AACnE,MAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AACrC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,MAAM,WAAA,CAAY,QAAQ,CAAC,CAAA;AAC7D,MAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,EAAK,OAAO,MAAA;AACpC,MAAA,OAAQ,MAAM,SAAS,IAAA,EAAK;AAAA,IAC9B;AAAA,GACF;AACF;AAEA,IAAM,QAAA,GAAW,CAAC,MAAA,KAChB,MAAA,KAAW,SAAY,EAAC,GAAI,EAAE,MAAA,EAAO;AAUhC,SAAS,6BACd,OAAA,EACoB;AACpB,EAAA,MAAM,GAAA,GAAM,KAAK,OAAO,CAAA;AACxB,EAAA,MAAM,EAAA,GAAK,kBAAA;AACX,EAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,OAAO,OAAA,KAAY;AAC/B,MAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA;AAAA,QACxB,GAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,OAAA,CAAQ,WAAW,CAAC,CAAA,OAAA,CAAA;AAAA,QAClC;AAAA,UACE,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,SAAS,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAG,CAAA;AAAA,UACvD,GAAG,QAAA,CAAS,OAAA,CAAQ,MAAM;AAAA;AAC5B,OACF;AACA,MAAA,OAAO;AAAA,QACL,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,SAAS,OAAA,CAAQ;AAAA,OACnB;AAAA,IACF,CAAA;AAAA,IACA,SAAA,EAAW,OAAO,OAAA,KAChB,MAAM,GAAA,CAAI,IAAA;AAAA,MACR,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,OAAA,CAAQ,WAAW,CAAC,CAAA,QAAA,EAAW,EAAA,CAAG,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAA;AAAA,MACjE;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,SAAS,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAG,CAAA;AAAA,QACvD,GAAG,QAAA,CAAS,OAAA,CAAQ,MAAM;AAAA;AAC5B,KACF;AAAA,IACF,eAAA,EAAiB,OAAO,OAAA,KACtB,MAAM,GAAA,CAAI,IAAA;AAAA,MACR,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,OAAA,CAAQ,WAAW,CAAC,CAAA,QAAA,EAAW,EAAA,CAAG,OAAA,CAAQ,QAAQ,CAAC,CAAA,OAAA,CAAA;AAAA,MACjE;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW;AAAC,SAC9B,CAAA;AAAA,QACD,GAAG,QAAA,CAAS,OAAA,CAAQ,MAAM;AAAA;AAC5B,KACF;AAAA,IACF,UAAA,EAAY,OAAO,OAAA,KAAY;AAC7B,MAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,GAAA;AAAA,QACzB,GAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,OAAA,CAAQ,WAAW,CAAC,CAAA,OAAA,CAAA;AAAA,QAClC;AAAA,UACE,MAAA,EAAQ,KAAA;AAAA,UACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,cAAA,EAAgB,OAAA,CAAQ,aAAA,IAAiB,EAAC;AAAA,YAC1C,mBAAA,EAAqB,OAAA,CAAQ,iBAAA,IAAqB,EAAC;AAAA,YACnD,QAAA,EAAU,QAAQ,OAAA,IAAW,IAAA;AAAA,YAC7B,gBAAA,EAAkB,QAAQ,cAAA,IAAkB,IAAA;AAAA,YAC5C,sBAAA,EAAwB,QAAQ,cAAA,KAAmB,IAAA;AAAA,YACnD,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,EAAC;AAAA,YACvB,eACE,OAAA,CAAQ,WAAA,KAAgB,MAAA,GACpB,IAAA,GACC,QAAQ,WAAA,IAAe,EAAA;AAAA,YAC9B,mBAAA,EAAqB,QAAQ,iBAAA,IAAqB;AAAA,WACnD,CAAA;AAAA,UACD,GAAG,QAAA,CAAS,OAAA,CAAQ,MAAM;AAAA;AAC5B,OACF;AACA,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,QAAA,MAAM,IAAI,mBAAA,CAAoB,MAAM,WAAA,CAAY,QAAQ,CAAC,CAAA;AAAA,MAC3D;AACA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,MAAM,WAAA,CAAY,QAAQ,CAAC,CAAA;AAC7D,MAAA,MAAM,OAAA,GAAW,MAAM,QAAA,CAAS,IAAA,EAAK;AACrC,MAAA,OAAO,OAAA,CAAQ,eAAe,IAAA,GAC1B,KACA,EAAE,SAAA,EAAW,QAAQ,UAAA,EAAW;AAAA,IACtC;AAAA,GACF;AACF;AA2EA,SAAS,kBACP,OAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,aAAa,OAAA,CAAQ,IAAA;AAAA,IACrB,UAAU,OAAA,CAAQ,SAAA;AAAA,IAClB,GAAI,QAAQ,UAAA,KAAe,IAAA,GAAO,EAAC,GAAI,EAAE,SAAA,EAAW,OAAA,CAAQ,UAAA;AAAW,GACzE;AACF;AAEA,SAAS,eAAe,OAAA,EAAgD;AACtE,EAAA,OAAO,EAAE,QAAA,EAAU,OAAA,CAAQ,SAAA,EAAW,QAAA,EAAU,QAAQ,SAAA,EAAU;AACpE;AAEA,SAAS,cAAc,OAAA,EAA8C;AACnE,EAAA,OAAO;AAAA,IACL,UAAU,OAAA,CAAQ,SAAA;AAAA,IAClB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,UAAU,OAAA,CAAQ;AAAA,GACpB;AACF;AAGO,SAAS,6BACd,OAAA,EACoB;AACpB,EAAA,MAAM,GAAA,GAAM,KAAK,OAAO,CAAA;AACxB,EAAA,MAAM,EAAA,GAAK,kBAAA;AACX,EAAA,MAAM,aAAa,OAAA,CAAQ,OAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,IAAgB,CAAA,EAAG,QAAQ,OAAO,CAAA,UAAA,CAAA;AACvD,EAAA,OAAO;AAAA,IACL,qBAAA,EAAuB,OAAO,KAAA,KAC5B,iBAAA;AAAA,MACE,MAAM,GAAA,CAAI,IAAA;AAAA,QACR,GAAG,UAAU,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,SAAA,CAAA;AAAA,QACtC,QAAA,CAAS,MAAM,MAAM;AAAA;AACvB,KACF;AAAA,IACF,qBAAA,EAAuB,OAAO,KAAA,KAC5B,iBAAA;AAAA,MACE,MAAM,GAAA,CAAI,IAAA;AAAA,QACR,GAAG,UAAU,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,SAAA,CAAA;AAAA,QACtC;AAAA,UACE,MAAA,EAAQ,KAAA;AAAA,UACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,WAAW,KAAA,CAAM,QAAA;AAAA,YACjB,mBAAA,EAAqB,MAAM,iBAAA,IAAqB;AAAA,WACjD;AAAA;AACH;AACF,KACF;AAAA,IACF,qBAAA,EAAuB,OAAO,KAAA,KAAU;AACtC,MAAA,MAAM,GAAA,CAAI,KAAc,CAAA,EAAG,UAAU,IAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,CAAA,EAAI;AAAA,QAChE,MAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,IAAA,EAAM,MAAM,IAAA,IAAQ,IAAA;AAAA,UACpB,WAAA,EAAa,MAAM,WAAA,IAAe;AAAA,SACnC;AAAA,OACF,CAAA;AAAA,IACH,CAAA;AAAA,IACA,aAAA,EAAe,OAAO,KAAA,KAAU;AAC9B,MAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA;AAAA,QACxB,GAAG,UAAU,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,KAAA,CAAA;AAAA,QACtC,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,IAAA,EAAM,CAAA;AAAE,OACvE;AACA,MAAA,OAAO,EAAE,WAAA,EAAa,OAAA,CAAQ,IAAA,EAAK;AAAA,IACrC,CAAA;AAAA,IACA,kBAAA,EAAoB,OAAO,KAAA,KACzB,cAAA;AAAA,MACE,MAAM,GAAA,CAAI,IAAA;AAAA,QACR,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,SAAA,EAAY,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAA;AAAA,QAC9D,QAAA,CAAS,MAAM,MAAM;AAAA;AACvB,KACF;AAAA,IACF,UAAA,EAAY,OAAO,KAAA,KAAU;AAC3B,MAAA,MAAM,GAAA,CAAI,IAAA;AAAA,QACR,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,SAAA,EAAY,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAA;AAAA,QAC9D,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,SAAA,EAAW,KAAA,CAAM,QAAA,EAAU,CAAA;AAAE,OACvE;AAAA,IACF,CAAA;AAAA,IACA,YAAA,EAAc,OAAO,KAAA,KACnB,cAAA;AAAA,MACE,MAAM,GAAA,CAAI,IAAA;AAAA,QACR,GAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,QAAA,CAAA;AAAA,QAChC;AAAA,UACE,MAAA,EAAQ,MAAA;AAAA,UACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,SAAA,EAAW,KAAA,CAAM,UAAU;AAAA;AACpD;AACF,KACF;AAAA,IACF,YAAA,EAAc,OAAO,KAAA,KAAU;AAC7B,MAAA,MAAM,GAAA,CAAI,IAAA;AAAA,QACR,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,SAAA,EAAY,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAA;AAAA,QAC9D,EAAE,QAAQ,QAAA;AAAS,OACrB;AAAA,IACF,CAAA;AAAA,IACA,WAAA,EAAa,OAAO,KAAA,KAA4C;AAC9D,MAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA;AAAA,QACxB,GAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,QAAA,CAAA;AAAA,QAChC,QAAA,CAAS,MAAM,MAAM;AAAA,OACvB;AACA,MAAA,OAAO;AAAA,QACL,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,mBAAmB,OAAA,CAAQ;AAAA,OAC7B;AAAA,IACF,CAAA;AAAA,IACA,cAAA,EAAgB,OAAO,KAAA,KAA8C;AACnE,MAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA;AAAA,QACxB,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,SAAA,EAAY,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAC,CAAA,YAAA,CAAA;AAAA,QAC9D;AAAA,UACE,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,SAAS,KAAA,CAAM,OAAA,IAAW,EAAC,EAAG,CAAA;AAAA,UACrD,GAAG,QAAA,CAAS,KAAA,CAAM,MAAM;AAAA;AAC1B,OACF;AACA,MAAA,OAAO;AAAA,QACL,UAAU,OAAA,CAAQ,SAAA;AAAA,QAClB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,UACvC,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,aAAa,KAAA,CAAM,aAAA;AAAA,UACnB,aAAa,KAAA,CAAM,YAAA;AAAA,UACnB,oBAAoB,KAAA,CAAM;AAAA,SAC5B,CAAE,CAAA;AAAA,QACF,GAAI,QAAQ,OAAA,GACR;AAAA,UACE,OAAA,EAAS;AAAA,YACP,QAAA,EAAU,QAAQ,OAAA,CAAQ,SAAA;AAAA,YAC1B,gBAAA,EAAkB,QAAQ,OAAA,CAAQ,iBAAA;AAAA,YAClC,YAAA,EAAc,QAAQ,OAAA,CAAQ,aAAA;AAAA,YAC9B,MAAA,EAAQ,QAAQ,OAAA,CAAQ;AAAA;AAC1B,YAEF,EAAC;AAAA,QACL,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,GAAI,QAAQ,KAAA,GAAQ,EAAE,OAAO,OAAA,CAAQ,KAAA,KAAU;AAAC,OAClD;AAAA,IACF,CAAA;AAAA,IACA,SAAA,EAAW,OAAO,KAAA,KAChB,aAAA;AAAA,MACE,MAAM,GAAA,CAAI,IAAA;AAAA,QACR,GAAG,IAAI,CAAA,MAAA,CAAA;AAAA,QACP,QAAA,CAAS,MAAM,MAAM;AAAA;AACvB,KACF;AAAA,IACF,SAAA,EAAW,OAAO,KAAA,KAChB,aAAA;AAAA,MACE,MAAM,GAAA,CAAI,IAAA,CAA2B,CAAA,EAAG,IAAI,CAAA,MAAA,CAAA,EAAU;AAAA,QACpD,MAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,WAAW,KAAA,CAAM,QAAA;AAAA,UACjB,IAAA,EAAM,MAAM,IAAA,IAAQ;AAAA,SACrB;AAAA,OACF;AAAA,KACH;AAAA,IACF,aAAA,EAAe,OAAO,KAAA,KACpB,MAAM,IAAI,IAAA,CAAgC,CAAA,EAAG,IAAI,CAAA,eAAA,CAAA,EAAmB;AAAA,MAClE,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,SAAA,EAAW,KAAA,CAAM,UAAU,CAAA;AAAA,MAClD,GAAG,QAAA,CAAS,KAAA,CAAM,MAAM;AAAA,KACzB,CAAA;AAAA,IACH,iBAAA,EAAmB,OAAO,KAAA,KAA0C;AAClE,MAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA;AAAA,QACxB,GAAG,IAAI,CAAA,eAAA,CAAA;AAAA,QACP,QAAA,CAAS,MAAM,MAAM;AAAA,OACvB;AACA,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,QAC/B,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,WAAW,OAAA,CAAQ,UAAA;AAAA,QACnB,WAAW,OAAA,CAAQ,UAAA;AAAA,QACnB,cAAc,OAAA,CAAQ,aAAA;AAAA,QACtB,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,WAAW,OAAA,CAAQ;AAAA,OACrB,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IACA,gBAAA,EAAkB,OAAO,KAAA,KACvB,aAAA;AAAA,MACE,MAAM,GAAA,CAAI,IAAA;AAAA,QACR,GAAG,IAAI,CAAA,gBAAA,EAAmB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA;AAAA,QAC/C,QAAA,CAAS,MAAM,MAAM;AAAA;AACvB,KACF;AAAA,IACF,mBAAA,EAAqB,OAAO,KAAA,KAC1B,aAAA;AAAA,MACE,MAAM,GAAA,CAAI,IAAA;AAAA,QACR,GAAG,IAAI,CAAA,gBAAA,EAAmB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAC,CAAA,QAAA,CAAA;AAAA,QAC/C,EAAE,QAAQ,MAAA;AAAO;AACnB,KACF;AAAA,IACF,eAAA,EAAiB,OAAO,KAAA,KAA0C;AAChE,MAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA;AAAA,QACxB,GAAG,IAAI,CAAA,YAAA,CAAA;AAAA,QACP,QAAA,CAAS,MAAM,MAAM;AAAA,OACvB;AACA,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,UAAA,MAAgB;AAAA,QAClC,IAAI,UAAA,CAAW,EAAA;AAAA,QACf,OAAO,UAAA,CAAW,KAAA;AAAA,QAClB,QAAQ,UAAA,CAAW;AAAA,OACrB,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IACA,mBAAA,EAAqB,OAAO,KAAA,KAAqC;AAC/D,MAAA,MAAM,KAAA,GACJ,MAAM,YAAA,KAAiB,IAAA,GACnB,KACA,CAAA,eAAA,EAAkB,kBAAA,CAAmB,KAAA,CAAM,YAAY,CAAC,CAAA,CAAA;AAC9D,MAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA;AAAA,QACxB,CAAA,EAAG,IAAI,CAAA,iBAAA,EAAoB,KAAK,CAAA,CAAA;AAAA,QAChC,QAAA,CAAS,MAAM,MAAM;AAAA,OACvB;AACA,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QAC7B,YAAY,KAAA,CAAM,WAAA;AAAA,QAClB,WAAW,KAAA,CAAM,UAAA;AAAA,QACjB,WAAW,KAAA,CAAM,UAAA;AAAA,QACjB,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,UACtC,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,UAAU,MAAA,CAAO;AAAA,SACnB,CAAE;AAAA,OACJ,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IACA,cAAA,EAAgB,OAAO,KAAA,KAAyC;AAC9D,MAAA,MAAM,UAAU,MAAM,GAAA,CAAI,IAAA,CAAqB,CAAA,EAAG,IAAI,CAAA,cAAA,CAAA,EAAkB;AAAA,QACtE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,WAAW,KAAA,CAAM,QAAA;AAAA,UACjB,YAAY,KAAA,CAAM,SAAA;AAAA,UAClB,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,SAC3B,CAAA;AAAA,QACD,GAAG,QAAA,CAAS,KAAA,CAAM,MAAM;AAAA,OACzB,CAAA;AACD,MAAA,OAAO;AAAA,QACL,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,UAAU,OAAA,CAAQ,SAAA;AAAA,QAClB,oBAAoB,OAAA,CAAQ,mBAAA;AAAA,QAC5B,KAAK,OAAA,CAAQ;AAAA,OACf;AAAA,IACF,CAAA;AAAA,IACA,iBAAA,EAAmB,OAAO,KAAA,KAAU;AAClC,MAAA,MAAM,GAAA,CAAI,IAAA;AAAA,QACR,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,QAAA,EAAW,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAC,CAAA,MAAA,CAAA;AAAA,QAC7D,EAAE,QAAQ,MAAA;AAAO,OACnB;AAAA,IACF,CAAA;AAAA,IACA,sBAAA,EAAwB,OAAO,KAAA,KAAU;AACvC,MAAA,MAAM,GAAA,CAAI,IAAA;AAAA,QACR,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,QAAA,EAAW,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAC,CAAA,QAAA,CAAA;AAAA,QAC7D,EAAE,QAAQ,MAAA;AAAO,OACnB;AAAA,IACF;AAAA,GACF;AACF;AAwCA,SAAS,QAAQ,OAAA,EAA2C;AAC1D,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,YAAA,IAAgB,EAAA;AAAA,IACrD,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,WAAW,OAAA,CAAQ,UAAA;AAAA,IACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,OAAA,EAAS,QAAQ,QAAA,IAAY,IAAA;AAAA,IAC7B,UAAU,OAAA,CAAQ,SAAA;AAAA,IAClB,SAAS,OAAA,CAAQ,QAAA;AAAA,IACjB,eAAA,EAAiB,QAAQ,iBAAA,IAAqB,CAAA;AAAA,IAC9C,WAAW,OAAA,CAAQ;AAAA,GACrB;AACF;AAEA,SAAS,OAAO,OAAA,EAAyC;AACvD,EAAA,OAAO;AAAA,IACL,GAAG,QAAQ,OAAO,CAAA;AAAA,IAClB,MAAA,EAAQ,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACrC,aAAa,KAAA,CAAM,YAAA;AAAA,MACnB,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,aAAa,KAAA,CAAM;AAAA,KACrB,CAAE,CAAA;AAAA,IACF,UAAA,EAAY,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ;AAAA,GAC7C;AACF;AAEA,SAAS,UAAA,CAAW,UAAoB,QAAA,EAA0B;AAChE,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA,IAAK,EAAA;AAC9D,EAAA,MAAM,IAAA,GAAO,4BAAA,CAA6B,IAAA,CAAK,MAAM,CAAA;AACrD,EAAA,IAAI,IAAA,GAAO,CAAC,CAAA,KAAM,MAAA,SAAkB,kBAAA,CAAmB,IAAA,CAAK,CAAC,CAAC,CAAA;AAC9D,EAAA,MAAM,KAAA,GAAQ,wBAAA,CAAyB,IAAA,CAAK,MAAM,CAAA;AAClD,EAAA,OAAO,KAAA,GAAQ,CAAC,CAAA,IAAK,QAAA;AACvB;AAQO,SAAS,8BACd,OAAA,EAC8B;AAC9B,EAAA,MAAM,GAAA,GAAM,KAAK,OAAO,CAAA;AACxB,EAAA,MAAM,EAAA,GAAK,kBAAA;AACX,EAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,IAAc,CAAA,EAAG,IAAI,CAAA,QAAA,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,EAAC;AACtC,EAAA,MAAM,SAAA,GAA0C;AAAA,IAC9C,cAAA,EAAgB,OAAO,KAAA,KAAA,CACpB,MAAM,GAAA,CAAI,IAAA,CAAuB,IAAA,EAAM,QAAA,CAAS,KAAA,CAAM,MAAM,CAAC,CAAA,EAAG,GAAA;AAAA,MAC/D;AAAA,KACF;AAAA,IACF,aAAA,EAAe,OAAO,KAAA,KACpB,MAAA;AAAA,MACE,MAAM,GAAA,CAAI,IAAA;AAAA,QACR,GAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,CAAA;AAAA,QAChC,QAAA,CAAS,MAAM,MAAM;AAAA;AACvB,KACF;AAAA,IACF,eAAA,EAAiB,OAAO,KAAA,KACtB,OAAA;AAAA,MACE,MAAM,GAAA,CAAI,IAAA,CAAqB,IAAA,EAAM;AAAA,QACnC,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,IAAA,EAAM,MAAM,WAAA,IAAe,IAAA;AAAA,UAC3B,SAAA,EAAW,MAAM,QAAA,IAAY,EAAA;AAAA,UAC7B,UAAA,EAAY,MAAM,UAAA,IAAc;AAAA,SACjC;AAAA,OACF;AAAA,KACH;AAAA,IACF,aAAA,EAAe,OAAO,KAAA,KACpB,MAAA;AAAA,MACE,MAAM,GAAA,CAAI,IAAA;AAAA,QACR,GAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,OAAA,CAAA;AAAA,QAChC;AAAA,UACE,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,cACnC,cAAc,KAAA,CAAM,WAAA;AAAA,cACpB,YAAY,KAAA,CAAM;AAAA,aACpB,CAAE;AAAA,WACH;AAAA;AACH;AACF,KACF;AAAA,IACF,WAAA,EAAa,OAAO,KAAA,KAClB,MAAA;AAAA,MACE,MAAM,GAAA,CAAI,IAAA;AAAA,QACR,GAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,cAAA,CAAA;AAAA,QAChC;AAAA,UACE,MAAA,EAAQ,MAAA;AAAA,UACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,YAAA,EAAc,KAAA,CAAM,aAAa;AAAA;AAC1D;AACF,KACF;AAAA,IACF,aAAA,EAAe,OAAO,KAAA,KACpB,MAAA;AAAA,MACE,MAAM,GAAA,CAAI,IAAA;AAAA,QACR,GAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,WAAA,CAAA;AAAA,QAChC;AAAA,UACE,MAAA,EAAQ,MAAA;AAAA,UACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,UAAA,EAAY,KAAA,CAAM,YAAY;AAAA;AACvD;AACF;AACF,GACJ;AACA,EAAA,IAAI,QAAA,CAAS,WAAW,IAAA,EAAM;AAC5B,IAAA,SAAA,CAAU,eAAA,GAAkB,OAAO,KAAA,KAAU;AAC3C,MAAA,MAAM,GAAA,CAAI,KAAgB,CAAA,EAAG,IAAI,IAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,CAAA,EAAI;AAAA,QAC5D,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH,CAAA;AAAA,EACF;AACA,EAAA,IAAI,QAAA,CAAS,eAAe,IAAA,EAAM;AAChC,IAAA,SAAA,CAAU,gBAAA,GAAmB,OAAO,KAAA,KAAA,CAEhC,MAAM,GAAA,CAAI,IAAA;AAAA,MAGR,GAAG,IAAI,CAAA,cAAA,EAAiB,kBAAA,CAAmB,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AAAA,MACvD,QAAA,CAAS,MAAM,MAAM;AAAA,KACvB,EACA,GAAA,CAAI,CAAC,SAAA,MAAe;AAAA,MACpB,aAAa,SAAA,CAAU,YAAA;AAAA,MACvB,aAAa,SAAA,CAAU,YAAA;AAAA,MACvB,GAAI,UAAU,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAQ,SAAA,CAAU,MAAA;AAAO,KACvE,CAAE,CAAA;AAAA,EACN;AACA,EAAA,IAAI,QAAA,CAAS,YAAY,KAAA,EAAO;AAC9B,IAAA,SAAA,CAAU,iBAAA,GAAoB,OAAO,KAAA,KAAA,CAEjC,MAAM,GAAA,CAAI,IAAA;AAAA,MACR,GAAG,OAAO,CAAA,QAAA,CAAA;AAAA,MACV,QAAA,CAAS,MAAM,MAAM;AAAA,KACvB,EACA,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,MACjB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAU,MAAA,CAAO;AAAA,KACnB,CAAE,CAAA;AACJ,IAAA,SAAA,CAAU,cAAA,GAAiB,OAAO,KAAA,KAAU;AAC1C,MAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,GAAA;AAAA,QACzB,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,MAAM,CAAC,CAAA,CAAA;AAAA,QACvD;AAAA,UACE,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,YAAA,EAAc,EAAC,EAAG;AAAA;AACnE,OACF;AACA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,MAAM,WAAA,CAAY,QAAQ,CAAC,CAAA;AAC7D,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,QAAA,EAAU,WAAW,QAAA,EAAU,CAAA,EAAG,MAAM,WAAW,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,QACrE,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,UAAU,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,KAAK,IAAA,CAAK;AAAA,OACzD;AAAA,IACF,CAAA;AAAA,EACF;AACA,EAAA,OAAO,SAAA;AACT;AC7pBA,SAAS,OAAA,CACP,SACAU,KAAAA,EACA;AACA,EAAA,OAAOjB,QAAQ,MAAM;AACnB,IAAA,IAAI,OAAA,KAAY,QAAW,OAAO,IAAA;AAClC,IAAA,MAAM,OAAA,GAA6B,EAAE,GAAGiB,KAAAA,EAAM,OAAA,EAAQ;AACtD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,6BAA6B,OAAO,CAAA;AAAA,MAC5C,WACE,OAAA,CAAQ,SAAA,KAAc,KAAA,GAClB,MAAA,GACA,6BAA6B,OAAO,CAAA;AAAA,MAC1C,UAAA,EAAY,8BAA8B,OAAO;AAAA,KACnD;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAASA,KAAI,CAAC,CAAA;AACpB;AAEA,SAAS,QAAQ,IAAA,EAAqB;AACpC,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,6CAA6C,IAAI,CAAA,WAAA;AAAA,GACnD;AACF;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,OAAA;AAAA,EACA,IAAA,EAAAA,KAAAA;AAAA,EACA,SAAA;AAAA,EACA,kBAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyB;AACvB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,EAASA,KAAI,CAAA;AACnC,EAAA,MAAM,SAAA,GAAYjB,OAAAA;AAAA,IAChB,MAAM,SAAA,IAAa,sBAAA,CAAuB,eAAe,CAAA;AAAA,IACzD,CAAC,WAAW,eAAe;AAAA,GAC7B;AACA,EAAA,MAAM,MAAA,GAAS,SAAA,IAAa,KAAA,EAAO,MAAA,IAAU,QAAQ,WAAW,CAAA;AAChE,EAAA,MAAM,OAAA,GAAU,UAAA,IAAc,KAAA,EAAO,UAAA,IAAc,QAAQ,YAAY,CAAA;AACvE,EAAA,MAAM,MAAA,GAAS,sBAAsB,KAAA,EAAO,SAAA;AAC5C,EAAA,uBACEN,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,UAAA,EAAY,OAAA;AAAA,MACZ,SAAA,EAAW,SAAA;AAAA,MACX,SAAA,EAAW,MAAA;AAAA,MACV,GAAI,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,oBAAoB,MAAA;AAAO;AAAA,GAChE;AAEJ;AASO,SAAS,mBAAA,CAAoB;AAAA,EAClC,OAAA;AAAA,EACA,IAAA,EAAAuB,KAAAA;AAAA,EACA,UAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA6B;AAC3B,EAAA,MAAM,KAAA,GAAQjB,OAAAA;AAAA,IACZ,MACE,YAAY,MAAA,GACR,IAAA,GACA,8BAA8B,EAAE,GAAGiB,KAAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IACxD,CAAC,SAASA,KAAI;AAAA,GAChB;AACA,EAAA,MAAM,OAAA,GAAU,UAAA,IAAc,KAAA,IAAS,OAAA,CAAQ,YAAY,CAAA;AAC3D,EAAA,uBAAOvB,GAAAA,CAAC,aAAA,EAAA,EAAe,GAAG,IAAA,EAAM,YAAY,OAAA,EAAS,CAAA;AACvD","file":"chunk-62IQGXLW.js","sourcesContent":["import type { CodeEditorProps } from \"./authoring-ports.js\";\n\n/**\n * The editor a host gets when it passes none.\n *\n * Monaco is what the origin application uses, and it is a megabyte of host choice, so the\n * package ships a textarea that behaves correctly instead: the text edits, and\n * the markers that Monaco would underline are listed under it with their line\n * numbers, which keeps the diagnostics readable without an editor library.\n */\nexport function PlainCodeEditor({\n value,\n onChange,\n readOnly,\n markers,\n ariaLabel,\n className,\n}: CodeEditorProps) {\n const listed = markers ?? [];\n return (\n <div className={className} data-bideux-editor=\"plain\">\n <textarea\n className=\"block w-full min-h-[24rem] resize-y rounded-md border border-input bg-background p-3 font-mono text-[13px] leading-5 text-foreground\"\n aria-label={ariaLabel ?? \"YAML\"}\n spellCheck={false}\n readOnly={readOnly ?? false}\n value={value}\n rows={20}\n onChange={(event) => {\n onChange(event.target.value);\n }}\n />\n {listed.length > 0 ? (\n <ul data-bideux-editor-markers=\"\">\n {listed.map((marker, index) => (\n <li key={`${marker.startLineNumber}-${index}`}>\n {`Line ${marker.startLineNumber}: ${marker.message}`}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n","export function cn(\n ...values: (string | false | null | undefined)[]\n): string | undefined {\n const parts = values.filter(\n (value): value is string => typeof value === \"string\" && value !== \"\",\n );\n return parts.length === 0 ? undefined : parts.join(\" \");\n}\n","/**\n * The built-in icon set: one inline SVG per `IconName`, drawn on the 24 unit\n * grid with a 2 unit stroke so a host that later swaps in Lucide, Heroicons or\n * its own glyphs sees no size change. No icon library is imported.\n */\nimport type { ComponentType } from \"react\";\n\nimport { cn } from \"../cn.js\";\nimport type { IconName, IconProps, IconSet } from \"../ports.js\";\n\nconst PATHS: Record<IconName, string> = {\n activity: \"M22 12h-4l-3 9L9 3l-3 9H2\",\n alert:\n \"M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0ZM12 9v4M12 17h.01\",\n arrowDown: \"M12 5v14M19 12l-7 7-7-7\",\n arrowLeft: \"M19 12H5M12 19l-7-7 7-7\",\n arrowUp: \"M12 19V5M5 12l7-7 7 7\",\n arrowUpDown: \"M7 3v18M3 7l4-4 4 4M17 21V3M13 17l4 4 4-4\",\n building:\n \"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18ZM6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2M10 6h4M10 10h4M10 14h4M10 18h4\",\n calendar:\n \"M8 2v4M16 2v4M3 10h18M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2Z\",\n check: \"M20 6 9 17l-5-5\",\n chevronDown: \"m6 9 6 6 6-6\",\n chevronLeft: \"m15 18-6-6 6-6\",\n chevronRight: \"m9 18 6-6-6-6\",\n close: \"M18 6 6 18M6 6l12 12\",\n code: \"m16 18 6-6-6-6M8 6l-6 6 6 6\",\n copy: \"M8 8h12v12H8ZM16 8V4H4v12h4\",\n download: \"M12 3v12M7 10l5 5 5-5M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2\",\n expand: \"M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7\",\n eye: \"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12ZM12 9a3 3 0 1 0 0 6 3 3 0 1 0 0-6Z\",\n filter: \"M22 3H2l8 9.5V19l4 2v-8.5Z\",\n grip: \"M9 5h.01M9 12h.01M9 19h.01M15 5h.01M15 12h.01M15 19h.01\",\n help: \"M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20ZM9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3M12 17h.01\",\n info: \"M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20ZM12 16v-4M12 8h.01\",\n layers: \"m12 2 10 5-10 5L2 7ZM2 12l10 5 10-5M2 17l10 5 10-5\",\n loader:\n \"M12 2v4M12 18v4M4.9 4.9l2.8 2.8M16.3 16.3l2.8 2.8M2 12h4M18 12h4M4.9 19.1l2.8-2.8M16.3 7.7l2.8-2.8\",\n lock: \"M5 11h14v10H5ZM8 11V7a4 4 0 0 1 8 0v4\",\n minus: \"M5 12h14\",\n more: \"M5 12h.01M12 12h.01M19 12h.01\",\n plus: \"M12 5v14M5 12h14\",\n refresh:\n \"M21 12a9 9 0 0 1-15.5 6.3L3 16M3 12a9 9 0 0 1 15.5-6.3L21 8M21 3v5h-5M3 21v-5h5\",\n save: \"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2ZM17 21v-8H7v8M7 3v5h8\",\n search: \"M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM21 21l-4.3-4.3\",\n settings:\n \"M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1Z\",\n share:\n \"M18 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM6 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM18 22a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM8.6 13.5l6.8 4M15.4 6.5l-6.8 4\",\n sliders:\n \"M21 4h-7M10 4H3M21 12h-9M8 12H3M21 20h-5M12 20H3M14 2v4M8 10v4M16 18v4\",\n sparkles:\n \"m12 3 1.9 5.1L19 10l-5.1 1.9L12 17l-1.9-5.1L5 10l5.1-1.9ZM5 3v4M3 5h4M19 17v4M17 19h4\",\n spreadsheet:\n \"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8ZM14 2v6h6M8 13h8M8 17h8M12 13v4\",\n trash: \"M3 6h18M8 6V4h8v2M19 6l-1 14H6L5 6M10 11v6M14 11v6\",\n trendDown: \"m22 17-8.5-8.5-5 5L2 7M16 17h6v-6\",\n trendFlat: \"M2 12h20M16 7l5 5-5 5\",\n trendUp: \"m22 7-8.5 8.5-5-5L2 17M16 7h6v6\",\n undo: \"M3 7v6h6M21 17a9 9 0 0 0-15-6.7L3 13\",\n users:\n \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8ZM22 21v-2a4 4 0 0 0-3-3.9M16 3.1a4 4 0 0 1 0 7.8\",\n};\n\nfunction glyph(name: IconName): ComponentType<IconProps> {\n const d = PATHS[name];\n return function BideuxIcon({ className, title }: IconProps) {\n return (\n <svg\n aria-hidden={title === undefined}\n className={cn(\"size-4 shrink-0\", className)}\n data-icon={name}\n fill=\"none\"\n role={title === undefined ? undefined : \"img\"}\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n viewBox=\"0 0 24 24\"\n >\n {title === undefined ? null : <title>{title}</title>}\n <path d={d} />\n </svg>\n );\n };\n}\n\n/** Every `IconName`, drawn inline. Spread and override to replace a few. */\nexport const defaultIcons: IconSet = Object.fromEntries(\n (Object.keys(PATHS) as IconName[]).map((name) => [name, glyph(name)]),\n) as IconSet;\n\n/** The built-in glyphs with a host's own laid over the top. */\nexport function mergeIcons(overrides?: Partial<IconSet>): IconSet {\n if (overrides === undefined) return defaultIcons;\n const merged: Partial<IconSet> = { ...defaultIcons };\n for (const [name, component] of Object.entries(overrides) as [\n IconName,\n ComponentType<IconProps> | undefined,\n ][]) {\n if (component !== undefined) merged[name] = component;\n }\n return merged as IconSet;\n}\n","/**\n * The built-in design system: every `UiKit` primitive drawn with plain\n * elements and the same utility classes the reader and builder use, themed by\n * the CSS variables in `styles.css` (`--background`, `--primary`, `--border`\n * and so on). No component library is imported.\n *\n * A host keeps its own look by passing any subset of `UiKit` to the providers;\n * `createDefaultUiKit(overrides)` fills in the rest.\n */\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport type { CSSProperties, RefObject } from \"react\";\n\nimport { cn } from \"../cn.js\";\nimport { defaultIcons } from \"./icons.js\";\nimport type {\n UiBadgeProps,\n UiButtonProps,\n UiCheckboxProps,\n UiKit,\n UiMenuProps,\n UiModalProps,\n UiPopoverProps,\n UiSelectProps,\n UiSkeletonProps,\n UiTextInputProps,\n UiTooltipProps,\n} from \"../ports.js\";\n\nconst FOCUS_RING =\n \"outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\";\n\nconst BADGE_TONE: Record<NonNullable<UiBadgeProps[\"tone\"]>, string> = {\n neutral: \"bg-muted text-muted-foreground\",\n info: \"bg-secondary text-secondary-foreground\",\n success: \"bg-primary text-primary-foreground\",\n warning: \"border border-border bg-transparent text-foreground\",\n danger: \"bg-destructive text-destructive-foreground\",\n};\n\nfunction Badge({ children, tone, className, title }: UiBadgeProps) {\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1 rounded-md px-2 py-0.5 text-xs font-medium\",\n BADGE_TONE[tone ?? \"neutral\"],\n className,\n )}\n data-bideux=\"badge\"\n data-tone={tone ?? \"neutral\"}\n title={title}\n >\n {children}\n </span>\n );\n}\n\nconst BUTTON_VARIANT: Record<NonNullable<UiButtonProps[\"variant\"]>, string> = {\n primary: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n secondary:\n \"border border-border bg-background text-foreground hover:bg-muted\",\n ghost: \"text-foreground hover:bg-muted\",\n link: \"text-primary underline-offset-4 hover:underline\",\n};\n\nconst BUTTON_SIZE: Record<NonNullable<UiButtonProps[\"size\"]>, string> = {\n sm: \"h-8 px-3 text-xs\",\n md: \"h-9 px-4 text-sm\",\n};\n\n/**\n * Forwards the ref so a popover or menu can anchor to the real button, which\n * is also what a host's own button must do to take its place.\n */\nconst Button = forwardRef<HTMLButtonElement, UiButtonProps>(\n function BideuxButton(\n {\n children,\n className,\n disabled,\n onClick,\n title,\n ariaLabel,\n variant,\n size,\n type,\n },\n ref,\n ) {\n return (\n <button\n aria-label={ariaLabel}\n className={cn(\n \"inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none\",\n FOCUS_RING,\n BUTTON_VARIANT[variant ?? \"secondary\"],\n BUTTON_SIZE[size ?? \"md\"],\n className,\n )}\n data-bideux=\"button\"\n data-variant={variant ?? \"secondary\"}\n disabled={disabled}\n onClick={onClick}\n ref={ref}\n title={title}\n type={type ?? \"button\"}\n >\n {children}\n </button>\n );\n },\n);\n\nfunction Checkbox({\n checked,\n onChange,\n label,\n disabled,\n className,\n}: UiCheckboxProps) {\n return (\n <label\n className={cn(\n \"inline-flex cursor-pointer items-center gap-2 text-sm\",\n disabled === true && \"cursor-not-allowed opacity-50\",\n className,\n )}\n data-bideux=\"checkbox\"\n >\n <input\n checked={checked}\n className={cn(\"size-4 cursor-pointer accent-primary\", FOCUS_RING)}\n disabled={disabled}\n onChange={(event) => onChange(event.target.checked)}\n type=\"checkbox\"\n />\n {label}\n </label>\n );\n}\n\n/** Closes on Escape and on a pointer down outside `refs`. */\nfunction useDismiss(\n open: boolean,\n onClose: () => void,\n refs: readonly RefObject<HTMLElement | null>[],\n): void {\n useEffect(() => {\n if (!open) return;\n const onKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") onClose();\n };\n const onPointer = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (refs.some((ref) => ref.current?.contains(target) === true)) return;\n onClose();\n };\n document.addEventListener(\"keydown\", onKey);\n document.addEventListener(\"pointerdown\", onPointer);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(\"pointerdown\", onPointer);\n };\n }, [open, onClose, refs]);\n}\n\ntype Align = NonNullable<UiPopoverProps[\"align\"]>;\n\n/**\n * Places a floating panel under its anchor with `position: fixed`, so the\n * panel escapes any overflow clipping around the trigger, and re-measures on\n * scroll and resize while open.\n */\nfunction useAnchoredPosition(\n open: boolean,\n anchor: RefObject<HTMLElement | null>,\n panel: RefObject<HTMLElement | null>,\n align: Align,\n): CSSProperties {\n const [style, setStyle] = useState<CSSProperties>({});\n const place = useCallback(() => {\n const trigger = anchor.current;\n const floating = panel.current;\n if (trigger === null || floating === null) return;\n const rect = trigger.getBoundingClientRect();\n const width = floating.offsetWidth;\n const height = floating.offsetHeight;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n let left =\n align === \"start\"\n ? rect.left\n : align === \"end\"\n ? rect.right - width\n : rect.left + rect.width / 2 - width / 2;\n left = Math.max(8, Math.min(left, viewportWidth - width - 8));\n let top = rect.bottom + 4;\n if (top + height > viewportHeight - 8 && rect.top - height - 4 > 8) {\n top = rect.top - height - 4;\n }\n setStyle({ position: \"fixed\", top, left, zIndex: 60 });\n }, [anchor, panel, align]);\n useLayoutEffect(() => {\n if (!open) return;\n place();\n window.addEventListener(\"scroll\", place, true);\n window.addEventListener(\"resize\", place);\n return () => {\n window.removeEventListener(\"scroll\", place, true);\n window.removeEventListener(\"resize\", place);\n };\n }, [open, place]);\n return style;\n}\n\nconst PANEL =\n \"rounded-md border border-border bg-popover text-popover-foreground shadow-md\";\n\nfunction Popover({\n open,\n onOpenChange,\n trigger,\n children,\n align,\n className,\n}: UiPopoverProps) {\n const anchor = useRef<HTMLSpanElement>(null);\n const panel = useRef<HTMLDivElement>(null);\n const onOpenChangeRef = useRef(onOpenChange);\n onOpenChangeRef.current = onOpenChange;\n const close = useCallback(() => onOpenChangeRef.current(false), []);\n const refs = useRef([anchor, panel] as const);\n useDismiss(open, close, refs.current);\n const style = useAnchoredPosition(open, anchor, panel, align ?? \"center\");\n return (\n <>\n <span\n className=\"inline-flex\"\n data-bideux=\"popover-trigger\"\n onClick={() => onOpenChange(!open)}\n ref={anchor}\n >\n {trigger}\n </span>\n {open ? (\n <div\n className={cn(PANEL, \"w-72 p-4\", className)}\n data-bideux=\"popover\"\n ref={panel}\n role=\"dialog\"\n style={style}\n >\n {children}\n </div>\n ) : null}\n </>\n );\n}\n\nfunction Menu({ items, trigger, ariaLabel }: UiMenuProps) {\n const [open, setOpen] = useState(false);\n const anchor = useRef<HTMLSpanElement>(null);\n const panel = useRef<HTMLDivElement>(null);\n const close = useCallback(() => setOpen(false), []);\n const refs = useRef([anchor, panel] as const);\n useDismiss(open, close, refs.current);\n const style = useAnchoredPosition(open, anchor, panel, \"end\");\n const id = useId();\n return (\n <>\n <span\n aria-controls={id}\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-label={ariaLabel}\n className=\"inline-flex\"\n data-bideux=\"menu-trigger\"\n onClick={() => setOpen((value) => !value)}\n ref={anchor}\n >\n {trigger}\n </span>\n {open ? (\n <div\n className={cn(PANEL, \"min-w-40 p-1\")}\n data-bideux=\"menu\"\n id={id}\n ref={panel}\n role=\"menu\"\n style={style}\n >\n {items.map((item) => {\n const Glyph =\n item.icon === undefined ? null : defaultIcons[item.icon];\n return (\n <button\n className={cn(\n \"flex w-full cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-muted disabled:pointer-events-none disabled:opacity-50\",\n FOCUS_RING,\n )}\n disabled={item.disabled}\n key={item.id}\n onClick={() => {\n setOpen(false);\n item.onSelect();\n }}\n role=\"menuitem\"\n type=\"button\"\n >\n {Glyph === null ? null : <Glyph />}\n {item.label}\n </button>\n );\n })}\n </div>\n ) : null}\n </>\n );\n}\n\nconst MODAL_SIZE: Record<NonNullable<UiModalProps[\"size\"]>, string> = {\n md: \"max-w-lg\",\n lg: \"max-w-3xl\",\n xl: \"max-w-6xl\",\n};\n\nconst FOCUSABLE =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nfunction Modal({\n open,\n onOpenChange,\n title,\n description,\n header,\n footer,\n children,\n size,\n}: UiModalProps) {\n const panel = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const onOpenChangeRef = useRef(onOpenChange);\n onOpenChangeRef.current = onOpenChange;\n const close = useCallback(() => onOpenChangeRef.current(false), []);\n useEffect(() => {\n if (!open) return;\n const previous = document.activeElement;\n const body = document.body;\n const overflow = body.style.overflow;\n body.style.overflow = \"hidden\";\n const first = panel.current?.querySelector<HTMLElement>(FOCUSABLE);\n (first ?? panel.current)?.focus();\n const onKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n close();\n return;\n }\n if (event.key !== \"Tab\" || panel.current === null) return;\n const focusable = Array.from(\n panel.current.querySelectorAll<HTMLElement>(FOCUSABLE),\n );\n const head = focusable[0];\n const tail = focusable[focusable.length - 1];\n if (head === undefined || tail === undefined) return;\n if (event.shiftKey && document.activeElement === head) {\n event.preventDefault();\n tail.focus();\n } else if (!event.shiftKey && document.activeElement === tail) {\n event.preventDefault();\n head.focus();\n }\n };\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n body.style.overflow = overflow;\n if (previous instanceof HTMLElement) previous.focus();\n };\n }, [open, close]);\n if (!open) return null;\n const CloseGlyph = defaultIcons.close;\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\"\n data-bideux=\"modal-backdrop\"\n onPointerDown={(event) => {\n if (event.target === event.currentTarget) close();\n }}\n >\n <div\n aria-labelledby={titleId}\n aria-modal=\"true\"\n className={cn(\n \"flex max-h-[90vh] w-full flex-col gap-4 overflow-y-auto rounded-lg border border-border bg-background p-6 text-foreground shadow-lg outline-none\",\n MODAL_SIZE[size ?? \"md\"],\n )}\n data-bideux=\"modal\"\n ref={panel}\n role=\"dialog\"\n tabIndex={-1}\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n {header ?? (\n <h2 className=\"text-lg font-semibold leading-none\" id={titleId}>\n {title}\n </h2>\n )}\n {header === undefined ? null : (\n <h2 className=\"sr-only\" id={titleId}>\n {title}\n </h2>\n )}\n {description === undefined ? null : (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n <button\n aria-label=\"Close\"\n className={cn(\n \"rounded-sm p-1 text-muted-foreground hover:text-foreground\",\n FOCUS_RING,\n )}\n onClick={close}\n type=\"button\"\n >\n <CloseGlyph />\n </button>\n </div>\n {children}\n {footer === undefined ? null : (\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nconst FIELD =\n \"h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\";\n\nfunction Select({\n value,\n options,\n onChange,\n placeholder,\n disabled,\n ariaLabel,\n className,\n}: UiSelectProps) {\n const Chevron = defaultIcons.chevronDown;\n return (\n <span\n className={cn(\"relative inline-flex w-full\", className)}\n data-bideux=\"select\"\n >\n <select\n aria-label={ariaLabel}\n className={cn(FIELD, \"appearance-none pr-8 cursor-pointer\", FOCUS_RING)}\n disabled={disabled}\n onChange={(event) => onChange(event.target.value)}\n value={value}\n >\n {placeholder !== undefined && value === \"\" ? (\n <option disabled value=\"\">\n {placeholder}\n </option>\n ) : null}\n {options.map((option) => (\n <option\n disabled={option.disabled}\n key={option.value}\n value={option.value}\n >\n {option.label}\n </option>\n ))}\n </select>\n <Chevron className=\"pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-muted-foreground\" />\n </span>\n );\n}\n\nfunction Skeleton({ className, style }: UiSkeletonProps) {\n return (\n <span\n className={cn(\"block animate-pulse rounded-md bg-muted\", className)}\n data-bideux=\"skeleton\"\n style={style}\n />\n );\n}\n\nfunction TextInput({\n value,\n onChange,\n placeholder,\n disabled,\n ariaLabel,\n className,\n type,\n onCommit,\n}: UiTextInputProps) {\n return (\n <input\n aria-label={ariaLabel}\n className={cn(FIELD, FOCUS_RING, className)}\n data-bideux=\"text-input\"\n disabled={disabled}\n onBlur={onCommit}\n onChange={(event) => onChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") onCommit?.();\n }}\n placeholder={placeholder}\n type={type ?? \"text\"}\n value={value}\n />\n );\n}\n\nconst TOOLTIP_SIDE: Record<NonNullable<UiTooltipProps[\"side\"]>, string> = {\n top: \"bottom-full left-1/2 mb-1.5 -translate-x-1/2\",\n bottom: \"top-full left-1/2 mt-1.5 -translate-x-1/2\",\n left: \"right-full top-1/2 mr-1.5 -translate-y-1/2\",\n right: \"left-full top-1/2 ml-1.5 -translate-y-1/2\",\n};\n\nfunction Tooltip({ label, children, side }: UiTooltipProps) {\n const [shown, setShown] = useState(false);\n return (\n <span\n className=\"relative inline-flex\"\n data-bideux=\"tooltip\"\n onBlur={() => setShown(false)}\n onFocus={() => setShown(true)}\n onMouseEnter={() => setShown(true)}\n onMouseLeave={() => setShown(false)}\n >\n {children}\n {shown ? (\n <span\n className={cn(\n \"pointer-events-none absolute z-50 whitespace-nowrap rounded-md bg-foreground px-2 py-1 text-xs text-background shadow-md\",\n TOOLTIP_SIDE[side ?? \"top\"],\n )}\n role=\"tooltip\"\n >\n {label}\n </span>\n ) : null}\n </span>\n );\n}\n\n/** The complete built-in kit. */\nexport const defaultUiKit: UiKit = {\n Badge,\n Button,\n Checkbox,\n Menu,\n Modal,\n Popover,\n Select,\n Skeleton,\n TextInput,\n Tooltip,\n};\n\n/**\n * The built-in kit with a host's own primitives laid over the top, so a host\n * replaces one control (its Button, its Modal) without writing the other nine.\n */\nexport function createDefaultUiKit(overrides?: Partial<UiKit>): UiKit {\n if (overrides === undefined) return defaultUiKit;\n const defined = Object.fromEntries(\n Object.entries(overrides).filter(\n ([, component]) => component !== undefined,\n ),\n ) as Partial<UiKit>;\n return { ...defaultUiKit, ...defined };\n}\n","import { createContext, useCallback, useContext, useMemo, useRef } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport type { AuthoringTransport, CodeEditor } from \"./authoring-ports.js\";\nimport { PlainCodeEditor } from \"./code-editor.js\";\nimport { mergeIcons } from \"./defaults/icons.js\";\nimport { createDefaultUiKit } from \"./defaults/ui.js\";\nimport type { IconSet, NoticeSink, UiKit } from \"./ports.js\";\n\n/**\n * The authoring seam, kept separate from the reader context on purpose.\n *\n * A reader host wires nothing new to keep reading, and an authoring host adds\n * one provider. The two nest, so a builder rendered inside a reader still has\n * the reader's transport for its preview.\n */\nexport interface DashboardAuthoringContextValue {\n transport: AuthoringTransport;\n ui: UiKit;\n icons: IconSet;\n editor: CodeEditor;\n onNotice: NoticeSink;\n /** The dashboard every authoring call is scoped to. */\n dashboardId: string;\n /** False when the caller may look at the documents but not write them. */\n canEdit: boolean;\n}\n\nconst AuthoringContext = createContext<DashboardAuthoringContextValue | null>(\n null,\n);\n\nexport interface DashboardAuthoringProviderProps {\n transport: AuthoringTransport;\n /** Any subset of the kit; the built-in primitives fill the rest. */\n ui?: Partial<UiKit>;\n /** Any subset of the glyphs; the built-in SVGs fill the rest. */\n icons?: Partial<IconSet>;\n dashboardId: string;\n editor?: CodeEditor;\n onNotice?: NoticeSink;\n canEdit?: boolean;\n children: ReactNode;\n}\n\nexport function DashboardAuthoringProvider({\n transport,\n ui,\n icons,\n dashboardId,\n editor = PlainCodeEditor,\n onNotice = () => undefined,\n canEdit = true,\n children,\n}: DashboardAuthoringProviderProps) {\n const kit = useMemo(() => createDefaultUiKit(ui), [ui]);\n const glyphs = useMemo(() => mergeIcons(icons), [icons]);\n // Held steady for the same reason the reader holds its sink steady: authoring\n // effects watch the context, and a host arrow rebuilt each render would make\n // every load run again.\n const noticeRef = useRef<NoticeSink>(onNotice);\n noticeRef.current = onNotice;\n const notify = useCallback<NoticeSink>((notice) => {\n noticeRef.current(notice);\n }, []);\n\n const value = useMemo<DashboardAuthoringContextValue>(\n () => ({\n transport,\n ui: kit,\n icons: glyphs,\n editor,\n onNotice: notify,\n dashboardId,\n canEdit,\n }),\n [transport, kit, glyphs, editor, notify, dashboardId, canEdit],\n );\n return (\n <AuthoringContext.Provider value={value}>\n {children}\n </AuthoringContext.Provider>\n );\n}\n\nexport function useAuthoring(): DashboardAuthoringContextValue {\n const value = useContext(AuthoringContext);\n if (value === null) {\n throw new Error(\n \"Authoring components must be rendered inside DashboardAuthoringProvider.\",\n );\n }\n return value;\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { CSSProperties, ReactNode } from \"react\";\n\nimport { cn } from \"./cn.js\";\n\nexport interface AutoFitTextProps {\n children: ReactNode;\n className?: string;\n max?: number;\n min?: number;\n style?: CSSProperties;\n}\n\n/**\n * Shrinks a single line until it fits its box. KPI values are unpredictable in\n * length and the card must not clip the number it exists to show.\n */\nexport function AutoFitText({\n children,\n className,\n max = 48,\n min = 12,\n style,\n}: AutoFitTextProps) {\n const boxRef = useRef<HTMLDivElement | null>(null);\n const textRef = useRef<HTMLSpanElement | null>(null);\n const [size, setSize] = useState(max);\n\n useEffect(() => {\n const box = boxRef.current;\n const text = textRef.current;\n if (box === null || text === null) return;\n const fit = () => {\n let next = max;\n text.style.fontSize = `${next}px`;\n // A short card is as much of a clip as a narrow one, so the line is\n // measured against both, and the height only when the box has one.\n const tooTall = () =>\n box.clientHeight > 0 && text.scrollHeight > box.clientHeight;\n while (next > min && (text.scrollWidth > box.clientWidth || tooTall())) {\n next -= 1;\n text.style.fontSize = `${next}px`;\n }\n setSize(next);\n };\n fit();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(fit);\n observer.observe(box);\n return () => {\n observer.disconnect();\n };\n }, [children, max, min]);\n\n return (\n <div\n ref={boxRef}\n className={cn(\"bideux-autofit w-full overflow-hidden\", className)}\n // A host with no utility CSS still has to hold the line inside the box,\n // otherwise the number it is being fitted to spills over the card.\n style={{\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n overflow: \"hidden\",\n ...style,\n }}\n >\n <span\n ref={textRef}\n className=\"block whitespace-nowrap\"\n style={{ fontSize: `${size}px`, lineHeight: 1.1 }}\n >\n {children}\n </span>\n </div>\n );\n}\n","import { createContext, useCallback, useContext, useMemo, useRef } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { mergeIcons } from \"./defaults/icons.js\";\nimport { createDefaultUiKit } from \"./defaults/ui.js\";\nimport type {\n AssetResolver,\n DashboardTransport,\n HostLinkProps,\n HostLinks,\n IconSet,\n NoticeSink,\n RendererFactories,\n UiKit,\n} from \"./ports.js\";\n\nexport interface DashboardReaderContextValue {\n transport: DashboardTransport;\n ui: UiKit;\n icons: IconSet;\n assets: AssetResolver;\n links: HostLinks;\n renderers: RendererFactories;\n onNotice: NoticeSink;\n /** Capture mode drops hover chrome so exporters photograph a clean canvas. */\n capture: boolean;\n embedded: boolean;\n reducedMotion: boolean;\n}\n\nconst ReaderContext = createContext<DashboardReaderContextValue | null>(null);\n\nexport interface DashboardReaderProviderProps {\n transport: DashboardTransport;\n /** Any subset of the kit; the built-in primitives fill the rest. */\n ui?: Partial<UiKit>;\n /** Any subset of the glyphs; the built-in SVGs fill the rest. */\n icons?: Partial<IconSet>;\n assets?: AssetResolver;\n links?: HostLinks;\n renderers?: RendererFactories;\n onNotice?: NoticeSink;\n capture?: boolean;\n embedded?: boolean;\n reducedMotion?: boolean;\n children: ReactNode;\n}\n\nconst passthroughAssets: AssetResolver = { resolve: (reference) => reference };\n\nfunction PlainLink({\n href,\n children,\n className,\n target,\n onNavigate,\n}: HostLinkProps) {\n return (\n <a\n href={href}\n className={className}\n target={target}\n onClick={onNavigate}\n rel={target === \"_blank\" ? \"noreferrer\" : undefined}\n >\n {children}\n </a>\n );\n}\n\nconst plainLinks: HostLinks = { Link: PlainLink };\n\nexport function DashboardReaderProvider({\n transport,\n ui,\n icons,\n assets = passthroughAssets,\n links = plainLinks,\n renderers = {},\n onNotice = () => undefined,\n capture = false,\n embedded = false,\n reducedMotion = false,\n children,\n}: DashboardReaderProviderProps) {\n const kit = useMemo(() => createDefaultUiKit(ui), [ui]);\n const glyphs = useMemo(() => mergeIcons(icons), [icons]);\n // A host may pass a fresh arrow for the notice sink on every render. The\n // reader watches the sink in its effects, so it is held steady here and read\n // through a ref, and the whole value is memoised for the same reason.\n const noticeRef = useRef<NoticeSink>(onNotice);\n noticeRef.current = onNotice;\n const notify = useCallback<NoticeSink>((notice) => {\n noticeRef.current(notice);\n }, []);\n\n const value = useMemo<DashboardReaderContextValue>(\n () => ({\n transport,\n ui: kit,\n icons: glyphs,\n assets,\n links,\n renderers,\n onNotice: notify,\n capture,\n embedded,\n reducedMotion,\n }),\n [\n transport,\n kit,\n glyphs,\n assets,\n links,\n renderers,\n notify,\n capture,\n embedded,\n reducedMotion,\n ],\n );\n return (\n <ReaderContext.Provider value={value}>{children}</ReaderContext.Provider>\n );\n}\n\nexport function useDashboardReader(): DashboardReaderContextValue {\n const value = useContext(ReaderContext);\n if (value === null) {\n throw new Error(\n \"Dashboard reader components must be rendered inside DashboardReaderProvider.\",\n );\n }\n return value;\n}\n\nexport function useUiKit(): UiKit {\n return useDashboardReader().ui;\n}\n\nexport function useIcons(): IconSet {\n return useDashboardReader().icons;\n}\n","import { cn } from \"./cn.js\";\nimport { useDashboardReader, useIcons } from \"./context.js\";\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n}\n\nexport interface DashboardBreadcrumbProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\n/** Where the reader is, as links the host renders. */\nexport function DashboardBreadcrumb({\n items,\n className,\n}: DashboardBreadcrumbProps) {\n const { links } = useDashboardReader();\n const icons = useIcons();\n if (items.length === 0) return null;\n const Link = links.Link;\n return (\n <nav\n aria-label=\"Breadcrumb\"\n className={cn(\n \"flex items-center gap-1 text-sm text-muted-foreground\",\n className,\n )}\n >\n {items.map((item, index) => (\n <span\n key={`${item.label}-${index}`}\n className=\"flex items-center gap-1\"\n >\n {index > 0 && <icons.chevronRight className=\"h-3 w-3\" />}\n {item.href === undefined ? (\n <span\n className={index === items.length - 1 ? \"text-foreground\" : \"\"}\n aria-current={index === items.length - 1 ? \"page\" : undefined}\n >\n {item.label}\n </span>\n ) : (\n <Link href={item.href}>{item.label}</Link>\n )}\n </span>\n ))}\n </nav>\n );\n}\n","import { useState } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport type { WidgetColumn } from \"@dlh.io/bideux-dashboard-core\";\n\nimport { useAuthoring } from \"./authoring-context.js\";\nimport { cn } from \"./cn.js\";\n\n/** Value a mapping dropdown uses for \"leave this unset\". */\nexport const UNSET = \"__unset__\";\n\n/** The question mark beside a label, for wording that is not self-evident. */\nexport function Info({ text }: { text: string }) {\n const { ui, icons } = useAuthoring();\n const Help = icons.help;\n return (\n <ui.Tooltip label={text}>\n <span\n aria-label={text}\n role=\"img\"\n className=\"text-muted-foreground/70 hover:text-foreground\"\n >\n <Help className=\"h-3.5 w-3.5\" title={text} />\n </span>\n </ui.Tooltip>\n );\n}\n\n/** A small heading with its own explanation on hover. */\nexport function FieldLabel({\n text,\n help,\n}: {\n text: string;\n help?: string | undefined;\n}) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-xs text-muted-foreground\">{text}</span>\n {help ? <Info text={help} /> : null}\n </div>\n );\n}\n\n/** A text field that types like a text field and saves when you leave it. */\nexport function TextField({\n label,\n value,\n placeholder,\n hint,\n help,\n mono,\n readOnly,\n onCommit,\n}: {\n label: string;\n value: string;\n placeholder: string;\n hint?: string | undefined;\n help?: string | undefined;\n mono?: boolean | undefined;\n readOnly: boolean;\n onCommit: (value: string) => void;\n}) {\n const { ui } = useAuthoring();\n const [draft, setDraft] = useState(value);\n const [focused, setFocused] = useState(false);\n // While the field is not being typed in, it follows the document, which is\n // what keeps builder and YAML showing the same thing.\n const shown = focused ? draft : value;\n\n return (\n <div className=\"space-y-1\">\n <FieldLabel text={label} help={help} />\n <div\n onFocus={() => {\n setDraft(value);\n setFocused(true);\n }}\n onBlur={() => {\n setFocused(false);\n if (draft !== value) onCommit(draft);\n }}\n >\n <ui.TextInput\n value={shown}\n ariaLabel={label}\n placeholder={placeholder}\n disabled={readOnly}\n className={cn(mono ? \"font-mono text-[13px]\" : \"\")}\n onChange={setDraft}\n onCommit={() => {\n setFocused(false);\n if (draft !== value) onCommit(draft);\n }}\n />\n </div>\n {hint ? (\n <p className=\"text-[11px] text-muted-foreground\">{hint}</p>\n ) : null}\n </div>\n );\n}\n\n/** An on/off setting, with its own explanation on hover. */\nexport function ToggleField({\n label,\n help,\n hint,\n checked,\n readOnly,\n onToggle,\n}: {\n label: string;\n help?: string | undefined;\n hint?: string | undefined;\n checked: boolean;\n readOnly: boolean;\n onToggle: (checked: boolean) => void;\n}) {\n const { ui } = useAuthoring();\n return (\n <div className=\"flex items-start justify-between gap-3 rounded-md border px-3 py-2\">\n <div className=\"min-w-0 space-y-0.5\">\n <FieldLabel text={label} help={help} />\n {hint ? (\n <p className=\"text-[11px] text-muted-foreground\">{hint}</p>\n ) : null}\n </div>\n <ui.Checkbox\n checked={checked}\n disabled={readOnly}\n label={label}\n onChange={onToggle}\n />\n </div>\n );\n}\n\n/** A whole number field that keeps an empty box meaning \"the default\". */\nexport function NumberField({\n label,\n value,\n placeholder,\n hint,\n help,\n min,\n max,\n readOnly,\n onCommit,\n}: {\n label: string;\n value: number | null;\n placeholder: string;\n hint?: string | undefined;\n help?: string | undefined;\n min: number;\n max: number;\n readOnly: boolean;\n onCommit: (value: number | null) => void;\n}) {\n return (\n <TextField\n label={label}\n value={value === null ? \"\" : String(value)}\n placeholder={placeholder}\n hint={hint}\n help={help}\n readOnly={readOnly}\n onCommit={(text) => {\n const trimmed = text.trim();\n if (trimmed === \"\") {\n onCommit(null);\n return;\n }\n const parsed = Number(trimmed);\n if (!Number.isFinite(parsed)) return;\n onCommit(Math.min(max, Math.max(min, Math.trunc(parsed))));\n }}\n />\n );\n}\n\n/** A dropdown that is always ready to use, with no click-to-edit step. */\nexport function ChoiceField({\n label,\n value,\n options,\n placeholder,\n hint,\n help,\n readOnly,\n onPick,\n}: {\n label: string;\n value: string | null;\n options: { value: string; label: string }[];\n placeholder: string;\n hint?: string | undefined;\n help?: string | undefined;\n readOnly: boolean;\n onPick: (value: string) => void;\n}) {\n const { ui } = useAuthoring();\n return (\n <div className=\"space-y-1\">\n <FieldLabel text={label} help={help} />\n <ui.Select\n value={value ?? \"\"}\n options={options}\n ariaLabel={label}\n placeholder={placeholder}\n disabled={readOnly}\n onChange={onPick}\n />\n {hint ? (\n <p className=\"text-[11px] text-muted-foreground\">{hint}</p>\n ) : null}\n </div>\n );\n}\n\n/** A row of choices that commits on one click, with no edit mode in between. */\nexport function PickList<T extends string>({\n options,\n value,\n readOnly,\n columns = 2,\n onPick,\n}: {\n options: { id: T; label: string; blurb?: string | undefined }[];\n value: T | null;\n readOnly: boolean;\n columns?: number;\n onPick: (id: T) => void;\n}) {\n return (\n <div\n className={cn(\n \"grid gap-2\",\n columns === 2 ? \"sm:grid-cols-2\" : \"sm:grid-cols-3\",\n )}\n >\n {options.map((option) => (\n <button\n key={option.id}\n type=\"button\"\n disabled={readOnly}\n aria-pressed={option.id === value}\n onClick={() => {\n onPick(option.id);\n }}\n className={cn(\n \"flex items-start justify-between gap-2 rounded-md border px-3 py-2 text-left text-sm\",\n option.id === value\n ? \"border-primary ring-1 ring-primary/40\"\n : \"hover:border-input hover:bg-muted/50\",\n readOnly ? \"cursor-default opacity-60\" : \"\",\n )}\n >\n <span className=\"min-w-0\">\n <span className=\"block truncate\">{option.label}</span>\n {option.blurb ? (\n <span className=\"block truncate text-xs text-muted-foreground\">\n {option.blurb}\n </span>\n ) : null}\n </span>\n </button>\n ))}\n </div>\n );\n}\n\nexport function ColumnPicker({\n title,\n empty,\n help,\n columns,\n selected,\n readOnly,\n onToggle,\n}: {\n title: string;\n empty: string;\n help?: string | undefined;\n columns: WidgetColumn[];\n selected: string[];\n readOnly: boolean;\n onToggle: (key: string, checked: boolean) => void;\n}) {\n const { ui } = useAuthoring();\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n {title}\n </span>\n {help ? <Info text={help} /> : null}\n </div>\n {columns.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">{empty}</p>\n ) : (\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {columns.map((column) => (\n <div\n key={column.key}\n title={column.key}\n className={cn(\n \"flex items-center gap-2 rounded-md border px-2.5 py-1.5 text-sm\",\n selected.includes(column.key)\n ? \"border-primary/50 bg-primary/5\"\n : \"hover:border-input hover:bg-muted/50\",\n readOnly ? \"opacity-60\" : \"\",\n )}\n >\n <ui.Checkbox\n checked={selected.includes(column.key)}\n disabled={readOnly}\n label={\n <span className=\"flex items-center gap-1.5\">\n <span className=\"truncate\">{column.label}</span>\n {column.joined ? (\n <ui.Badge tone=\"neutral\">joins</ui.Badge>\n ) : null}\n </span>\n }\n onChange={(checked) => {\n onToggle(column.key, checked);\n }}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/** The YAML a builder panel produces, so the format is learned, not hidden. */\nexport function BuilderYamlStrip({ fragment }: { fragment: string }) {\n const [open, setOpen] = useState(false);\n if (!fragment) return null;\n return (\n <div className=\"rounded-md border bg-muted/40\">\n <button\n type=\"button\"\n className=\"w-full px-3 py-2 text-left text-xs font-medium text-muted-foreground hover:text-foreground\"\n onClick={() => {\n setOpen((current) => !current);\n }}\n >\n {open ? \"Hide\" : \"Show\"} the YAML this writes\n </button>\n {open ? (\n <pre className=\"overflow-auto border-t px-3 py-2 text-[11px] leading-relaxed\">\n {fragment}\n </pre>\n ) : null}\n </div>\n );\n}\n\n/** Keys the builder has no editor for, named rather than silently dropped. */\nexport function PreservedKeysNote({\n keys,\n blocking,\n}: {\n keys: string[];\n blocking?: boolean | undefined;\n}) {\n if (keys.length === 0) return null;\n return (\n <p className=\"rounded-md border border-amber-300 bg-amber-50 px-3 py-2 text-[11px] text-amber-900\">\n {blocking\n ? `This is shown read-only because the builder has no editor for ${keys.join(\", \")}. Edit it in the YAML tab.`\n : `Kept as written, because the builder has no editor for ${keys.join(\", \")}.`}\n </p>\n );\n}\n\nexport function StepFrame({\n anchor,\n number,\n title,\n blurb,\n help,\n done,\n children,\n}: {\n anchor: string;\n number: number;\n title: string;\n blurb?: string | undefined;\n help?: string | undefined;\n done?: boolean | undefined;\n children: ReactNode;\n}) {\n return (\n // scroll-mt clears the sticky strip, which would otherwise cover the\n // header of whichever step the strip scrolls to.\n <section\n id={anchor}\n aria-label={title}\n className=\"scroll-mt-28 rounded-lg border shadow-sm\"\n >\n <header className=\"flex items-start gap-3 rounded-t-lg border-b bg-muted/30 px-4 py-3\">\n <span\n className={cn(\n \"flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-medium\",\n done\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted text-muted-foreground\",\n )}\n >\n {number}\n </span>\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-sm font-medium\">{title}</span>\n {help ? <Info text={help} /> : null}\n </div>\n {blurb ? (\n <p className=\"text-xs text-muted-foreground\">{blurb}</p>\n ) : null}\n </div>\n </header>\n <div className=\"space-y-4 p-4\">{children}</div>\n </section>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport type { ReactNode } from \"react\";\n\nexport interface DashboardFiltersValue {\n filters: Record<string, unknown>;\n setFilter: (id: string, value: unknown) => void;\n /**\n * What each control is showing for its current value, keyed by filter id. A\n * location filter sends a key and displays a name, and written content that\n * echoes the selection needs the name.\n */\n labels: Record<string, string>;\n setFilterLabel: (id: string, label: string) => void;\n clearFilters: () => void;\n}\n\nconst FiltersContext = createContext<DashboardFiltersValue>({\n filters: {},\n setFilter: () => undefined,\n labels: {},\n setFilterLabel: () => undefined,\n clearFilters: () => undefined,\n});\n\nexport interface DashboardFiltersProviderProps {\n children: ReactNode;\n filters?: Record<string, unknown>;\n setFilter?: (id: string, value: unknown) => void;\n onFilterChange?: (id: string, value: unknown) => void;\n initialFilters?: Record<string, unknown>;\n}\n\nexport function DashboardFiltersProvider({\n children,\n filters: controlledFilters,\n setFilter: controlledSetFilter,\n onFilterChange,\n initialFilters = {},\n}: DashboardFiltersProviderProps) {\n const [internalFilters, setInternalFilters] =\n useState<Record<string, unknown>>(initialFilters);\n const [labels, setLabels] = useState<Record<string, string>>({});\n\n const setFilterLabel = useCallback((id: string, label: string) => {\n setLabels((previous) =>\n previous[id] === label ? previous : { ...previous, [id]: label },\n );\n }, []);\n\n const filters = controlledFilters ?? internalFilters;\n const setFilter = useMemo(\n () =>\n controlledSetFilter ??\n ((id: string, value: unknown) => {\n setInternalFilters((previous) => ({ ...previous, [id]: value }));\n }),\n [controlledSetFilter],\n );\n\n const value = useMemo<DashboardFiltersValue>(\n () => ({\n filters,\n setFilter: (id, next) => {\n setFilter(id, next);\n onFilterChange?.(id, next);\n },\n labels,\n setFilterLabel,\n clearFilters: () => {\n for (const id of Object.keys(filters)) {\n setFilter(id, undefined);\n onFilterChange?.(id, undefined);\n }\n },\n }),\n [filters, setFilter, onFilterChange, labels, setFilterLabel],\n );\n\n return (\n <FiltersContext.Provider value={value}>{children}</FiltersContext.Provider>\n );\n}\n\nexport function useDashboardFilters(): DashboardFiltersValue {\n return useContext(FiltersContext);\n}\n","import { useState } from \"react\";\nimport type { CSSProperties } from \"react\";\n\nimport {\n cellText,\n formatTableCsv,\n resultColumns,\n resultRows,\n} from \"@dlh.io/bideux-dashboard-renderers\";\nimport type {\n WidgetResult,\n WidgetSpec,\n} from \"@dlh.io/bideux-dashboard-renderers\";\nimport { formatFilterValue } from \"@dlh.io/bideux-dashboard-core\";\n\nimport { cn } from \"./cn.js\";\nimport { useDashboardReader, useIcons, useUiKit } from \"./context.js\";\nimport { useDashboardFilters } from \"./filters-context.js\";\n\nconst DATA_COMPONENTS = new Set([\n \"echarts\",\n \"kpi\",\n \"table\",\n \"tabulator\",\n \"pivot_table\",\n]);\n\nconst PREVIEW_ROWS = 200;\n\nconst ACTIONS_LAYOUT: CSSProperties = {\n position: \"absolute\",\n right: 4,\n top: 4,\n zIndex: 20,\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n};\n\nexport interface WidgetActionsProps {\n widget: WidgetSpec;\n result?: WidgetResult;\n /** Filter widget id to its name, so an applied filter reads as its label. */\n filterNames?: Record<string, string>;\n /** Rerun this widget alone, through the host transport. */\n onRefresh?: () => void;\n className?: string;\n}\n\n/**\n * Reader actions on the card: what the query answered, that answer as a table,\n * and that table on the clipboard. Editing, asking and removing belong to the\n * builder and are absent here.\n */\nexport function WidgetActions({\n widget,\n result,\n filterNames,\n onRefresh,\n className,\n}: WidgetActionsProps) {\n const ui = useUiKit();\n const icons = useIcons();\n const reader = useDashboardReader();\n const { filters, labels } = useDashboardFilters();\n const [infoOpen, setInfoOpen] = useState(false);\n const [dataOpen, setDataOpen] = useState(false);\n\n const component = String(widget.spec.component ?? \"\");\n if (!DATA_COMPONENTS.has(component)) return null;\n if (typeof result?.error === \"string\") return null;\n if (reader.capture) return null;\n\n const rows = resultRows(result);\n const columns = resultColumns(result, rows);\n const hasTable = rows.length > 0 && columns.length > 0;\n if (!hasTable) return null;\n\n const applied = Object.entries(filters).filter(\n ([, value]) => value !== undefined && value !== null && value !== \"\",\n );\n\n const copy = () => {\n const csv = formatTableCsv({ columns, rows });\n const clipboard = globalThis.navigator?.clipboard;\n if (clipboard === undefined) {\n reader.onNotice({ tone: \"error\", message: \"Clipboard unavailable\" });\n return;\n }\n void clipboard.writeText(csv).then(\n () => {\n reader.onNotice({ tone: \"success\", message: \"Copied as CSV\" });\n },\n () => {\n reader.onNotice({ tone: \"error\", message: \"Copy failed\" });\n },\n );\n };\n\n return (\n <div\n data-html2canvas-ignore=\"true\"\n data-widget-actions={widget.metadata.id}\n className={cn(\n \"absolute right-1 top-1 z-20 flex items-center gap-0.5 transition-opacity print:hidden\",\n \"opacity-100 focus-within:opacity-100 md:opacity-0 md:group-hover/widget:opacity-100\",\n className,\n )}\n // The corner these actions sit in is part of the card's shape, not of a\n // host's stylesheet: in flow they would take the room the chart needs.\n style={ACTIONS_LAYOUT}\n >\n <ui.Popover\n open={infoOpen}\n onOpenChange={setInfoOpen}\n align=\"end\"\n trigger={\n <ui.Button\n variant=\"ghost\"\n size=\"sm\"\n ariaLabel=\"What this widget is showing\"\n title=\"What this widget is showing\"\n onClick={() => {\n setInfoOpen(!infoOpen);\n }}\n >\n <icons.info className=\"h-3.5 w-3.5\" />\n </ui.Button>\n }\n >\n <div className=\"w-72 text-xs\">\n <p className=\"font-medium\">{widget.metadata.name}</p>\n {typeof widget.metadata.description === \"string\" && (\n <p className=\"mt-1 text-muted-foreground\">\n {widget.metadata.description}\n </p>\n )}\n <p className=\"mt-2 text-muted-foreground\">\n {rows.length} row{rows.length === 1 ? \"\" : \"s\"}, {columns.length}{\" \"}\n column{columns.length === 1 ? \"\" : \"s\"}\n </p>\n <p className=\"mt-2 font-medium\">Filters applied</p>\n {applied.length === 0 ? (\n <p className=\"text-muted-foreground\">\n None, so this counts everything the query covers.\n </p>\n ) : (\n <ul className=\"mt-0.5 space-y-0.5 text-muted-foreground\">\n {applied.map(([id, value]) => (\n <li key={id} className=\"truncate\">\n {filterNames?.[id] ?? id}:{\" \"}\n {labels[id] ?? formatFilterValue(value)}\n </li>\n ))}\n </ul>\n )}\n </div>\n </ui.Popover>\n <ui.Menu\n ariaLabel=\"Widget actions\"\n items={[\n ...(onRefresh === undefined\n ? []\n : [\n {\n id: \"refresh\",\n label: \"Refresh\",\n icon: \"refresh\" as const,\n onSelect: onRefresh,\n },\n ]),\n {\n id: \"view\",\n label: \"View data\",\n icon: \"expand\",\n onSelect: () => {\n setDataOpen(true);\n },\n },\n {\n id: \"copy\",\n label: \"Copy as CSV\",\n icon: \"download\",\n onSelect: copy,\n },\n ]}\n trigger={\n <ui.Button variant=\"ghost\" size=\"sm\" ariaLabel=\"Widget actions\">\n <icons.more className=\"h-3.5 w-3.5\" />\n </ui.Button>\n }\n />\n <ui.Modal\n open={dataOpen}\n onOpenChange={setDataOpen}\n size=\"lg\"\n title={widget.metadata.name}\n description={\n rows.length > PREVIEW_ROWS\n ? `First ${PREVIEW_ROWS} of ${rows.length} rows behind this widget.`\n : `The ${rows.length} row${rows.length === 1 ? \"\" : \"s\"} behind this widget.`\n }\n >\n <div className=\"max-h-[60vh] overflow-auto rounded-md border\">\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr>\n {columns.map((column) => (\n <th\n key={column}\n scope=\"col\"\n className=\"whitespace-nowrap bg-muted/50 px-2 py-1 text-left\"\n >\n {column}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.slice(0, PREVIEW_ROWS).map((row, index) => (\n <tr key={index} className=\"border-b last:border-0\">\n {columns.map((column) => (\n <td key={column} className=\"whitespace-nowrap px-2 py-1\">\n {cellText(row[column])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </ui.Modal>\n </div>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport type StyleValue = string | number | boolean | null | undefined;\n\n/**\n * Build a style object from generated spec values.\n *\n * The generated document types carry `null` for an unset value and name their\n * property types loosely, so the values are narrowed here once rather than cast\n * at every call site.\n */\nexport function cssProps(values: Record<string, StyleValue>): CSSProperties {\n const style: Record<string, string | number> = {};\n for (const [key, value] of Object.entries(values)) {\n if (value === null || value === undefined || value === false) continue;\n if (value === true) continue;\n style[key] = value;\n }\n return style as CSSProperties;\n}\n\nexport function present<T>(value: T | null | undefined): T | undefined {\n return value === null ? undefined : value;\n}\n","import type { CSSProperties, ReactNode } from \"react\";\n\nimport type { LabelBlock } from \"@dlh.io/bideux-dashboard-spec\";\n\nimport { cn } from \"./cn.js\";\nimport { useIcons, useUiKit } from \"./context.js\";\nimport type { IconName } from \"./ports.js\";\n\nconst TOOLTIP_ICONS: Record<string, IconName> = {\n info: \"info\",\n check: \"check\",\n help: \"help\",\n warning: \"alert\",\n};\n\n/** A label with its text resolved, which the generated block leaves optional. */\nexport interface NormalizedLabel {\n text: string;\n icon?: string | undefined;\n tooltip?: string | undefined;\n position?: string | undefined;\n}\n\nexport function normalizeLabel(\n label: string | LabelBlock | NormalizedLabel | null | undefined,\n fallback?: string,\n): NormalizedLabel | undefined {\n if (label === undefined || label === null || label === \"\") {\n return fallback === undefined ? undefined : { text: fallback };\n }\n if (typeof label === \"string\") return { text: label };\n const text = label.text ?? fallback;\n if (text === null || text === undefined || text === \"\") return undefined;\n return {\n text,\n icon: label.icon ?? undefined,\n tooltip: label.tooltip ?? undefined,\n position: label.position ?? undefined,\n };\n}\n\nexport interface WidgetLabelProps {\n label?: string | LabelBlock | NormalizedLabel | null;\n fallback?: string;\n className?: string;\n style?: CSSProperties;\n actions?: ReactNode;\n}\n\nexport function WidgetLabel({\n label,\n fallback,\n className,\n style,\n actions,\n}: WidgetLabelProps) {\n const ui = useUiKit();\n const icons = useIcons();\n const block = normalizeLabel(label, fallback);\n if (block === undefined || block.text === \"\") return null;\n const iconName =\n block.icon === undefined ? undefined : TOOLTIP_ICONS[block.icon];\n const Icon = iconName === undefined ? null : icons[iconName];\n return (\n <div\n className={cn(\n \"bideux-widget-label flex items-center gap-1 truncate text-sm text-muted-foreground\",\n className,\n )}\n style={style}\n >\n <span className=\"truncate\" title={block.text}>\n {block.text}\n </span>\n {Icon !== null && block.tooltip !== undefined && block.tooltip !== \"\" && (\n <ui.Tooltip label={block.tooltip} side=\"bottom\">\n <span className=\"inline-flex shrink-0 cursor-help\">\n <Icon className=\"h-3.5 w-3.5 opacity-60\" title={block.tooltip} />\n </span>\n </ui.Tooltip>\n )}\n {actions}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport type { WidgetSpec } from \"@dlh.io/bideux-dashboard-spec\";\n\nimport { cn } from \"./cn.js\";\nimport { cssProps } from \"./style.js\";\nimport { normalizeLabel, WidgetLabel } from \"./widget-label.js\";\n\nexport interface WidgetHeaderProps {\n widget: WidgetSpec;\n className?: string;\n actions?: ReactNode;\n}\n\nexport function WidgetHeader({\n widget,\n className,\n actions,\n}: WidgetHeaderProps) {\n const header = widget.metadata.header;\n if (header === undefined || header === null || header.visible === false) {\n return null;\n }\n const titleBlock = normalizeLabel(header.title, widget.metadata.name);\n if (titleBlock === undefined || titleBlock.text === undefined) return null;\n\n const style = cssProps({\n padding: header.padding,\n color: header.color,\n backgroundColor: header.backgroundColor,\n textAlign: header.textAlign,\n fontSize: header.fontSize,\n fontWeight: header.fontWeight,\n borderRadius: header.borderRadius,\n border: header.border === true ? \"1px solid currentColor\" : header.border,\n });\n\n const alignClass =\n header.verticalAlign === \"middle\"\n ? \"items-center\"\n : header.verticalAlign === \"bottom\"\n ? \"items-end\"\n : \"items-start\";\n\n return (\n <div\n className={cn(\n \"bideux-widget-header flex min-h-0 shrink-0 items-center justify-between gap-2 text-sm font-semibold\",\n alignClass,\n className,\n )}\n style={style}\n data-widget-header={widget.metadata.id}\n >\n <WidgetLabel label={titleBlock} className=\"text-inherit\" />\n {actions !== undefined && actions !== null && (\n <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>\n )}\n </div>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\n\nimport {\n buildFilterModel,\n describeFilter,\n isIsoDate,\n isRelativeDateExpression,\n} from \"@dlh.io/bideux-dashboard-renderers\";\nimport type {\n FilterModel,\n FilterOption,\n WidgetResult,\n WidgetSpec,\n} from \"@dlh.io/bideux-dashboard-renderers\";\n\nimport { cn } from \"./cn.js\";\nimport { useIcons, useUiKit } from \"./context.js\";\nimport { WidgetHeader } from \"./widget-header.js\";\n\nexport interface FilterWidgetProps {\n widget: WidgetSpec;\n result?: WidgetResult;\n value?: unknown;\n onChange: (widgetId: string, value: unknown, label: string) => void;\n /**\n * Receives the human readable summary of the value currently shown,\n * including the default before anyone touches the control, so a heading\n * that reads `{{filter:...}}` says \"All\" or \"last 90 days\" from the first\n * paint rather than after the first change.\n */\n onLabel?: (widgetId: string, label: string) => void;\n className?: string;\n disabled?: boolean;\n}\n\nfunction optionValue(options: FilterOption[], raw: string): unknown {\n return options.find((option) => String(option.value) === raw)?.value ?? raw;\n}\n\ninterface DateRangeValue {\n start: string;\n end: string;\n}\n\nfunction range(value: unknown): DateRangeValue {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n const record = value as Record<string, unknown>;\n return {\n start: typeof record.start === \"string\" ? record.start : \"\",\n end: typeof record.end === \"string\" ? record.end : \"\",\n };\n }\n return { start: \"\", end: \"\" };\n}\n\nfunction chosenKeys(value: unknown): string[] {\n if (Array.isArray(value)) return value.map(String);\n if (value === \"\" || value === null || value === undefined) return [];\n return [String(value)];\n}\n\ninterface ControlProps {\n model: FilterModel;\n current: unknown;\n disabled: boolean | undefined;\n emit: (next: unknown) => void;\n}\n\nfunction MultiSelectControl({ model, current, disabled, emit }: ControlProps) {\n const ui = useUiKit();\n const icons = useIcons();\n const Chevron = icons.chevronDown;\n const Check = icons.check;\n const [open, setOpen] = useState(false);\n const chosen = chosenKeys(current);\n const toggle = (raw: string) => {\n const next = chosen.includes(raw)\n ? chosen.filter((entry) => entry !== raw)\n : [...chosen, raw];\n emit(\n model.options\n .filter((option) => next.includes(String(option.value)))\n .map((option) => option.value),\n );\n };\n const summary =\n chosen.length === 0\n ? (model.placeholder ?? \"All\")\n : describeFilter(\n model.options\n .filter((option) => chosen.includes(String(option.value)))\n .map((option) => option.value),\n model.options,\n );\n return (\n <ui.Popover\n open={open}\n onOpenChange={setOpen}\n align=\"start\"\n className=\"w-64 p-2\"\n trigger={\n <ui.Button\n variant=\"secondary\"\n className=\"w-full justify-between font-normal\"\n ariaLabel={model.label}\n {...(disabled === undefined ? {} : { disabled })}\n onClick={() => {\n setOpen(!open);\n }}\n >\n <span className=\"truncate\">{summary}</span>\n <Chevron className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\n </ui.Button>\n }\n >\n <div className=\"flex items-center justify-between px-1 pb-2\">\n <span className=\"text-xs text-muted-foreground\">\n {chosen.length === 0 ? \"Everything\" : `${chosen.length} selected`}\n </span>\n {chosen.length > 0 && (\n <ui.Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-xs\"\n onClick={() => {\n emit([]);\n }}\n >\n Clear\n </ui.Button>\n )}\n </div>\n <div\n role=\"listbox\"\n aria-multiselectable=\"true\"\n aria-label={model.label}\n className=\"max-h-64 space-y-1 overflow-auto\"\n >\n {model.options.map((option) => {\n const raw = String(option.value);\n const selected = chosen.includes(raw);\n return (\n <button\n key={raw}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n disabled={disabled}\n onClick={() => {\n toggle(raw);\n }}\n className=\"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-accent\"\n >\n <Check\n className={cn(\n \"h-4 w-4 shrink-0\",\n selected ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n <span className=\"truncate\">{option.label}</span>\n </button>\n );\n })}\n </div>\n </ui.Popover>\n );\n}\n\ninterface DateControlProps extends ControlProps {\n mode: \"single\" | \"range\";\n}\n\n/**\n * A date filter takes a calendar date, a relative expression such as\n * `last 30 days`, or a preset. The native date input is the calendar; hosts\n * without one still get the typed path, which is what an expression needs.\n */\nfunction DateControl({\n model,\n current,\n disabled,\n emit,\n mode,\n}: DateControlProps) {\n const ui = useUiKit();\n const icons = useIcons();\n const CalendarIcon = icons.calendar;\n const [pickerOpen, setPickerOpen] = useState(false);\n const displayed = useMemo(() => {\n if (typeof current === \"string\") return current;\n const { start, end } = range(current);\n if (start !== \"\" && end !== \"\" && start !== end)\n return `${start} to ${end}`;\n return start;\n }, [current]);\n const [draft, setDraft] = useState(displayed);\n useEffect(() => {\n setDraft(displayed);\n }, [displayed]);\n\n const commit = (text: string) => {\n const trimmed = text.trim();\n if (trimmed === \"\") {\n emit(\"\");\n return;\n }\n if (mode === \"range\") {\n const parts = trimmed.split(/\\s+to\\s+/i);\n if (\n parts.length === 2 &&\n isIsoDate(parts[0] ?? \"\") &&\n isIsoDate(parts[1] ?? \"\")\n ) {\n emit({ start: parts[0], end: parts[1] });\n return;\n }\n }\n if (isIsoDate(trimmed) || isRelativeDateExpression(trimmed)) {\n emit(trimmed);\n }\n };\n\n const valid =\n draft.trim() === \"\" ||\n isIsoDate(draft.trim()) ||\n isRelativeDateExpression(draft) ||\n (mode === \"range\" &&\n draft.split(/\\s+to\\s+/i).every((part) => isIsoDate(part.trim())));\n\n const rangeValue = range(current);\n const picker =\n mode === \"range\" ? (\n <div className=\"grid grid-cols-2 gap-2\">\n <ui.TextInput\n type=\"date\"\n ariaLabel={`${model.label} start`}\n {...(disabled === undefined ? {} : { disabled })}\n value={rangeValue.start}\n onChange={(next) => {\n emit({ ...rangeValue, start: next });\n }}\n />\n <ui.TextInput\n type=\"date\"\n ariaLabel={`${model.label} end`}\n {...(disabled === undefined ? {} : { disabled })}\n value={rangeValue.end}\n onChange={(next) => {\n const nextRange = { ...rangeValue, end: next };\n emit(nextRange);\n if (nextRange.start !== \"\" && next !== \"\") setPickerOpen(false);\n }}\n />\n </div>\n ) : (\n <ui.TextInput\n type=\"date\"\n ariaLabel={`${model.label} calendar`}\n {...(disabled === undefined ? {} : { disabled })}\n value={typeof current === \"string\" && isIsoDate(current) ? current : \"\"}\n onChange={(next) => {\n emit(next);\n if (next !== \"\") setPickerOpen(false);\n }}\n />\n );\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center gap-2\">\n <ui.TextInput\n type=\"text\"\n ariaLabel={model.label}\n className={cn(\"flex-1\", !valid && \"border-destructive\")}\n {...(disabled === undefined ? {} : { disabled })}\n placeholder={\n model.placeholder ??\n (mode === \"range\"\n ? \"YYYY-MM-DD to YYYY-MM-DD\"\n : \"YYYY-MM-DD or expression\")\n }\n value={draft}\n onChange={setDraft}\n onCommit={() => {\n commit(draft);\n }}\n />\n {model.showIcon && (\n <ui.Popover\n open={pickerOpen}\n onOpenChange={setPickerOpen}\n align=\"center\"\n className=\"p-2\"\n trigger={\n <ui.Button\n variant=\"secondary\"\n size=\"sm\"\n className=\"h-9 w-9 shrink-0 px-0\"\n ariaLabel=\"Open calendar\"\n {...(disabled === undefined ? {} : { disabled })}\n onClick={() => {\n setPickerOpen(!pickerOpen);\n }}\n >\n <CalendarIcon className=\"h-4 w-4\" />\n </ui.Button>\n }\n >\n {picker}\n </ui.Popover>\n )}\n </div>\n {model.presets.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {model.presets.map((preset) => (\n <ui.Button\n key={preset}\n variant=\"secondary\"\n size=\"sm\"\n {...(disabled === undefined ? {} : { disabled })}\n onClick={() => {\n emit(preset);\n }}\n >\n {preset}\n </ui.Button>\n ))}\n </div>\n )}\n {!model.showIcon && (\n <div className=\"w-fit rounded-md border p-2\">{picker}</div>\n )}\n </div>\n );\n}\n\n/**\n * One filter control, driven by the dashboard filter state rather than by any\n * store of its own. Every change leaves through onChange with the label the\n * filter bar shows, exactly as the frozen reader does.\n */\nexport function FilterWidget({\n widget,\n result = {},\n value,\n onChange,\n onLabel,\n className,\n disabled,\n}: FilterWidgetProps) {\n const ui = useUiKit();\n const model = useMemo(\n () => buildFilterModel(widget, result),\n [widget, result],\n );\n const current = value ?? model.defaultValue;\n const controlId = `${model.widgetId}-control`;\n const currentLabel = describeFilter(current, model.options);\n useEffect(() => {\n onLabel?.(model.widgetId, currentLabel);\n }, [onLabel, model.widgetId, currentLabel]);\n\n const emit = (next: unknown) => {\n onChange(model.widgetId, next, describeFilter(next, model.options));\n };\n\n const selected = chosenKeys(current);\n const controlProps: ControlProps = { model, current, disabled, emit };\n const label = model.showObjectHeader ? null : (\n <label\n htmlFor={controlId}\n className={cn(\n \"text-xs font-medium text-muted-foreground\",\n model.labelPosition === \"bottom\" ? \"mt-1\" : \"mb-1\",\n )}\n >\n {model.label}\n </label>\n );\n\n return (\n <div\n className={cn(\n \"bideux-filter flex w-full flex-col justify-center\",\n className,\n )}\n data-filter-widget={model.widgetId}\n data-filter-control={model.control}\n >\n {model.showObjectHeader && (\n <WidgetHeader widget={widget} className=\"mb-1\" />\n )}\n {model.labelPosition === \"top\" && label}\n {model.control === \"select\" && (\n <ui.Select\n value={selected[0] ?? \"\"}\n ariaLabel={model.label}\n {...(disabled === undefined ? {} : { disabled })}\n placeholder={model.placeholder ?? \"Select...\"}\n options={model.options.map((option) => ({\n value: String(option.value),\n label: option.label,\n }))}\n onChange={(next) => {\n emit(optionValue(model.options, next));\n }}\n />\n )}\n {model.control === \"multiselect\" && (\n <MultiSelectControl {...controlProps} />\n )}\n {model.control === \"radio\" && (\n <div\n id={controlId}\n role=\"radiogroup\"\n aria-label={model.label}\n className={cn(\n \"flex\",\n model.radioOrientation === \"horizontal\"\n ? \"flex-row flex-wrap gap-4\"\n : \"flex-col gap-2\",\n )}\n >\n {model.options.map((option) => (\n <label\n key={String(option.value)}\n className=\"flex items-center gap-2 text-sm\"\n >\n <input\n type=\"radio\"\n name={`${model.widgetId}-radio`}\n value={String(option.value)}\n disabled={disabled}\n checked={String(option.value) === String(current ?? \"\")}\n onChange={() => {\n emit(option.value);\n }}\n />\n {option.label}\n </label>\n ))}\n </div>\n )}\n {model.control === \"date\" && (\n <DateControl {...controlProps} mode=\"single\" />\n )}\n {model.control === \"date_range\" && (\n <DateControl {...controlProps} mode=\"range\" />\n )}\n {model.control === \"input\" && (\n <ui.TextInput\n type=\"search\"\n ariaLabel={model.label}\n {...(disabled === undefined ? {} : { disabled })}\n placeholder={model.placeholder ?? \"Enter a value\"}\n value={\n current === null || current === undefined ? \"\" : String(current)\n }\n onChange={(next) => {\n emit(next);\n }}\n />\n )}\n {model.labelPosition === \"bottom\" && label}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nimport { useDashboardReader } from \"./context.js\";\n\n/**\n * Ease a KPI number from its previous value to the new one.\n *\n * A card that snaps from 12,400 to 9,100 gives no sign that anything happened,\n * which matters most on the widget people look at first. The first value and\n * any non-finite value land immediately, and the whole thing is skipped when\n * the host asked for reduced motion or is capturing a still image.\n */\nexport function useCountUp(\n target: number | undefined,\n duration = 600,\n): number | undefined {\n const reader = useDashboardReader();\n const reduced = reader.reducedMotion || reader.capture;\n const [value, setValue] = useState<number | undefined>(target);\n const currentRef = useRef<number | undefined>(target);\n\n useEffect(() => {\n const finiteTarget =\n typeof target === \"number\" && Number.isFinite(target)\n ? target\n : undefined;\n const from = currentRef.current;\n if (\n finiteTarget === undefined ||\n reduced ||\n from === undefined ||\n !Number.isFinite(from) ||\n from === finiteTarget ||\n typeof requestAnimationFrame !== \"function\"\n ) {\n currentRef.current = target;\n setValue(target);\n return;\n }\n\n let frame = 0;\n const start =\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\n const tick = (now: number) => {\n const elapsed = now - start;\n const progress = Math.min(1, elapsed / duration);\n const eased = 1 - Math.pow(1 - progress, 3);\n const next = from + (finiteTarget - from) * eased;\n currentRef.current = next;\n setValue(next);\n if (progress < 1) {\n frame = requestAnimationFrame(tick);\n } else {\n currentRef.current = finiteTarget;\n }\n };\n frame = requestAnimationFrame(tick);\n return () => {\n cancelAnimationFrame(frame);\n };\n }, [target, reduced, duration]);\n\n return value;\n}\n","import { useMemo } from \"react\";\nimport type { CSSProperties } from \"react\";\n\nimport { formatValue } from \"@dlh.io/bideux-dashboard-renderers\";\nimport type {\n KpiDeltaModel,\n KpiRendererModel,\n} from \"@dlh.io/bideux-dashboard-renderers\";\n\nimport { cn } from \"./cn.js\";\nimport { useIcons, useUiKit } from \"./context.js\";\nimport type { IconName } from \"./ports.js\";\nimport { useCountUp } from \"./use-count-up.js\";\nimport { WidgetLabel } from \"./widget-label.js\";\n\nexport interface KpiCardProps {\n model: KpiRendererModel;\n className?: string;\n /** Fires when the card is clicked and the widget declares a click interaction. */\n onClick?: (() => void) | undefined;\n}\n\nconst DELTA_ICONS: Record<\"up\" | \"down\" | \"neutral\", IconName> = {\n up: \"trendUp\",\n down: \"trendDown\",\n neutral: \"trendFlat\",\n};\n\nconst TOOLTIP_ICONS: Record<\n NonNullable<KpiDeltaModel[\"tooltipIcon\"]>,\n IconName\n> = {\n info: \"info\",\n check: \"check\",\n help: \"help\",\n warning: \"alert\",\n};\n\nconst TONE_CLASSES: Record<KpiDeltaModel[\"tone\"], string> = {\n up: \"border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-900 dark:bg-emerald-950 dark:text-emerald-300\",\n down: \"border-rose-200 bg-rose-50 text-rose-700 dark:border-rose-900 dark:bg-rose-950 dark:text-rose-300\",\n flat: \"border-muted bg-muted text-muted-foreground\",\n};\n\n/**\n * The card is a column that fills its tile. A host without utility CSS gets\n * the same shape from these few declarations.\n */\nconst CARD_LAYOUT: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n height: \"100%\",\n width: \"100%\",\n minWidth: 0,\n minHeight: 0,\n overflow: \"hidden\",\n};\n\nconst VALUE_ROW_LAYOUT: CSSProperties = {\n display: \"flex\",\n flex: \"1 1 auto\",\n minHeight: 0,\n alignItems: \"baseline\",\n justifyContent: \"space-between\",\n gap: 8,\n};\n\nconst VALUE_LAYOUT: CSSProperties = {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n fontSize: \"1.875rem\",\n lineHeight: \"2.25rem\",\n fontWeight: 600,\n letterSpacing: \"-0.025em\",\n fontVariantNumeric: \"tabular-nums\",\n};\n\ninterface DeltaPillProps {\n delta: KpiDeltaModel;\n}\n\nfunction DeltaPill({ delta }: DeltaPillProps) {\n const ui = useUiKit();\n const icons = useIcons();\n const DeltaIcon =\n delta.icon === \"none\" ? null : icons[DELTA_ICONS[delta.icon]];\n const TooltipIcon =\n delta.tooltipIcon === undefined\n ? null\n : icons[TOOLTIP_ICONS[delta.tooltipIcon]];\n const pill = (\n <span\n className={cn(\n \"inline-flex shrink-0 cursor-help items-center gap-0.5 rounded-md border px-1.5 py-0.5 text-xs font-medium transition-colors duration-300\",\n delta.color === undefined && TONE_CLASSES[delta.tone],\n )}\n style={delta.color === undefined ? undefined : { color: delta.color }}\n data-kpi-delta={delta.tone}\n >\n {DeltaIcon !== null && <DeltaIcon className=\"h-3 w-3\" />}\n {delta.formattedValue}\n {delta.comparedWith !== undefined && (\n <span className=\"font-normal opacity-80\">{delta.comparedWith}</span>\n )}\n {TooltipIcon !== null && <TooltipIcon className=\"h-3 w-3 opacity-70\" />}\n </span>\n );\n if (delta.tooltip === undefined && delta.reference === undefined) {\n return pill;\n }\n return (\n <ui.Tooltip\n side=\"bottom\"\n label={\n <div className=\"max-w-xs space-y-1\">\n {delta.tooltip !== undefined && (\n <p className=\"text-xs font-medium\">{delta.tooltip}</p>\n )}\n {delta.reference !== undefined && (\n <p className=\"text-xs text-muted-foreground\">\n Reference: {delta.reference.formattedValue}\n </p>\n )}\n </div>\n }\n >\n {pill}\n </ui.Tooltip>\n );\n}\n\nexport function KpiCard({ model, className, onClick }: KpiCardProps) {\n const delta = model.delta;\n const label = model.frame.label;\n const showLabelFirst = label?.position !== \"bottom\";\n const labelNode =\n label === undefined ? null : (\n <WidgetLabel\n label={{\n text: label.text ?? \"\",\n tooltip: label.tooltip ?? undefined,\n icon: label.tooltipIcon ?? undefined,\n }}\n className={showLabelFirst ? \"mb-1\" : \"mt-1\"}\n />\n );\n\n // The number eases to its new value, so a card that changed is visibly the\n // one that changed. A whole number counts up in whole numbers, so the tile\n // does not flicker through decimals it never shows once it settles.\n const animatedValue = useCountUp(\n Number.isFinite(model.value) ? model.value : undefined,\n );\n const formattedValue = useMemo(() => {\n if (animatedValue === undefined || animatedValue === model.value) {\n return model.formattedValue;\n }\n const options = model.valueFormat;\n const rounded =\n options.decimals === undefined &&\n options.format !== \"percent\" &&\n Number.isInteger(model.value)\n ? Math.round(animatedValue)\n : animatedValue;\n return formatValue(rounded, options);\n }, [animatedValue, model]);\n\n const interactive = onClick !== undefined;\n\n return (\n <div\n className={cn(\n \"bideux-kpi flex h-full w-full min-w-0 flex-col justify-center overflow-hidden\",\n interactive && \"cursor-pointer\",\n className,\n )}\n style={CARD_LAYOUT}\n data-kpi-value={model.settledValue}\n onClick={onClick}\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n onKeyDown={\n interactive\n ? (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onClick();\n }\n }\n : undefined\n }\n >\n {showLabelFirst && labelNode}\n <div\n className=\"flex min-h-0 flex-1 items-baseline justify-between gap-2\"\n style={VALUE_ROW_LAYOUT}\n >\n <div\n className=\"truncate text-3xl font-semibold tracking-tight tabular-nums\"\n style={VALUE_LAYOUT}\n title={model.settledValue}\n >\n {formattedValue}\n </div>\n {delta !== undefined && <DeltaPill delta={delta} />}\n </div>\n {model.note !== undefined && model.note !== \"\" && (\n <p\n className=\"mt-1 truncate text-xs text-muted-foreground\"\n title={model.note}\n >\n {model.note}\n </p>\n )}\n {!showLabelFirst && labelNode}\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\n\nimport type {\n ReaderRenderer,\n RendererFactory,\n RendererMountInput,\n} from \"./ports.js\";\n\nexport interface RendererMountProps {\n factory: RendererFactory;\n input: Omit<RendererMountInput, \"element\">;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Mounts one of the framework neutral renderers into a div and drives its\n * lifecycle from React: create once, update on new input, resize with the\n * element, destroy on unmount. The chart, grid and pivot behaviour stays in the\n * renderer packages and is never rebuilt here.\n */\nexport function RendererMount({\n factory,\n input,\n className,\n style,\n}: RendererMountProps) {\n const hostRef = useRef<HTMLDivElement | null>(null);\n /**\n * The div the renderer draws into. It is a child of the host rather than the\n * host itself, so a renderer torn down while a later one is already drawing\n * takes its own surface with it and leaves the newer picture alone. React in\n * strict mode runs the effect twice, which is exactly that situation.\n */\n const surfaceRef = useRef<HTMLDivElement | null>(null);\n const rendererRef = useRef<ReaderRenderer | null>(null);\n const inputRef = useRef(input);\n inputRef.current = input;\n /** The input the renderer was created with, so creation is not re-applied. */\n const appliedRef = useRef<Omit<RendererMountInput, \"element\"> | null>(null);\n\n useEffect(() => {\n const host = hostRef.current;\n if (host === null) return;\n const element = host.ownerDocument.createElement(\"div\");\n element.style.height = \"100%\";\n element.style.width = \"100%\";\n element.style.minHeight = \"0\";\n host.appendChild(element);\n surfaceRef.current = element;\n let disposed = false;\n const created = factory({ ...inputRef.current, element });\n const settle = (renderer: ReaderRenderer) => {\n if (disposed) {\n renderer.destroy();\n return;\n }\n rendererRef.current = renderer;\n appliedRef.current = inputRef.current;\n };\n if (created instanceof Promise) {\n void created.then(settle, (error: unknown) => {\n inputRef.current.callbacks?.onError?.(\n error instanceof Error ? error : new Error(\"Renderer failed\"),\n );\n });\n } else {\n settle(created);\n }\n return () => {\n disposed = true;\n rendererRef.current?.destroy();\n rendererRef.current = null;\n appliedRef.current = null;\n if (surfaceRef.current === element) surfaceRef.current = null;\n element.remove();\n };\n }, [factory]);\n\n useEffect(() => {\n const element = surfaceRef.current;\n const renderer = rendererRef.current;\n if (element === null || renderer === null) return;\n if (appliedRef.current === input) return;\n appliedRef.current = input;\n renderer.update({ ...input, element });\n }, [input]);\n\n useEffect(() => {\n const element = hostRef.current;\n if (element === null || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(() => {\n rendererRef.current?.resize();\n });\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, []);\n\n return (\n <div\n ref={hostRef}\n className={className}\n style={style}\n data-renderer-mount={input.widget.metadata.id}\n />\n );\n}\n","import { formatTableCsv } from \"@dlh.io/bideux-dashboard-renderers\";\nimport type { ResultTable } from \"@dlh.io/bideux-dashboard-renderers\";\n\nexport type TableExportFormat = \"csv\" | \"excel\";\n\nexport interface TableExportRequest {\n format: TableExportFormat;\n table: ResultTable;\n /** File name without extension, from the widget's export settings. */\n filename: string;\n}\n\n/**\n * Hosts that want Excel, or that route downloads through their own storage,\n * implement this. The reader handles CSV itself when no exporter is given.\n */\nexport type TableExporter = (request: TableExportRequest) => void;\n\n/** Save a UTF-8 CSV of the table through the browser's download flow. */\nexport function downloadTableCsv(table: ResultTable, filename: string): void {\n if (typeof document === \"undefined\" || typeof URL === \"undefined\") return;\n const blob = new Blob([formatTableCsv(table)], {\n type: \"text/csv;charset=utf-8;\",\n });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = `${filename}.csv`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n","import type { ReactNode } from \"react\";\n\nimport type {\n TableRendererModel,\n TableSortState,\n} from \"@dlh.io/bideux-dashboard-renderers\";\n\nimport { cn } from \"./cn.js\";\nimport { useIcons, useUiKit } from \"./context.js\";\n\nexport interface TableViewProps {\n model: TableRendererModel;\n onSortChange?: (sort: TableSortState | null) => void;\n onPageChange?: (page: number) => void;\n onRowClick?: (row: Record<string, unknown>) => void;\n /** Export buttons and the like, drawn above the grid when no header carries them. */\n toolbar?: ReactNode;\n className?: string;\n}\n\n/**\n * The plain table the reader draws itself. Grid engines (Tabulator, RevoGrid)\n * arrive as renderer factories instead, so nothing here reimplements them.\n */\nexport function TableView({\n model,\n onSortChange,\n onPageChange,\n onRowClick,\n toolbar,\n className,\n}: TableViewProps) {\n const ui = useUiKit();\n const icons = useIcons();\n const ArrowUp = icons.arrowUp;\n const ArrowDown = icons.arrowDown;\n const ArrowUpDown = icons.arrowUpDown;\n const toggleSort = (field: string, direction: \"asc\" | \"desc\" | null) => {\n if (onSortChange === undefined) return;\n if (direction === null) onSortChange({ column: field, direction: \"asc\" });\n else if (direction === \"asc\")\n onSortChange({ column: field, direction: \"desc\" });\n else onSortChange(null);\n };\n const interactive = onRowClick !== undefined;\n\n return (\n <div\n className={cn(\n \"bideux-table flex h-full w-full flex-col overflow-auto\",\n className,\n )}\n >\n {toolbar !== undefined && toolbar !== null && (\n <div className=\"mb-2 flex shrink-0 items-center justify-end gap-2\">\n {toolbar}\n </div>\n )}\n <div className=\"relative min-h-0 flex-1 overflow-auto\">\n <table className=\"w-full caption-bottom text-sm\">\n <thead className=\"[&_tr]:border-b\">\n <tr className=\"border-b transition-colors\">\n {model.columns.map((column) => (\n <th\n key={column.field}\n scope=\"col\"\n className=\"h-10 whitespace-nowrap px-2 text-left align-middle font-medium text-muted-foreground\"\n aria-sort={\n column.sortDirection === \"asc\"\n ? \"ascending\"\n : column.sortDirection === \"desc\"\n ? \"descending\"\n : \"none\"\n }\n >\n {column.sortable ? (\n <button\n type=\"button\"\n className=\"flex items-center gap-1 font-medium hover:text-foreground\"\n onClick={() => {\n toggleSort(column.field, column.sortDirection);\n }}\n >\n {column.title}\n {column.sortDirection === \"asc\" ? (\n <ArrowUp className=\"h-3.5 w-3.5\" />\n ) : column.sortDirection === \"desc\" ? (\n <ArrowDown className=\"h-3.5 w-3.5\" />\n ) : (\n <ArrowUpDown className=\"h-3.5 w-3.5 opacity-40\" />\n )}\n </button>\n ) : (\n column.title\n )}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"[&_tr:last-child]:border-0\">\n {model.rows.map((row) => (\n <tr\n key={row.key}\n className={cn(\n \"border-b transition-colors hover:bg-muted/50\",\n interactive && \"cursor-pointer\",\n )}\n onClick={\n onRowClick === undefined\n ? undefined\n : () => {\n onRowClick(row.data);\n }\n }\n >\n {row.cells.map((cell) => (\n <td\n key={cell.field}\n className=\"whitespace-nowrap p-2 align-middle\"\n >\n {cell.text}\n </td>\n ))}\n </tr>\n ))}\n {model.rows.length === 0 && (\n <tr>\n <td\n colSpan={Math.max(model.columns.length, 1)}\n className=\"p-6 text-center text-muted-foreground\"\n >\n No rows for the current filters\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n {model.pageCount > 1 && (\n <div className=\"flex shrink-0 items-center justify-between gap-2 border-t px-2 py-1 text-xs text-muted-foreground\">\n <span>\n Page {model.page} of {model.pageCount}, {model.totalRows} rows\n </span>\n <span className=\"flex items-center gap-1\">\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={model.page <= 1}\n ariaLabel=\"Previous page\"\n onClick={() => {\n onPageChange?.(model.page - 1);\n }}\n >\n Previous\n </ui.Button>\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={model.page >= model.pageCount}\n ariaLabel=\"Next page\"\n onClick={() => {\n onPageChange?.(model.page + 1);\n }}\n >\n Next\n </ui.Button>\n </span>\n </div>\n )}\n </div>\n );\n}\n","import { forwardRef } from \"react\";\nimport type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\n\nimport type { WidgetTheme } from \"@dlh.io/bideux-dashboard-renderers\";\nimport type { WidgetSpec } from \"@dlh.io/bideux-dashboard-spec\";\n\nimport { cn } from \"./cn.js\";\nimport { useIcons } from \"./context.js\";\n\nexport function frameStyle(theme: WidgetTheme): CSSProperties {\n const style: CSSProperties = {};\n if (theme.padding !== undefined) style.padding = theme.padding;\n if (theme.margin !== undefined) style.margin = theme.margin;\n if (theme.borderRadius !== undefined) style.borderRadius = theme.borderRadius;\n if (theme.background !== undefined) style.background = theme.background;\n if (typeof theme.border === \"string\") style.border = theme.border;\n if (theme.border === true) style.border = \"1px solid var(--border, #e5e7eb)\";\n if (theme.border === false) style.border = \"none\";\n if (typeof theme.shadow === \"string\") style.boxShadow = theme.shadow;\n if (theme.shadow === true) {\n style.boxShadow = \"0 1px 2px 0 rgb(0 0 0 / 0.05)\";\n }\n if (theme.shadow === false) style.boxShadow = \"none\";\n return style;\n}\n\n/**\n * The card is a full height column whatever the host's stylesheet says. The\n * class names describe the card for a host that wants to style it; these few\n * declarations are what actually give a chart somewhere to draw.\n */\nconst FRAME_LAYOUT: CSSProperties = {\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n width: \"100%\",\n minWidth: 0,\n overflow: \"hidden\",\n};\n\n/** Height of the edit bar drawn over the top of the card while the grid is editable. */\nexport const EDIT_BAR_HEIGHT = 28;\n\nexport interface WidgetFrameProps extends HTMLAttributes<HTMLDivElement> {\n widget: WidgetSpec;\n /** Reader actions for this card, revealed on hover. Absent while editing. */\n actions?: ReactNode;\n theme?: WidgetTheme;\n /** Draws the drag bar and the edit buttons over the card. */\n editMode?: boolean;\n onEdit?: (widgetId: string) => void;\n onRemove?: (widgetId: string) => void;\n onDiagnose?: (widgetId: string) => void;\n /** Opens the editor straight on the assistant. Absent where asking makes no sense. */\n onAsk?: (widgetId: string) => void;\n}\n\nconst EDIT_BUTTON =\n \"rounded p-1 opacity-0 transition-opacity hover:bg-muted hover:text-foreground focus-visible:opacity-100 group-hover:opacity-100\";\n\n/**\n * The widget card. In the reader it is a plain themed box with hover actions;\n * in edit mode it also carries the origin application's drag bar (`.custom-drag-handle`)\n * with the widget name and the diagnostics, AI, properties and remove buttons,\n * whose class names match the dashboard's `draggableHandle` and\n * `draggableCancel` selectors.\n */\nexport const WidgetFrame = forwardRef<HTMLDivElement, WidgetFrameProps>(\n function WidgetFrame(\n {\n widget,\n actions,\n theme,\n editMode = false,\n onEdit,\n onRemove,\n onDiagnose,\n onAsk,\n className,\n style,\n children,\n ...divProps\n },\n ref,\n ) {\n const icons = useIcons();\n const Grip = icons.grip;\n const Activity = icons.activity;\n const Sparkles = icons.sparkles;\n const Settings = icons.settings;\n const Minus = icons.minus;\n const id = widget.metadata.id;\n return (\n <div\n ref={ref}\n data-widget-id={id}\n data-widget-component={String(widget.spec.component ?? \"unknown\")}\n data-edit-mode={editMode ? \"true\" : undefined}\n className={cn(\n \"bideux-widget group/widget relative flex h-full w-full min-w-0 flex-col overflow-hidden bg-card\",\n \"motion-safe:animate-in motion-safe:fade-in motion-safe:duration-300\",\n editMode && \"group bideux-canvas-edit dashboard-canvas-edit\",\n className,\n )}\n style={{\n ...FRAME_LAYOUT,\n ...(theme === undefined ? {} : frameStyle(theme)),\n ...style,\n }}\n {...divProps}\n >\n {editMode && (\n <div\n className=\"custom-drag-handle absolute inset-x-0 top-0 z-10 flex h-7 items-center justify-between rounded-t-xl border-b bg-card/70 px-2 text-muted-foreground backdrop-blur-sm\"\n style={{ height: EDIT_BAR_HEIGHT }}\n >\n <div className=\"flex min-w-0 flex-1 cursor-move items-center gap-1\">\n <Grip className=\"h-4 w-4 shrink-0\" />\n <span className=\"truncate text-xs font-medium\">\n {widget.metadata.name}\n </span>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {onDiagnose && (\n <button\n type=\"button\"\n onClick={() => onDiagnose(id)}\n className={cn(\"widget-diagnose-btn\", EDIT_BUTTON)}\n aria-label=\"Query diagnostics\"\n title=\"Query diagnostics\"\n >\n <Activity className=\"h-4 w-4\" />\n </button>\n )}\n {onAsk && (\n <button\n type=\"button\"\n onClick={() => onAsk(id)}\n className={cn(\"widget-ask-btn text-primary\", EDIT_BUTTON)}\n aria-label=\"Edit with AI\"\n title=\"Edit with AI: describe the change in a sentence\"\n >\n <Sparkles className=\"h-4 w-4\" />\n </button>\n )}\n {onEdit && (\n <button\n type=\"button\"\n onClick={() => onEdit(id)}\n className={cn(\"widget-edit-btn\", EDIT_BUTTON)}\n aria-label=\"Open widget properties\"\n title=\"Open widget properties\"\n >\n <Settings className=\"h-4 w-4\" />\n </button>\n )}\n {onRemove && (\n <button\n type=\"button\"\n onClick={() => onRemove(id)}\n className={cn(\"widget-remove-btn\", EDIT_BUTTON)}\n aria-label=\"Remove from grid\"\n title=\"Remove from grid\"\n >\n <Minus className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n )}\n {!editMode && actions}\n {children}\n </div>\n );\n },\n);\n","import type { CSSProperties, ReactNode } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"./cn.js\";\nimport { useIcons, useUiKit } from \"./context.js\";\n\n/**\n * A message is as long as the reason it reports, and a tile is as short as its\n * rows, so the copy scrolls inside the card instead of running past its edge.\n * The declarations are inline because a host need not ship the utility CSS.\n */\nconst MESSAGE_LAYOUT: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 4,\n height: \"100%\",\n width: \"100%\",\n minHeight: 0,\n overflowY: \"auto\",\n padding: 8,\n textAlign: \"center\",\n fontSize: 12,\n lineHeight: 1.35,\n};\n\n/**\n * A reason usually opens with its headline and then explains itself, as in\n * \"No number to show: net_sales came back empty\". A tile too short for the\n * whole sentence keeps the headline and carries the rest in the title, so the\n * card reads at a glance and the detail is a hover away.\n */\nfunction splitMessage(message: string): { lead: string; detail: string } {\n const mark = message.indexOf(\": \");\n if (mark === -1) return { lead: message, detail: \"\" };\n return {\n lead: message.slice(0, mark),\n detail: message.slice(mark + 2),\n };\n}\n\ninterface FittedMessageProps {\n message: string;\n className?: string;\n}\n\nfunction FittedMessage({ message, className }: FittedMessageProps) {\n const boxRef = useRef<HTMLParagraphElement>(null);\n const [brief, setBrief] = useState(false);\n const { lead, detail } = splitMessage(message);\n\n useEffect(() => {\n const box = boxRef.current;\n if (box === null) return;\n const surface = box.parentElement;\n if (surface === null) return;\n const fits = () => {\n setBrief(false);\n requestAnimationFrame(() => {\n if (boxRef.current === null) return;\n setBrief(surface.scrollHeight > surface.clientHeight);\n });\n };\n fits();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(fits);\n observer.observe(surface);\n return () => {\n observer.disconnect();\n };\n }, [message]);\n\n return (\n <p ref={boxRef} className={className} title={message}>\n {brief && detail !== \"\" ? lead : message}\n </p>\n );\n}\n\nexport interface DashboardLoadingBarProps {\n loading: boolean;\n className?: string;\n}\n\nexport function DashboardLoadingBar({\n loading,\n className,\n}: DashboardLoadingBarProps) {\n if (!loading) return null;\n return (\n <div\n aria-label=\"Loading dashboard\"\n role=\"status\"\n className={cn(\n \"bideux-loading-bar pointer-events-none absolute inset-x-0 top-0 z-50 h-1 overflow-hidden bg-muted/30\",\n className,\n )}\n >\n <div\n className=\"h-full w-full origin-left bg-primary\"\n style={{ animation: \"loading-bar 1.5s infinite ease-in-out\" }}\n />\n </div>\n );\n}\n\nexport interface WidgetLoadingProps {\n skeleton: \"kpi\" | \"chart\" | \"content\";\n message?: string;\n}\n\nexport function WidgetLoading({ skeleton, message }: WidgetLoadingProps) {\n const ui = useUiKit();\n return (\n <div\n className=\"bideux-widget-loading flex h-full w-full flex-col gap-2 p-3\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label={message ?? \"Loading widget\"}\n data-skeleton={skeleton}\n >\n {skeleton === \"kpi\" ? (\n <>\n <ui.Skeleton className=\"h-3 w-24\" />\n <ui.Skeleton className=\"h-8 w-32\" />\n </>\n ) : skeleton === \"chart\" ? (\n <ui.Skeleton className=\"h-full min-h-16 w-full\" />\n ) : (\n <>\n <ui.Skeleton className=\"h-3 w-full\" />\n <ui.Skeleton className=\"h-3 w-11/12\" />\n <ui.Skeleton className=\"h-3 w-10/12\" />\n <ui.Skeleton className=\"h-3 w-9/12\" />\n </>\n )}\n </div>\n );\n}\n\nexport interface WidgetErrorProps {\n message: string;\n hint?: string;\n retryable?: boolean;\n onRetry?: () => void;\n}\n\nexport function WidgetError({\n message,\n hint,\n retryable,\n onRetry,\n}: WidgetErrorProps) {\n const ui = useUiKit();\n const icons = useIcons();\n const Alert = icons.alert;\n const Refresh = icons.refresh;\n return (\n <div\n role=\"alert\"\n className=\"bideux-widget-error flex h-full w-full flex-col items-center justify-center gap-2 p-4 text-center text-sm text-muted-foreground\"\n style={MESSAGE_LAYOUT}\n >\n <Alert className=\"h-5 w-5 shrink-0 text-destructive\" />\n <FittedMessage message={message} className=\"line-clamp-4\" />\n {hint !== undefined && hint !== \"\" && (\n <p className=\"line-clamp-3 text-xs\">{hint}</p>\n )}\n {retryable === true && onRetry !== undefined && (\n <ui.Button\n variant=\"secondary\"\n size=\"sm\"\n className=\"mt-1\"\n onClick={onRetry}\n >\n <span className=\"inline-flex items-center gap-1\">\n <Refresh className=\"h-3 w-3\" />\n Try again\n </span>\n </ui.Button>\n )}\n </div>\n );\n}\n\nexport interface WidgetNoticeProps {\n message: string;\n children?: ReactNode;\n}\n\nexport function WidgetNotice({ message, children }: WidgetNoticeProps) {\n const icons = useIcons();\n const Info = icons.info;\n return (\n <div\n role=\"status\"\n className=\"bideux-widget-notice flex h-full w-full flex-col items-center justify-center gap-2 p-4 text-center text-sm text-muted-foreground\"\n style={MESSAGE_LAYOUT}\n >\n <Info className=\"h-5 w-5 shrink-0\" />\n <FittedMessage message={message} className=\"line-clamp-4\" />\n {children}\n </div>\n );\n}\n\nexport interface WidgetRefreshingProps {\n active: boolean;\n children: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Hold the previous answer on screen while the next query runs. The card is\n * dimmed and marked busy, so the numbers still on it read as the previous\n * filters' answer rather than the new one.\n */\nexport function WidgetRefreshing({\n active,\n children,\n className,\n style,\n}: WidgetRefreshingProps) {\n return (\n <div\n aria-busy={active ? \"true\" : undefined}\n className={cn(\n \"relative min-h-0\",\n active && \"bideux-widget-refreshing\",\n className,\n )}\n style={{ position: \"relative\", ...style }}\n >\n {active && (\n <div className=\"pointer-events-none absolute inset-x-0 top-0 z-10 h-0.5 overflow-hidden\">\n <div\n className=\"h-full w-full origin-left bg-primary/70\"\n style={{ animation: \"loading-bar 1.2s infinite ease-in-out\" }}\n />\n </div>\n )}\n <div\n className={cn(\n \"h-full w-full transition-opacity duration-200\",\n active && \"opacity-60\",\n )}\n style={{ height: \"100%\", width: \"100%\", opacity: active ? 0.6 : 1 }}\n >\n {children}\n </div>\n </div>\n );\n}\n\nexport interface WidgetEmptyProps {\n message?: string;\n hint?: string;\n}\n\nexport function WidgetEmpty({ message, hint }: WidgetEmptyProps) {\n return (\n <WidgetNotice message={message ?? \"No data for the current filters\"}>\n {hint !== undefined && hint !== \"\" && (\n <p className=\"text-xs opacity-70\">{hint}</p>\n )}\n </WidgetNotice>\n );\n}\n\nexport interface VisibilityBadgeProps {\n visibility: \"private\" | \"shared\" | \"public\" | \"organisation\";\n className?: string;\n}\n\nexport function VisibilityBadge({\n visibility,\n className,\n}: VisibilityBadgeProps) {\n const ui = useUiKit();\n const icons = useIcons();\n const Icon = visibility === \"private\" ? icons.lock : icons.users;\n const tone =\n visibility === \"public\"\n ? \"info\"\n : visibility === \"private\"\n ? \"neutral\"\n : \"success\";\n return (\n <ui.Badge\n tone={tone}\n className={className}\n title={`Visibility: ${visibility}`}\n >\n <span className=\"inline-flex items-center gap-1\">\n <Icon className=\"h-3 w-3\" />\n {visibility}\n </span>\n </ui.Badge>\n );\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport type { CSSProperties, ReactNode } from \"react\";\n\nimport {\n buildWidgetRendererModel,\n resolveTheme,\n resultColumns,\n resultRows,\n} from \"@dlh.io/bideux-dashboard-renderers\";\nimport type {\n RendererContext,\n RendererLabel,\n TableExportModel,\n TableSortState,\n WidgetInteraction,\n WidgetResult,\n WidgetSpec,\n} from \"@dlh.io/bideux-dashboard-renderers\";\nimport type { WidgetInteractionContext } from \"@dlh.io/bideux-dashboard-core\";\n\nimport { cn } from \"./cn.js\";\nimport { useDashboardReader, useIcons, useUiKit } from \"./context.js\";\nimport { useDashboardFilters } from \"./filters-context.js\";\nimport { FilterWidget } from \"./filter-widget.js\";\nimport { KpiCard } from \"./kpi-card.js\";\nimport type {\n PivotDetailPayload,\n RendererFactory,\n RendererMountCallbacks,\n} from \"./ports.js\";\nimport { RendererMount } from \"./renderer-mount.js\";\nimport { downloadTableCsv } from \"./table-export.js\";\nimport type { TableExporter } from \"./table-export.js\";\nimport { TableView } from \"./table-view.js\";\nimport { WidgetFrame } from \"./widget-frame.js\";\nimport { WidgetHeader } from \"./widget-header.js\";\nimport { WidgetLabel } from \"./widget-label.js\";\nimport {\n WidgetError,\n WidgetLoading,\n WidgetNotice,\n WidgetRefreshing,\n} from \"./widget-states.js\";\n\n/** Renderer kinds the reader hands to a renderer factory rather than drawing. */\nconst MOUNTED_KINDS = new Set([\n \"chart\",\n \"tabulator\",\n \"pivot\",\n \"markdown\",\n \"extension\",\n]);\n\nfunction getClickInteraction(\n widget: WidgetSpec,\n): WidgetInteraction | undefined {\n return (widget.spec.interactions ?? []).find(\n (interaction) =>\n interaction.type === \"drilldown\" || interaction.type === \"set_filter\",\n );\n}\n\nconst MOUNT_STYLE: CSSProperties = {\n height: \"100%\",\n width: \"100%\",\n minHeight: 0,\n};\n\nconst FILL_STYLE: CSSProperties = {\n flex: \"1 1 auto\",\n minHeight: 0,\n};\n\nconst VERTICAL_ALIGN: Record<\n \"top\" | \"middle\" | \"bottom\",\n CSSProperties[\"justifyContent\"]\n> = {\n top: \"flex-start\",\n middle: \"center\",\n bottom: \"flex-end\",\n};\n\ninterface FrameLabelProps {\n label: RendererLabel;\n className?: string;\n}\n\nfunction FrameLabel({ label, className }: FrameLabelProps) {\n return (\n <WidgetLabel\n label={{\n text: label.text ?? \"\",\n tooltip: label.tooltip ?? undefined,\n icon: label.tooltipIcon ?? undefined,\n }}\n {...(className === undefined ? {} : { className })}\n />\n );\n}\n\ninterface TableExportButtonsProps {\n exports: TableExportModel;\n excelAvailable: boolean;\n onExport: (format: \"csv\" | \"excel\") => void;\n}\n\nfunction TableExportButtons({\n exports,\n excelAvailable,\n onExport,\n}: TableExportButtonsProps) {\n const ui = useUiKit();\n const icons = useIcons();\n const Download = icons.download;\n const Spreadsheet = icons.spreadsheet;\n const showCsv = exports.csv;\n const showExcel = exports.excel && excelAvailable;\n if (!showCsv && !showExcel) return null;\n return (\n <span className=\"flex items-center gap-1\" data-widget-exports=\"\">\n {showCsv && (\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n ariaLabel=\"Export CSV\"\n title=\"Export CSV\"\n onClick={() => {\n onExport(\"csv\");\n }}\n >\n <Download className=\"h-3.5 w-3.5\" />\n </ui.Button>\n )}\n {showExcel && (\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n ariaLabel=\"Export Excel\"\n title=\"Export Excel\"\n onClick={() => {\n onExport(\"excel\");\n }}\n >\n <Spreadsheet className=\"h-3.5 w-3.5\" />\n </ui.Button>\n )}\n </span>\n );\n}\n\nexport interface WidgetRendererProps {\n widget: WidgetSpec;\n result?: WidgetResult;\n context?: RendererContext;\n loading?: boolean;\n className?: string;\n style?: CSSProperties;\n actions?: ReactNode;\n onInteraction?: (\n interaction: WidgetInteraction,\n context: WidgetInteractionContext,\n ) => void;\n onRetry?: () => void;\n onPivotDetail?: (payload: PivotDetailPayload) => void;\n /**\n * Handles table exports. Without one the reader downloads CSV itself and\n * hides the Excel button, since building a workbook is the host's business.\n */\n onExport?: TableExporter;\n /** Draws the frame's drag bar and edit buttons. */\n editMode?: boolean;\n onEdit?: (widgetId: string) => void;\n onAsk?: (widgetId: string) => void;\n onRemove?: (widgetId: string) => void;\n onDiagnose?: (widgetId: string) => void;\n}\n\nexport function WidgetRenderer({\n widget,\n result = {},\n context = {},\n loading,\n className,\n style,\n actions,\n onInteraction,\n onRetry,\n onPivotDetail,\n onExport,\n editMode = false,\n onEdit,\n onAsk,\n onRemove,\n onDiagnose,\n}: WidgetRendererProps) {\n const frameEdit = {\n editMode,\n ...(onEdit === undefined ? {} : { onEdit }),\n ...(onAsk === undefined ? {} : { onAsk }),\n ...(onRemove === undefined ? {} : { onRemove }),\n ...(onDiagnose === undefined ? {} : { onDiagnose }),\n };\n const reader = useDashboardReader();\n const filters = useDashboardFilters();\n const [sort, setSort] = useState<TableSortState | null>(null);\n const [page, setPage] = useState(1);\n // Once a widget has drawn an answer it keeps it under a Refreshing overlay\n // while the next run is in flight, instead of falling back to a skeleton.\n const answeredOnce = useRef(false);\n\n const component = String(widget.spec.component ?? \"unknown\");\n const theme = useMemo(\n () =>\n resolveTheme(\n widget,\n component === \"select\" ? \"select\" : (component as \"kpi\"),\n context.widgetDefaults ?? {},\n ),\n [widget, component, context.widgetDefaults],\n );\n\n const mergedContext = useMemo<RendererContext>(\n () => ({\n ...context,\n ...(loading === undefined ? {} : { loading }),\n answeredOnce: context.answeredOnce ?? answeredOnce.current,\n retryable: context.retryable ?? onRetry !== undefined,\n filters: context.filters ?? filters.filters,\n filterLabels: context.filterLabels ?? filters.labels,\n capture: reader.capture,\n embedded: reader.embedded,\n framed: true,\n excelExport: onExport !== undefined,\n reducedMotion: reader.reducedMotion,\n tableSort: context.tableSort ?? sort,\n tablePage: context.tablePage ?? page,\n }),\n [\n context,\n loading,\n onRetry,\n filters.filters,\n filters.labels,\n reader,\n sort,\n page,\n ],\n );\n\n const exportTable = useCallback(\n (format: \"csv\" | \"excel\", filename: string) => {\n const rows = resultRows(result);\n const table = { columns: resultColumns(result, rows), rows };\n if (onExport !== undefined) {\n onExport({ format, table, filename });\n return;\n }\n if (format === \"csv\") downloadTableCsv(table, filename);\n },\n [result, onExport],\n );\n\n const callbacks = useMemo<RendererMountCallbacks>(\n () => ({\n ...(onInteraction === undefined ? {} : { onInteraction }),\n ...(onRetry === undefined ? {} : { onRetry }),\n ...(onPivotDetail === undefined ? {} : { onPivotDetail }),\n onFilterChange: (widgetId, value) => {\n filters.setFilter(widgetId, value);\n },\n onFilterLabelChange: (widgetId, label) => {\n filters.setFilterLabel(widgetId, label);\n },\n onError: (error) => {\n reader.onNotice({ tone: \"error\", message: error.message });\n },\n onExport: (request) => {\n exportTable(request.format, request.filename);\n },\n }),\n [onInteraction, onRetry, onPivotDetail, filters, reader, exportTable],\n );\n\n const pickFactory = useCallback(\n (kind: string): RendererFactory | undefined =>\n reader.renderers[component] ??\n reader.renderers[kind] ??\n reader.renderers.default,\n [reader.renderers, component],\n );\n\n const clickInteraction = getClickInteraction(widget);\n const onWidgetClick = useMemo(\n () =>\n onInteraction === undefined || clickInteraction === undefined\n ? undefined\n : (data: Record<string, unknown> = {}) => {\n onInteraction(clickInteraction, {\n widgetId: widget.metadata.id,\n data,\n });\n },\n [onInteraction, clickInteraction, widget.metadata.id],\n );\n\n /**\n * A registered table renderer, if the host named one.\n *\n * The reader draws a table itself, so this deliberately skips the `default`\n * fallback: a host that registers nothing keeps the built in table, and a host\n * that registers a table package gets the same grid a non React host draws.\n */\n const tableFactory: RendererFactory | undefined =\n reader.renderers[component] ?? reader.renderers.table;\n\n if (component === \"filter\" || component === \"select\") {\n return (\n <WidgetFrame\n widget={widget}\n theme={theme}\n className={className}\n style={style}\n {...frameEdit}\n >\n <FilterWidget\n widget={widget}\n result={result}\n value={filters.filters[widget.metadata.id]}\n onChange={(id, value, label) => {\n filters.setFilter(id, value);\n filters.setFilterLabel(id, label);\n }}\n onLabel={filters.setFilterLabel}\n />\n </WidgetFrame>\n );\n }\n\n const resolution = buildWidgetRendererModel(widget, result, mergedContext);\n answeredOnce.current = resolution.answeredOnce;\n const state = resolution.state;\n const model = resolution.model;\n const label = model?.frame.label;\n const showHeader = model?.frame.showObjectHeader === true;\n const labelTop = label !== undefined && label.position !== \"bottom\";\n const labelBottom = label !== undefined && label.position === \"bottom\";\n const mountInput = { widget, result, context: mergedContext, callbacks };\n\n let body: ReactNode;\n let headerActions: ReactNode = null;\n let handlesOwnLabel = false;\n let overlayChrome = false;\n\n if (state.kind === \"loading\") {\n body = <WidgetLoading skeleton={state.skeleton} message={state.message} />;\n } else if (state.kind === \"error\") {\n body = (\n <WidgetError\n message={state.message}\n {...(state.hint === undefined ? {} : { hint: state.hint })}\n retryable={state.retryable}\n {...(onRetry === undefined ? {} : { onRetry })}\n />\n );\n } else if (state.kind === \"notice\") {\n body = <WidgetNotice message={state.message} />;\n } else if (model === undefined) {\n body = <WidgetNotice message=\"Nothing to render\" />;\n } else if (model.kind === \"kpi\") {\n handlesOwnLabel = true;\n body = (\n <KpiCard\n model={model}\n onClick={\n onWidgetClick === undefined\n ? undefined\n : () => {\n onWidgetClick({ value: model.value });\n }\n }\n />\n );\n } else if (model.kind === \"table\") {\n const exportButtons = (\n <TableExportButtons\n exports={model.exports}\n excelAvailable={onExport !== undefined}\n onExport={(format) => {\n exportTable(format, model.exports.filename);\n }}\n />\n );\n headerActions = exportButtons;\n body =\n tableFactory !== undefined ? (\n <RendererMount\n factory={tableFactory}\n className=\"h-full w-full min-h-0\"\n style={MOUNT_STYLE}\n input={mountInput}\n />\n ) : (\n <TableView\n model={model}\n onSortChange={setSort}\n onPageChange={setPage}\n {...(onWidgetClick === undefined\n ? {}\n : { onRowClick: onWidgetClick })}\n {...(showHeader || label !== undefined\n ? {}\n : { toolbar: exportButtons })}\n />\n );\n } else if (model.kind === \"text\") {\n const markdownFactory =\n model.contentFormat === \"markdown\" ? pickFactory(\"markdown\") : undefined;\n const textStyle: CSSProperties = {\n textAlign: model.style.textAlign,\n fontSize: model.style.fontSize,\n fontWeight: model.style.fontWeight,\n color: model.style.color,\n lineHeight: model.style.lineHeight,\n letterSpacing: model.style.letterSpacing,\n whiteSpace: model.style.whiteSpace,\n ...model.style.custom,\n };\n body = (\n <div\n className={cn(\n \"bideux-widget-text flex h-full w-full min-h-0 flex-col overflow-auto\",\n onWidgetClick !== undefined && \"cursor-pointer\",\n )}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n minHeight: 0,\n justifyContent: VERTICAL_ALIGN[model.style.verticalAlign],\n }}\n onClick={\n onWidgetClick === undefined\n ? undefined\n : () => {\n onWidgetClick();\n }\n }\n >\n {markdownFactory !== undefined ? (\n <div style={textStyle}>\n <RendererMount\n factory={markdownFactory}\n className=\"min-h-0 w-full\"\n input={mountInput}\n />\n </div>\n ) : (\n <div\n className={cn(\n \"min-w-0 whitespace-pre-wrap break-words\",\n model.style.truncate && \"truncate whitespace-nowrap\",\n )}\n style={{\n ...textStyle,\n ...(model.style.truncate\n ? {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }\n : {}),\n }}\n title={model.style.truncate ? model.content : undefined}\n >\n {model.content}\n </div>\n )}\n </div>\n );\n } else if (model.kind === \"image\") {\n overlayChrome = true;\n handlesOwnLabel = true;\n body =\n model.source === null ? (\n <WidgetNotice message=\"No image\" />\n ) : (\n <div\n className={cn(\n \"bideux-widget-image relative h-full w-full overflow-hidden\",\n onWidgetClick !== undefined && \"cursor-pointer\",\n )}\n style={{ position: \"relative\", height: \"100%\", width: \"100%\" }}\n onClick={\n onWidgetClick === undefined\n ? undefined\n : () => {\n onWidgetClick();\n }\n }\n role={onWidgetClick === undefined ? undefined : \"button\"}\n tabIndex={onWidgetClick === undefined ? undefined : 0}\n >\n <img\n src={reader.assets.resolve(model.source)}\n alt={model.alt}\n className=\"h-full w-full\"\n style={{\n height: \"100%\",\n width: \"100%\",\n objectFit: model.objectFit,\n }}\n draggable={false}\n />\n {label !== undefined && (\n <div\n className={cn(\n \"pointer-events-none absolute inset-x-0 px-3 py-2 text-white\",\n labelBottom\n ? \"bottom-0 bg-gradient-to-t from-black/60 to-transparent\"\n : \"top-0 bg-gradient-to-b from-black/60 to-transparent\",\n )}\n >\n <FrameLabel label={label} className=\"text-white\" />\n </div>\n )}\n </div>\n );\n } else if (model.kind === \"unknown\") {\n body = <WidgetNotice message={model.message} />;\n } else if (MOUNTED_KINDS.has(model.kind)) {\n const factory = pickFactory(model.kind);\n body =\n factory === undefined ? (\n <WidgetNotice\n message={`No renderer registered for ${model.kind} widgets`}\n />\n ) : (\n <RendererMount\n factory={factory}\n className=\"h-full w-full min-h-0\"\n style={MOUNT_STYLE}\n input={mountInput}\n />\n );\n } else {\n body = <WidgetNotice message={`Unsupported widget kind ${model.kind}`} />;\n }\n\n const refreshing = state.kind === \"ready\" && state.refreshing;\n const labelClass = model?.kind === \"table\" ? \"mb-2\" : \"mb-1\";\n\n return (\n <WidgetFrame\n widget={widget}\n theme={theme}\n className={cn(refreshing && \"bideux-widget-refreshing\", className)}\n style={style}\n {...(actions === undefined ? {} : { actions })}\n {...frameEdit}\n data-widget-state={state.kind}\n >\n {showHeader && (\n <WidgetHeader\n widget={widget}\n className={\n overlayChrome ? \"absolute inset-x-0 top-0 z-10\" : labelClass\n }\n {...(headerActions === null ? {} : { actions: headerActions })}\n />\n )}\n {!showHeader && !handlesOwnLabel && labelTop && label !== undefined && (\n <FrameLabel label={label} className={labelClass} />\n )}\n {!showHeader &&\n !handlesOwnLabel &&\n label !== undefined &&\n headerActions !== null && (\n <div className=\"mb-2 flex items-center justify-end gap-1\">\n {headerActions}\n </div>\n )}\n <WidgetRefreshing\n active={refreshing}\n className=\"min-h-0 flex-1\"\n style={FILL_STYLE}\n >\n {body}\n </WidgetRefreshing>\n {!showHeader &&\n !handlesOwnLabel &&\n labelBottom &&\n label !== undefined && <FrameLabel label={label} className=\"mt-1\" />}\n </WidgetFrame>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport type {\n Layout,\n ResponsiveLayouts as GridLayouts,\n} from \"react-grid-layout\";\nimport { GridBackground } from \"react-grid-layout/extras\";\nimport { Responsive } from \"react-grid-layout/legacy\";\n\nimport {\n BREAKPOINT_MAP,\n DEFAULT_GRID_CONFIG,\n MAX_LAYOUT_WIDTHS,\n buildBaseLayouts,\n ensureLayoutCoverage,\n filterLayoutsByIds,\n isPanelledControl,\n mergeLayouts,\n movedIds,\n requiredRows,\n resolveSnap,\n sanitizeLayouts,\n stackNarrowLayouts,\n stripPanelledControls,\n syncActiveLayoutToDesktopWide,\n syncDesktopWideLayouts,\n} from \"@dlh.io/bideux-dashboard-core\";\nimport type {\n Breakpoint,\n DashboardGridConfig,\n LayoutItem,\n ResizeHandle,\n ResponsiveLayouts,\n WidgetInteractionContext,\n} from \"@dlh.io/bideux-dashboard-core\";\nimport {\n LAYOUT_BREAKPOINT_WIDTHS,\n layoutKeyForWidth,\n readerRendererContext,\n resolveResponsive,\n} from \"@dlh.io/bideux-dashboard-renderers\";\nimport type {\n LayoutKey,\n WidgetInteraction,\n WidgetResult,\n} from \"@dlh.io/bideux-dashboard-renderers\";\nimport type { DashboardSpec, WidgetSpec } from \"@dlh.io/bideux-dashboard-spec\";\n\nimport { cn } from \"./cn.js\";\nimport { useDashboardReader, useIcons, useUiKit } from \"./context.js\";\nimport type { PivotDetailPayload } from \"./ports.js\";\nimport { WidgetActions } from \"./widget-actions.js\";\nimport { WidgetRenderer } from \"./widget-renderer.js\";\n\n/** Rows added to the grid each time the author asks for more room. */\nconst ROW_INCREMENT = 2;\n\n/** Per breakpoint overrides an author previews with, before the dashboard saves them. */\nexport type GridOverrides = Partial<\n Record<Breakpoint, { rowHeight?: number; cols?: number }>\n>;\n\ntype ColumnCounts = Record<LayoutKey, number>;\n\nexport interface DashboardCanvasProps {\n dashboard: DashboardSpec;\n widgets: Record<string, WidgetSpec>;\n results?: Record<string, WidgetResult>;\n /** Widget ids the reader is still waiting on, drawn as skeletons. */\n loadingWidgetIds?: string[];\n loading?: boolean;\n className?: string;\n style?: CSSProperties;\n /** Overrides the measured width, which is how tests and exports fix a size. */\n viewportWidth?: number;\n /** Tiles can be dragged and resized, and carry the edit bar. */\n editMode?: boolean;\n /**\n * Snap on compacts vertically and pushes neighbours aside; snap off places\n * freely and refuses a drop on top of another tile.\n */\n snap?: boolean;\n /** Positions being edited, in place of the ones the widget specs declare. */\n draftLayout?: ResponsiveLayouts;\n gridOverrides?: GridOverrides;\n /** Grid settings being edited, layered over the dashboard's `config.grid`. */\n gridConfig?: Pick<\n DashboardGridConfig,\n \"isBounded\" | \"preventCollision\" | \"maxLayoutWidth\" | \"maxRows\"\n >;\n /** Widgets kept off the grid without being deleted. */\n unplacedWidgetIds?: string[];\n widgetActions?: (widget: WidgetSpec) => ReactNode;\n onLayoutKeyChange?: (key: LayoutKey) => void;\n onBreakpointChange?: (breakpoint: Breakpoint) => void;\n /** Every breakpoint after a drag or resize, plus the key that was edited. */\n onLayoutChange?: (layouts: ResponsiveLayouts, activeKey: LayoutKey) => void;\n onEditWidget?: (widgetId: string) => void;\n onAskWidget?: (widgetId: string) => void;\n onRemoveWidget?: (widgetId: string) => void;\n onDiagnoseWidget?: (widgetId: string) => void;\n /** The author asked for more rows; the next value to save as `maxRows`. */\n onIncreaseMaxRows?: (nextRows: number) => void;\n onInteraction?: (\n interaction: WidgetInteraction,\n context: WidgetInteractionContext,\n ) => void;\n onRetryWidget?: (widgetId: string) => void;\n /** Rerun one widget, which is what the tile's refresh action asks for. */\n onRefreshWidget?: (widgetId: string) => void;\n onPivotDetail?: (payload: PivotDetailPayload) => void;\n}\n\nfunction useContainerWidth(\n override: number | undefined,\n fallback: number,\n): [React.RefObject<HTMLDivElement | null>, number, boolean] {\n const ref = useRef<HTMLDivElement | null>(null);\n const [width, setWidth] = useState(override ?? fallback);\n const [mounted, setMounted] = useState(override !== undefined);\n useEffect(() => {\n if (override !== undefined) {\n setWidth(override);\n setMounted(true);\n return;\n }\n const element = ref.current;\n if (element === null) return;\n const measure = () => {\n setWidth(element.clientWidth > 0 ? element.clientWidth : fallback);\n setMounted(true);\n };\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [override, fallback]);\n return [ref, width, mounted];\n}\n\nconst RESIZE_HANDLES: ReadonlySet<string> = new Set([\n \"s\",\n \"w\",\n \"e\",\n \"n\",\n \"sw\",\n \"nw\",\n \"se\",\n \"ne\",\n]);\n\n/** The configured handles the grid knows how to draw; anything else falls back to the default corner. */\nfunction resizeHandlesFor(config: DashboardGridConfig): ResizeHandle[] {\n const configured = (config.resizeHandles ?? []).filter(\n (handle): handle is ResizeHandle => RESIZE_HANDLES.has(handle),\n );\n if (configured.length > 0) return configured;\n const fallback = (DEFAULT_GRID_CONFIG.resizeHandles ?? []).filter(\n (handle): handle is ResizeHandle => RESIZE_HANDLES.has(handle),\n );\n return fallback.length > 0 ? fallback : [\"se\"];\n}\n\nfunction bottomRow(items: readonly LayoutItem[]): number {\n return items.reduce((lowest, item) => Math.max(lowest, item.y + item.h), 0);\n}\n\nfunction pixelHeight(\n rows: number,\n rowHeight: number,\n marginY: number,\n paddingY: number,\n): number {\n const safeRows = Math.max(0, rows);\n return Math.max(\n 0,\n safeRows * rowHeight + Math.max(0, safeRows - 1) * marginY + 2 * paddingY,\n );\n}\n\n/**\n * The dashboard grid, read or edited.\n *\n * Positions come from the same layout maths the builder saves, drawn by\n * react-grid-layout so that a tile reads and drags at the same pixel. Reading\n * stacks phones into one column; editing keeps the authored grid because an\n * author dragging tiles has to see the positions that will be saved.\n */\nexport function DashboardCanvas({\n dashboard,\n widgets,\n results = {},\n loadingWidgetIds = [],\n loading,\n className,\n style,\n viewportWidth,\n editMode = false,\n snap = false,\n draftLayout,\n gridOverrides = {},\n gridConfig: gridConfigDraft,\n unplacedWidgetIds = [],\n widgetActions,\n onLayoutKeyChange,\n onBreakpointChange,\n onLayoutChange,\n onEditWidget,\n onAskWidget,\n onRemoveWidget,\n onDiagnoseWidget,\n onIncreaseMaxRows,\n onInteraction,\n onRetryWidget,\n onRefreshWidget,\n onPivotDetail,\n}: DashboardCanvasProps) {\n const reader = useDashboardReader();\n const ui = useUiKit();\n const icons = useIcons();\n const Plus = icons.plus;\n\n const gridConfig = useMemo<DashboardGridConfig>(\n () => ({\n ...DEFAULT_GRID_CONFIG,\n ...(dashboard.spec.config?.grid ?? {}),\n ...(gridConfigDraft ?? {}),\n }),\n [dashboard, gridConfigDraft],\n );\n const responsive = useMemo(() => resolveResponsive(dashboard), [dashboard]);\n\n const cols = useMemo<ColumnCounts>(\n () => ({\n lg: gridOverrides.wide?.cols ?? responsive.wide.cols ?? 24,\n md: gridOverrides.desktop?.cols ?? responsive.desktop.cols ?? 24,\n sm: gridOverrides.tablet?.cols ?? responsive.tablet.cols ?? 24,\n xs: gridOverrides.mobile?.cols ?? responsive.mobile.cols ?? 24,\n xxs: gridOverrides.mobile?.cols ?? responsive.mobile.cols ?? 24,\n }),\n [responsive, gridOverrides],\n );\n\n const configuredMaxRows =\n typeof gridConfig.maxRows === \"number\" &&\n Number.isFinite(gridConfig.maxRows)\n ? gridConfig.maxRows\n : undefined;\n\n const maxLayoutWidth =\n gridConfig.maxLayoutWidth === undefined ||\n gridConfig.maxLayoutWidth === null\n ? undefined\n : MAX_LAYOUT_WIDTHS[gridConfig.maxLayoutWidth];\n const effectiveMaxWidth =\n viewportWidth !== undefined && maxLayoutWidth !== undefined\n ? Math.min(viewportWidth, maxLayoutWidth)\n : (viewportWidth ?? maxLayoutWidth);\n\n const [containerRef, width, mounted] = useContainerWidth(\n viewportWidth === undefined ? undefined : effectiveMaxWidth,\n effectiveMaxWidth ?? 1280,\n );\n\n const layoutKey = layoutKeyForWidth(width);\n const breakpoint: Breakpoint = BREAKPOINT_MAP[layoutKey] ?? \"desktop\";\n const reportedKey = useRef<LayoutKey | null>(null);\n useEffect(() => {\n if (!mounted || reportedKey.current === layoutKey) return;\n reportedKey.current = layoutKey;\n onLayoutKeyChange?.(layoutKey);\n onBreakpointChange?.(breakpoint);\n }, [mounted, layoutKey, breakpoint, onLayoutKeyChange, onBreakpointChange]);\n\n const unplaced = useMemo(\n () => new Set(unplacedWidgetIds),\n [unplacedWidgetIds],\n );\n const gridWidgets = useMemo(() => {\n const out: Record<string, WidgetSpec> = {};\n for (const [id, widget] of Object.entries(widgets)) {\n if (!isPanelledControl(widget, dashboard) && !unplaced.has(id)) {\n out[id] = widget;\n }\n }\n return out;\n }, [widgets, dashboard, unplaced]);\n const gridWidgetIds = useMemo(\n () => new Set(Object.keys(gridWidgets)),\n [gridWidgets],\n );\n\n // The positions exactly as the specs or the draft declare them, before\n // anything is separated, so what had to move can be named.\n const declared = useMemo<ResponsiveLayouts>(\n () =>\n draftLayout === undefined\n ? buildBaseLayouts(\n widgets,\n dashboard,\n gridOverrides,\n unplacedWidgetIds,\n configuredMaxRows,\n { resolve: false },\n )\n : stripPanelledControls(draftLayout, widgets, dashboard),\n [\n draftLayout,\n widgets,\n dashboard,\n gridOverrides,\n unplacedWidgetIds,\n configuredMaxRows,\n ],\n );\n\n const safe = useMemo<ResponsiveLayouts>(\n () =>\n sanitizeLayouts(\n draftLayout === undefined\n ? declared\n : syncDesktopWideLayouts(declared, cols),\n cols,\n configuredMaxRows,\n ),\n [draftLayout, declared, cols, configuredMaxRows],\n );\n\n const covered = useMemo<ResponsiveLayouts>(\n () =>\n ensureLayoutCoverage(\n safe,\n widgets,\n dashboard,\n gridOverrides,\n unplacedWidgetIds,\n configuredMaxRows,\n ),\n [\n safe,\n widgets,\n dashboard,\n gridOverrides,\n unplacedWidgetIds,\n configuredMaxRows,\n ],\n );\n\n // Tiles that had to be separated because they shared a cell. Without saying\n // so, the grid drawn here would silently disagree with what is saved.\n const moved = useMemo(\n () => movedIds(declared, safe, layoutKey),\n [declared, safe, layoutKey],\n );\n\n const layouts = useMemo<ResponsiveLayouts>(() => {\n const placed = filterLayoutsByIds(covered, gridWidgetIds);\n return editMode ? placed : stackNarrowLayouts(placed, cols);\n }, [covered, gridWidgetIds, editMode, cols]);\n\n const breakpointConfig = responsive[breakpoint];\n const margin: [number, number] = [\n breakpointConfig.margin?.[0] ?? 8,\n breakpointConfig.margin?.[1] ?? 8,\n ];\n const configuredPadding =\n breakpointConfig.containerPadding ?? gridConfig.containerPadding;\n const containerPadding: [number, number] =\n configuredPadding === undefined || configuredPadding === null\n ? margin\n : [configuredPadding[0] ?? margin[0], configuredPadding[1] ?? margin[1]];\n const colCount = cols[layoutKey];\n\n const { compactType, preventCollision } = resolveSnap(gridConfig, snap);\n\n const rowHeightFloor = breakpointConfig.row_height ?? 30;\n const columnWidth =\n (width - 2 * containerPadding[0] - margin[0] * (colCount - 1)) / colCount;\n // A square cell of a twenty column grid is tiny on a phone, so on the small\n // breakpoints the breakpoint's own row height is the floor.\n const smallBreakpoint = breakpoint === \"mobile\" || breakpoint === \"tablet\";\n const squareHeight = smallBreakpoint\n ? Math.max(columnWidth, rowHeightFloor, 1)\n : Math.max(columnWidth, 1);\n const rowHeight = Math.max(\n 1,\n gridOverrides[breakpoint]?.rowHeight ??\n (gridConfig.squareCells === false ? rowHeightFloor : squareHeight),\n );\n\n // The row limit only ever grows the grid. Clamping a tile back inside it is\n // what used to drop it on top of the row above.\n const effectiveMaxRows =\n configuredMaxRows === undefined\n ? undefined\n : Math.max(\n configuredMaxRows,\n requiredRows(covered),\n requiredRows(layouts),\n );\n\n const activeLayout: LayoutItem[] = layouts[layoutKey] ?? [];\n const rawBottom = bottomRow(activeLayout);\n const gridBottom =\n effectiveMaxRows === undefined\n ? rawBottom\n : Math.min(rawBottom, effectiveMaxRows);\n const containerHeight = pixelHeight(\n gridBottom,\n rowHeight,\n margin[1],\n containerPadding[1],\n );\n const gridHeight =\n effectiveMaxRows === undefined\n ? undefined\n : pixelHeight(\n effectiveMaxRows,\n rowHeight,\n margin[1],\n containerPadding[1],\n );\n\n const handleUserLayoutChange = useCallback(\n (layout: Layout) => {\n if (!editMode || onLayoutChange === undefined) return;\n const edited: LayoutItem[] = layout.map((item) => ({\n i: item.i,\n x: item.x,\n y: item.y,\n w: item.w,\n h: item.h,\n ...(item.minW === undefined ? {} : { minW: item.minW }),\n ...(item.maxW === undefined ? {} : { maxW: item.maxW }),\n ...(item.minH === undefined ? {} : { minH: item.minH }),\n ...(item.maxH === undefined ? {} : { maxH: item.maxH }),\n }));\n const synced = syncActiveLayoutToDesktopWide(\n { [layoutKey]: edited },\n layoutKey,\n cols,\n );\n onLayoutChange(mergeLayouts(covered, synced), layoutKey);\n },\n [editMode, onLayoutChange, layoutKey, cols, covered],\n );\n\n const context = useMemo(() => readerRendererContext(dashboard), [dashboard]);\n\n const rootStyle: CSSProperties = { width: \"100%\", ...style };\n if (effectiveMaxWidth !== undefined) rootStyle.maxWidth = effectiveMaxWidth;\n\n const resizeHandles = useMemo(\n () => resizeHandlesFor(gridConfig),\n [gridConfig],\n );\n\n return (\n <div\n ref={containerRef}\n className={cn(\n \"bideux-canvas relative mx-auto flex w-full max-w-full flex-col\",\n className,\n )}\n style={rootStyle}\n data-dashboard-canvas=\"\"\n data-layout-key={layoutKey}\n data-breakpoint={breakpoint}\n data-edit-mode={editMode ? \"true\" : undefined}\n data-capture={reader.capture ? \"true\" : undefined}\n >\n {mounted && (\n <>\n {editMode && (\n <GridBackground\n width={width}\n cols={colCount}\n rowHeight={rowHeight}\n margin={margin}\n containerPadding={containerPadding}\n rows={effectiveMaxRows ?? \"auto\"}\n height={gridHeight ?? containerHeight}\n color=\"var(--muted-foreground)\"\n borderRadius={0}\n style={{ opacity: 0.12 }}\n />\n )}\n <Responsive\n width={width}\n breakpoints={LAYOUT_BREAKPOINT_WIDTHS}\n cols={cols}\n layouts={layouts as GridLayouts}\n rowHeight={rowHeight}\n margin={margin}\n containerPadding={containerPadding}\n isDraggable={editMode}\n isResizable={editMode}\n isBounded={gridConfig.isBounded ?? true}\n {...(typeof gridConfig.draggableHandle === \"string\"\n ? { draggableHandle: gridConfig.draggableHandle }\n : {})}\n {...(typeof gridConfig.draggableCancel === \"string\"\n ? { draggableCancel: gridConfig.draggableCancel }\n : {})}\n resizeHandles={resizeHandles}\n compactType={compactType}\n preventCollision={preventCollision}\n allowOverlap={gridConfig.allowOverlap ?? false}\n {...(effectiveMaxRows === undefined\n ? {}\n : { maxRows: effectiveMaxRows })}\n style={{\n minHeight:\n editMode && gridHeight !== undefined\n ? gridHeight\n : containerHeight,\n }}\n useCSSTransforms\n onDragStop={handleUserLayoutChange}\n onResizeStop={handleUserLayoutChange}\n >\n {Object.entries(gridWidgets).map(([id, widget]) => {\n const result = results[id];\n return (\n <div\n key={id}\n data-grid-item={id}\n className={cn(\n editMode && \"bideux-canvas-edit dashboard-canvas-edit\",\n )}\n >\n <WidgetRenderer\n widget={widget}\n {...(result === undefined ? {} : { result })}\n context={context}\n loading={loading === true || loadingWidgetIds.includes(id)}\n editMode={editMode}\n {...(onEditWidget === undefined\n ? {}\n : { onEdit: onEditWidget })}\n {...(onAskWidget === undefined\n ? {}\n : { onAsk: onAskWidget })}\n {...(onRemoveWidget === undefined\n ? {}\n : { onRemove: onRemoveWidget })}\n {...(onDiagnoseWidget === undefined\n ? {}\n : { onDiagnose: onDiagnoseWidget })}\n actions={\n widgetActions === undefined ? (\n <WidgetActions\n widget={widget}\n {...(result === undefined ? {} : { result })}\n {...(onRefreshWidget === undefined\n ? {}\n : {\n onRefresh: () => {\n onRefreshWidget(id);\n },\n })}\n />\n ) : (\n widgetActions(widget)\n )\n }\n {...(onInteraction === undefined ? {} : { onInteraction })}\n {...(onPivotDetail === undefined ? {} : { onPivotDetail })}\n {...(onRetryWidget === undefined\n ? {}\n : {\n onRetry: () => {\n onRetryWidget(id);\n },\n })}\n />\n </div>\n );\n })}\n </Responsive>\n {editMode && moved.length > 0 && (\n <div\n className=\"mt-2 rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-900 dark:border-amber-900 dark:bg-amber-950 dark:text-amber-200\"\n role=\"status\"\n >\n {moved.length === 1\n ? \"1 widget did not fit where it was placed, either on top of another widget or wider than this breakpoint, so it has been moved to a free spot: \"\n : `${String(moved.length)} widgets did not fit where they were placed, either on top of another widget or wider than this breakpoint, so they have been moved to free spots: `}\n {moved.join(\", \")}. Save the layout to keep these positions.\n </div>\n )}\n {editMode &&\n effectiveMaxRows !== undefined &&\n onIncreaseMaxRows !== undefined && (\n <div className=\"mt-2 flex flex-col items-center gap-1\">\n <ui.Button\n variant=\"secondary\"\n size=\"sm\"\n ariaLabel=\"Add rows\"\n title=\"Add rows\"\n onClick={() => {\n onIncreaseMaxRows(effectiveMaxRows + ROW_INCREMENT);\n }}\n >\n <Plus className=\"mr-2 h-4 w-4\" />\n Add rows\n </ui.Button>\n <p className=\"text-xs text-muted-foreground\">\n This change applies when you click Save layout.\n </p>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n readDashboardOutline,\n yamlSyntaxMarkers,\n} from \"@dlh.io/bideux-dashboard-core\";\n\nimport { useAuthoring } from \"./authoring-context.js\";\n\nexport interface DashboardYamlEditorProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Runs after a successful save so the page can redraw in place. */\n onSaved: () => void | Promise<void>;\n}\n\n/**\n * The whole dashboard document as text: pages, widget order, grid and filter\n * panel settings. Widgets keep their own editor, so the refs listed here are\n * checked against the inventory but their bodies are not shown.\n *\n * Appears only when the host wired `loadDashboardDocument` and\n * `saveDashboardDocument`.\n */\nexport function DashboardYamlEditor({\n open,\n onOpenChange,\n onSaved,\n}: DashboardYamlEditorProps) {\n const {\n transport,\n ui,\n editor: Editor,\n dashboardId,\n canEdit,\n } = useAuthoring();\n const [value, setValue] = useState(\"\");\n const [saved, setSaved] = useState(\"\");\n const [updatedAt, setUpdatedAt] = useState<string | undefined>(undefined);\n const [knownWidgets, setKnownWidgets] = useState<Set<string> | null>(null);\n const [loading, setLoading] = useState(false);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const onSavedRef = useRef(onSaved);\n const onOpenChangeRef = useRef(onOpenChange);\n useEffect(() => {\n onSavedRef.current = onSaved;\n onOpenChangeRef.current = onOpenChange;\n }, [onSaved, onOpenChange]);\n\n useEffect(() => {\n if (!open || transport.loadDashboardDocument === undefined) return;\n const loadDocument = transport.loadDashboardDocument;\n let cancelled = false;\n const controller = new AbortController();\n async function load(): Promise<void> {\n setLoading(true);\n setError(null);\n try {\n const [document, inventory] = await Promise.all([\n loadDocument({ dashboardId, signal: controller.signal }),\n transport.listWidgets({ dashboardId, signal: controller.signal }),\n ]);\n if (cancelled) return;\n setValue(document.specYaml);\n setSaved(document.specYaml);\n setUpdatedAt(document.updatedAt);\n setKnownWidgets(new Set(Object.keys(inventory.widgets)));\n } catch (err) {\n if (!cancelled) {\n setError(\n err instanceof Error\n ? err.message\n : \"Failed to load dashboard YAML\",\n );\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n void load();\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [transport, dashboardId, open]);\n\n const outline = useMemo(() => readDashboardOutline(value), [value]);\n const issues = useMemo(() => {\n if (value === \"\") return [];\n const out = [...outline.issues];\n if (knownWidgets !== null) {\n for (const ref of outline.widgetRefs) {\n if (!knownWidgets.has(ref)) {\n out.push(`Widget ${ref} is listed on a page but does not exist.`);\n }\n }\n }\n if (outline.id !== null && outline.id !== dashboardId) {\n out.push(\n `metadata.id is ${outline.id} but this dashboard is ${dashboardId}; the id cannot change here.`,\n );\n }\n return out;\n }, [value, outline, knownWidgets, dashboardId]);\n const markers = useMemo(() => yamlSyntaxMarkers(value), [value]);\n const dirty = value !== saved;\n\n function handleOpenChange(next: boolean): void {\n if (!next) {\n setValue(\"\");\n setSaved(\"\");\n setError(null);\n }\n onOpenChangeRef.current(next);\n }\n\n async function persist(): Promise<void> {\n if (transport.saveDashboardDocument === undefined || issues.length > 0) {\n return;\n }\n setSaving(true);\n setError(null);\n try {\n const result = await transport.saveDashboardDocument({\n dashboardId,\n specYaml: value,\n ...(updatedAt === undefined ? {} : { expectedUpdatedAt: updatedAt }),\n });\n setSaved(result.specYaml);\n setUpdatedAt(result.updatedAt);\n await onSavedRef.current();\n handleOpenChange(false);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to save dashboard YAML\",\n );\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <ui.Modal\n open={open}\n size=\"xl\"\n title=\"Dashboard YAML\"\n description=\"Pages, widget order, grid and filter panel settings. Widget bodies are edited from the widget itself. Nothing changes until you save.\"\n onOpenChange={handleOpenChange}\n footer={\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-xs text-muted-foreground\">\n {outline.tabIds.length > 1\n ? `${String(outline.tabIds.length)} pages, shown as tabs`\n : \"One page, no tab strip\"}\n </span>\n <div className=\"flex items-center gap-3\">\n <ui.Button\n variant=\"secondary\"\n disabled={saving}\n onClick={() => {\n handleOpenChange(false);\n }}\n >\n Cancel\n </ui.Button>\n <ui.Button\n variant=\"primary\"\n disabled={\n saving || loading || !canEdit || !dirty || issues.length > 0\n }\n onClick={() => {\n void persist();\n }}\n >\n {saving ? \"Saving...\" : \"Save\"}\n </ui.Button>\n </div>\n </div>\n }\n >\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {loading ? (\n <p className=\"p-6 text-sm text-muted-foreground\">\n Loading dashboard YAML...\n </p>\n ) : (\n <Editor\n value={value}\n language=\"yaml\"\n readOnly={!canEdit}\n markers={markers}\n ariaLabel=\"Dashboard YAML\"\n onChange={setValue}\n />\n )}\n </div>\n {error !== null ? (\n <div className=\"border-t bg-red-50 px-6 py-3 text-sm text-red-700\">\n {error}\n </div>\n ) : null}\n {issues.length > 0 ? (\n <div className=\"border-t bg-amber-50 px-6 py-3 text-sm text-amber-900\">\n <div className=\"font-medium\">Fix these before saving:</div>\n <ul className=\"mt-1 list-disc space-y-0.5 pl-6 text-xs\">\n {issues.map((issue) => (\n <li key={issue}>{issue}</li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n </ui.Modal>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { cn } from \"./cn.js\";\nimport { useAuthoring } from \"./authoring-context.js\";\n\n/**\n * Click to edit one field.\n *\n * The builder is a view of the document first and a form second: a value reads\n * as text until you click it, and only the field you clicked becomes an input.\n * Enter or clicking away keeps the change, Escape abandons it. Muted text means\n * read-only, never \"empty\", so an author can tell what they may change.\n */\ninterface FieldShellProps {\n label: string;\n hint?: string | undefined;\n children: ReactNode;\n}\n\nfunction FieldShell({ label, hint, children }: FieldShellProps) {\n return (\n <div className=\"space-y-1\">\n <span className=\"text-xs text-muted-foreground\">{label}</span>\n {children}\n {hint ? (\n <p className=\"text-[11px] text-muted-foreground\">{hint}</p>\n ) : null}\n </div>\n );\n}\n\nfunction ValueButton({\n label,\n value,\n empty,\n readOnly,\n mono,\n onClick,\n}: {\n label: string;\n value: string;\n empty: string;\n readOnly: boolean;\n mono?: boolean | undefined;\n onClick: () => void;\n}) {\n const isEmpty = value === \"\";\n return (\n <button\n type=\"button\"\n disabled={readOnly}\n aria-label={label}\n onClick={onClick}\n className={cn(\n \"flex min-h-9 w-full items-center justify-between gap-2 rounded-md border border-transparent px-3 py-1.5 text-left text-sm\",\n readOnly\n ? \"cursor-default text-muted-foreground\"\n : \"hover:border-input hover:bg-muted/50\",\n isEmpty && !readOnly ? \"border-dashed border-input\" : \"\",\n mono && !isEmpty ? \"font-mono text-[13px]\" : \"\",\n )}\n >\n <span className={cn(\"truncate\", isEmpty ? \"text-muted-foreground\" : \"\")}>\n {isEmpty ? empty : value}\n </span>\n </button>\n );\n}\n\nconst EDITING = \"border-primary ring-1 ring-primary/40\";\n\nexport interface InlineTextProps {\n label: string;\n value: string | null;\n /** What the field says when it holds nothing, for example \"Set a label\". */\n empty: string;\n placeholder?: string | undefined;\n hint?: string | undefined;\n readOnly?: boolean | undefined;\n mono?: boolean | undefined;\n /**\n * Opens straight into the input, for a thing the author just created: reading\n * a field that has never held anything is not worth a click.\n */\n startOpen?: boolean | undefined;\n onCommit: (value: string) => void;\n}\n\nexport function InlineText({\n label,\n value,\n empty,\n placeholder,\n hint,\n readOnly = false,\n mono,\n startOpen = false,\n onCommit,\n}: InlineTextProps) {\n const { ui } = useAuthoring();\n const [editing, setEditing] = useState(startOpen && !readOnly);\n const [draft, setDraft] = useState(value ?? \"\");\n const wrapper = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!editing) return;\n const input = wrapper.current?.querySelector(\"input\");\n input?.focus();\n }, [editing]);\n\n function commit(next: string): void {\n setEditing(false);\n if (next !== (value ?? \"\")) onCommit(next);\n }\n\n return (\n <FieldShell label={label} hint={hint}>\n {editing ? (\n <div\n ref={wrapper}\n onBlur={() => {\n commit(draft);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setDraft(value ?? \"\");\n setEditing(false);\n }\n }}\n >\n <ui.TextInput\n value={draft}\n ariaLabel={label}\n placeholder={placeholder}\n className={cn(EDITING, mono ? \"font-mono text-[13px]\" : \"\")}\n onChange={setDraft}\n onCommit={() => {\n commit(draft);\n }}\n />\n </div>\n ) : (\n <ValueButton\n label={label}\n value={value ?? \"\"}\n empty={empty}\n readOnly={readOnly}\n mono={mono}\n onClick={() => {\n setDraft(value ?? \"\");\n setEditing(true);\n }}\n />\n )}\n </FieldShell>\n );\n}\n\nexport interface InlineOption {\n value: string;\n label: string;\n}\n\nexport interface InlineSelectProps {\n label: string;\n value: string | null;\n options: InlineOption[];\n empty: string;\n hint?: string | undefined;\n readOnly?: boolean | undefined;\n onCommit: (value: string) => void;\n}\n\nexport function InlineSelect({\n label,\n value,\n options,\n empty,\n hint,\n readOnly = false,\n onCommit,\n}: InlineSelectProps) {\n const { ui } = useAuthoring();\n const [editing, setEditing] = useState(false);\n const chosen = options.find((option) => option.value === value);\n\n return (\n <FieldShell label={label} hint={hint}>\n {editing ? (\n <ui.Select\n value={value ?? \"\"}\n options={options}\n ariaLabel={label}\n placeholder={empty}\n className={EDITING}\n onChange={(next) => {\n setEditing(false);\n if (next !== value) onCommit(next);\n }}\n />\n ) : (\n <ValueButton\n label={label}\n value={chosen?.label ?? \"\"}\n empty={empty}\n readOnly={readOnly}\n onClick={() => {\n setEditing(true);\n }}\n />\n )}\n </FieldShell>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport {\n AGGREGATIONS,\n aggregationExpression,\n blockingKeys,\n datasetFragment,\n dimensionTypeFor,\n parseAggregation,\n preservedKeys,\n readModelOutline,\n removeDataset,\n upsertDataset,\n type Aggregation,\n type BuilderDataset,\n type BuilderMetric,\n} from \"@dlh.io/bideux-dashboard-core\";\n\nimport { useAuthoring } from \"./authoring-context.js\";\nimport type {\n DataModelConnection,\n DatasetPreviewResult,\n WarehouseTable,\n} from \"./authoring-ports.js\";\nimport { BuilderYamlStrip, PreservedKeysNote } from \"./builder-fields.js\";\nimport { cn } from \"./cn.js\";\nimport { InlineSelect, InlineText } from \"./inline-edit.js\";\n\n/** Placeholder value for \"no location column picked\", which a select needs. */\nconst NO_COLUMN = \"__none__\";\nconst MODEL_DEFAULT_STORE = \"__model_default__\";\n\n/**\n * Write `{mart_schema}` instead of the schema the admin happens to be connected\n * to, so the same model works in every environment.\n */\nfunction sourceFor(\n table: WarehouseTable,\n connectionSchema: string | null,\n): string {\n const schema =\n connectionSchema && table.schemaName === connectionSchema\n ? \"{mart_schema}\"\n : table.schemaName;\n return `${schema}.${table.tableName}`;\n}\n\nfunction newDatasetId(existing: string[]): string {\n let id = \"new_dataset\";\n let n = 2;\n while (existing.includes(id)) {\n id = `new_dataset_${n}`;\n n += 1;\n }\n return id;\n}\n\n/**\n * Add a column to a hand-written expression without needing a cursor.\n *\n * The inline field has no caret to insert at, so the rule is stated in the UI:\n * an empty expression becomes an aggregation of the column, and anything else\n * gets the column appended where an operator or bracket left off.\n */\nexport function appendColumn(expression: string, column: string): string {\n const text = expression.trim();\n if (!text) return `SUM(${column})`;\n if (text.endsWith(\"(\") || text.endsWith(\",\") || text.endsWith(\" \")) {\n return `${text}${column}`;\n }\n return `${text} ${column}`;\n}\n\n/** The columns the table really has, so none has to be typed from memory. */\nfunction ColumnInsertPicker({\n columns,\n onInsert,\n}: {\n columns: string[];\n onInsert: (column: string) => void;\n}) {\n const { ui } = useAuthoring();\n const [filter, setFilter] = useState(\"\");\n const needle = filter.trim().toUpperCase();\n const matching = (\n needle\n ? columns.filter((column) => column.toUpperCase().includes(needle))\n : columns\n ).slice(0, 40);\n\n return (\n <div className=\"space-y-2 rounded-md border border-dashed p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"text-[11px] text-muted-foreground\">\n Click a column to add it. An empty expression becomes SUM(column).\n </p>\n <ui.TextInput\n value={filter}\n ariaLabel=\"Find a column\"\n placeholder=\"Find a column\"\n onChange={setFilter}\n />\n </div>\n <div className=\"flex max-h-28 flex-wrap gap-1 overflow-auto\">\n {matching.length === 0 ? (\n <p className=\"text-[11px] text-muted-foreground\">\n {`No column matches ${filter}.`}\n </p>\n ) : (\n matching.map((column) => (\n <ui.Button\n key={column}\n size=\"sm\"\n variant=\"secondary\"\n className=\"font-mono text-[11px]\"\n onClick={() => {\n onInsert(column);\n }}\n >\n {column}\n </ui.Button>\n ))\n )}\n </div>\n </div>\n );\n}\n\nfunction MetricRow({\n metric,\n columns,\n readOnly,\n onChange,\n onRemove,\n}: {\n metric: BuilderMetric;\n columns: string[];\n readOnly: boolean;\n onChange: (next: BuilderMetric) => void;\n onRemove: () => void;\n}) {\n const { ui } = useAuthoring();\n const parsed = parseAggregation(metric.expression);\n const [advanced, setAdvanced] = useState(parsed === null);\n\n return (\n <div className=\"space-y-2 rounded-md border p-3\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <InlineText\n label=\"Id widgets ask for\"\n value={metric.id}\n empty=\"Name this metric\"\n placeholder=\"net_sales\"\n mono\n readOnly={readOnly}\n onCommit={(value) => {\n onChange({ ...metric, id: value });\n }}\n />\n <InlineText\n label=\"Label (optional)\"\n value={metric.label}\n empty={`Defaults to ${metric.id}`}\n placeholder={metric.id}\n readOnly={readOnly}\n onCommit={(value) => {\n onChange({ ...metric, label: value || null });\n }}\n />\n </div>\n\n {advanced || parsed === null ? (\n <div className=\"space-y-2\">\n <InlineText\n label=\"SQL expression\"\n value={metric.expression}\n empty=\"Write the aggregation\"\n placeholder=\"SUM(NET_SALES)\"\n mono\n readOnly={readOnly}\n onCommit={(value) => {\n onChange({ ...metric, expression: value });\n }}\n />\n {!readOnly && columns.length > 0 ? (\n <ColumnInsertPicker\n columns={columns}\n onInsert={(column) => {\n onChange({\n ...metric,\n expression: appendColumn(metric.expression, column),\n });\n }}\n />\n ) : null}\n </div>\n ) : (\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <InlineSelect\n label=\"Aggregation\"\n value={parsed.aggregation}\n empty=\"Pick an aggregation\"\n readOnly={readOnly}\n options={AGGREGATIONS.map((entry) => ({\n value: entry,\n label: entry,\n }))}\n onCommit={(value) => {\n onChange({\n ...metric,\n expression: aggregationExpression(\n value as Aggregation,\n parsed.column,\n ),\n });\n }}\n />\n {columns.length > 0 ? (\n <InlineSelect\n label=\"Column\"\n value={parsed.column}\n empty=\"Pick a column\"\n readOnly={readOnly}\n options={(columns.includes(parsed.column)\n ? columns\n : [parsed.column, ...columns]\n ).map((column) => ({ value: column, label: column }))}\n onCommit={(value) => {\n onChange({\n ...metric,\n expression: aggregationExpression(parsed.aggregation, value),\n });\n }}\n />\n ) : (\n <InlineText\n label=\"Column\"\n value={parsed.column}\n empty=\"Name the column\"\n placeholder=\"NET_SALES\"\n mono\n readOnly={readOnly}\n onCommit={(value) => {\n onChange({\n ...metric,\n expression: aggregationExpression(parsed.aggregation, value),\n });\n }}\n />\n )}\n </div>\n )}\n\n <div className=\"flex items-center justify-between\">\n <button\n type=\"button\"\n className=\"text-xs text-muted-foreground underline-offset-2 hover:underline\"\n onClick={() => {\n setAdvanced((current) => !current);\n }}\n >\n {advanced || parsed === null\n ? \"Back to aggregation and column\"\n : \"Write the SQL myself\"}\n </button>\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={readOnly}\n ariaLabel={`Remove metric ${metric.id}`}\n onClick={onRemove}\n >\n Remove\n </ui.Button>\n </div>\n </div>\n );\n}\n\nexport interface DatasetBuilderPanelProps {\n specYaml: string;\n onChange: (specYaml: string) => void;\n readOnly: boolean;\n connections: DataModelConnection[];\n /** False while the connection list is still in flight. */\n connectionsReady: boolean;\n onEditInYaml: () => void;\n}\n\n/**\n * One named source of rows plus the fields widgets may ask for.\n *\n * A dataset the builder has no form for is shown rather than edited, because\n * rewriting a document whose keys are not understood is how an author loses\n * work. Everything unsupported is named, never dropped.\n */\nexport function DatasetBuilderPanel({\n specYaml,\n onChange,\n readOnly,\n connections,\n connectionsReady,\n onEditInYaml,\n}: DatasetBuilderPanelProps) {\n const { transport, ui } = useAuthoring();\n const outline = useMemo(() => readModelOutline(specYaml), [specYaml]);\n const { dataStores, datasets } = outline;\n const [selectedId, setSelectedId] = useState<string | null>(null);\n /** A dataset added just now opens its fields instead of reading as blank. */\n const [addedId, setAddedId] = useState<string | null>(null);\n const [tables, setTables] = useState<WarehouseTable[] | null>(null);\n const [tablesError, setTablesError] = useState<string | null>(null);\n const [tableFilter, setTableFilter] = useState(\"\");\n const [preview, setPreview] = useState<DatasetPreviewResult | null>(null);\n const [previewError, setPreviewError] = useState<string | null>(null);\n const [previewing, setPreviewing] = useState(false);\n\n const selected =\n datasets.find((dataset) => dataset.id === selectedId) ??\n datasets[0] ??\n null;\n\n /** The connection a dataset's rows come from, for introspection. */\n const connectionId = useMemo(() => {\n if (!selected) return null;\n const store =\n dataStores.find((entry) => entry.id === selected.dataStoreId) ??\n dataStores.find((entry) => entry.isDefault) ??\n null;\n return store?.dataModelId ?? connections[0]?.id ?? null;\n }, [connections, dataStores, selected]);\n\n useEffect(() => {\n // Asking before the connections arrive would ask again the moment they do.\n if (!connectionsReady) return;\n let cancelled = false;\n const controller = new AbortController();\n async function load(): Promise<void> {\n setTablesError(null);\n try {\n const listed = await transport.listWarehouseTables({\n connectionId,\n signal: controller.signal,\n });\n if (!cancelled) setTables(listed);\n } catch (error) {\n if (cancelled) return;\n setTables([]);\n setTablesError(\n error instanceof Error\n ? error.message\n : \"Could not read the warehouse\",\n );\n }\n }\n void load();\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [transport, connectionId, connectionsReady]);\n\n const write = useCallback(\n (next: BuilderDataset, originalId?: string) => {\n onChange(upsertDataset(specYaml, next, originalId));\n setSelectedId(next.id);\n setPreview(null);\n },\n [onChange, specYaml],\n );\n\n const source = selected ? selected.source : null;\n\n /** Columns of the table this dataset reads, for the pickers. */\n const tableColumns = useMemo(() => {\n if (!source || !tables) return [];\n const bare = source.replace(\"{mart_schema}.\", \"\").toUpperCase();\n const match = tables.find(\n (table) =>\n `${table.schemaName}.${table.tableName}`.toUpperCase() === bare ||\n table.tableName.toUpperCase() === bare.split(\".\").pop(),\n );\n return match?.columns ?? [];\n }, [source, tables]);\n\n const columnNames = tableColumns.map((column) => column.name);\n\n const filteredTables = useMemo(() => {\n if (!tables) return [];\n const needle = tableFilter.trim().toUpperCase();\n const matching = needle\n ? tables.filter((table) =>\n `${table.schemaName}.${table.tableName}`\n .toUpperCase()\n .includes(needle),\n )\n : tables;\n return matching.slice(0, 200);\n }, [tableFilter, tables]);\n\n function addDataset(): void {\n const id = newDatasetId(datasets.map((dataset) => dataset.id));\n setAddedId(id);\n write({\n id,\n name: null,\n dataStoreId: dataStores.find((store) => store.isDefault)?.id ?? null,\n source: null,\n sourceType: \"table\",\n filterField: null,\n dimensions: [],\n metrics: [],\n rollup: null,\n unsupportedKeys: [],\n });\n }\n\n async function runPreview(dataset: BuilderDataset): Promise<void> {\n setPreviewing(true);\n setPreviewError(null);\n setPreview(null);\n try {\n setPreview(\n await transport.previewDataset({\n specYaml,\n datasetId: dataset.id,\n limit: 20,\n }),\n );\n } catch (error) {\n setPreviewError(\n error instanceof Error ? error.message : \"Could not run the preview\",\n );\n } finally {\n setPreviewing(false);\n }\n }\n\n function toggleDimension(\n column: string,\n warehouseType: string,\n on: boolean,\n ): void {\n if (!selected) return;\n const dimensions = on\n ? [\n ...selected.dimensions,\n {\n id: column.toLowerCase(),\n column: column.toLowerCase() === column ? null : column,\n type: dimensionTypeFor(warehouseType),\n isTime: dimensionTypeFor(warehouseType) === \"date\",\n },\n ]\n : selected.dimensions.filter(\n (dimension) =>\n (dimension.column ?? dimension.id).toUpperCase() !==\n column.toUpperCase(),\n );\n write({ ...selected, dimensions });\n }\n\n const blocking = blockingKeys(selected?.unsupportedKeys ?? []);\n const preserved = preservedKeys(selected?.unsupportedKeys ?? []);\n\n /** Read-only either because the admin may not edit, or the builder cannot. */\n const locked = readOnly || blocking.length > 0;\n\n const rollupWarning = Boolean(\n selected?.rollup &&\n selected.filterField &&\n !selected.rollup.grain.includes(selected.filterField),\n );\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"text-sm font-medium\">Datasets</div>\n <p className=\"text-xs text-muted-foreground\">\n One named source of rows plus the fields widgets may ask for. A\n widget names a dataset, never a table.\n </p>\n </div>\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={readOnly}\n onClick={addDataset}\n >\n Add dataset\n </ui.Button>\n </div>\n\n {datasets.length === 0 ? (\n <p className=\"rounded-md border border-dashed p-4 text-sm text-muted-foreground\">\n No datasets yet. Add one, pick its table, then tick the columns\n widgets may group by.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {datasets.map((dataset) => (\n <ui.Button\n key={dataset.id}\n size=\"sm\"\n variant={dataset.id === selected?.id ? \"primary\" : \"secondary\"}\n onClick={() => {\n setSelectedId(dataset.id);\n setAddedId(null);\n setPreview(null);\n }}\n >\n {dataset.id}\n {!dataset.filterField ? (\n <ui.Badge tone=\"danger\" className=\"ml-2\">\n no location column\n </ui.Badge>\n ) : null}\n </ui.Button>\n ))}\n </div>\n )}\n\n {selected && blocking.length > 0 ? (\n <div className=\"space-y-2 rounded-md border border-amber-300 bg-amber-50 p-4 text-sm text-amber-900\">\n <div className=\"font-medium\">\n {`${selected.id} builds its rows with ${blocking.join(\", \")}, which the builder has no form for`}\n </div>\n <p>\n It is shown read-only rather than edited, so nothing here is\n dropped. Everything it declares keeps working.\n </p>\n <ui.Button size=\"sm\" variant=\"secondary\" onClick={onEditInYaml}>\n {`Edit ${selected.id} in YAML`}\n </ui.Button>\n </div>\n ) : null}\n\n {selected && blocking.length === 0 ? (\n <PreservedKeysNote keys={preserved} />\n ) : null}\n\n {selected ? (\n <div\n key={selected.id}\n className={cn(\n \"space-y-5 rounded-md border p-4\",\n selected.unsupportedKeys.length > 0 ? \"opacity-60\" : \"\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InlineText\n label=\"Id widgets ask for\"\n value={selected.id}\n empty=\"Name this dataset\"\n placeholder=\"daily_sales\"\n mono\n readOnly={locked}\n startOpen={selected.id === addedId}\n onCommit={(value) => {\n write({ ...selected, id: value }, selected.id);\n }}\n />\n <InlineText\n label=\"Label (optional)\"\n value={selected.name}\n empty={`Defaults to ${selected.id}`}\n placeholder={selected.id}\n readOnly={locked}\n onCommit={(value) => {\n write({ ...selected, name: value || null });\n }}\n />\n </div>\n\n <InlineSelect\n label=\"Data store\"\n value={selected.dataStoreId ?? MODEL_DEFAULT_STORE}\n empty=\"Pick a data store\"\n readOnly={locked}\n options={[\n {\n value: MODEL_DEFAULT_STORE,\n label: \"The model's default store\",\n },\n ...dataStores.map((store) => ({\n value: store.id,\n label: store.name ?? store.id,\n })),\n ]}\n onCommit={(value) => {\n write({\n ...selected,\n dataStoreId: value === MODEL_DEFAULT_STORE ? null : value,\n });\n }}\n />\n\n <div className=\"space-y-2\">\n <InlineText\n label=\"Table or view\"\n value={selected.source}\n empty=\"Pick or type a table\"\n placeholder=\"{mart_schema}.RPT_DAILY_SALES_SUMMARY\"\n mono\n readOnly={locked}\n startOpen={selected.id === addedId && !selected.source}\n hint=\"Search below to pick one, or type it if you know the name.\"\n onCommit={(value) => {\n write({ ...selected, source: value || null });\n }}\n />\n {tablesError !== null ? (\n <p className=\"text-xs text-amber-700\">\n {`Could not list tables: ${tablesError}. Type the table above instead.`}\n </p>\n ) : null}\n {tables === null ? (\n <p className=\"text-xs text-muted-foreground\">\n Reading the warehouse...\n </p>\n ) : null}\n {tables && tables.length > 0 ? (\n <>\n <ui.TextInput\n value={tableFilter}\n ariaLabel=\"Search tables and views\"\n placeholder=\"Search tables and views\"\n onChange={setTableFilter}\n />\n <div className=\"max-h-44 overflow-auto rounded-md border\">\n {filteredTables.map((table) => {\n const candidate = sourceFor(table, null);\n return (\n <button\n key={`${table.schemaName}.${table.tableName}`}\n type=\"button\"\n disabled={locked}\n className={cn(\n \"flex w-full items-center justify-between px-3 py-1.5 text-left text-xs hover:bg-muted\",\n candidate === selected.source\n ? \"bg-muted font-medium\"\n : \"\",\n )}\n onClick={() => {\n write({\n ...selected,\n source: candidate,\n sourceType:\n table.tableType === \"view\" ? \"view\" : \"table\",\n });\n }}\n >\n <span>{`${table.schemaName}.${table.tableName}`}</span>\n <span className=\"text-muted-foreground\">\n {table.tableType}\n </span>\n </button>\n );\n })}\n </div>\n </>\n ) : null}\n </div>\n\n <div className=\"space-y-2\">\n <InlineSelect\n label=\"Which column identifies the location?\"\n value={selected.filterField ?? NO_COLUMN}\n empty=\"Pick the location column\"\n readOnly={locked}\n options={[\n { value: NO_COLUMN, label: \"Not set\" },\n ...(columnNames.length > 0\n ? columnNames.map((column) => column.toLowerCase())\n : selected.filterField\n ? [selected.filterField]\n : []\n ).map((column) => ({ value: column, label: column })),\n ]}\n onCommit={(value) => {\n write({\n ...selected,\n filterField: value === NO_COLUMN ? null : value,\n });\n }}\n />\n {!selected.filterField ? (\n <p className=\"text-xs text-destructive\">\n Without it a scoped caller cannot query this dataset, and their\n widget errors instead of showing their own rows.\n </p>\n ) : null}\n </div>\n\n {tableColumns.length > 0 ? (\n <div className=\"space-y-2\">\n <div className=\"text-xs text-muted-foreground\">\n Columns widgets may group or filter by\n </div>\n <div className=\"grid max-h-48 gap-1 overflow-auto rounded-md border p-2 sm:grid-cols-2\">\n {tableColumns.map((column) => {\n const on = selected.dimensions.some(\n (dimension) =>\n (dimension.column ?? dimension.id).toUpperCase() ===\n column.name.toUpperCase(),\n );\n return (\n <ui.Checkbox\n key={column.name}\n checked={on}\n disabled={locked}\n label={\n <span className=\"flex items-center gap-2 text-xs\">\n <span>{column.name.toLowerCase()}</span>\n <span className=\"text-muted-foreground\">\n {dimensionTypeFor(column.dataType)}\n </span>\n </span>\n }\n onChange={(checked) => {\n toggleDimension(column.name, column.dataType, checked);\n }}\n />\n );\n })}\n </div>\n </div>\n ) : null}\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-xs text-muted-foreground\">Metrics</div>\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={locked}\n onClick={() => {\n write({\n ...selected,\n metrics: [\n ...selected.metrics,\n {\n id: `metric_${selected.metrics.length + 1}`,\n label: null,\n expression: aggregationExpression(\n \"SUM\",\n columnNames[0] ?? \"COLUMN\",\n ),\n type: \"sql\",\n },\n ],\n });\n }}\n >\n Add metric\n </ui.Button>\n </div>\n {selected.metrics.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n No metrics yet. A metric is an aggregation over this table, for\n example Sum of NET_SALES.\n </p>\n ) : (\n selected.metrics.map((metric, index) => (\n <MetricRow\n key={index}\n metric={metric}\n columns={columnNames}\n readOnly={locked}\n onChange={(next) => {\n write({\n ...selected,\n metrics: selected.metrics.map((entry, i) =>\n i === index ? next : entry,\n ),\n });\n }}\n onRemove={() => {\n write({\n ...selected,\n metrics: selected.metrics.filter((_, i) => i !== index),\n });\n }}\n />\n ))\n )}\n </div>\n\n <div className=\"space-y-2\">\n <ui.Checkbox\n checked={selected.rollup !== null}\n disabled={locked}\n label=\"This table has a pre-aggregated rollup to read instead\"\n onChange={(checked) => {\n write({\n ...selected,\n rollup: checked\n ? {\n source: null,\n grain: selected.dimensions.map(\n (dimension) => dimension.id,\n ),\n metrics: selected.metrics.map((metric) => metric.id),\n }\n : null,\n });\n }}\n />\n {selected.rollup ? (\n <div className=\"space-y-2 rounded-md border p-3\">\n <InlineText\n label=\"Rollup table\"\n value={selected.rollup.source}\n empty=\"Name the rollup table\"\n placeholder=\"{mart_schema}.RPT_SALES_BY_STORE_DAY\"\n mono\n readOnly={locked}\n onCommit={(value) => {\n const rollup = selected.rollup;\n if (!rollup) return;\n write({\n ...selected,\n rollup: { ...rollup, source: value || null },\n });\n }}\n />\n <p className=\"text-xs text-muted-foreground\">\n {`Answers a widget only when every column it groups by is in the grain (${\n selected.rollup.grain.join(\", \") || \"none\"\n }) and every metric is one the rollup carries. Anything wider falls back to the table above, so this is an optimisation and never changes what a widget can ask for.`}\n </p>\n {rollupWarning ? (\n <p className=\"text-xs text-destructive\">\n {`The grain does not include ${selected.filterField}, so the rollup is skipped for every scoped caller: the predicate could not be pushed into it.`}\n </p>\n ) : null}\n </div>\n ) : null}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={previewing || !selected.source}\n onClick={() => {\n void runPreview(selected);\n }}\n >\n {previewing ? \"Running...\" : \"Preview 20 rows\"}\n </ui.Button>\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={readOnly}\n onClick={() => {\n onChange(removeDataset(specYaml, selected.id));\n setSelectedId(null);\n setPreview(null);\n }}\n >\n Remove dataset\n </ui.Button>\n <span className=\"text-xs text-muted-foreground\">\n Preview runs the model text as it stands now, saved or not.\n </span>\n </div>\n\n {previewError !== null ? (\n <p className=\"text-xs text-destructive\">{previewError}</p>\n ) : null}\n\n {preview ? (\n <div className=\"space-y-2\">\n <div className=\"text-xs text-muted-foreground\">\n {`${preview.rowCount} rows`}\n {preview.effectiveLocations\n ? `, scoped to ${preview.effectiveLocations.length} locations`\n : \", unscoped for this caller\"}\n </div>\n <div className=\"max-h-56 overflow-auto rounded-md border\">\n <table className=\"w-full text-left text-xs\">\n <thead className=\"bg-muted\">\n <tr>\n {preview.columns.map((column) => (\n <th key={column} className=\"px-2 py-1 font-medium\">\n {column}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {preview.rows.map((row, index) => (\n <tr key={index} className=\"border-t\">\n {preview.columns.map((column) => (\n <td key={column} className=\"px-2 py-1\">\n {String(row[column] ?? \"\")}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {preview.sql !== null ? (\n <pre className=\"max-h-32 overflow-auto rounded-md border bg-muted/40 p-2 text-[11px]\">\n {preview.sql}\n </pre>\n ) : null}\n </div>\n ) : null}\n\n <BuilderYamlStrip fragment={datasetFragment(specYaml, selected.id)} />\n </div>\n ) : null}\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport {\n buildDrillUrl,\n isUrlInteraction,\n resolveInteractionValues,\n} from \"@dlh.io/bideux-dashboard-core\";\nimport type {\n DrillStackItem,\n WidgetInteraction,\n WidgetInteractionContext,\n} from \"@dlh.io/bideux-dashboard-core\";\nimport type { WidgetResult } from \"@dlh.io/bideux-dashboard-renderers\";\nimport type { DashboardSpec, WidgetSpec } from \"@dlh.io/bideux-dashboard-spec\";\n\nimport { DashboardCanvas } from \"./canvas.js\";\nimport { useDashboardReader, useIcons, useUiKit } from \"./context.js\";\nimport { DashboardFiltersProvider } from \"./filters-context.js\";\n\nexport interface DrilldownModalProps {\n dashboardId: string;\n dashboardName: string;\n initialFilters?: Record<string, unknown>;\n parentStack?: DrillStackItem[];\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\ninterface DrillRender {\n spec: DashboardSpec;\n widgets: Record<string, WidgetSpec>;\n results: Record<string, WidgetResult>;\n name: string;\n}\n\n/**\n * A dashboard opened from a widget, in a modal, with a stack behind it.\n *\n * Where the frozen reader called a server action and read `window.location`,\n * this asks the injected transport and the injected links, so the same modal\n * works under any router.\n */\nexport function DrilldownModal({\n dashboardId,\n dashboardName,\n initialFilters = {},\n parentStack = [],\n open,\n onOpenChange,\n}: DrilldownModalProps) {\n const ui = useUiKit();\n const icons = useIcons();\n const { transport, links, onNotice } = useDashboardReader();\n const [currentId, setCurrentId] = useState(dashboardId);\n const [currentName, setCurrentName] = useState(dashboardName);\n const [filters, setFilters] =\n useState<Record<string, unknown>>(initialFilters);\n const [stack, setStack] = useState<DrillStackItem[]>(parentStack);\n const [render, setRender] = useState<DrillRender | null>(null);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!open) return;\n let cancelled = false;\n setLoading(true);\n transport\n .runDashboard({ dashboardId: currentId, filters })\n .then((data) => {\n if (cancelled) return;\n setRender({\n spec: data.dashboard,\n widgets: data.widgets,\n results: data.results,\n name: data.name ?? currentName,\n });\n if (data.name !== undefined) setCurrentName(data.name);\n })\n .catch((error: unknown) => {\n if (cancelled) return;\n onNotice({\n tone: \"error\",\n message:\n error instanceof Error ? error.message : \"Could not open dashboard\",\n });\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n // currentName is read, never watched: a rename must not refetch.\n }, [open, currentId, filters, transport, onNotice]);\n\n const back = () => {\n const previous = stack[stack.length - 1];\n if (previous === undefined) {\n onOpenChange(false);\n return;\n }\n setStack(stack.slice(0, stack.length - 1));\n setCurrentId(previous.id);\n setCurrentName(previous.name);\n setFilters(previous.filters);\n };\n\n const toCrumb = (index: number) => {\n const target = stack[index];\n if (target === undefined) return;\n setStack(stack.slice(0, index));\n setCurrentId(target.id);\n setCurrentName(target.name);\n setFilters(target.filters);\n };\n\n const handleInteraction = useCallback(\n (interaction: WidgetInteraction, context: WidgetInteractionContext) => {\n const values = resolveInteractionValues(interaction, context, filters);\n if (interaction.type === \"set_filter\") {\n setFilters({ ...filters, ...values });\n return;\n }\n const targetFilters: Record<string, unknown> = {};\n if (interaction.pass_filters === true)\n Object.assign(targetFilters, filters);\n Object.assign(targetFilters, values);\n\n if (interaction.type === \"navigate\" || isUrlInteraction(interaction)) {\n links.navigate?.(interaction.target, {\n newTab: interaction.open_in === \"new\",\n params: targetFilters,\n });\n return;\n }\n if (interaction.open_in === \"modal\") {\n setStack([...stack, { id: currentId, name: currentName, filters }]);\n setCurrentId(interaction.target);\n setFilters(targetFilters);\n return;\n }\n const url = buildDrillUrl(interaction.target, targetFilters, stack, {\n currentDashboard: { id: currentId, name: currentName, filters },\n detail: interaction.open_in === \"detail\",\n });\n links.navigate?.(url, { newTab: interaction.open_in === \"new\" });\n },\n [filters, links, stack, currentId, currentName],\n );\n\n return (\n <ui.Modal\n open={open}\n onOpenChange={onOpenChange}\n size=\"xl\"\n title={currentName}\n header={\n <div className=\"flex items-center gap-2\">\n <ui.Button variant=\"ghost\" size=\"sm\" ariaLabel=\"Back\" onClick={back}>\n <icons.chevronLeft className=\"h-4 w-4\" />\n </ui.Button>\n {stack.length > 0 && (\n <nav\n aria-label=\"Drill path\"\n className=\"flex items-center gap-1 text-sm\"\n >\n {stack.map((item, index) => (\n <span key={item.id} className=\"flex items-center gap-1\">\n <ui.Button\n variant=\"link\"\n size=\"sm\"\n onClick={() => {\n toCrumb(index);\n }}\n >\n {item.name}\n </ui.Button>\n <span className=\"text-muted-foreground\">/</span>\n </span>\n ))}\n </nav>\n )}\n <span className=\"truncate\">{currentName}</span>\n </div>\n }\n >\n <div\n className=\"min-h-0 flex-1 overflow-auto p-2\"\n data-drill-body\n // The frozen reader shows no chip for a passed filter, so the values\n // the target was asked for are written here to stay readable.\n data-drill-filters={JSON.stringify(filters)}\n >\n {render === null ? (\n <p className=\"py-8 text-center text-sm text-muted-foreground\">\n {loading ? \"Loading dashboard\" : \"Nothing to show\"}\n </p>\n ) : (\n <DashboardFiltersProvider\n filters={filters}\n setFilter={(id, value) => {\n setFilters({ ...filters, [id]: value });\n }}\n >\n <DashboardCanvas\n dashboard={render.spec}\n widgets={render.widgets}\n results={render.results}\n loading={loading}\n onInteraction={handleInteraction}\n />\n </DashboardFiltersProvider>\n )}\n </div>\n </ui.Modal>\n );\n}\n","import { cn } from \"./cn.js\";\nimport { useIcons, useUiKit } from \"./context.js\";\nimport { useDashboardFilters } from \"./filters-context.js\";\n\nexport interface DashboardFilterBarProps {\n className?: string;\n onRefresh?: () => void;\n refreshing?: boolean;\n}\n\nfunction isActive(value: unknown): boolean {\n if (value === undefined || value === null || value === \"\") return false;\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === \"object\") {\n return Object.values(value).some(\n (entry) => entry !== undefined && entry !== null && entry !== \"\",\n );\n }\n return true;\n}\n\n/** The one line summary of what the reader is currently looking at. */\nexport function DashboardFilterBar({\n className,\n onRefresh,\n refreshing,\n}: DashboardFilterBarProps) {\n const ui = useUiKit();\n const icons = useIcons();\n const { filters, labels, clearFilters } = useDashboardFilters();\n const active = Object.entries(filters).filter(([, value]) => isActive(value));\n\n return (\n <div\n className={cn(\n \"bideux-filter-bar flex flex-wrap items-center gap-2 text-xs\",\n className,\n )}\n data-active-filters={active.length}\n >\n {active.length === 0 ? (\n <span className=\"text-muted-foreground\">No filters applied</span>\n ) : (\n active.map(([id, value]) => (\n <ui.Badge key={id} tone=\"info\" title={id}>\n {labels[id] ?? String(value)}\n </ui.Badge>\n ))\n )}\n {active.length > 0 && (\n <ui.Button size=\"sm\" variant=\"ghost\" onClick={clearFilters}>\n Clear\n </ui.Button>\n )}\n {onRefresh !== undefined && (\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n ariaLabel=\"Refresh dashboard\"\n disabled={refreshing === true}\n onClick={onRefresh}\n >\n <span className=\"inline-flex items-center gap-1\">\n <icons.refresh\n className={cn(\n \"h-3.5 w-3.5\",\n refreshing === true && \"animate-spin\",\n )}\n />\n Refresh\n </span>\n </ui.Button>\n )}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport type { CSSProperties } from \"react\";\n\nimport { buildFilterModel } from \"@dlh.io/bideux-dashboard-renderers\";\nimport type {\n WidgetResult,\n WidgetSpec,\n} from \"@dlh.io/bideux-dashboard-renderers\";\nimport type {\n DashboardFilterPanelConfig,\n FilterLayout,\n} from \"@dlh.io/bideux-dashboard-spec\";\n\nimport { cn } from \"./cn.js\";\nimport { cssProps } from \"./style.js\";\nimport { useIcons, useUiKit } from \"./context.js\";\nimport { useDashboardFilters } from \"./filters-context.js\";\nimport { FilterWidget } from \"./filter-widget.js\";\n\nexport interface DashboardFilterPanelProps {\n widgets: WidgetSpec[];\n config: DashboardFilterPanelConfig;\n results?: Record<string, WidgetResult>;\n className?: string;\n style?: CSSProperties;\n /**\n * Draw the panel across the top or down the side regardless of the configured\n * position, which is how a side panel folds above the grid on a phone.\n */\n orientation?: \"horizontal\" | \"vertical\";\n}\n\nfunction spanForControl(control: string, layout: FilterLayout): number {\n switch (control) {\n case \"date\":\n case \"date_range\":\n return layout.dateSpan ?? 2;\n case \"radio\":\n return layout.radioSpan ?? 2;\n case \"select\":\n case \"multiselect\":\n return layout.selectSpan ?? 1;\n default:\n return layout.buttonSpan ?? 1;\n }\n}\n\nexport function DashboardFilterPanel({\n widgets,\n config,\n results = {},\n className,\n style,\n orientation,\n}: DashboardFilterPanelProps) {\n const ui = useUiKit();\n const icons = useIcons();\n const { filters, setFilter, setFilterLabel } = useDashboardFilters();\n const position = config.position ?? \"top\";\n const collapsible =\n config.collapsible !== false && config.disableCollapse !== true;\n const [collapsed, setCollapsed] = useState(config.defaultCollapsed === true);\n\n const isHorizontal =\n orientation === undefined\n ? position === \"top\"\n : orientation === \"horizontal\";\n const layout: FilterLayout = config.layout ?? {};\n const minColumnWidth = layout.minColumnWidth ?? 180;\n const gap = layout.gap ?? config.gap ?? 12;\n const padding = layout.padding ?? config.padding ?? 12;\n\n const bodyStyle: CSSProperties = isHorizontal\n ? {\n display: \"grid\",\n gridTemplateColumns:\n layout.columns === undefined || layout.columns === null\n ? `repeat(auto-fit, minmax(${minColumnWidth}px, 1fr))`\n : `repeat(${layout.columns}, minmax(0, 1fr))`,\n gap,\n }\n : { display: \"flex\", flexDirection: \"column\", gap };\n\n if (widgets.length === 0) return null;\n\n return (\n <section\n aria-label=\"Dashboard filters\"\n data-filter-panel={position}\n className={cn(\n \"bideux-filter-panel shrink-0 border-b bg-muted/20\",\n !isHorizontal && \"h-full w-full border-b-0 border-r\",\n className,\n )}\n style={{\n ...cssProps({\n padding,\n background: config.background,\n width: isHorizontal ? undefined : (config.width ?? 260),\n }),\n ...style,\n }}\n >\n {collapsible && (\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"inline-flex items-center gap-1 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n <icons.filter className=\"h-3.5 w-3.5\" />\n Filters\n </span>\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n ariaLabel={collapsed ? \"Show filters\" : \"Hide filters\"}\n onClick={() => {\n setCollapsed(!collapsed);\n }}\n >\n {collapsed ? \"Show\" : \"Hide\"}\n </ui.Button>\n </div>\n )}\n {!collapsed && (\n <div style={bodyStyle}>\n {widgets.map((widget) => {\n const model = buildFilterModel(widget, results[widget.metadata.id]);\n return (\n <div\n key={widget.metadata.id}\n style={\n isHorizontal\n ? {\n gridColumn: `span ${spanForControl(model.control, layout)}`,\n }\n : undefined\n }\n >\n <FilterWidget\n widget={widget}\n {...(results[widget.metadata.id] === undefined\n ? {}\n : { result: results[widget.metadata.id] })}\n value={filters[widget.metadata.id]}\n onChange={(id, value, label) => {\n setFilter(id, value);\n setFilterLabel(id, label);\n }}\n onLabel={setFilterLabel}\n />\n </div>\n );\n })}\n </div>\n )}\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { DEFAULT_GRID_CONFIG } from \"@dlh.io/bideux-dashboard-core\";\nimport type { Breakpoint } from \"@dlh.io/bideux-dashboard-core\";\nimport { resolveResponsive } from \"@dlh.io/bideux-dashboard-renderers\";\nimport type { DashboardSpec } from \"@dlh.io/bideux-dashboard-spec\";\n\nimport { useAuthoring } from \"./authoring-context.js\";\nimport type { LayoutDraft } from \"./use-layout-draft.js\";\n\n/** A data store the author can point the dashboard at. */\nexport interface GridSettingsDataStore {\n id: string;\n name: string;\n vendor?: string | undefined;\n}\n\nexport interface GridSettingsPanelProps {\n dashboard: DashboardSpec;\n /** The breakpoint the canvas is showing, whose columns and row height are edited. */\n breakpoint: Breakpoint;\n draft: Pick<\n LayoutDraft,\n \"gridOverrides\" | \"gridConfig\" | \"setGridOverride\" | \"setGridConfig\"\n >;\n /**\n * Stores the Data store select offers. Leave undefined to hide the select,\n * which is right for a host with a single store.\n */\n dataStores?: GridSettingsDataStore[] | undefined;\n className?: string | undefined;\n}\n\n/** The cell sizes the origin application offers, as columns per row. */\nexport const CELL_SIZE_OPTIONS: ReadonlyArray<{ label: string; cols: number }> =\n [\n { label: \"Extra coarse\", cols: 8 },\n { label: \"Coarse\", cols: 12 },\n { label: \"Normal\", cols: 20 },\n { label: \"Fine\", cols: 30 },\n { label: \"Extra fine\", cols: 40 },\n { label: \"Ultra fine\", cols: 60 },\n ];\n\nconst MAX_WIDTH_OPTIONS: ReadonlyArray<{ value: string; label: string }> = [\n { value: \"none\", label: \"No max\" },\n { value: \"mobile\", label: \"Mobile\" },\n { value: \"tablet\", label: \"Tablet\" },\n { value: \"desktop\", label: \"Desktop\" },\n { value: \"wide\", label: \"Wide\" },\n];\n\nconst DEFAULT_STORE = \"__default__\";\n\nfunction Field({\n label,\n help,\n children,\n}: {\n label: ReactNode;\n help?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <div className=\"space-y-2\">\n <span className=\"block text-sm font-medium leading-none\">{label}</span>\n {children}\n {help === undefined ? null : (\n <p className=\"text-xs text-muted-foreground\">{help}</p>\n )}\n </div>\n );\n}\n\nfunction positiveOrUndefined(raw: string): number | undefined {\n const value = Number(raw);\n return Number.isFinite(value) && value > 0 ? Math.floor(value) : undefined;\n}\n\n/**\n * The body of the Grid popover: data store, row height, columns, cell size,\n * bounded drag, prevent collision and max layout width, wired to the layout\n * draft so every change waits for Save layout. Drawn with the authoring\n * provider's primitives; the host supplies the popover and the button that\n * opens it.\n */\nexport function GridSettingsPanel({\n dashboard,\n breakpoint,\n draft,\n dataStores,\n className,\n}: GridSettingsPanelProps) {\n const { ui } = useAuthoring();\n const responsive = resolveResponsive(dashboard);\n const savedGrid = { ...DEFAULT_GRID_CONFIG, ...dashboard.spec.config?.grid };\n const grid = { ...savedGrid, ...draft.gridConfig };\n const override = draft.gridOverrides[breakpoint];\n const cols = override?.cols ?? responsive[breakpoint].cols ?? 24;\n const rowHeight = override?.rowHeight;\n const dataModelId =\n draft.gridConfig.dataModelId === undefined\n ? dashboard.spec.config?.dataModelId\n : draft.gridConfig.dataModelId;\n const maxLayoutWidth = grid.maxLayoutWidth ?? \"none\";\n\n const setOverride = (patch: { rowHeight?: number; cols?: number }) => {\n draft.setGridOverride(breakpoint, patch);\n };\n\n return (\n <div className={className ?? \"grid gap-4\"}>\n <p className=\"text-xs text-muted-foreground\">\n Grid changes apply when you click Save layout.\n </p>\n {dataStores === undefined ? null : (\n <Field\n label=\"Data store\"\n help=\"Select the data store that widgets will query. Widget-level data_model_id overrides this.\"\n >\n <ui.Select\n ariaLabel=\"Data store\"\n value={dataModelId ?? DEFAULT_STORE}\n options={[\n { value: DEFAULT_STORE, label: \"Default (first active)\" },\n ...dataStores.map((store) => ({\n value: store.id,\n label:\n store.vendor === undefined\n ? store.name\n : `${store.name} (${store.vendor})`,\n })),\n ]}\n onChange={(value) =>\n draft.setGridConfig({\n dataModelId: value === DEFAULT_STORE ? null : value,\n })\n }\n />\n </Field>\n )}\n <Field\n label={`Row height (${breakpoint})`}\n help=\"Leave empty for auto square cells.\"\n >\n <ui.TextInput\n ariaLabel=\"Row height\"\n type=\"number\"\n placeholder=\"Auto\"\n value={rowHeight === undefined ? \"\" : String(rowHeight)}\n onChange={(raw) => {\n const value = positiveOrUndefined(raw);\n setOverride(value === undefined ? {} : { rowHeight: value });\n }}\n />\n </Field>\n <Field label={`Columns (${breakpoint})`}>\n <ui.TextInput\n ariaLabel=\"Columns\"\n type=\"number\"\n value={String(cols)}\n onChange={(raw) => {\n const value = positiveOrUndefined(raw);\n setOverride(value === undefined ? {} : { cols: value });\n }}\n />\n </Field>\n <Field\n label={`Cell size (${breakpoint})`}\n help=\"More columns = smaller cells. Row height auto-scales with cell width.\"\n >\n <ui.Select\n ariaLabel=\"Cell size\"\n value={String(cols)}\n options={[\n ...CELL_SIZE_OPTIONS.map((option) => ({\n value: String(option.cols),\n label: `${option.label} (${option.cols})`,\n })),\n ...(CELL_SIZE_OPTIONS.some((option) => option.cols === cols)\n ? []\n : [{ value: String(cols), label: `Custom (${cols})` }]),\n ]}\n onChange={(value) => {\n const next = positiveOrUndefined(value);\n if (next !== undefined) setOverride({ cols: next });\n }}\n />\n </Field>\n <ui.Checkbox\n className=\"flex items-center justify-between\"\n checked={grid.isBounded ?? true}\n label=\"Bounded drag\"\n onChange={(checked) => draft.setGridConfig({ isBounded: checked })}\n />\n <ui.Checkbox\n className=\"flex items-center justify-between\"\n checked={grid.preventCollision ?? false}\n label=\"Prevent collision\"\n onChange={(checked) =>\n draft.setGridConfig({ preventCollision: checked })\n }\n />\n <Field\n label=\"Max layout width\"\n help=\"Caps the dashboard width to this breakpoint while remaining responsive below it.\"\n >\n <ui.Select\n ariaLabel=\"Max layout width\"\n value={maxLayoutWidth}\n options={MAX_WIDTH_OPTIONS.map((option) => ({ ...option }))}\n onChange={(value) =>\n draft.setGridConfig({\n maxLayoutWidth:\n value === \"mobile\" ||\n value === \"tablet\" ||\n value === \"desktop\" ||\n value === \"wide\"\n ? value\n : null,\n })\n }\n />\n </Field>\n </div>\n );\n}\n","import { useUiKit } from \"./context.js\";\nimport type { LayoutDraft } from \"./use-layout-draft.js\";\n\nexport interface LayoutDraftDialogsProps {\n draft: Pick<\n LayoutDraft,\n | \"unsavedDialogOpen\"\n | \"saveAndExit\"\n | \"discardAndExit\"\n | \"keepEditing\"\n | \"conflictDialogOpen\"\n | \"overwriteAfterConflict\"\n | \"reloadAfterConflict\"\n | \"saving\"\n >;\n}\n\n/**\n * The two questions Edit mode asks on the way out: keep or drop unsaved\n * changes, and overwrite or reload when someone else saved first. Drawn with\n * the host's modal so they look like every other dialog on the page.\n */\nexport function LayoutDraftDialogs({ draft }: LayoutDraftDialogsProps) {\n const ui = useUiKit();\n return (\n <>\n <ui.Modal\n open={draft.unsavedDialogOpen}\n size=\"md\"\n title=\"Save your dashboard changes?\"\n description=\"You have unsaved layout changes. Save them before leaving edit mode or this dashboard?\"\n onOpenChange={(open) => {\n if (!open) draft.keepEditing();\n }}\n footer={\n <div className=\"flex items-center justify-end gap-3\">\n <ui.Button variant=\"ghost\" onClick={draft.keepEditing}>\n Keep editing\n </ui.Button>\n <ui.Button variant=\"secondary\" onClick={draft.discardAndExit}>\n Discard and exit\n </ui.Button>\n <ui.Button\n variant=\"primary\"\n disabled={draft.saving}\n onClick={draft.saveAndExit}\n >\n {draft.saving ? \"Saving...\" : \"Save and exit\"}\n </ui.Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n Widget positions, added rows and grid settings are only kept once you\n click Save layout.\n </p>\n </ui.Modal>\n <ui.Modal\n open={draft.conflictDialogOpen}\n size=\"md\"\n title=\"This dashboard changed elsewhere\"\n description=\"Someone saved this dashboard after you started editing. Overwrite their layout with yours, or reload theirs and lose your draft.\"\n onOpenChange={(open) => {\n if (!open) draft.reloadAfterConflict();\n }}\n footer={\n <div className=\"flex items-center justify-end gap-3\">\n <ui.Button variant=\"secondary\" onClick={draft.reloadAfterConflict}>\n Reload their version\n </ui.Button>\n <ui.Button\n variant=\"primary\"\n disabled={draft.saving}\n onClick={draft.overwriteAfterConflict}\n >\n {draft.saving ? \"Saving...\" : \"Overwrite with mine\"}\n </ui.Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n Reloading keeps the other person's positions. Overwriting replaces\n them with the grid as you see it now.\n </p>\n </ui.Modal>\n </>\n );\n}\n","import { useState } from \"react\";\n\nimport {\n AGGREGATIONS,\n blockingKeys,\n datasetsInExpression,\n modelMetricFragment,\n modelMetricIssues,\n parseAggregation,\n parseRatioExpression,\n preservedKeys,\n ratioExpression,\n removeModelMetric,\n upsertModelMetric,\n type Aggregation,\n type BuilderDataset,\n type BuilderModelMetric,\n type BuilderRelationship,\n type RatioSide,\n} from \"@dlh.io/bideux-dashboard-core\";\n\nimport { useAuthoring } from \"./authoring-context.js\";\nimport type { DatasetPreviewResult } from \"./authoring-ports.js\";\nimport { BuilderYamlStrip, PreservedKeysNote } from \"./builder-fields.js\";\nimport { InlineSelect, InlineText } from \"./inline-edit.js\";\n\nconst FORMATS = [\"currency\", \"percent\", \"number\"];\nconst NO_FORMAT = \"__none__\";\n\n/**\n * Warehouse columns of a dataset worth measuring: the columns it groups by, plus\n * the columns its own metrics already aggregate.\n */\nfunction measurableColumns(dataset: BuilderDataset | undefined): string[] {\n if (!dataset) return [];\n const columns = dataset.dimensions.map(\n (dimension) => dimension.column ?? dimension.id,\n );\n for (const metric of dataset.metrics) {\n const parsed = parseAggregation(metric.expression);\n if (parsed && !columns.includes(parsed.column)) columns.push(parsed.column);\n }\n return columns;\n}\n\nfunction newMetricId(taken: string[]): string {\n let id = \"new_metric\";\n let n = 2;\n while (taken.includes(id)) {\n id = `new_metric_${n}`;\n n += 1;\n }\n return id;\n}\n\n/** One side of the ratio: dataset, aggregation and column. */\nfunction RatioSideFields({\n label,\n side,\n datasets,\n readOnly,\n onChange,\n}: {\n label: string;\n side: RatioSide;\n datasets: BuilderDataset[];\n readOnly: boolean;\n onChange: (next: RatioSide) => void;\n}) {\n const dataset = datasets.find((entry) => entry.id === side.dataset);\n const candidates = measurableColumns(dataset);\n return (\n <div className=\"space-y-2 rounded-md border p-3\">\n <div className=\"text-xs text-muted-foreground\">{label}</div>\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <InlineSelect\n label=\"Dataset\"\n value={side.dataset || null}\n empty=\"Pick a dataset\"\n readOnly={readOnly}\n options={datasets.map((option) => ({\n value: option.id,\n label: option.name ?? option.id,\n }))}\n onCommit={(value) => {\n onChange({ ...side, dataset: value });\n }}\n />\n <InlineSelect\n label=\"Aggregation\"\n value={side.aggregation}\n empty=\"Pick an aggregation\"\n readOnly={readOnly}\n options={AGGREGATIONS.map((aggregation) => ({\n value: aggregation,\n label: aggregation,\n }))}\n onCommit={(value) => {\n onChange({ ...side, aggregation: value as Aggregation });\n }}\n />\n {candidates.length > 0 ? (\n <InlineSelect\n label=\"Column\"\n value={side.column || null}\n empty=\"Pick a column\"\n readOnly={readOnly}\n options={(candidates.includes(side.column) || !side.column\n ? candidates\n : [side.column, ...candidates]\n ).map((column) => ({ value: column, label: column }))}\n onCommit={(value) => {\n onChange({ ...side, column: value });\n }}\n />\n ) : (\n <InlineText\n label=\"Column\"\n value={side.column}\n empty=\"Name the column\"\n placeholder=\"NET_SALES\"\n mono\n readOnly={readOnly}\n onCommit={(value) => {\n onChange({ ...side, column: value });\n }}\n />\n )}\n </div>\n </div>\n );\n}\n\nexport interface MetricBuilderPanelProps {\n specYaml: string;\n onChange: (specYaml: string) => void;\n readOnly: boolean;\n datasets: BuilderDataset[];\n relationships: BuilderRelationship[];\n metrics: BuilderModelMetric[];\n onEditInYaml: () => void;\n}\n\n/**\n * Metrics that span datasets, such as labor cost over net sales.\n *\n * A ratio is offered as two pickers rather than as SQL, because the two ways a\n * ratio goes wrong are both structural: dividing by zero, and asking the\n * warehouse for percentage points when the card multiplies by 100 itself.\n */\nexport function MetricBuilderPanel({\n specYaml,\n onChange,\n readOnly,\n datasets,\n relationships,\n metrics,\n onEditInYaml,\n}: MetricBuilderPanelProps) {\n const { transport, ui } = useAuthoring();\n const [selectedId, setSelectedId] = useState<string | null>(\n metrics[0]?.id ?? null,\n );\n /** A metric added just now opens its id, since the generated one is a stub. */\n const [addedId, setAddedId] = useState<string | null>(null);\n const [advanced, setAdvanced] = useState(false);\n const [preview, setPreview] = useState<DatasetPreviewResult | null>(null);\n const [previewError, setPreviewError] = useState<string | null>(null);\n const [previewing, setPreviewing] = useState(false);\n\n const selected =\n metrics.find((metric) => metric.id === selectedId) ?? metrics[0] ?? null;\n const ratio = selected ? parseRatioExpression(selected.expression) : null;\n const editingRaw = advanced || (selected !== null && ratio === null);\n\n function write(next: BuilderModelMetric, originalId?: string): void {\n onChange(upsertModelMetric(specYaml, next, originalId));\n setSelectedId(next.id);\n setPreview(null);\n }\n\n function addMetric(): void {\n const first = datasets[0];\n const second = datasets[1] ?? datasets[0];\n const firstColumn = measurableColumns(first)[0] ?? \"COLUMN\";\n const secondColumn = measurableColumns(second)[0] ?? \"COLUMN\";\n const id = newMetricId(metrics.map((metric) => metric.id));\n setAddedId(id);\n write({\n id,\n label: null,\n description: null,\n type: \"sql\",\n format: null,\n expression: ratioExpression(\n {\n dataset: first?.id ?? \"dataset\",\n aggregation: \"SUM\",\n column: firstColumn,\n },\n {\n dataset: second?.id ?? \"dataset\",\n aggregation: \"SUM\",\n column: secondColumn,\n },\n ),\n unsupportedKeys: [],\n });\n setAdvanced(false);\n }\n\n async function runPreview(metric: BuilderModelMetric): Promise<void> {\n const referenced = datasetsInExpression(\n metric.expression,\n datasets.map((dataset) => dataset.id),\n );\n const base =\n datasets.find((dataset) => dataset.id === referenced[0]) ?? datasets[0];\n if (!base) return;\n // A date column makes the sample readable. Without one the metric is a\n // single total, which is still a fine proof that the SQL runs.\n const grain = base.dimensions.find(\n (dimension) => dimension.isTime || dimension.type === \"date\",\n );\n setPreviewing(true);\n setPreviewError(null);\n try {\n setPreview(\n await transport.previewDataset({\n specYaml,\n datasetId: base.id,\n limit: 20,\n columns: [...(grain ? [grain.id] : []), metric.id],\n }),\n );\n } catch (error) {\n setPreviewError(\n error instanceof Error\n ? error.message\n : \"Could not preview this metric\",\n );\n } finally {\n setPreviewing(false);\n }\n }\n\n const issues = selected\n ? modelMetricIssues(selected, datasets, relationships)\n : [];\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <div className=\"text-sm font-medium\">Model level metrics</div>\n <p className=\"text-xs text-muted-foreground\">\n Metrics that span datasets, such as labor cost over net sales. A\n widget asking for one is enough for the engine to build the join.\n </p>\n </div>\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={readOnly || datasets.length === 0}\n title={\n datasets.length === 0\n ? \"Add a dataset first, since a metric measures its columns\"\n : \"\"\n }\n onClick={addMetric}\n >\n Add metric\n </ui.Button>\n </div>\n\n {metrics.length === 0 ? (\n <p className=\"rounded-md border border-dashed p-4 text-sm text-muted-foreground\">\n No model level metrics yet. A metric that only reads one dataset\n belongs inside that dataset instead.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {metrics.map((metric) => {\n const broken =\n modelMetricIssues(metric, datasets, relationships).length > 0;\n return (\n <ui.Button\n key={metric.id}\n size=\"sm\"\n variant={metric.id === selected?.id ? \"primary\" : \"secondary\"}\n onClick={() => {\n setSelectedId(metric.id);\n setAddedId(null);\n setAdvanced(false);\n setPreview(null);\n }}\n >\n {metric.id}\n {broken ? (\n <ui.Badge tone=\"danger\" className=\"ml-2\">\n !\n </ui.Badge>\n ) : null}\n </ui.Button>\n );\n })}\n </div>\n )}\n\n {selected ? (\n <div key={selected.id} className=\"space-y-4 rounded-md border p-4\">\n {blockingKeys(selected.unsupportedKeys).length > 0 ? (\n <div className=\"space-y-2 rounded-md border border-amber-300 bg-amber-50 p-3 text-xs text-amber-900\">\n <div className=\"font-medium\">\n {`This metric is defined with ${blockingKeys(\n selected.unsupportedKeys,\n ).join(\", \")}, which the builder has no form for`}\n </div>\n <p>\n Editing it here keeps those keys untouched, but they are not\n shown, so check them in YAML if you change the expression.\n </p>\n <ui.Button size=\"sm\" variant=\"secondary\" onClick={onEditInYaml}>\n Edit in YAML\n </ui.Button>\n </div>\n ) : (\n <PreservedKeysNote keys={preservedKeys(selected.unsupportedKeys)} />\n )}\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InlineText\n label=\"Id widgets ask for\"\n value={selected.id}\n empty=\"Name this metric\"\n placeholder=\"labor_pct\"\n mono\n readOnly={readOnly}\n startOpen={selected.id === addedId}\n onCommit={(value) => {\n write({ ...selected, id: value }, selected.id);\n }}\n />\n <InlineText\n label=\"Label (optional)\"\n value={selected.label}\n empty={`Defaults to ${selected.id}`}\n placeholder={selected.id}\n readOnly={readOnly}\n onCommit={(value) => {\n write({ ...selected, label: value || null });\n }}\n />\n </div>\n\n <InlineText\n label=\"What it means (optional)\"\n value={selected.description}\n empty=\"Describe what it measures\"\n placeholder=\"Labor cost as a share of net sales.\"\n readOnly={readOnly}\n onCommit={(value) => {\n write({ ...selected, description: value || null });\n }}\n />\n\n {editingRaw ? (\n <div className=\"space-y-1\">\n <InlineText\n label=\"SQL expression\"\n value={selected.expression}\n empty=\"Write the expression\"\n placeholder=\"SUM(daily_labor.TOTAL_LABOR_COST) / NULLIF(SUM(daily_sales.NET_SALES), 0)\"\n mono\n readOnly={readOnly}\n hint=\"Qualify every column with its dataset id, which is the alias the engine gives it in the join.\"\n onCommit={(value) => {\n write({ ...selected, expression: value });\n }}\n />\n {ratio !== null ? (\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setAdvanced(false);\n }}\n >\n Back to the pickers\n </ui.Button>\n ) : null}\n </div>\n ) : ratio ? (\n <div className=\"space-y-2\">\n <RatioSideFields\n label=\"Divide this\"\n side={ratio.numerator}\n datasets={datasets}\n readOnly={readOnly}\n onChange={(next) => {\n write({\n ...selected,\n expression: ratioExpression(next, ratio.denominator),\n });\n }}\n />\n <RatioSideFields\n label=\"By this\"\n side={ratio.denominator}\n datasets={datasets}\n readOnly={readOnly}\n onChange={(next) => {\n write({\n ...selected,\n expression: ratioExpression(ratio.numerator, next),\n });\n }}\n />\n <ui.Checkbox\n checked={selected.format === \"percent\"}\n disabled={readOnly}\n label=\"Show it as a percent, so 0.133 reads 13.3%\"\n onChange={(checked) => {\n write({\n ...selected,\n // The share stays a share. Asking the warehouse for\n // percentage points as well is what prints 13.3% as\n // 1,333%, since the card multiplies by 100 itself.\n expression: ratioExpression(\n ratio.numerator,\n ratio.denominator,\n ),\n format: checked ? \"percent\" : null,\n });\n }}\n />\n <p className=\"text-xs text-muted-foreground\">\n A day with none of the bottom measure comes back empty rather\n than failing, because the divisor is wrapped in NULLIF.\n </p>\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setAdvanced(true);\n }}\n >\n Write the SQL myself\n </ui.Button>\n </div>\n ) : null}\n\n <InlineSelect\n label=\"How to display it\"\n value={selected.format ?? NO_FORMAT}\n empty=\"Plain number\"\n readOnly={readOnly}\n options={[\n { value: NO_FORMAT, label: \"Plain number\" },\n ...[\n ...FORMATS,\n ...(selected.format && !FORMATS.includes(selected.format)\n ? [selected.format]\n : []),\n ].map((format) => ({ value: format, label: format })),\n ]}\n onCommit={(value) => {\n write({\n ...selected,\n format: value === NO_FORMAT ? null : value,\n });\n }}\n />\n\n {issues.length > 0 ? (\n <ul className=\"space-y-1 text-xs text-destructive\">\n {issues.map((issue) => (\n <li key={issue}>{issue}</li>\n ))}\n </ul>\n ) : null}\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={previewing || issues.length > 0}\n onClick={() => {\n void runPreview(selected);\n }}\n >\n {previewing ? \"Running...\" : \"Preview this metric\"}\n </ui.Button>\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={readOnly}\n onClick={() => {\n onChange(removeModelMetric(specYaml, selected.id));\n setSelectedId(null);\n setPreview(null);\n }}\n >\n Remove metric\n </ui.Button>\n <span className=\"text-xs text-muted-foreground\">\n Preview runs the join this metric implies, on the text as it\n stands now.\n </span>\n </div>\n\n {previewError !== null ? (\n <p className=\"text-xs text-destructive\">{previewError}</p>\n ) : null}\n\n {preview ? (\n <div className=\"space-y-2\">\n <div className=\"text-xs text-muted-foreground\">\n {`${preview.rowCount} rows`}\n {preview.effectiveLocations\n ? `, scoped to ${preview.effectiveLocations.length} locations`\n : \", unscoped for this caller\"}\n </div>\n <div className=\"max-h-56 overflow-auto rounded-md border\">\n <table className=\"w-full text-left text-xs\">\n <thead className=\"bg-muted\">\n <tr>\n {preview.columns.map((column) => (\n <th key={column} className=\"px-2 py-1 font-medium\">\n {column}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {preview.rows.map((row, index) => (\n <tr key={index} className=\"border-t\">\n {preview.columns.map((column) => (\n <td key={column} className=\"px-2 py-1\">\n {String(row[column] ?? \"\")}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {preview.sql !== null ? (\n <pre className=\"max-h-32 overflow-auto rounded-md border bg-muted/40 p-2 text-[11px]\">\n {preview.sql}\n </pre>\n ) : null}\n </div>\n ) : null}\n\n <BuilderYamlStrip\n fragment={modelMetricFragment(specYaml, selected.id)}\n />\n </div>\n ) : null}\n </div>\n );\n}\n","import { useState } from \"react\";\n\nimport {\n blockingKeys,\n preservedKeys,\n relationshipFragment,\n relationshipIssues,\n removeRelationship,\n upsertRelationship,\n type BuilderCardinality,\n type BuilderDataStore,\n type BuilderDataset,\n type BuilderRelationship,\n} from \"@dlh.io/bideux-dashboard-core\";\n\nimport { useAuthoring } from \"./authoring-context.js\";\nimport { BuilderYamlStrip, PreservedKeysNote } from \"./builder-fields.js\";\nimport { InlineSelect, InlineText } from \"./inline-edit.js\";\n\nconst CARDINALITIES: { value: BuilderCardinality; label: string }[] = [\n { value: \"many_to_one\", label: \"Many rows on the left, one on the right\" },\n { value: \"one_to_one\", label: \"One row on each side\" },\n { value: \"one_to_many\", label: \"One row on the left, many on the right\" },\n { value: \"many_to_many\", label: \"Many rows on both sides\" },\n];\n\n/** Cardinalities where the join can multiply rows and inflate a total. */\nconst FANS_OUT: BuilderCardinality[] = [\"one_to_many\", \"many_to_many\"];\n\n/** Columns of a dataset worth joining on: what it declares it can read. */\nexport function joinableColumns(dataset: BuilderDataset | undefined): string[] {\n if (!dataset) return [];\n const columns = dataset.dimensions.map(\n (dimension) => dimension.column ?? dimension.id,\n );\n if (dataset.filterField && !columns.includes(dataset.filterField)) {\n columns.push(dataset.filterField);\n }\n return columns;\n}\n\nfunction newRelationshipName(\n from: string,\n to: string,\n taken: string[],\n): string {\n const base = `${from}_to_${to}`;\n let name = base;\n let n = 2;\n while (taken.includes(name)) {\n name = `${base}_${n}`;\n n += 1;\n }\n return name;\n}\n\n/**\n * One side of a join pair: a dropdown when the dataset declares its columns,\n * and a typed name when it does not, since a column can exist unlisted.\n */\nfunction ColumnField({\n label,\n value,\n candidates,\n readOnly,\n onCommit,\n}: {\n label: string;\n value: string;\n candidates: string[];\n readOnly: boolean;\n onCommit: (value: string) => void;\n}) {\n if (candidates.length === 0) {\n return (\n <InlineText\n label={label}\n value={value}\n empty=\"Name the column\"\n placeholder=\"store_key\"\n mono\n readOnly={readOnly}\n onCommit={onCommit}\n />\n );\n }\n return (\n <InlineSelect\n label={label}\n value={value || null}\n empty=\"Pick a column\"\n readOnly={readOnly}\n options={(candidates.includes(value) || !value\n ? candidates\n : [value, ...candidates]\n ).map((column) => ({ value: column, label: column }))}\n onCommit={onCommit}\n />\n );\n}\n\nexport interface RelationshipBuilderPanelProps {\n specYaml: string;\n onChange: (specYaml: string) => void;\n readOnly: boolean;\n datasets: BuilderDataset[];\n stores: BuilderDataStore[];\n relationships: BuilderRelationship[];\n onEditInYaml: () => void;\n}\n\n/**\n * How two datasets line up.\n *\n * A widget that asks for columns from both makes the engine build this join, so\n * nothing here needs SQL. What it does need is honesty about cardinality: a\n * join that fans out repeats the left row and double counts its totals.\n */\nexport function RelationshipBuilderPanel({\n specYaml,\n onChange,\n readOnly,\n datasets,\n stores,\n relationships,\n onEditInYaml,\n}: RelationshipBuilderPanelProps) {\n const { ui } = useAuthoring();\n const [selectedName, setSelectedName] = useState<string | null>(\n relationships[0]?.name ?? null,\n );\n /** A relationship added just now opens its fields rather than reading blank. */\n const [addedName, setAddedName] = useState<string | null>(null);\n const selected =\n relationships.find((entry) => entry.name === selectedName) ??\n relationships[0] ??\n null;\n\n function write(next: BuilderRelationship, originalName?: string): void {\n onChange(upsertRelationship(specYaml, next, originalName));\n setSelectedName(next.name);\n }\n\n function addRelationship(): void {\n const fromDataset = datasets[0];\n const toDataset = datasets[1];\n const from = fromDataset?.id ?? null;\n const to = toDataset?.id ?? null;\n // The location column is the one both sides almost always share, so it is\n // the useful first guess rather than an empty row.\n const shared =\n fromDataset?.filterField &&\n joinableColumns(toDataset).includes(fromDataset.filterField)\n ? [fromDataset.filterField]\n : [];\n const name = newRelationshipName(\n from ?? \"left\",\n to ?? \"right\",\n relationships.map((entry) => entry.name),\n );\n setAddedName(name);\n write({\n name,\n from,\n to,\n fromColumns: shared,\n toColumns: shared,\n cardinality: \"many_to_one\",\n unsupportedKeys: [],\n });\n }\n\n const fromDataset = datasets.find((entry) => entry.id === selected?.from);\n const toDataset = datasets.find((entry) => entry.id === selected?.to);\n const datasetOptions = datasets.map((dataset) => ({\n value: dataset.id,\n label: dataset.name ?? dataset.id,\n }));\n const issues = selected ? relationshipIssues(selected, datasets, stores) : [];\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <div className=\"text-sm font-medium\">Relationships</div>\n <p className=\"text-xs text-muted-foreground\">\n How two datasets line up. A widget that asks for columns from both\n makes the engine build this join, so nothing here needs SQL.\n </p>\n </div>\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={readOnly || datasets.length < 2}\n title={\n datasets.length < 2\n ? \"A join needs two datasets, so add another first\"\n : \"\"\n }\n onClick={addRelationship}\n >\n Add relationship\n </ui.Button>\n </div>\n\n {relationships.length === 0 ? (\n <p className=\"rounded-md border border-dashed p-4 text-sm text-muted-foreground\">\n No relationships yet. Without one, a widget can only ask for columns\n from a single dataset.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {relationships.map((relationship) => {\n const broken =\n relationshipIssues(relationship, datasets, stores).length > 0;\n return (\n <ui.Button\n key={relationship.name}\n size=\"sm\"\n variant={\n relationship.name === selected?.name ? \"primary\" : \"secondary\"\n }\n onClick={() => {\n setSelectedName(relationship.name);\n setAddedName(null);\n }}\n >\n {relationship.name}\n {broken ? (\n <ui.Badge tone=\"danger\" className=\"ml-2\">\n !\n </ui.Badge>\n ) : null}\n </ui.Button>\n );\n })}\n </div>\n )}\n\n {selected ? (\n <div key={selected.name} className=\"space-y-4 rounded-md border p-4\">\n {blockingKeys(selected.unsupportedKeys).length > 0 ? (\n <div className=\"space-y-2 rounded-md border border-amber-300 bg-amber-50 p-3 text-xs text-amber-900\">\n <div className=\"font-medium\">\n {`This relationship joins with ${blockingKeys(\n selected.unsupportedKeys,\n ).join(\", \")}, which the builder has no form for`}\n </div>\n <p>\n Editing it here keeps those keys untouched, but they are not\n shown, so check them in YAML if you change the join.\n </p>\n <ui.Button size=\"sm\" variant=\"secondary\" onClick={onEditInYaml}>\n Edit in YAML\n </ui.Button>\n </div>\n ) : (\n <PreservedKeysNote keys={preservedKeys(selected.unsupportedKeys)} />\n )}\n\n <InlineText\n label=\"Name\"\n value={selected.name}\n empty=\"Name this join\"\n placeholder=\"daily_sales_to_daily_labor\"\n mono\n readOnly={readOnly}\n startOpen={selected.name === addedName}\n onCommit={(value) => {\n write({ ...selected, name: value }, selected.name);\n }}\n />\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InlineSelect\n label=\"Left dataset\"\n value={selected.from}\n empty=\"Pick a dataset\"\n readOnly={readOnly}\n options={datasetOptions}\n onCommit={(value) => {\n write({ ...selected, from: value });\n }}\n />\n <InlineSelect\n label=\"Right dataset\"\n value={selected.to}\n empty=\"Pick a dataset\"\n readOnly={readOnly}\n options={datasetOptions}\n onCommit={(value) => {\n write({ ...selected, to: value });\n }}\n />\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"text-xs text-muted-foreground\">\n Columns that match\n </div>\n <p className=\"text-xs text-muted-foreground\">\n Each row is one equality in the join, so a daily table usually\n matches on the location key and the date.\n </p>\n {selected.fromColumns.length === 0 &&\n selected.toColumns.length === 0 ? (\n <p className=\"text-xs text-destructive\">\n Without a pair of columns the engine has nothing to join on.\n </p>\n ) : null}\n {selected.fromColumns.map((column, index) => (\n <div key={index} className=\"flex items-end gap-2\">\n <div className=\"flex-1\">\n <ColumnField\n label={selected.from ?? \"Left\"}\n value={column}\n candidates={joinableColumns(fromDataset)}\n readOnly={readOnly}\n onCommit={(value) => {\n write({\n ...selected,\n fromColumns: selected.fromColumns.map((entry, i) =>\n i === index ? value : entry,\n ),\n });\n }}\n />\n </div>\n <span className=\"pb-2 text-xs text-muted-foreground\">=</span>\n <div className=\"flex-1\">\n <ColumnField\n label={selected.to ?? \"Right\"}\n value={selected.toColumns[index] ?? \"\"}\n candidates={joinableColumns(toDataset)}\n readOnly={readOnly}\n onCommit={(value) => {\n write({\n ...selected,\n toColumns: selected.fromColumns.map((_, i) =>\n i === index ? value : (selected.toColumns[i] ?? \"\"),\n ),\n });\n }}\n />\n </div>\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={readOnly}\n ariaLabel=\"Remove this pair\"\n onClick={() => {\n write({\n ...selected,\n fromColumns: selected.fromColumns.filter(\n (_, i) => i !== index,\n ),\n toColumns: selected.toColumns.filter(\n (_, i) => i !== index,\n ),\n });\n }}\n >\n Remove\n </ui.Button>\n </div>\n ))}\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={readOnly}\n onClick={() => {\n write({\n ...selected,\n fromColumns: [...selected.fromColumns, \"\"],\n toColumns: [...selected.toColumns, \"\"],\n });\n }}\n >\n Add a matching pair\n </ui.Button>\n </div>\n\n <div className=\"space-y-1\">\n <InlineSelect\n label=\"How many rows match\"\n value={selected.cardinality}\n empty=\"Pick the cardinality\"\n readOnly={readOnly}\n options={CARDINALITIES.map((option) => ({\n value: option.value,\n label: option.label,\n }))}\n onCommit={(value) => {\n write({\n ...selected,\n cardinality: value as BuilderCardinality,\n });\n }}\n />\n {selected.cardinality && FANS_OUT.includes(selected.cardinality) ? (\n <p className=\"text-xs text-amber-700\">\n This can match several rows on the right, which repeats the left\n row and double counts its totals. Pick it only when the data\n really is one to many.\n </p>\n ) : null}\n </div>\n\n {issues.length > 0 ? (\n <ul className=\"space-y-1 text-xs text-destructive\">\n {issues.map((issue) => (\n <li key={issue}>{issue}</li>\n ))}\n </ul>\n ) : null}\n\n <BuilderYamlStrip\n fragment={relationshipFragment(specYaml, selected.name)}\n />\n\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={readOnly}\n onClick={() => {\n onChange(removeRelationship(specYaml, selected.name));\n setSelectedName(null);\n }}\n >\n Remove this relationship\n </ui.Button>\n </div>\n ) : null}\n </div>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\n\nimport {\n dataStoreFragment,\n modelMetricIssues,\n readModelOutline,\n relationshipIssues,\n removeDataStore,\n upsertDataStore,\n type BuilderDataStore,\n} from \"@dlh.io/bideux-dashboard-core\";\n\nimport { useAuthoring } from \"./authoring-context.js\";\nimport type { DataModelConnection } from \"./authoring-ports.js\";\nimport { BuilderYamlStrip } from \"./builder-fields.js\";\nimport { cn } from \"./cn.js\";\nimport { DatasetBuilderPanel } from \"./dataset-builder-panel.js\";\nimport { InlineSelect, InlineText } from \"./inline-edit.js\";\nimport { MetricBuilderPanel } from \"./metric-builder-panel.js\";\nimport { RelationshipBuilderPanel } from \"./relationship-builder-panel.js\";\n\n/** Value the connection dropdown uses for \"no data_model_id in the YAML\". */\nconst HOST_DEFAULT = \"__host_default__\";\n\nexport type ModelLayer =\n | \"data_stores\"\n | \"datasets\"\n | \"relationships\"\n | \"metrics\";\n\nfunction DataStorePanel({\n specYaml,\n onChange,\n readOnly,\n connections,\n}: {\n specYaml: string;\n onChange: (specYaml: string) => void;\n readOnly: boolean;\n connections: DataModelConnection[];\n}) {\n const { ui } = useAuthoring();\n const stores = useMemo(\n () => readModelOutline(specYaml).dataStores,\n [specYaml],\n );\n const [selectedId, setSelectedId] = useState<string | null>(\n stores[0]?.id ?? null,\n );\n /** A store added just now opens its fields, since it has nothing to read. */\n const [addedId, setAddedId] = useState<string | null>(null);\n const selected =\n stores.find((store) => store.id === selectedId) ?? stores[0] ?? null;\n\n function write(next: BuilderDataStore, originalId?: string): void {\n onChange(upsertDataStore(specYaml, next, originalId));\n setSelectedId(next.id);\n }\n\n function addStore(): void {\n const base = \"store\";\n let id = base;\n let n = 2;\n while (stores.some((store) => store.id === id)) {\n id = `${base}_${n}`;\n n += 1;\n }\n write({\n id,\n name: null,\n vendor: null,\n dataModelId: connections[0]?.id ?? null,\n isDefault: stores.length === 0,\n });\n setAddedId(id);\n }\n\n const connection = connections.find(\n (entry) => entry.id === selected?.dataModelId,\n );\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"text-sm font-medium\">Data stores</div>\n <p className=\"text-xs text-muted-foreground\">\n Which warehouse connection a dataset reads. Datasets that name none\n use the store marked default.\n </p>\n </div>\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={readOnly}\n onClick={addStore}\n >\n Add data store\n </ui.Button>\n </div>\n\n {stores.length === 0 ? (\n <p className=\"rounded-md border border-dashed p-4 text-sm text-muted-foreground\">\n No data stores yet. Add one, or leave the model without any and every\n dataset uses the connection the host marks default.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {stores.map((store) => (\n <ui.Button\n key={store.id}\n size=\"sm\"\n variant={store.id === selected?.id ? \"primary\" : \"secondary\"}\n onClick={() => {\n setSelectedId(store.id);\n setAddedId(null);\n }}\n >\n {store.id}\n {store.isDefault ? (\n <ui.Badge tone=\"neutral\" className=\"ml-2\">\n default\n </ui.Badge>\n ) : null}\n </ui.Button>\n ))}\n </div>\n )}\n\n {selected ? (\n <div key={selected.id} className=\"space-y-4 rounded-md border p-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InlineText\n label=\"Id datasets point at\"\n value={selected.id}\n empty=\"Name this store\"\n placeholder=\"ops_dw\"\n mono\n readOnly={readOnly}\n startOpen={selected.id === addedId}\n onCommit={(value) => {\n write({ ...selected, id: value }, selected.id);\n }}\n />\n <InlineText\n label=\"Label (optional)\"\n value={selected.name}\n empty={`Defaults to ${selected.id}`}\n placeholder={selected.id}\n readOnly={readOnly}\n onCommit={(value) => {\n write({ ...selected, name: value || null });\n }}\n />\n </div>\n\n <InlineSelect\n label=\"Warehouse connection\"\n value={selected.dataModelId ?? HOST_DEFAULT}\n empty=\"Pick a connection\"\n readOnly={readOnly}\n options={[\n { value: HOST_DEFAULT, label: \"The host's default connection\" },\n ...connections.map((entry) => ({\n value: entry.id,\n label: entry.label,\n })),\n ]}\n hint={\n selected.dataModelId\n ? `Reads over ${connection?.vendor ?? \"its vendor\"}.`\n : \"Nothing is written into the YAML, so this store follows whichever connection the host marks default.\"\n }\n onCommit={(value) => {\n write({\n ...selected,\n dataModelId: value === HOST_DEFAULT ? null : value,\n vendor:\n connections.find((entry) => entry.id === value)?.vendor ??\n selected.vendor,\n });\n }}\n />\n\n <ui.Checkbox\n checked={selected.isDefault}\n disabled={readOnly}\n label=\"Datasets that do not name a store use this one\"\n onChange={(checked) => {\n write({ ...selected, isDefault: checked });\n }}\n />\n\n <BuilderYamlStrip\n fragment={dataStoreFragment(specYaml, selected.id)}\n />\n\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={readOnly}\n onClick={() => {\n onChange(removeDataStore(specYaml, selected.id));\n setSelectedId(null);\n }}\n >\n Remove this data store\n </ui.Button>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport interface ModelBuilderProps {\n specYaml: string;\n onChange: (specYaml: string) => void;\n readOnly: boolean;\n /** Sends the author to the YAML tab for anything the builder cannot edit. */\n onEditInYaml: () => void;\n}\n\n/**\n * The semantic model in four layers, each of which can only break the next.\n *\n * The rail carries counts and a badge for anything already broken, because a\n * dataset with no location column or a join that cannot resolve is exactly what\n * makes a widget error later, and it should be visible without pressing\n * anything.\n */\nexport function ModelBuilder({\n specYaml,\n onChange,\n readOnly,\n onEditInYaml,\n}: ModelBuilderProps) {\n const { transport, ui } = useAuthoring();\n const [layer, setLayer] = useState<ModelLayer>(\"datasets\");\n const [connections, setConnections] = useState<DataModelConnection[]>([]);\n const [connectionsReady, setConnectionsReady] = useState(false);\n const outline = useMemo(() => readModelOutline(specYaml), [specYaml]);\n\n useEffect(() => {\n let cancelled = false;\n const controller = new AbortController();\n async function load(): Promise<void> {\n try {\n const listed = await transport.listConnections({\n signal: controller.signal,\n });\n if (!cancelled) {\n setConnections(listed);\n setConnectionsReady(true);\n }\n } catch {\n // A failed list only costs the dropdown its options, and the panel says\n // so, so it must not blank the whole builder.\n if (!cancelled) {\n setConnections([]);\n setConnectionsReady(true);\n }\n }\n }\n void load();\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [transport]);\n\n const datasetsMissingFilterField = outline.datasets.filter(\n (dataset) => !dataset.filterField,\n ).length;\n const brokenRelationships = outline.relationships.filter(\n (relationship) =>\n relationshipIssues(relationship, outline.datasets, outline.dataStores)\n .length > 0,\n ).length;\n const brokenMetrics = outline.modelMetrics.filter(\n (metric) =>\n modelMetricIssues(metric, outline.datasets, outline.relationships)\n .length > 0,\n ).length;\n\n if (outline.error) {\n return (\n <div className=\"flex h-full items-center justify-center p-6\">\n <div className=\"max-w-md space-y-3 rounded-md border border-amber-300 bg-amber-50 p-4 text-sm text-amber-900\">\n <div className=\"font-medium\">This model has a YAML syntax error</div>\n <p>{`${outline.error.message} (line ${outline.error.line})`}</p>\n <p>\n The builder will not guess at half-parsed text, so fix it in the\n YAML tab and come back.\n </p>\n <ui.Button size=\"sm\" variant=\"secondary\" onClick={onEditInYaml}>\n Open the YAML tab\n </ui.Button>\n </div>\n </div>\n );\n }\n\n const rail: {\n id: ModelLayer;\n label: string;\n count: number;\n broken: number;\n brokenTitle: string;\n }[] = [\n {\n id: \"data_stores\",\n label: \"Data stores\",\n count: outline.dataStores.length,\n broken: 0,\n brokenTitle: \"\",\n },\n {\n id: \"datasets\",\n label: \"Datasets\",\n count: outline.datasets.length,\n broken: datasetsMissingFilterField,\n brokenTitle: `${datasetsMissingFilterField} without a location column`,\n },\n {\n id: \"relationships\",\n label: \"Relationships\",\n count: outline.relationships.length,\n broken: brokenRelationships,\n brokenTitle: `${brokenRelationships} that cannot join as written`,\n },\n {\n id: \"metrics\",\n label: \"Metrics\",\n count: outline.modelMetrics.length,\n broken: brokenMetrics,\n brokenTitle: `${brokenMetrics} that cannot be computed as written`,\n },\n ];\n\n return (\n <div className=\"flex h-full min-h-0\">\n <div className=\"w-52 shrink-0 space-y-1 border-r p-3\">\n {rail.map((entry) => (\n <button\n key={entry.id}\n type=\"button\"\n onClick={() => {\n setLayer(entry.id);\n }}\n className={cn(\n \"flex w-full items-center justify-between rounded-md px-3 py-2 text-sm\",\n entry.id === layer\n ? \"bg-muted font-medium\"\n : \"text-muted-foreground hover:bg-muted/50\",\n )}\n >\n <span>{entry.label}</span>\n <span className=\"flex items-center gap-1\">\n {entry.broken > 0 ? (\n <ui.Badge tone=\"danger\" title={entry.brokenTitle}>\n {entry.broken}\n </ui.Badge>\n ) : null}\n <span className=\"text-xs text-muted-foreground\">\n {entry.count}\n </span>\n </span>\n </button>\n ))}\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-auto p-4\">\n {layer === \"data_stores\" ? (\n <DataStorePanel\n specYaml={specYaml}\n onChange={onChange}\n readOnly={readOnly}\n connections={connections}\n />\n ) : null}\n {layer === \"datasets\" ? (\n <DatasetBuilderPanel\n specYaml={specYaml}\n onChange={onChange}\n readOnly={readOnly}\n connections={connections}\n connectionsReady={connectionsReady}\n onEditInYaml={onEditInYaml}\n />\n ) : null}\n {layer === \"relationships\" ? (\n <RelationshipBuilderPanel\n specYaml={specYaml}\n onChange={onChange}\n readOnly={readOnly}\n datasets={outline.datasets}\n stores={outline.dataStores}\n relationships={outline.relationships}\n onEditInYaml={onEditInYaml}\n />\n ) : null}\n {layer === \"metrics\" ? (\n <MetricBuilderPanel\n specYaml={specYaml}\n onChange={onChange}\n readOnly={readOnly}\n datasets={outline.datasets}\n relationships={outline.relationships}\n metrics={outline.modelMetrics}\n onEditInYaml={onEditInYaml}\n />\n ) : null}\n </div>\n </div>\n );\n}\n","import type { ModelVersionSummary } from \"./authoring-ports.js\";\n\n/**\n * Labels for the model history list.\n *\n * A row has to answer \"is this the one I want\" without opening it, so it carries\n * when it was replaced, how big it was, how many datasets it declared, and any\n * note the host recorded with it.\n */\nexport interface VersionRowLabel {\n title: string;\n detail: string;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n return `${(bytes / 1024).toFixed(1)} KB`;\n}\n\n/** Relative age, coarse on purpose: a version list is scanned, not measured. */\nexport function formatAge(iso: string, now: Date = new Date()): string {\n const then = new Date(iso);\n if (Number.isNaN(then.getTime())) return \"unknown\";\n const seconds = Math.max(\n 0,\n Math.round((now.getTime() - then.getTime()) / 1000),\n );\n if (seconds < 60) return \"just now\";\n const minutes = Math.round(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.round(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.round(hours / 24);\n if (days < 30) return `${days}d ago`;\n return then.toLocaleDateString();\n}\n\nexport function versionRowLabel(\n version: ModelVersionSummary,\n now: Date = new Date(),\n): VersionRowLabel {\n const datasets =\n version.datasetCount === 1\n ? \"1 dataset\"\n : `${version.datasetCount} datasets`;\n const parts = [\n formatAge(version.createdAt, now),\n datasets,\n formatSize(version.sizeBytes),\n ];\n if (version.note) parts.push(version.note);\n return {\n title: `Version ${version.version}`,\n detail: parts.join(\" - \"),\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport {\n MODEL_TEMPLATES,\n countModelIssues,\n diagnosticsToMarkers,\n insertModelTemplate,\n yamlSyntaxMarkers,\n type DashboardModelDiagnostics,\n type ModelMarker,\n} from \"@dlh.io/bideux-dashboard-core\";\n\nimport { useAuthoring } from \"./authoring-context.js\";\nimport type { ModelVersionSummary } from \"./authoring-ports.js\";\nimport { cn } from \"./cn.js\";\nimport { ModelBuilder } from \"./model-builder.js\";\nimport { versionRowLabel } from \"./model-version-history.js\";\n\nexport type ModelEditorMode = \"builder\" | \"yaml\";\n\nexport const DEFAULT_MODEL_YAML = `# Shared semantic model\n# Reusable data stores, datasets, relationships, and metrics.\n# Dashboards reference it with spec.semantic_model_ref: default.\nversion: \"1.0\"\nkind: semantic_model\nname: default\ndata_stores: []\ndatasets: []\nrelationships: []\nmetrics: []\n`;\n\nexport function modelIssueLines(\n diagnostics: DashboardModelDiagnostics,\n): string[] {\n return [\n ...diagnostics.model.issues.map((issue) => `model: ${issue}`),\n ...diagnostics.data_stores.flatMap((store) =>\n store.issues.map((issue) => `data store ${store.id}: ${issue}`),\n ),\n ...diagnostics.datasets.flatMap((dataset) =>\n dataset.issues.map((issue) => `dataset ${dataset.id}: ${issue}`),\n ),\n ...diagnostics.relationships.flatMap((relationship) =>\n relationship.issues.map(\n (issue) => `relationship ${relationship.name}: ${issue}`,\n ),\n ),\n ...diagnostics.metrics.flatMap((metric) =>\n metric.issues.map(\n (issue) => `metric ${String(metric.metric.id)}: ${issue}`,\n ),\n ),\n ];\n}\n\nexport function modelNoteLines(\n diagnostics: DashboardModelDiagnostics,\n): string[] {\n return diagnostics.data_stores.flatMap((store) =>\n (store.notes ?? []).map((note) => `data store ${store.id}: ${note}`),\n );\n}\n\nexport interface ModelEditorProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSaved?: (() => void | Promise<void>) | undefined;\n}\n\n/**\n * The semantic model, edited as a form or as text, on one document.\n *\n * Builder and YAML edit the same string, so switching keeps comments and\n * anything the builder does not show. A save validates first, because saving a\n * broken model breaks every dashboard that reads it, and the second click saves\n * anyway so deliberate work in progress is not trapped behind a checker.\n */\nexport function ModelEditor({ open, onOpenChange, onSaved }: ModelEditorProps) {\n const {\n transport,\n ui,\n editor: CodeEditor,\n canEdit,\n onNotice,\n } = useAuthoring();\n const [value, setValue] = useState(DEFAULT_MODEL_YAML);\n const [savedValue, setSavedValue] = useState(DEFAULT_MODEL_YAML);\n const [loading, setLoading] = useState(false);\n const [saving, setSaving] = useState(false);\n const [validating, setValidating] = useState(false);\n const [diagnostics, setDiagnostics] =\n useState<DashboardModelDiagnostics | null>(null);\n const [error, setError] = useState<string | null>(null);\n // Set when a save was stopped by validation. The next save goes through.\n const [saveAnyway, setSaveAnyway] = useState(false);\n const [serverMarkers, setServerMarkers] = useState<ModelMarker[]>([]);\n const [mode, setMode] = useState<ModelEditorMode>(\"builder\");\n const [historyOpen, setHistoryOpen] = useState(false);\n const [versions, setVersions] = useState<ModelVersionSummary[] | null>(null);\n const [busyVersion, setBusyVersion] = useState<number | null>(null);\n // Set while the editor holds an old version's text that is not live yet.\n const [previewing, setPreviewing] = useState<number | null>(null);\n const [editable, setEditable] = useState(canEdit);\n\n const dirty = value !== savedValue;\n const writable = canEdit && editable;\n // Syntax errors mark as you type; server findings only after a validate or a\n // save, so the gutter never contradicts what the panel says.\n const syntaxMarkers = useMemo(() => yamlSyntaxMarkers(value), [value]);\n const markers = useMemo(\n () => (syntaxMarkers.length > 0 ? syntaxMarkers : serverMarkers),\n [syntaxMarkers, serverMarkers],\n );\n\n useEffect(() => {\n if (!open) return;\n let cancelled = false;\n const controller = new AbortController();\n async function load(): Promise<void> {\n setLoading(true);\n setError(null);\n try {\n const model = await transport.loadModel({ signal: controller.signal });\n if (cancelled) return;\n const yaml = model.specYaml || DEFAULT_MODEL_YAML;\n setValue(yaml);\n setSavedValue(yaml);\n setEditable(model.editable);\n } catch (err) {\n if (!cancelled) {\n setError(\n err instanceof Error ? err.message : \"Failed to load model YAML\",\n );\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n void load();\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [transport, open]);\n\n const close = useCallback(() => {\n setDiagnostics(null);\n setServerMarkers([]);\n setSaveAnyway(false);\n setError(null);\n setPreviewing(null);\n setVersions(null);\n onOpenChange(false);\n }, [onOpenChange]);\n\n const handleValidate = useCallback(async () => {\n setValidating(true);\n setError(null);\n setDiagnostics(null);\n try {\n const result = await transport.validateModel({ specYaml: value });\n setDiagnostics(result);\n setServerMarkers(diagnosticsToMarkers(value, result));\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to validate model YAML\",\n );\n } finally {\n setValidating(false);\n }\n }, [transport, value]);\n\n const handleSave = useCallback(async () => {\n setSaving(true);\n setError(null);\n try {\n // Validate first: saving a broken model breaks every dashboard that reads\n // it, and the host only rejects YAML it cannot parse at all.\n if (!saveAnyway) {\n const result = await transport.validateModel({ specYaml: value });\n setDiagnostics(result);\n setServerMarkers(diagnosticsToMarkers(value, result));\n const issues = countModelIssues(result);\n if (issues > 0) {\n setSaveAnyway(true);\n setError(\n `${issues} ${issues === 1 ? \"issue\" : \"issues\"} found, marked in the editor. ` +\n \"Fix them, or click Save again to save anyway.\",\n );\n return;\n }\n }\n await transport.saveModel({ specYaml: value });\n setSavedValue(value);\n setSaveAnyway(false);\n setPreviewing(null);\n // The save produced a new version, so a stale list would omit it.\n setVersions(null);\n onNotice({ tone: \"success\", message: \"Model saved\" });\n await onSaved?.();\n close();\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to save model YAML\",\n );\n } finally {\n setSaving(false);\n }\n }, [close, onNotice, onSaved, saveAnyway, transport, value]);\n\n useEffect(() => {\n if (!open || !historyOpen || !writable || versions !== null) return;\n let cancelled = false;\n const controller = new AbortController();\n async function load(): Promise<void> {\n try {\n const listed = await transport.listModelVersions({\n signal: controller.signal,\n });\n if (!cancelled) setVersions(listed);\n } catch (err) {\n if (cancelled) return;\n setError(\n err instanceof Error ? err.message : \"Failed to load model history\",\n );\n setVersions([]);\n }\n }\n void load();\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [transport, historyOpen, open, versions, writable]);\n\n const handlePreview = useCallback(\n async (version: number) => {\n setBusyVersion(version);\n setError(null);\n try {\n const snapshot = await transport.loadModelVersion({ version });\n setValue(snapshot.specYaml);\n setPreviewing(version);\n setDiagnostics(null);\n setServerMarkers([]);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to load that version\",\n );\n } finally {\n setBusyVersion(null);\n }\n },\n [transport],\n );\n\n const handleRestore = useCallback(\n async (version: number) => {\n setBusyVersion(version);\n setError(null);\n try {\n const model = await transport.restoreModelVersion({ version });\n setValue(model.specYaml);\n setSavedValue(model.specYaml);\n setPreviewing(null);\n setSaveAnyway(false);\n setVersions(null);\n onNotice({\n tone: \"success\",\n message: `Version ${version} is live again`,\n });\n await onSaved?.();\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to restore that version\",\n );\n } finally {\n setBusyVersion(null);\n }\n },\n [onNotice, onSaved, transport],\n );\n\n const issueCount = diagnostics ? countModelIssues(diagnostics) : 0;\n const previewingIsLive =\n previewing !== null &&\n (versions?.some(\n (entry) => entry.version === previewing && entry.isCurrent,\n ) ??\n false);\n const firstSyntaxMarker = syntaxMarkers[0];\n\n return (\n <ui.Modal\n open={open}\n size=\"xl\"\n title={\n writable\n ? `Semantic model${dirty ? \" (unsaved changes)\" : \"\"}`\n : \"Semantic model (read-only)\"\n }\n description=\"The data stores, datasets, relationships, and metrics shared across dashboards. Builder and YAML edit the same text, so switching keeps your comments and anything the builder does not show.\"\n onOpenChange={(next) => {\n if (!next) close();\n }}\n footer={\n <div className=\"flex items-center justify-end gap-3\">\n <ui.Button variant=\"secondary\" disabled={saving} onClick={close}>\n {writable ? \"Cancel\" : \"Close\"}\n </ui.Button>\n {writable ? (\n <ui.Button\n disabled={saving || loading}\n onClick={() => {\n void handleSave();\n }}\n >\n {saveAnyway ? \"Save anyway\" : \"Save\"}\n </ui.Button>\n ) : null}\n </div>\n }\n >\n <div className=\"flex min-h-0 flex-col gap-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex rounded-md border p-0.5\">\n {(\n [\n [\"builder\", \"Builder\"],\n [\"yaml\", \"YAML\"],\n ] as [ModelEditorMode, string][]\n ).map(([id, label]) => (\n <button\n key={id}\n type=\"button\"\n aria-pressed={mode === id}\n className={cn(\n \"rounded px-3 py-1 text-xs\",\n mode === id\n ? \"bg-muted font-medium\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n onClick={() => {\n setMode(id);\n }}\n >\n {label}\n </button>\n ))}\n </div>\n\n {writable ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n <ui.Menu\n ariaLabel=\"Insert a template\"\n trigger={\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={loading || mode !== \"yaml\"}\n title={\n mode === \"yaml\"\n ? \"Paste a starting point into the text\"\n : \"Templates paste YAML, so switch to the YAML tab\"\n }\n >\n Insert\n </ui.Button>\n }\n items={MODEL_TEMPLATES.map((template) => ({\n id: template.id,\n label: template.label,\n disabled: mode !== \"yaml\",\n onSelect: () => {\n setValue((current) =>\n insertModelTemplate(current, template),\n );\n },\n }))}\n />\n <ui.Button\n size=\"sm\"\n variant={historyOpen ? \"primary\" : \"secondary\"}\n disabled={loading}\n onClick={() => {\n setHistoryOpen((current) => !current);\n }}\n >\n History\n </ui.Button>\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={validating || loading}\n onClick={() => {\n void handleValidate();\n }}\n >\n {validating ? \"Validating...\" : \"Validate model\"}\n </ui.Button>\n </div>\n ) : null}\n </div>\n\n {previewing !== null ? (\n <div className=\"flex items-center justify-between gap-3 rounded-md border bg-muted px-3 py-2 text-sm\">\n <span>\n {previewingIsLive\n ? `Showing version ${previewing}, which is what the model already says.`\n : `Showing version ${previewing}. It is not live: restore it, or save to keep it as a new edit.`}\n </span>\n {!previewingIsLive ? (\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={busyVersion !== null}\n onClick={() => {\n void handleRestore(previewing);\n }}\n >\n {`Restore version ${previewing}`}\n </ui.Button>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"flex min-h-0 flex-1 gap-3\">\n <div className=\"min-h-0 flex-1 overflow-auto\">\n {loading ? (\n <p className=\"p-6 text-sm text-muted-foreground\">\n Loading model YAML...\n </p>\n ) : mode === \"builder\" ? (\n <ModelBuilder\n specYaml={value}\n onChange={setValue}\n readOnly={!writable}\n onEditInYaml={() => {\n setMode(\"yaml\");\n }}\n />\n ) : (\n <CodeEditor\n value={value}\n language=\"yaml\"\n readOnly={!writable}\n markers={markers}\n ariaLabel=\"Semantic model YAML\"\n onChange={setValue}\n />\n )}\n </div>\n\n {writable && historyOpen ? (\n <div className=\"w-72 shrink-0 overflow-auto border-l pl-3\">\n <div className=\"text-sm font-medium\">Saved versions</div>\n <p className=\"mb-3 mt-1 text-[11px] text-muted-foreground\">\n Each row is the text a save replaced, so the newest row is what\n you had before the last save, not what is live now.\n </p>\n {versions === null ? (\n <p className=\"text-xs text-muted-foreground\">\n Loading history...\n </p>\n ) : versions.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n No earlier versions yet. The text being replaced is kept every\n time the model is saved.\n </p>\n ) : (\n <ul className=\"space-y-2\">\n {versions.map((version) => {\n const label = versionRowLabel(version);\n return (\n <li\n key={version.version}\n className={cn(\n \"rounded-md border p-2 text-xs\",\n version.isCurrent\n ? \"bg-muted/50 text-muted-foreground\"\n : \"\",\n )}\n >\n <div className=\"flex items-center gap-2 font-medium\">\n {label.title}\n {version.isCurrent ? (\n <ui.Badge\n tone=\"neutral\"\n title=\"Exactly what the model says now\"\n >\n live\n </ui.Badge>\n ) : null}\n </div>\n <div className=\"text-muted-foreground\">\n {label.detail}\n </div>\n <div className=\"mt-2 flex gap-2\">\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={busyVersion !== null}\n onClick={() => {\n void handlePreview(version.version);\n }}\n >\n View\n </ui.Button>\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={busyVersion !== null || version.isCurrent}\n title={\n version.isCurrent\n ? \"Already live, so restoring it would change nothing\"\n : `Make version ${version.version} live again`\n }\n onClick={() => {\n void handleRestore(version.version);\n }}\n >\n Restore\n </ui.Button>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n ) : null}\n </div>\n\n {error !== null ? (\n <div className=\"rounded border border-destructive/20 bg-destructive/10 px-3 py-2 text-sm text-destructive\">\n {error}\n </div>\n ) : null}\n\n {firstSyntaxMarker ? (\n <div className=\"rounded border border-amber-300 bg-amber-50 px-3 py-2 text-sm text-amber-800\">\n {`This is not valid YAML yet: ${firstSyntaxMarker.message} (line ${firstSyntaxMarker.startLineNumber})`}\n </div>\n ) : null}\n\n {diagnostics ? (\n <div className=\"max-h-48 space-y-1 overflow-auto rounded border bg-muted px-3 py-2 text-xs\">\n {issueCount === 0 ? (\n <div className=\"text-sm\">\n {`Model is valid: ${diagnostics.data_stores.length} data stores, ${diagnostics.datasets.length} datasets, ${diagnostics.relationships.length} relationships, ${diagnostics.metrics.length} metrics.`}\n </div>\n ) : (\n <>\n <div className=\"text-sm font-medium\">\n {`${issueCount} issues found, marked in the editor`}\n </div>\n {modelIssueLines(diagnostics).map((line, index) => (\n <div key={index} className=\"text-muted-foreground\">\n {line}\n </div>\n ))}\n </>\n )}\n {modelNoteLines(diagnostics).map((line, index) => (\n <div key={`note-${index}`} className=\"text-muted-foreground\">\n {line}\n </div>\n ))}\n </div>\n ) : null}\n </div>\n </ui.Modal>\n );\n}\n","import { cellText } from \"@dlh.io/bideux-dashboard-renderers\";\nimport type { PivotDetailResult } from \"@dlh.io/bideux-dashboard-renderers\";\n\nimport { useUiKit } from \"./context.js\";\n\nexport interface PivotDetailModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** The clicked cell, in words: its row path and column values. */\n cellLabel: string;\n loading: boolean;\n error: string | null;\n result: PivotDetailResult | null;\n}\n\n/**\n * The rows behind one pivot cell, as a plain list.\n *\n * The pivot shows an aggregate; this shows what it aggregated, under the same\n * dashboard filters. The server caps the list, and the cap is said out loud\n * rather than passing a partial list off as the whole answer.\n */\nexport function PivotDetailModal({\n open,\n onOpenChange,\n cellLabel,\n loading,\n error,\n result,\n}: PivotDetailModalProps) {\n const ui = useUiKit();\n return (\n <ui.Modal\n open={open}\n onOpenChange={onOpenChange}\n size=\"lg\"\n title={cellLabel === \"\" ? \"Underlying rows\" : `Rows behind ${cellLabel}`}\n >\n {loading && (\n <p className=\"py-8 text-sm text-muted-foreground\">\n Fetching the rows behind this cell...\n </p>\n )}\n {!loading && error !== null && (\n <p className=\"py-4 text-sm text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n {!loading && error === null && result !== null && (\n <>\n <p className=\"text-xs text-muted-foreground\">\n {result.truncated\n ? `Showing the first ${result.rows.length.toLocaleString()} of ${result.row_count.toLocaleString()} matching rows.`\n : `${result.row_count.toLocaleString()} matching ${result.row_count === 1 ? \"row\" : \"rows\"}.`}\n </p>\n <div className=\"min-h-0 flex-1 overflow-auto\">\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr>\n {result.columns.map((column) => (\n <th\n key={column.key}\n scope=\"col\"\n className=\"whitespace-nowrap bg-muted/50 px-2 py-1 text-left\"\n >\n {column.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {result.rows.map((row, index) => (\n <tr key={index} className=\"border-b last:border-0\">\n {result.columns.map((column) => (\n <td\n key={column.key}\n className=\"whitespace-nowrap px-2 py-1\"\n >\n {cellText(row[column.key])}\n </td>\n ))}\n </tr>\n ))}\n {result.rows.length === 0 && (\n <tr>\n <td\n colSpan={Math.max(result.columns.length, 1)}\n className=\"px-2 py-4 text-center text-muted-foreground\"\n >\n No rows matched this cell.\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </>\n )}\n </ui.Modal>\n );\n}\n","import type { ComponentType, CSSProperties, ReactNode } from \"react\";\n\nimport type {\n PivotDetailResult,\n RendererContext,\n WidgetInteraction,\n WidgetResult,\n WidgetSpec,\n} from \"@dlh.io/bideux-dashboard-renderers\";\nimport type {\n Breakpoint,\n ResponsiveLayouts,\n WidgetInteractionContext,\n} from \"@dlh.io/bideux-dashboard-core\";\nimport type { DashboardSpec } from \"@dlh.io/bideux-dashboard-spec\";\n\n/**\n * Every glyph the reader and builder draw. `defaultIcons` covers them all with\n * inline SVG; a host maps any subset onto its own icon library and the rest\n * fall back to the built-in glyphs.\n */\nexport type IconName =\n | \"activity\"\n | \"alert\"\n | \"arrowDown\"\n | \"arrowLeft\"\n | \"arrowUp\"\n | \"arrowUpDown\"\n | \"building\"\n | \"calendar\"\n | \"check\"\n | \"chevronDown\"\n | \"chevronLeft\"\n | \"chevronRight\"\n | \"close\"\n | \"code\"\n | \"copy\"\n | \"download\"\n | \"expand\"\n | \"eye\"\n | \"filter\"\n | \"grip\"\n | \"help\"\n | \"info\"\n | \"layers\"\n | \"loader\"\n | \"lock\"\n | \"minus\"\n | \"more\"\n | \"plus\"\n | \"refresh\"\n | \"save\"\n | \"search\"\n | \"settings\"\n | \"share\"\n | \"sliders\"\n | \"sparkles\"\n | \"spreadsheet\"\n | \"trash\"\n | \"trendDown\"\n | \"trendFlat\"\n | \"trendUp\"\n | \"undo\"\n | \"users\";\n\nexport interface IconProps {\n className?: string | undefined;\n title?: string | undefined;\n}\n\nexport type IconSet = Record<IconName, ComponentType<IconProps>>;\n\nexport interface UiButtonProps {\n children?: ReactNode;\n className?: string | undefined;\n disabled?: boolean | undefined;\n onClick?: (() => void) | undefined;\n title?: string | undefined;\n ariaLabel?: string | undefined;\n variant?: \"primary\" | \"secondary\" | \"ghost\" | \"link\" | undefined;\n size?: \"sm\" | \"md\" | undefined;\n type?: \"button\" | \"submit\" | undefined;\n}\n\nexport interface UiTooltipProps {\n label: ReactNode;\n children: ReactNode;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\" | undefined;\n}\n\nexport interface UiPopoverProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n trigger: ReactNode;\n children: ReactNode;\n align?: \"start\" | \"center\" | \"end\" | undefined;\n className?: string | undefined;\n}\n\nexport interface UiModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: ReactNode;\n description?: ReactNode;\n /** Replaces the plain title row, for a modal that carries its own navigation. */\n header?: ReactNode;\n footer?: ReactNode;\n children: ReactNode;\n size?: \"md\" | \"lg\" | \"xl\" | undefined;\n}\n\nexport interface UiSelectOption {\n value: string;\n label: string;\n disabled?: boolean | undefined;\n}\n\nexport interface UiSelectProps {\n value: string;\n options: UiSelectOption[];\n onChange: (value: string) => void;\n placeholder?: string | undefined;\n disabled?: boolean | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n}\n\nexport interface UiTextInputProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string | undefined;\n disabled?: boolean | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n type?: \"text\" | \"number\" | \"date\" | \"search\" | undefined;\n onCommit?: (() => void) | undefined;\n}\n\nexport interface UiCheckboxProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n label: ReactNode;\n disabled?: boolean | undefined;\n className?: string | undefined;\n}\n\nexport interface UiBadgeProps {\n children: ReactNode;\n tone?: \"neutral\" | \"info\" | \"success\" | \"warning\" | \"danger\" | undefined;\n className?: string | undefined;\n title?: string | undefined;\n}\n\nexport interface UiSkeletonProps {\n className?: string | undefined;\n style?: CSSProperties | undefined;\n}\n\nexport interface UiMenuItem {\n id: string;\n label: string;\n icon?: IconName | undefined;\n disabled?: boolean | undefined;\n onSelect: () => void;\n}\n\nexport interface UiMenuProps {\n items: UiMenuItem[];\n trigger: ReactNode;\n ariaLabel?: string | undefined;\n}\n\n/**\n * The design system seam. A host passes its own primitives, so the reader runs\n * unchanged on shadcn, on Material, or on the plain elements the reference host\n * uses to prove the package carries no design system of its own.\n */\nexport interface UiKit {\n Badge: ComponentType<UiBadgeProps>;\n Button: ComponentType<UiButtonProps>;\n Checkbox: ComponentType<UiCheckboxProps>;\n Menu: ComponentType<UiMenuProps>;\n Modal: ComponentType<UiModalProps>;\n Popover: ComponentType<UiPopoverProps>;\n Select: ComponentType<UiSelectProps>;\n Skeleton: ComponentType<UiSkeletonProps>;\n TextInput: ComponentType<UiTextInputProps>;\n Tooltip: ComponentType<UiTooltipProps>;\n}\n\nexport interface AssetResolver {\n /** Turns a stored image reference into something an img tag can load. */\n resolve: (reference: string) => string;\n}\n\nexport interface HostLinkProps {\n href: string;\n children: ReactNode;\n className?: string | undefined;\n target?: \"_blank\" | \"_self\" | undefined;\n onNavigate?: (() => void) | undefined;\n}\n\nexport interface HostLinks {\n Link: ComponentType<HostLinkProps>;\n /** The route the reader currently sits on, when the host tracks one. */\n currentHref?: string | undefined;\n navigate?: (\n href: string,\n options?: { newTab?: boolean; params?: Record<string, unknown> },\n ) => void;\n}\n\nexport interface Notice {\n tone: \"info\" | \"success\" | \"warning\" | \"error\";\n message: string;\n detail?: string;\n}\n\nexport type NoticeSink = (notice: Notice) => void;\n\nexport interface DashboardRunRequest {\n dashboardId: string;\n filters?: Record<string, unknown>;\n signal?: AbortSignal;\n}\n\nexport interface DashboardRunResponse {\n results: Record<string, WidgetResult>;\n /** Present when the caller did not already hold the specs, as a drill does. */\n dashboard: DashboardSpec;\n widgets: Record<string, WidgetSpec>;\n name?: string;\n errors?: Record<string, string>;\n}\n\nexport interface WidgetRunRequest {\n dashboardId: string;\n widgetId: string;\n filters?: Record<string, unknown>;\n signal?: AbortSignal;\n}\n\nexport interface WidgetDetailRequest extends WidgetRunRequest {\n /** The clicked cell, named by the labels the pivot printed. */\n cell: Record<string, string>;\n label?: string;\n limit?: number;\n}\n\nexport interface DrillRunRequest {\n dashboardId: string;\n widgetId: string;\n interaction: WidgetInteraction;\n context: WidgetInteractionContext;\n filters?: Record<string, unknown>;\n signal?: AbortSignal;\n}\n\nexport interface DrillRunResponse {\n columns: string[];\n rows: Record<string, unknown>[];\n truncated?: boolean;\n}\n\nexport interface LayoutSaveRequest {\n dashboardId: string;\n /** Positions per breakpoint key (`lg`, `md`, `sm`, `xs`, `xxs`). */\n layouts: ResponsiveLayouts;\n /** Row height and column overrides per breakpoint, when the author changed them. */\n gridOverrides?: Partial<\n Record<Breakpoint, { rowHeight?: number; cols?: number }>\n >;\n /** Widgets kept off the grid without being deleted. */\n unplacedWidgetIds?: string[];\n /** The row limit after any Add rows the author clicked. */\n maxRows?: number;\n /** A breakpoint name that caps the dashboard width, or `null` to lift the cap. */\n maxLayoutWidth?: string | null;\n /** Dashboard level grid behaviour the author toggled in the Grid popover. */\n grid?: { isBounded?: boolean; preventCollision?: boolean };\n /** The data store widgets query by default, or `null` for the host default. */\n dataModelId?: string | null;\n /**\n * The dashboard's `updatedAt` when editing began. A host that supports\n * optimistic concurrency rejects the save with `LayoutConflictError` when a\n * newer version exists.\n */\n expectedUpdatedAt?: string;\n signal?: AbortSignal;\n}\n\nexport interface LayoutSaveResponse {\n /** The dashboard's version stamp after the save, for the next request. */\n updatedAt?: string;\n}\n\n/**\n * Thrown by `saveLayout` when someone else saved first. The reader offers to\n * overwrite or to reload rather than silently losing either side's work.\n */\nexport class LayoutConflictError extends Error {\n readonly conflict = true;\n constructor(message = \"Someone else changed this dashboard\") {\n super(message);\n this.name = \"LayoutConflictError\";\n }\n}\n\nexport function isLayoutConflict(error: unknown): boolean {\n return error instanceof LayoutConflictError;\n}\n\n/**\n * The only way the reader reaches a server. No fetch, no server action and no\n * URL is written inside the package.\n */\nexport interface DashboardTransport {\n runDashboard: (request: DashboardRunRequest) => Promise<DashboardRunResponse>;\n runWidget: (request: WidgetRunRequest) => Promise<WidgetResult>;\n runWidgetDetail?: (\n request: WidgetDetailRequest,\n ) => Promise<PivotDetailResult>;\n runDrill?: (request: DrillRunRequest) => Promise<DrillRunResponse>;\n saveLayout?: (\n request: LayoutSaveRequest,\n ) => Promise<LayoutSaveResponse | void>;\n}\n\n/**\n * Structural copy of the lifecycle the browser renderer packages return. It is\n * declared here rather than imported so the React package keeps its dependency\n * on the concrete renderers optional and host owned.\n */\nexport interface ReaderRenderer {\n update: (input: RendererMountInput) => void;\n resize: () => void;\n destroy: () => void;\n}\n\nexport interface RendererMountCallbacks {\n onInteraction?: (\n interaction: WidgetInteraction,\n context: WidgetInteractionContext,\n ) => void;\n onRetry?: () => void;\n onFilterChange?: (widgetId: string, value: unknown) => void;\n onFilterLabelChange?: (widgetId: string, label: string) => void;\n onError?: (error: Error) => void;\n onPivotDetail?: (payload: PivotDetailPayload) => void;\n onPivotView?: (widgetId: string, view: Record<string, unknown>) => void;\n onExport?: (request: RendererExportRequest) => void | Promise<void>;\n}\n\n/** A CSV or Excel export a concrete renderer's toolbar asked the reader for. */\nexport interface RendererExportRequest {\n widgetId: string;\n format: \"csv\" | \"excel\";\n filename: string;\n}\n\n/**\n * A pivot cell a reader asked to see behind, exactly as the concrete pivot\n * renderer raises it: the cell is named by the dimension labels the pivot\n * printed, because the labels are all the browser holds.\n */\nexport interface PivotDetailPayload {\n widgetId: string;\n /** The clicked cell in words, which titles the detail modal. */\n label: string;\n filters: Record<string, string>;\n}\n\nexport interface RendererMountInput {\n element: HTMLElement;\n widget: WidgetSpec;\n result?: WidgetResult;\n context?: RendererContext;\n filterValue?: unknown;\n callbacks?: RendererMountCallbacks;\n theme?: Record<string, unknown>;\n}\n\nexport type RendererFactory = (\n input: RendererMountInput,\n) => ReaderRenderer | Promise<ReaderRenderer>;\n\n/**\n * Renderer factories keyed by widget component. Hosts wire the phase 8 packages\n * here: createEChartsRenderer for charts, createTabulatorRenderer for grids,\n * createRevoGridRenderer for pivots, createNativeWidgetRenderer for the rest.\n */\nexport type RendererFactories = Partial<Record<string, RendererFactory>> & {\n default?: RendererFactory;\n};\n","import type { CSSProperties } from \"react\";\n\nimport type { WidgetResult } from \"@dlh.io/bideux-dashboard-renderers\";\nimport type {\n DashboardSectionConfig,\n WidgetSpec,\n} from \"@dlh.io/bideux-dashboard-spec\";\n\nimport { cn } from \"./cn.js\";\nimport { cssProps } from \"./style.js\";\nimport { WidgetRenderer } from \"./widget-renderer.js\";\n\nconst SECTION_COMPONENTS = new Set([\"text\", \"image\", \"markdown\"]);\n\nexport interface DashboardSectionProps {\n section: DashboardSectionConfig;\n results?: Record<string, WidgetResult>;\n className?: string;\n style?: CSSProperties;\n}\n\n/** The dashboard header and footer strips, which hold content, not data tiles. */\nexport function DashboardSection({\n section,\n results = {},\n className,\n style,\n}: DashboardSectionProps) {\n if (section.visible === false) return null;\n const widgets = (section.widgets ?? []) as WidgetSpec[];\n const visible = widgets.filter((widget) =>\n SECTION_COMPONENTS.has(String(widget.spec.component ?? \"\")),\n );\n if (visible.length === 0 && section.height === undefined) return null;\n\n const sectionStyle: CSSProperties = {\n ...cssProps({\n padding: section.padding ?? 16,\n height: section.height,\n textAlign: section.textAlign,\n background: section.background,\n }),\n ...style,\n };\n\n const alignClass =\n section.verticalAlign === \"middle\"\n ? \"items-center\"\n : section.verticalAlign === \"bottom\"\n ? \"items-end\"\n : \"items-start\";\n\n return (\n <div className={cn(\"bideux-section\", className)} style={sectionStyle}>\n <div className={cn(\"flex h-full w-full flex-wrap gap-4\", alignClass)}>\n {visible.map((widget) => (\n <div key={widget.metadata.id} className=\"min-w-0 flex-1\">\n <WidgetRenderer\n widget={widget}\n {...(results[widget.metadata.id] === undefined\n ? {}\n : { result: results[widget.metadata.id] })}\n className=\"h-full w-full\"\n />\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport {\n filterPanelConfig,\n getClickInteraction,\n} from \"@dlh.io/bideux-dashboard-core\";\nimport type {\n DrillStackItem,\n WidgetInteraction,\n WidgetInteractionContext,\n} from \"@dlh.io/bideux-dashboard-core\";\nimport {\n dashboardTabs,\n defaultTabId,\n tabWidgetIds,\n} from \"@dlh.io/bideux-dashboard-renderers\";\nimport type {\n PivotDetailResult,\n WidgetResult,\n} from \"@dlh.io/bideux-dashboard-renderers\";\nimport type { DashboardSpec, WidgetSpec } from \"@dlh.io/bideux-dashboard-spec\";\n\nimport { cn } from \"./cn.js\";\nimport { DashboardCanvas } from \"./canvas.js\";\nimport type { DashboardCanvasProps } from \"./canvas.js\";\nimport { useDashboardReader } from \"./context.js\";\nimport { DashboardFilterBar } from \"./filter-bar.js\";\nimport { DashboardFilterPanel } from \"./filter-panel.js\";\nimport { DashboardFiltersProvider } from \"./filters-context.js\";\nimport { DrilldownModal } from \"./drilldown-modal.js\";\nimport type { PivotDetailPayload } from \"./ports.js\";\nimport { PivotDetailModal } from \"./pivot-detail-modal.js\";\nimport { DashboardSection } from \"./section.js\";\nimport { DashboardLoadingBar } from \"./widget-states.js\";\n\nexport interface DashboardReaderProps {\n dashboard: DashboardSpec;\n /** How the host addresses this dashboard, when that is not the document id. */\n dashboardId?: string;\n widgets: Record<string, WidgetSpec>;\n results?: Record<string, WidgetResult>;\n /** Results the host already has, so the reader draws before it runs. */\n initialResults?: Record<string, WidgetResult>;\n /** Filters the host has already applied, for a controlled reader. */\n filters?: Record<string, unknown>;\n onFiltersChange?: (filters: Record<string, unknown>) => void;\n loading?: boolean;\n /** Rerun the dashboard through the transport when a filter changes. */\n autoRun?: boolean;\n header?: ReactNode;\n className?: string;\n /** Overrides the measured width, for exports and for tests. */\n viewportWidth?: number;\n /**\n * Edit mode and its callbacks, handed straight to the canvas. The reader\n * keeps its filters and results while these change, so entering edit mode\n * or dragging a tile never reruns a query.\n */\n canvas?: DashboardCanvasEditProps;\n /** Hide the reader's own refresh bar when the host toolbar carries one. */\n showFilterBar?: boolean;\n /** Which tab is open, for a host that wants to drive or remember it. */\n activeTab?: string;\n onActiveTabChange?: (tabId: string) => void;\n /** Fires with every dashboard run, so a host can mirror a busy state. */\n onRunningChange?: (running: boolean) => void;\n}\n\nexport type DashboardCanvasEditProps = Pick<\n DashboardCanvasProps,\n | \"editMode\"\n | \"snap\"\n | \"draftLayout\"\n | \"gridOverrides\"\n | \"gridConfig\"\n | \"unplacedWidgetIds\"\n | \"onLayoutChange\"\n | \"onBreakpointChange\"\n | \"onLayoutKeyChange\"\n | \"onEditWidget\"\n | \"onAskWidget\"\n | \"onRemoveWidget\"\n | \"onDiagnoseWidget\"\n | \"onIncreaseMaxRows\"\n>;\n\ninterface PivotDetailState {\n open: boolean;\n label: string;\n loading: boolean;\n error: string | null;\n result: PivotDetailResult | null;\n}\n\nconst CLOSED_DETAIL: PivotDetailState = {\n open: false,\n label: \"\",\n loading: false,\n error: null,\n result: null,\n};\n\n/**\n * A saved dashboard, read. Filters, tiles, drill and pivot detail, over the\n * transport and the design system the host injected.\n */\nexport function DashboardReader({\n dashboard,\n dashboardId,\n widgets,\n results: providedResults,\n initialResults,\n filters: controlledFilters,\n onFiltersChange,\n loading: providedLoading,\n autoRun = true,\n header,\n className,\n viewportWidth,\n canvas = {},\n showFilterBar = true,\n activeTab: controlledTab,\n onActiveTabChange,\n onRunningChange,\n}: DashboardReaderProps) {\n const { transport, onNotice } = useDashboardReader();\n const [ownFilters, setOwnFilters] = useState<Record<string, unknown>>({});\n const filters = controlledFilters ?? ownFilters;\n const [ownResults, setOwnResults] = useState<Record<string, WidgetResult>>(\n initialResults ?? {},\n );\n const [running, setRunning] = useState(false);\n const [refreshingWidgets, setRefreshing] = useState<string[]>([]);\n const [drill, setDrill] = useState<{\n id: string;\n name: string;\n filters: Record<string, unknown>;\n stack: DrillStackItem[];\n } | null>(null);\n const [detail, setDetail] = useState<PivotDetailState>(CLOSED_DETAIL);\n const runToken = useRef(0);\n const address = dashboardId ?? dashboard.metadata.id;\n\n const results = providedResults ?? ownResults;\n const loading = providedLoading ?? running;\n\n // A host that reloads hands over fresh results; the reader adopts them in\n // place rather than clearing what is drawn.\n const seenInitial = useRef(initialResults);\n useEffect(() => {\n if (\n initialResults === undefined ||\n seenInitial.current === initialResults\n ) {\n return;\n }\n seenInitial.current = initialResults;\n setOwnResults(initialResults);\n }, [initialResults]);\n\n useEffect(() => {\n onRunningChange?.(running);\n }, [running, onRunningChange]);\n\n const setFilters = useCallback(\n (next: Record<string, unknown>) => {\n if (onFiltersChange === undefined) setOwnFilters(next);\n onFiltersChange?.(next);\n },\n [onFiltersChange],\n );\n\n const run = useCallback(\n (nextFilters: Record<string, unknown>) => {\n const token = runToken.current + 1;\n runToken.current = token;\n setRunning(true);\n transport\n .runDashboard({\n dashboardId: address,\n filters: nextFilters,\n })\n .then((data) => {\n if (runToken.current !== token) return;\n setOwnResults(data.results);\n })\n .catch((error: unknown) => {\n if (runToken.current !== token) return;\n onNotice({\n tone: \"error\",\n message:\n error instanceof Error\n ? error.message\n : \"Could not refresh the dashboard\",\n });\n })\n .finally(() => {\n if (runToken.current === token) setRunning(false);\n });\n },\n [transport, address, onNotice],\n );\n\n const refreshWidget = useCallback(\n (widgetId: string) => {\n setRefreshing((current) => [...current, widgetId]);\n transport\n .runWidget({ dashboardId: address, widgetId, filters })\n .then((result) => {\n setOwnResults((current) => ({ ...current, [widgetId]: result }));\n })\n .catch((error: unknown) => {\n onNotice({\n tone: \"error\",\n message:\n error instanceof Error\n ? error.message\n : \"Could not refresh this widget\",\n });\n })\n .finally(() => {\n setRefreshing((current) => current.filter((id) => id !== widgetId));\n });\n },\n [transport, address, filters, onNotice],\n );\n\n // The signature of the filters the reader last asked for. It runs again only\n // when the words change, so a rerender with a fresh object cannot loop.\n const lastRun = useRef<string | null>(\n initialResults === undefined ? null : JSON.stringify(filters),\n );\n useEffect(() => {\n if (!autoRun || providedResults !== undefined) return;\n const signature = JSON.stringify(filters);\n if (lastRun.current === signature) return;\n lastRun.current = signature;\n run(filters);\n }, [autoRun, providedResults, filters, run]);\n\n const handleInteraction = useCallback(\n (interaction: WidgetInteraction, context: WidgetInteractionContext) => {\n if (interaction.type === \"drilldown\" || interaction.open_in === \"modal\") {\n setDrill({\n id: interaction.target,\n name: interaction.label ?? \"Details\",\n filters:\n interaction.pass_filters === true\n ? { ...filters, ...(context.data ?? {}) }\n : { ...(context.data ?? {}) },\n stack: [],\n });\n return;\n }\n if (interaction.type === \"set_filter\") {\n setFilters({ ...filters, ...(context.data ?? {}) });\n }\n },\n [filters, setFilters],\n );\n\n const handlePivotDetail = useCallback(\n (payload: PivotDetailPayload) => {\n const runDetail = transport.runWidgetDetail;\n if (runDetail === undefined) return;\n setDetail({\n open: true,\n label: payload.label,\n loading: true,\n error: null,\n result: null,\n });\n runDetail({\n dashboardId: address,\n widgetId: payload.widgetId,\n filters,\n cell: payload.filters,\n label: payload.label,\n })\n .then((result) => {\n setDetail({\n open: true,\n label: payload.label,\n loading: false,\n error: null,\n result,\n });\n })\n .catch((error: unknown) => {\n setDetail({\n open: true,\n label: payload.label,\n loading: false,\n error:\n error instanceof Error\n ? error.message\n : \"Could not fetch the rows behind this cell\",\n result: null,\n });\n });\n },\n [transport, address, filters],\n );\n\n const filterWidgets = useMemo(\n () =>\n Object.values(widgets).filter((widget) => {\n const component = String(widget.spec.component ?? \"\");\n return component === \"filter\" || component === \"select\";\n }),\n [widgets],\n );\n\n const tabs = useMemo(() => dashboardTabs(dashboard), [dashboard]);\n const [ownTab, setOwnTab] = useState<string | undefined>(undefined);\n const currentTab = controlledTab ?? ownTab ?? defaultTabId(tabs);\n const setActiveTab = useCallback(\n (tabId: string) => {\n if (controlledTab === undefined) setOwnTab(tabId);\n onActiveTabChange?.(tabId);\n },\n [controlledTab, onActiveTabChange],\n );\n const tabWidgets = useMemo(() => {\n if (tabs.length === 0) return widgets;\n const tab = tabs.find((entry) => entry.id === currentTab) ?? tabs[0];\n if (tab === undefined) return widgets;\n const ids = new Set(tabWidgetIds(tab));\n if (ids.size === 0) return widgets;\n return Object.fromEntries(\n Object.entries(widgets).filter(([id]) => ids.has(id)),\n );\n }, [tabs, currentTab, widgets]);\n\n const panel = filterPanelConfig(dashboard);\n const headerSection = dashboard.spec.config?.header;\n const footerSection = dashboard.spec.config?.footer;\n const clickable = Object.values(widgets).some(\n (widget) => getClickInteraction(widget) !== undefined,\n );\n\n return (\n <DashboardFiltersProvider\n filters={filters}\n setFilter={(id, value) => {\n setFilters({ ...filters, [id]: value });\n }}\n >\n <div\n className={cn(\"bideux-reader relative flex flex-col gap-3\", className)}\n data-dashboard-id={dashboard.metadata.id}\n data-interactive={clickable ? \"true\" : undefined}\n >\n <DashboardLoadingBar loading={loading} />\n {header}\n {headerSection !== undefined && headerSection !== null && (\n <DashboardSection section={headerSection} results={results} />\n )}\n {panel !== undefined && panel.enabled !== false && (\n <DashboardFilterPanel\n config={panel}\n widgets={filterWidgets}\n results={results}\n />\n )}\n {showFilterBar && (\n <DashboardFilterBar\n onRefresh={() => {\n run(filters);\n }}\n refreshing={loading}\n />\n )}\n {tabs.length > 1 && (\n <div\n className=\"bideux-tabs flex shrink-0 items-center gap-1 border-b\"\n role=\"tablist\"\n >\n {tabs.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={tab.id === currentTab}\n data-tab-id={tab.id}\n className={cn(\n \"px-3 py-1.5 text-sm\",\n tab.id === currentTab\n ? \"border-b-2 border-primary font-semibold\"\n : \"text-muted-foreground\",\n )}\n onClick={() => {\n setActiveTab(tab.id);\n }}\n >\n {tab.label}\n </button>\n ))}\n </div>\n )}\n <DashboardCanvas\n dashboard={dashboard}\n widgets={tabWidgets}\n results={results}\n loading={loading}\n onInteraction={handleInteraction}\n onPivotDetail={handlePivotDetail}\n onRefreshWidget={refreshWidget}\n onRetryWidget={refreshWidget}\n loadingWidgetIds={refreshingWidgets}\n {...(viewportWidth === undefined ? {} : { viewportWidth })}\n {...canvas}\n />\n {footerSection !== undefined && footerSection !== null && (\n <DashboardSection section={footerSection} results={results} />\n )}\n {drill !== null && (\n <DrilldownModal\n open\n dashboardId={drill.id}\n dashboardName={drill.name}\n initialFilters={drill.filters}\n parentStack={drill.stack}\n onOpenChange={(open) => {\n if (!open) setDrill(null);\n }}\n />\n )}\n <PivotDetailModal\n open={detail.open}\n cellLabel={detail.label}\n loading={detail.loading}\n error={detail.error}\n result={detail.result}\n onOpenChange={(open) => {\n if (!open) setDetail(CLOSED_DETAIL);\n }}\n />\n </div>\n </DashboardFiltersProvider>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport type { WidgetResult } from \"@dlh.io/bideux-dashboard-renderers\";\nimport type { DashboardSpec, WidgetSpec } from \"@dlh.io/bideux-dashboard-spec\";\n\nimport { DashboardReader } from \"./reader.js\";\nimport type { DashboardReaderProps } from \"./reader.js\";\nimport { useDashboardReader } from \"./context.js\";\nimport { WidgetError, WidgetLoading } from \"./widget-states.js\";\n\nexport interface LoadedDashboard {\n dashboard: DashboardSpec;\n widgets: Record<string, WidgetSpec>;\n results: Record<string, WidgetResult>;\n}\n\nexport interface DashboardReaderLoaderProps\n extends Pick<\n DashboardReaderProps,\n | \"canvas\"\n | \"showFilterBar\"\n | \"activeTab\"\n | \"onActiveTabChange\"\n | \"onRunningChange\"\n > {\n dashboardId: string;\n filters?: Record<string, unknown>;\n /** Fires as the reader's filters change, so a host can mirror them in its URL or exports. */\n onFiltersChange?: (filters: Record<string, unknown>) => void;\n header?: ReactNode;\n className?: string;\n viewportWidth?: number;\n /**\n * Bump to fetch the documents and results again without unmounting the\n * reader, which is how a host redraws after saving a widget or a layout.\n * The current filters, tab and scroll position all survive.\n */\n reloadToken?: number;\n /** The documents once they are known, and again after every reload. */\n onLoaded?: (loaded: LoadedDashboard) => void;\n}\n\n/**\n * A reader for a host that holds an identifier rather than the documents. The\n * transport answers with both the documents and the first results, so a host\n * needs no loader of its own.\n */\nexport function DashboardReaderLoader({\n dashboardId,\n filters,\n onFiltersChange,\n header,\n className,\n viewportWidth,\n reloadToken = 0,\n onLoaded,\n canvas,\n showFilterBar,\n activeTab,\n onActiveTabChange,\n onRunningChange,\n}: DashboardReaderLoaderProps) {\n const { transport } = useDashboardReader();\n const [loaded, setLoaded] = useState<LoadedDashboard | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [reloading, setReloading] = useState(false);\n const [applied, setApplied] = useState<Record<string, unknown>>(\n filters ?? {},\n );\n const token = useRef(0);\n const lastReload = useRef(reloadToken);\n const appliedRef = useRef(applied);\n appliedRef.current = applied;\n // Hosts write this callback inline; a ref keeps a fresh function from\n // counting as a reason to load again.\n const onLoadedRef = useRef(onLoaded);\n onLoadedRef.current = onLoaded;\n const onFiltersChangeRef = useRef(onFiltersChange);\n onFiltersChangeRef.current = onFiltersChange;\n const changeFilters = useCallback((next: Record<string, unknown>) => {\n setApplied(next);\n onFiltersChangeRef.current?.(next);\n }, []);\n // Hosts write the filters inline, so the words decide when to load again,\n // not the identity of the object.\n const signature = JSON.stringify(filters ?? null);\n\n const load = useCallback(\n (asked: Record<string, unknown> | null, inPlace: boolean) => {\n const current = token.current + 1;\n token.current = current;\n if (inPlace) {\n setReloading(true);\n } else {\n setLoaded(null);\n setApplied(asked ?? {});\n }\n setError(null);\n transport\n .runDashboard({\n dashboardId,\n ...(asked === null ? {} : { filters: asked }),\n })\n .then((data) => {\n if (token.current !== current) return;\n const next = {\n dashboard: data.dashboard,\n widgets: data.widgets,\n results: data.results,\n };\n setLoaded(next);\n onLoadedRef.current?.(next);\n })\n .catch((reason: unknown) => {\n if (token.current !== current) return;\n setError(\n reason instanceof Error\n ? reason.message\n : \"Could not open this dashboard\",\n );\n })\n .finally(() => {\n if (token.current === current) setReloading(false);\n });\n },\n [transport, dashboardId],\n );\n\n useEffect(() => {\n const asked = JSON.parse(signature) as Record<string, unknown> | null;\n load(asked, false);\n }, [load, signature]);\n\n useEffect(() => {\n if (lastReload.current === reloadToken) return;\n lastReload.current = reloadToken;\n load(appliedRef.current, true);\n }, [reloadToken, load]);\n\n if (error !== null && loaded === null) {\n return <WidgetError message={error} />;\n }\n if (loaded === null) {\n return <WidgetLoading skeleton=\"content\" message=\"Loading dashboard\" />;\n }\n return (\n <DashboardReader\n dashboard={loaded.dashboard}\n dashboardId={dashboardId}\n widgets={loaded.widgets}\n initialResults={loaded.results}\n filters={applied}\n onFiltersChange={changeFilters}\n header={header}\n {...(className === undefined ? {} : { className })}\n {...(viewportWidth === undefined ? {} : { viewportWidth })}\n {...(reloading ? { loading: true } : {})}\n {...(canvas === undefined ? {} : { canvas })}\n {...(showFilterBar === undefined ? {} : { showFilterBar })}\n {...(activeTab === undefined ? {} : { activeTab })}\n {...(onActiveTabChange === undefined ? {} : { onActiveTabChange })}\n {...(onRunningChange === undefined ? {} : { onRunningChange })}\n />\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n DEFAULT_GRID_CONFIG,\n addWidgetToLayouts,\n buildBaseLayouts,\n computeRequiredMaxRows,\n layoutsForSave,\n stripPanelledControls,\n} from \"@dlh.io/bideux-dashboard-core\";\nimport type {\n Breakpoint,\n ResponsiveLayouts,\n} from \"@dlh.io/bideux-dashboard-core\";\nimport type { LayoutKey } from \"@dlh.io/bideux-dashboard-renderers\";\nimport type { DashboardSpec, WidgetSpec } from \"@dlh.io/bideux-dashboard-spec\";\n\nimport type { GridOverrides } from \"./canvas.js\";\nimport { LayoutConflictError } from \"./ports.js\";\nimport type { LayoutSaveRequest, LayoutSaveResponse } from \"./ports.js\";\n\nexport interface LayoutDraftDocuments {\n dashboard: DashboardSpec;\n widgets: Record<string, WidgetSpec>;\n /** Widgets the saved documents keep off the grid. */\n unplacedWidgetIds: string[];\n /** The saved version stamp, sent back as `expectedUpdatedAt`. */\n updatedAt?: string;\n}\n\nexport interface UseLayoutDraftOptions {\n dashboardId: string;\n /** The documents as last loaded, or null before the first load. */\n documents: LayoutDraftDocuments | null;\n saveLayout?: (\n request: LayoutSaveRequest,\n ) => Promise<LayoutSaveResponse | void>;\n /**\n * Where an unsaved draft survives a reload. Pass null to keep drafts in\n * memory only. Hosts usually pass `window.localStorage`.\n */\n storage?: Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\"> | null;\n /** Runs after a successful save so the page can redraw from the server. */\n onSaved?: () => void | Promise<void>;\n onError?: (message: string) => void;\n}\n\ninterface StoredDraft {\n layout: ResponsiveLayouts;\n maxRows?: number;\n gridOverrides?: GridOverrides;\n gridConfig?: LayoutGridConfigDraft;\n unplacedWidgetIds?: string[];\n}\n\n/**\n * The dashboard level grid settings the Grid popover edits: they live in\n * `spec.config.grid` (and `spec.config.dataModelId`) rather than per\n * breakpoint, and reach the server with Save layout like everything else.\n */\nexport interface LayoutGridConfigDraft {\n isBounded?: boolean;\n preventCollision?: boolean;\n /** `null` clears a cap the dashboard had. */\n maxLayoutWidth?: Breakpoint | null;\n /** `null` returns to the host's default store. */\n dataModelId?: string | null;\n}\n\nexport type LayoutExitTarget = \"edit\" | \"back\";\n\nexport interface LayoutDraft {\n editMode: boolean;\n /** Turns editing on, or asks about unsaved work before turning it off. */\n setEditMode: (next: boolean) => void;\n /** Leaves the page, or asks about unsaved work first. */\n requestExit: (leave: () => void) => void;\n draftLayout: ResponsiveLayouts | undefined;\n draftMaxRows: number | undefined;\n gridOverrides: GridOverrides;\n /** Dashboard level grid settings changed since the last save. */\n gridConfig: LayoutGridConfigDraft;\n unplacedWidgetIds: string[];\n activeLayoutKey: LayoutKey;\n setActiveLayoutKey: (key: LayoutKey) => void;\n hasUnsavedChanges: boolean;\n saving: boolean;\n onLayoutChange: (layouts: ResponsiveLayouts, activeKey: LayoutKey) => void;\n onIncreaseMaxRows: (nextRows: number) => void;\n setGridOverride: (\n breakpoint: Breakpoint,\n override: { rowHeight?: number; cols?: number },\n ) => void;\n setGridConfig: (update: LayoutGridConfigDraft) => void;\n /** Keeps a widget in the draft but off the grid until the next save. */\n removeFromGrid: (widgetId: string) => void;\n /** Puts a widget the saved documents left unplaced back on the draft grid. */\n placeOnGrid: (widgetId: string) => void;\n save: (options?: { force?: boolean }) => Promise<boolean>;\n reset: () => void;\n /** Set while the host should show the unsaved changes dialog. */\n unsavedDialogOpen: boolean;\n saveAndExit: () => void;\n discardAndExit: () => void;\n keepEditing: () => void;\n /** Set while the host should show the conflict dialog. */\n conflictDialogOpen: boolean;\n overwriteAfterConflict: () => void;\n reloadAfterConflict: () => void;\n}\n\nfunction sameIds(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n const set = new Set(a);\n return b.every((id) => set.has(id));\n}\n\n/**\n * The lifecycle behind Edit mode: the draft the grid edits, Save layout, Reset\n * layout, the unsaved changes dialog on exit and the conflict dialog when\n * someone else saved first. Nothing here draws; a host composes its own\n * toolbar and dialogs around the flags.\n */\nexport function useLayoutDraft({\n dashboardId,\n documents,\n saveLayout,\n storage = null,\n onSaved,\n onError,\n}: UseLayoutDraftOptions): LayoutDraft {\n const draftKey = `bideux:layout-draft:${dashboardId}`;\n const [editMode, setEditModeState] = useState(false);\n const [draftLayout, setDraftLayout] = useState<ResponsiveLayouts | undefined>(\n undefined,\n );\n const [draftMaxRows, setDraftMaxRows] = useState<number | undefined>(\n undefined,\n );\n const [gridOverrides, setGridOverrides] = useState<GridOverrides>({});\n const [gridConfig, setGridConfigState] = useState<LayoutGridConfigDraft>({});\n const [unplaced, setUnplaced] = useState<string[] | undefined>(undefined);\n const [activeLayoutKey, setActiveLayoutKey] = useState<LayoutKey>(\"lg\");\n const [saving, setSaving] = useState(false);\n const [unsavedDialogOpen, setUnsavedDialogOpen] = useState(false);\n const [conflictDialogOpen, setConflictDialogOpen] = useState(false);\n const pendingExit = useRef<(() => void) | null>(null);\n const restored = useRef(false);\n const onSavedRef = useRef(onSaved);\n const onErrorRef = useRef(onError);\n onSavedRef.current = onSaved;\n onErrorRef.current = onError;\n\n const savedUnplaced = documents?.unplacedWidgetIds ?? [];\n const unplacedWidgetIds = unplaced ?? savedUnplaced;\n\n useEffect(() => {\n if (restored.current || storage === null) return;\n restored.current = true;\n const raw = storage.getItem(draftKey);\n if (raw === null) return;\n try {\n const parsed = JSON.parse(raw) as StoredDraft;\n setDraftLayout(parsed.layout);\n if (parsed.maxRows !== undefined) setDraftMaxRows(parsed.maxRows);\n if (parsed.gridOverrides) setGridOverrides(parsed.gridOverrides);\n if (parsed.gridConfig) setGridConfigState(parsed.gridConfig);\n if (parsed.unplacedWidgetIds) setUnplaced(parsed.unplacedWidgetIds);\n setEditModeState(true);\n } catch {\n storage.removeItem(draftKey);\n }\n }, [storage, draftKey]);\n\n useEffect(() => {\n if (storage === null || !editMode) return;\n if (draftLayout === undefined) {\n storage.removeItem(draftKey);\n return;\n }\n const stored: StoredDraft = {\n layout: draftLayout,\n ...(draftMaxRows === undefined ? {} : { maxRows: draftMaxRows }),\n gridOverrides,\n gridConfig,\n unplacedWidgetIds,\n };\n storage.setItem(draftKey, JSON.stringify(stored));\n }, [\n storage,\n draftKey,\n editMode,\n draftLayout,\n draftMaxRows,\n gridOverrides,\n gridConfig,\n unplacedWidgetIds,\n ]);\n\n const hasUnsavedChanges =\n draftLayout !== undefined ||\n draftMaxRows !== undefined ||\n Object.keys(gridOverrides).length > 0 ||\n Object.keys(gridConfig).length > 0 ||\n (unplaced !== undefined && !sameIds(unplaced, savedUnplaced));\n\n const clearDraft = useCallback(() => {\n setDraftLayout(undefined);\n setDraftMaxRows(undefined);\n setGridOverrides({});\n setGridConfigState({});\n setUnplaced(undefined);\n storage?.removeItem(draftKey);\n }, [storage, draftKey]);\n\n const onLayoutChange = useCallback(\n (layouts: ResponsiveLayouts, activeKey: LayoutKey) => {\n setActiveLayoutKey(activeKey);\n setDraftLayout(layouts);\n },\n [],\n );\n\n const setGridOverride = useCallback(\n (\n breakpoint: Breakpoint,\n override: { rowHeight?: number; cols?: number },\n ) => {\n setGridOverrides((current) => ({\n ...current,\n [breakpoint]: { ...current[breakpoint], ...override },\n }));\n },\n [],\n );\n\n const setGridConfig = useCallback((update: LayoutGridConfigDraft) => {\n setGridConfigState((current) => ({ ...current, ...update }));\n }, []);\n\n const removeFromGrid = useCallback(\n (widgetId: string) => {\n setUnplaced((current) => {\n const base = current ?? savedUnplaced;\n return base.includes(widgetId) ? base : [...base, widgetId];\n });\n setDraftLayout((current) => {\n if (current === undefined) return current;\n const next: ResponsiveLayouts = {};\n for (const [key, items] of Object.entries(current)) {\n next[key] = items?.filter((item) => item.i !== widgetId);\n }\n return next;\n });\n },\n [savedUnplaced],\n );\n\n const placeOnGrid = useCallback(\n (widgetId: string) => {\n const nextUnplaced = (unplaced ?? savedUnplaced).filter(\n (id) => id !== widgetId,\n );\n setUnplaced(nextUnplaced);\n if (documents === null) return;\n const widget = documents.widgets[widgetId];\n if (widget === undefined) return;\n const grid = {\n ...DEFAULT_GRID_CONFIG,\n ...documents.dashboard.spec.config?.grid,\n };\n const currentMaxRows = draftMaxRows ?? grid.maxRows ?? undefined;\n const base =\n draftLayout === undefined\n ? buildBaseLayouts(\n documents.widgets,\n documents.dashboard,\n gridOverrides,\n nextUnplaced,\n currentMaxRows,\n )\n : stripPanelledControls(\n draftLayout,\n documents.widgets,\n documents.dashboard,\n );\n const requiredRows = computeRequiredMaxRows(\n base,\n widget,\n documents.dashboard,\n gridOverrides,\n currentMaxRows,\n );\n if (requiredRows !== undefined && requiredRows !== currentMaxRows) {\n setDraftMaxRows(requiredRows);\n }\n setDraftLayout(\n addWidgetToLayouts(\n base,\n widget,\n documents.dashboard,\n gridOverrides,\n requiredRows ?? currentMaxRows,\n ),\n );\n },\n [\n documents,\n draftLayout,\n draftMaxRows,\n gridOverrides,\n savedUnplaced,\n unplaced,\n ],\n );\n\n const save = useCallback(\n async ({ force = false }: { force?: boolean } = {}): Promise<boolean> => {\n if (documents === null || saveLayout === undefined) return false;\n setSaving(true);\n try {\n const grid = {\n ...DEFAULT_GRID_CONFIG,\n ...documents.dashboard.spec.config?.grid,\n };\n const maxRows = draftMaxRows ?? grid.maxRows ?? undefined;\n const maxLayoutWidth =\n gridConfig.maxLayoutWidth === undefined\n ? (grid.maxLayoutWidth ?? undefined)\n : gridConfig.maxLayoutWidth;\n const gridSettings: NonNullable<LayoutSaveRequest[\"grid\"]> = {\n ...(gridConfig.isBounded === undefined\n ? {}\n : { isBounded: gridConfig.isBounded }),\n ...(gridConfig.preventCollision === undefined\n ? {}\n : { preventCollision: gridConfig.preventCollision }),\n };\n const source =\n draftLayout === undefined\n ? buildBaseLayouts(\n documents.widgets,\n documents.dashboard,\n gridOverrides,\n unplacedWidgetIds,\n maxRows,\n )\n : stripPanelledControls(\n draftLayout,\n documents.widgets,\n documents.dashboard,\n );\n const request: LayoutSaveRequest = {\n dashboardId,\n layouts: layoutsForSave(source),\n gridOverrides,\n unplacedWidgetIds,\n ...(maxRows === undefined ? {} : { maxRows }),\n ...(maxLayoutWidth === undefined ? {} : { maxLayoutWidth }),\n ...(Object.keys(gridSettings).length === 0\n ? {}\n : { grid: gridSettings }),\n ...(gridConfig.dataModelId === undefined\n ? {}\n : { dataModelId: gridConfig.dataModelId }),\n ...(force || documents.updatedAt === undefined\n ? {}\n : { expectedUpdatedAt: documents.updatedAt }),\n };\n await saveLayout(request);\n clearDraft();\n setConflictDialogOpen(false);\n await onSavedRef.current?.();\n return true;\n } catch (error) {\n if (error instanceof LayoutConflictError) {\n setConflictDialogOpen(true);\n } else {\n pendingExit.current = null;\n onErrorRef.current?.(\n error instanceof Error ? error.message : \"Could not save layout\",\n );\n }\n return false;\n } finally {\n setSaving(false);\n }\n },\n [\n documents,\n saveLayout,\n dashboardId,\n draftLayout,\n draftMaxRows,\n gridOverrides,\n gridConfig,\n unplacedWidgetIds,\n clearDraft,\n ],\n );\n\n const finishExit = useCallback(() => {\n const leave = pendingExit.current;\n pendingExit.current = null;\n if (leave === null) {\n setEditModeState(false);\n } else {\n leave();\n }\n }, []);\n\n const setEditMode = useCallback(\n (next: boolean) => {\n if (next || !hasUnsavedChanges) {\n setEditModeState(next);\n return;\n }\n pendingExit.current = null;\n setUnsavedDialogOpen(true);\n },\n [hasUnsavedChanges],\n );\n\n const requestExit = useCallback(\n (leave: () => void) => {\n if (!editMode || !hasUnsavedChanges) {\n leave();\n return;\n }\n pendingExit.current = leave;\n setUnsavedDialogOpen(true);\n },\n [editMode, hasUnsavedChanges],\n );\n\n const saveAndExit = useCallback(() => {\n setUnsavedDialogOpen(false);\n void save().then((ok) => {\n if (ok) finishExit();\n });\n }, [save, finishExit]);\n\n const discardAndExit = useCallback(() => {\n setUnsavedDialogOpen(false);\n clearDraft();\n finishExit();\n }, [clearDraft, finishExit]);\n\n const keepEditing = useCallback(() => {\n setUnsavedDialogOpen(false);\n pendingExit.current = null;\n }, []);\n\n const overwriteAfterConflict = useCallback(() => {\n void save({ force: true }).then((ok) => {\n if (ok && pendingExit.current !== null) finishExit();\n });\n }, [save, finishExit]);\n\n const reloadAfterConflict = useCallback(() => {\n setConflictDialogOpen(false);\n pendingExit.current = null;\n clearDraft();\n void onSavedRef.current?.();\n }, [clearDraft]);\n\n return useMemo<LayoutDraft>(\n () => ({\n editMode,\n setEditMode,\n requestExit,\n draftLayout,\n draftMaxRows,\n gridOverrides,\n gridConfig,\n unplacedWidgetIds,\n activeLayoutKey,\n setActiveLayoutKey,\n hasUnsavedChanges,\n saving,\n onLayoutChange,\n onIncreaseMaxRows: setDraftMaxRows,\n setGridOverride,\n setGridConfig,\n removeFromGrid,\n placeOnGrid,\n save,\n reset: clearDraft,\n unsavedDialogOpen,\n saveAndExit,\n discardAndExit,\n keepEditing,\n conflictDialogOpen,\n overwriteAfterConflict,\n reloadAfterConflict,\n }),\n [\n editMode,\n setEditMode,\n requestExit,\n draftLayout,\n draftMaxRows,\n gridOverrides,\n gridConfig,\n unplacedWidgetIds,\n activeLayoutKey,\n hasUnsavedChanges,\n saving,\n onLayoutChange,\n setGridOverride,\n setGridConfig,\n removeFromGrid,\n placeOnGrid,\n save,\n clearDraft,\n unsavedDialogOpen,\n saveAndExit,\n discardAndExit,\n keepEditing,\n conflictDialogOpen,\n overwriteAfterConflict,\n reloadAfterConflict,\n ],\n );\n}\n","import { useState } from \"react\";\n\nimport { useAuthoring } from \"./authoring-context.js\";\nimport type { AuthoringProposal } from \"./authoring-ports.js\";\n\nexport interface WidgetAskPanelProps {\n widgetId: string | null;\n /** The text in the editor, which is what the proposal is asked to change. */\n specYaml: string;\n unsaved: boolean;\n onApply: (specYaml: string, proposalId: string) => void;\n onBuildByHand: () => void;\n}\n\n/**\n * Describe the widget in a sentence and read what comes back before keeping it.\n *\n * The assistant itself is the host's: this panel only calls the proposal port,\n * shows the document it returns, and hands the text to the editor when the\n * author applies it. Nothing is written until the author saves, so a proposal\n * is a suggestion rather than an edit.\n */\nexport function WidgetAskPanel({\n widgetId,\n specYaml,\n unsaved,\n onApply,\n onBuildByHand,\n}: WidgetAskPanelProps) {\n const { transport, ui, dashboardId } = useAuthoring();\n const [instruction, setInstruction] = useState(\"\");\n const [asking, setAsking] = useState(false);\n const [proposal, setProposal] = useState<AuthoringProposal | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const propose = transport.proposeDocument;\n if (!propose) {\n return (\n <p className=\"p-6 text-sm text-muted-foreground\">\n This host has not wired an assistant.\n </p>\n );\n }\n\n async function ask(): Promise<void> {\n if (!propose || instruction.trim() === \"\") return;\n setAsking(true);\n setError(null);\n try {\n const result = await propose({\n dashboardId,\n widgetId,\n instruction: instruction.trim(),\n specYaml,\n });\n setProposal(result);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Could not write a proposal\",\n );\n } finally {\n setAsking(false);\n }\n }\n\n return (\n <div className=\"space-y-4 p-6\">\n {unsaved ? (\n <p className=\"rounded-md border border-amber-300 bg-amber-50 px-3 py-2 text-xs text-amber-900\">\n You have unsaved edits. A proposal replaces the text in the editor, so\n apply it only if you are happy to lose them.\n </p>\n ) : null}\n <ui.TextInput\n value={instruction}\n ariaLabel=\"Describe the widget\"\n placeholder=\"Sales by store for the last 30 days, as a bar chart\"\n onChange={setInstruction}\n onCommit={() => {\n void ask();\n }}\n />\n <div className=\"flex flex-wrap gap-2\">\n <ui.Button\n variant=\"primary\"\n size=\"sm\"\n disabled={asking || instruction.trim() === \"\"}\n onClick={() => {\n void ask();\n }}\n >\n {asking ? \"Writing...\" : \"Ask\"}\n </ui.Button>\n <ui.Button variant=\"secondary\" size=\"sm\" onClick={onBuildByHand}>\n Build it by hand\n </ui.Button>\n </div>\n\n {error !== null ? (\n <p className=\"text-xs text-destructive\">{error}</p>\n ) : null}\n\n {proposal ? (\n <div className=\"space-y-2 rounded-md border p-3\">\n <p className=\"text-sm\">{proposal.summary}</p>\n <pre className=\"max-h-72 overflow-auto rounded bg-muted/40 px-3 py-2 text-[11px] leading-relaxed\">\n {proposal.specYaml}\n </pre>\n <div className=\"flex gap-2\">\n <ui.Button\n size=\"sm\"\n variant=\"primary\"\n onClick={() => {\n onApply(proposal.specYaml, proposal.id);\n }}\n >\n Use this\n </ui.Button>\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n if (transport.recordProposalOutcome) {\n void transport.recordProposalOutcome({\n proposalId: proposal.id,\n applied: false,\n });\n }\n setProposal(null);\n }}\n >\n Discard\n </ui.Button>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n","import type {\n BuilderPivot,\n BuilderPivotMeasure,\n BuilderWidget,\n WidgetColumn,\n} from \"@dlh.io/bideux-dashboard-core\";\n\nimport { UNSET } from \"./builder-fields.js\";\n\n/**\n * The edits the widget builder makes, as plain functions on a document object.\n *\n * They live apart from the panel because they are where the correctness is: a\n * mapping that names a column the query does not return is exactly what draws\n * an empty card, so dropping a column has to drop everything pointing at it.\n */\n\nexport function toggleColumn(\n widget: BuilderWidget,\n key: string,\n checked: boolean,\n): BuilderWidget {\n if (checked) {\n return { ...widget, columns: [...widget.columns, key] };\n }\n // Dropping a column drops whatever pointed at it, because a mapping naming a\n // column the query does not return is exactly what draws an empty chart.\n const mappings = { ...widget.mappings };\n for (const slot of [\"x\", \"category\", \"value\", \"series\", \"delta\"] as const) {\n if (mappings[slot] === key) mappings[slot] = null;\n }\n const pivot: BuilderPivot = {\n ...widget.pivot,\n rows: widget.pivot.rows.filter((field) => field !== key),\n columns: widget.pivot.columns.filter((field) => field !== key),\n measures: widget.pivot.measures.filter((measure) => measure.field !== key),\n heatmap: widget.pivot.heatmap === key ? null : widget.pivot.heatmap,\n sortMeasure:\n widget.pivot.sortMeasure === key ? null : widget.pivot.sortMeasure,\n topRowsMeasure:\n widget.pivot.topRowsMeasure === key ? null : widget.pivot.topRowsMeasure,\n };\n return {\n ...widget,\n columns: widget.columns.filter((column) => column !== key),\n mappings,\n series: widget.series.filter((entry) => entry.field !== key),\n pivot,\n };\n}\n\nexport function setMapping(\n widget: BuilderWidget,\n slot: keyof BuilderWidget[\"mappings\"],\n value: string,\n): BuilderWidget {\n return {\n ...widget,\n mappings: {\n ...widget.mappings,\n [slot]: value === UNSET ? null : value,\n },\n };\n}\n\n/**\n * The axis column, written to both `x` and `category`.\n *\n * A chart with named series groups its points by `category`, and one without\n * them lays them out along `x`. Setting only one is how a chart ends up drawing\n * against a column the author never picked.\n */\nexport function setAxis(widget: BuilderWidget, value: string): BuilderWidget {\n const column = value === UNSET ? null : value;\n return {\n ...widget,\n mappings: { ...widget.mappings, x: column, category: column },\n };\n}\n\n/** A dataset change clears what belonged to the old dataset. */\nexport function setDataset(\n widget: BuilderWidget,\n datasetId: string,\n): BuilderWidget {\n if (datasetId === widget.datasetId) return widget;\n return {\n ...widget,\n datasetId,\n // Columns belong to the old dataset, and so do the mappings reading them:\n // keeping either is how a widget ends up blank.\n columns: [],\n mappings: {\n x: null,\n category: null,\n value: null,\n series: null,\n delta: null,\n },\n series: [],\n };\n}\n\nexport function addSeries(widget: BuilderWidget, field: string): BuilderWidget {\n return { ...widget, series: [...widget.series, { name: null, field }] };\n}\n\nexport function updateSeries(\n widget: BuilderWidget,\n index: number,\n entry: BuilderWidget[\"series\"][number],\n): BuilderWidget {\n return {\n ...widget,\n series: widget.series.map((current, i) => (i === index ? entry : current)),\n };\n}\n\nexport function removeSeries(\n widget: BuilderWidget,\n index: number,\n): BuilderWidget {\n return { ...widget, series: widget.series.filter((_, i) => i !== index) };\n}\n\n/** The first selected measure no series covers yet. */\nexport function nextSeriesField(\n widget: BuilderWidget,\n numbers: WidgetColumn[],\n): string | null {\n const used = new Set(widget.series.map((entry) => entry.field));\n return numbers.find((column) => !used.has(column.key))?.key ?? null;\n}\n\nexport function addMeasure(pivot: BuilderPivot, field: string): BuilderPivot {\n return {\n ...pivot,\n measures: [\n ...pivot.measures,\n { field, agg: \"sum\", label: null, format: null, decimals: null },\n ],\n };\n}\n\nexport function updateMeasure(\n pivot: BuilderPivot,\n index: number,\n measure: BuilderPivotMeasure,\n): BuilderPivot {\n return {\n ...pivot,\n measures: pivot.measures.map((current, i) =>\n i === index ? measure : current,\n ),\n // The shading names a measure, so a measure renamed out of the pivot cannot\n // stay the shaded one.\n heatmap:\n pivot.heatmap === pivot.measures[index]?.field\n ? measure.field\n : pivot.heatmap,\n sortMeasure:\n pivot.sortMeasure === pivot.measures[index]?.field\n ? measure.field\n : pivot.sortMeasure,\n topRowsMeasure:\n pivot.topRowsMeasure === pivot.measures[index]?.field\n ? measure.field\n : pivot.topRowsMeasure,\n };\n}\n\nexport function removeMeasure(\n pivot: BuilderPivot,\n index: number,\n): BuilderPivot {\n const dropped = pivot.measures[index]?.field;\n return {\n ...pivot,\n measures: pivot.measures.filter((_, i) => i !== index),\n heatmap: pivot.heatmap === dropped ? null : pivot.heatmap,\n sortMeasure: pivot.sortMeasure === dropped ? null : pivot.sortMeasure,\n topRowsMeasure:\n pivot.topRowsMeasure === dropped ? null : pivot.topRowsMeasure,\n };\n}\n\nexport function isMapped(widget: BuilderWidget, column: string): boolean {\n return (\n Object.values(widget.mappings).includes(column) ||\n widget.series.some((entry) => entry.field === column)\n );\n}\n\nexport const STEP_TITLES = [\n \"Name it\",\n \"Choose what it is\",\n \"Pick where the numbers come from\",\n \"Pick the columns it asks for\",\n \"Say what each part reads\",\n \"Set how it reads\",\n \"Check it before saving\",\n];\n\nexport interface StepState {\n identity: { id: string; name: string | null; component: string };\n widget: BuilderWidget | null;\n issues: string[];\n}\n\n/** Which of the seven steps read as done, in the order the strip shows them. */\nexport function builderStepsDone({\n identity,\n widget,\n issues,\n}: StepState): boolean[] {\n const tabular =\n widget?.component === \"table\" || widget?.component === \"tabulator\";\n const pivot = widget?.component === \"pivot_table\";\n const pivotLaidOut = Boolean(\n widget && widget.pivot.rows.length > 0 && widget.pivot.measures.length > 0,\n );\n return [\n Boolean(identity.name && identity.id),\n Boolean(identity.component),\n Boolean(widget?.datasetId),\n (widget?.columns.length ?? 0) > 0,\n widget\n ? pivot\n ? pivotLaidOut\n : tabular\n ? widget.columns.length > 0\n : Boolean(widget.mappings.value)\n : false,\n // Nothing in step 6 is required, so the step reads as done as soon as the\n // widget itself is one the builder can style.\n Boolean(widget),\n Boolean(widget) && issues.length === 0,\n ];\n}\n","import { useEffect, useMemo, useState } from \"react\";\n\nimport {\n ALL_COMPONENTS,\n CHART_TYPES,\n DELTA_FORMATS,\n NUMBER_FORMATS,\n PIVOT_AGGREGATIONS,\n PIVOT_DIRECTIONS,\n PIVOT_SUBTOTALS,\n humanizeColumn,\n labelColumns,\n numericColumns,\n readModelOutline,\n readWidgetOutline,\n widgetColumns,\n widgetFragment,\n widgetIssues,\n writeComponent,\n writeIdentity,\n writeWidget,\n type BuilderAppearance,\n type BuilderPivot,\n type BuilderWidget,\n type ChartType,\n type DeltaFormat,\n type NumberFormat,\n type PivotAggregation,\n type PivotDirection,\n type PivotSubtotals,\n type SemanticSummary,\n type SortOrder,\n type WidgetColumn,\n} from \"@dlh.io/bideux-dashboard-core\";\n\nimport { useAuthoring } from \"./authoring-context.js\";\nimport type { DatasetPreviewResult } from \"./authoring-ports.js\";\nimport {\n BuilderYamlStrip,\n ChoiceField,\n ColumnPicker,\n FieldLabel,\n Info,\n NumberField,\n PickList,\n StepFrame,\n TextField,\n ToggleField,\n UNSET,\n} from \"./builder-fields.js\";\nimport { cn } from \"./cn.js\";\nimport {\n STEP_TITLES,\n addMeasure,\n addSeries,\n builderStepsDone,\n isMapped,\n nextSeriesField,\n removeMeasure,\n removeSeries,\n setAxis,\n setDataset,\n setMapping,\n toggleColumn,\n updateMeasure,\n updateSeries,\n} from \"./widget-builder-model.js\";\n\nconst COMPONENTS: {\n id: (typeof ALL_COMPONENTS)[number];\n label: string;\n blurb: string;\n}[] = [\n { id: \"echarts\", label: \"Chart\", blurb: \"Lines, bars, pies\" },\n { id: \"kpi\", label: \"Single number\", blurb: \"One figure\" },\n { id: \"table\", label: \"Table\", blurb: \"Rows and columns\" },\n { id: \"tabulator\", label: \"Table (advanced)\", blurb: \"Sortable, exportable\" },\n { id: \"pivot_table\", label: \"Pivot table\", blurb: \"Cross-tab with totals\" },\n { id: \"text\", label: \"Text\", blurb: \"Written in YAML\" },\n { id: \"markdown\", label: \"Markdown\", blurb: \"Written in YAML\" },\n { id: \"image\", label: \"Image\", blurb: \"Written in YAML\" },\n { id: \"filter\", label: \"Filter control\", blurb: \"Written in YAML\" },\n];\n\nconst AGGREGATION_LABELS: Record<PivotAggregation, string> = {\n sum: \"Sum\",\n avg: \"Average\",\n min: \"Smallest\",\n max: \"Largest\",\n count: \"How many rows\",\n count_distinct: \"How many different values\",\n};\n\nconst FORMAT_LABELS: Record<NumberFormat, string> = {\n number: \"Number, for example 12,345.678\",\n currency: \"Currency, for example $12,345.68\",\n percent: \"Percent, for example 12.3%\",\n};\n\nconst SUBTOTAL_LABELS: Record<PivotSubtotals, string> = {\n collapsed: \"A group line, with its rows indented under it\",\n expanded: \"A group line, with its rows shown in full\",\n none: \"No group lines, just the rows\",\n};\n\nconst CHART_LABELS: Record<ChartType, string> = {\n line: \"Line\",\n bar: \"Bar\",\n area: \"Area\",\n pie: \"Pie\",\n scatter: \"Scatter\",\n};\n\n/** What the delivery-open select shows while a custom level count is set. */\nconst CUSTOM_LEVELS = \"__custom__\";\n\nfunction stepAnchor(number: number): string {\n return `widget-builder-step-${number}`;\n}\n\n/**\n * One pivot axis's delivery-open control: a select holding All open, All\n * collapsed and Custom, and beside it, only while Custom is picked, a second\n * select holding the level count.\n */\nfunction DeliveryOpenField({\n label,\n help,\n levels,\n levelCount,\n noun,\n foldedHint,\n readOnly,\n onCommit,\n}: {\n label: string;\n help: string;\n levels: number | null;\n levelCount: number;\n noun: string;\n foldedHint: string;\n readOnly: boolean;\n onCommit: (levels: number | null) => void;\n}) {\n const custom = levels !== null && levels >= 1 && levels < levelCount;\n const customLevels: number[] = [];\n for (let level = 1; level < levelCount; level += 1) {\n customLevels.push(level);\n }\n return (\n <div className=\"space-y-2\">\n <ChoiceField\n label={label}\n help={help}\n value={\n levels === null || levels >= levelCount\n ? UNSET\n : custom\n ? CUSTOM_LEVELS\n : \"0\"\n }\n placeholder=\"All open\"\n readOnly={readOnly}\n options={[\n { value: UNSET, label: \"All open\" },\n { value: \"0\", label: `All collapsed (${foldedHint})` },\n ...(customLevels.length > 0\n ? [{ value: CUSTOM_LEVELS, label: \"Custom\" }]\n : []),\n ]}\n onPick={(value) => {\n onCommit(value === UNSET ? null : value === \"0\" ? 0 : 1);\n }}\n />\n {custom ? (\n <ChoiceField\n label=\"Levels open\"\n value={String(levels)}\n placeholder=\"1\"\n readOnly={readOnly}\n options={customLevels.map((level) => ({\n value: String(level),\n label: level === 1 ? `1 ${noun}` : `${level} ${noun}s`,\n }))}\n onPick={(value) => {\n onCommit(Number(value));\n }}\n />\n ) : null}\n </div>\n );\n}\n\n/** How the sample number in step 6 reads with the settings as they stand. */\nfunction sampleNumber(look: BuilderAppearance): string {\n const places = look.decimals ?? (look.format === \"currency\" ? 2 : undefined);\n const notation = look.compact ? \"compact\" : \"standard\";\n const value = look.format === \"percent\" ? 0.1234 : 12345.678;\n const text = new Intl.NumberFormat(\"en-US\", {\n style: look.format === \"percent\" ? \"percent\" : \"decimal\",\n notation: look.format === \"percent\" ? \"standard\" : notation,\n minimumFractionDigits: places,\n maximumFractionDigits: places ?? (look.format === \"percent\" ? 1 : 3),\n }).format(value);\n return `${look.prefix ?? \"\"}${text}${look.suffix ?? \"\"}`;\n}\n\n/**\n * Step 6: everything about how the widget reads rather than what it reads.\n *\n * Only the controls the current component honours are shown, because offering\n * a page size on a single number would write a key no renderer reads.\n */\nfunction AppearanceFields({\n widget,\n labels,\n readOnly,\n onChange,\n}: {\n widget: BuilderWidget;\n labels: WidgetColumn[];\n readOnly: boolean;\n onChange: (appearance: BuilderAppearance) => void;\n}) {\n const look = widget.appearance;\n const set = (patch: Partial<BuilderAppearance>): void => {\n onChange({ ...look, ...patch });\n };\n\n if (widget.component === \"kpi\") {\n return (\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <ChoiceField\n label=\"How the number is printed\"\n help=\"Currency adds the local currency symbol and two decimals. Percent expects a fraction, so 0.12 reads 12%. Number leaves it as it comes.\"\n value={look.format}\n placeholder=\"Number\"\n readOnly={readOnly}\n options={NUMBER_FORMATS.map((format) => ({\n value: format,\n label: FORMAT_LABELS[format],\n }))}\n onPick={(value) => {\n set({\n format: (NUMBER_FORMATS as readonly string[]).includes(value)\n ? (value as NumberFormat)\n : \"number\",\n });\n }}\n />\n <NumberField\n label=\"Decimal places (optional)\"\n help=\"Fixed rounding, whatever the figure is. Leave it empty to use the format's own default, which is two for currency.\"\n value={look.decimals}\n placeholder=\"Default for the format\"\n min={0}\n max={6}\n readOnly={readOnly}\n onCommit={(value) => {\n set({ decimals: value });\n }}\n />\n <TextField\n label=\"Prefix (optional)\"\n help=\"Printed immediately before the number, for anything the format has no symbol for.\"\n value={look.prefix ?? \"\"}\n placeholder=\"Nothing\"\n readOnly={readOnly}\n onCommit={(value) => {\n set({ prefix: value.trim() || null });\n }}\n />\n <TextField\n label=\"Suffix (optional)\"\n help=\"Printed immediately after the number, for units the format has no name for, for example hrs, pp or /hr.\"\n value={look.suffix ?? \"\"}\n placeholder=\"Nothing\"\n readOnly={readOnly}\n onCommit={(value) => {\n set({ suffix: value.trim() || null });\n }}\n />\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <ToggleField\n label=\"Shorten large numbers\"\n help=\"Prints 1,240,000 as 1.24M, which keeps a long figure inside a small card.\"\n checked={look.compact}\n readOnly={readOnly}\n onToggle={(checked) => {\n set({ compact: checked });\n }}\n />\n <ToggleField\n label=\"Caption below the number\"\n help=\"By default the caption sits above the figure. Turn this on to put it underneath.\"\n checked={look.labelPosition === \"bottom\"}\n readOnly={readOnly}\n onToggle={(checked) => {\n set({ labelPosition: checked ? \"bottom\" : \"top\" });\n }}\n />\n </div>\n <p className=\"rounded-md border bg-muted/30 px-3 py-2 text-xs text-muted-foreground\">\n {`A number reads as ${sampleNumber(look)} with these settings.`}\n </p>\n </div>\n );\n }\n\n if (widget.component === \"echarts\") {\n const axis = widget.mappings.x ?? widget.mappings.category;\n return (\n <div className=\"space-y-3\">\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <ToggleField\n label=\"Show the legend\"\n help=\"The key naming each line or bar. Worth turning off when there is only one measure, since the axis already says what it is.\"\n checked={look.showLegend}\n readOnly={readOnly}\n onToggle={(checked) => {\n set({ showLegend: checked });\n }}\n />\n <ToggleField\n label=\"Lay the bars on their side\"\n help=\"Horizontal bars, which read better when the category names are long. Ignored by line, area, pie and scatter charts.\"\n checked={look.horizontal}\n readOnly={readOnly}\n onToggle={(checked) => {\n set({ horizontal: checked });\n }}\n />\n </div>\n <ChoiceField\n label=\"Sort the points (optional)\"\n help=\"Sorts the rows on the axis column before drawing them. Leave it unsorted to keep the order the query returned, which is usually what a date axis wants.\"\n value={look.sortOrder}\n placeholder=\"Leave the query's order\"\n readOnly={readOnly}\n options={[\n { value: \"none\", label: \"Leave the query's order\" },\n { value: \"asc\", label: \"Ascending\" },\n { value: \"desc\", label: \"Descending\" },\n ]}\n hint={\n axis\n ? `Sorted by ${humanizeColumn(axis)}.`\n : \"Pick the axis column in step 5 first.\"\n }\n onPick={(value) => {\n set({ sortOrder: value as SortOrder });\n }}\n />\n </div>\n );\n }\n\n if (widget.component === \"table\" || widget.component === \"tabulator\") {\n return (\n <div className=\"space-y-3\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <NumberField\n label=\"Rows per page (optional)\"\n help=\"How many rows a viewer sees before paging. Leave it empty to show every row the query returned, which suits a short summary.\"\n value={look.pageSize}\n placeholder=\"Show them all\"\n min={1}\n max={1000}\n readOnly={readOnly}\n onCommit={(value) => {\n set({ pageSize: value });\n }}\n />\n {widget.component === \"tabulator\" ? (\n <ChoiceField\n label=\"Group the rows (optional)\"\n help=\"Collects the rows under a heading per value of this column. Only the columns this widget selects can be grouped on.\"\n value={look.groupBy ?? UNSET}\n placeholder=\"No grouping\"\n readOnly={readOnly}\n options={[\n { value: UNSET, label: \"No grouping\" },\n ...labels.map((column) => ({\n value: column.key,\n label: column.label,\n })),\n ]}\n onPick={(value) => {\n set({ groupBy: value === UNSET ? null : value });\n }}\n />\n ) : null}\n </div>\n <ToggleField\n label=\"Let a viewer sort by a column\"\n help=\"Clicking a heading reorders the rows. Turn it off when the order the query returns is the point, for example a ranked list.\"\n checked={look.sortable}\n readOnly={readOnly}\n onToggle={(checked) => {\n set({ sortable: checked });\n }}\n />\n </div>\n );\n }\n\n return (\n <p className=\"text-xs text-muted-foreground\">\n This widget type has no display settings the builder writes.\n </p>\n );\n}\n\n/** The pivot's own measures, as something to order or rank by. */\nfunction measureOptions(\n pivot: BuilderPivot,\n): { value: string; label: string }[] {\n return pivot.measures.map((measure) => ({\n value: measure.field,\n label: measure.label ?? humanizeColumn(measure.field),\n }));\n}\n\n/**\n * Step 5 for a pivot table: what goes down the side, across the top and inside.\n *\n * Only the dimensions and metrics the widget selects in step 4 are offered, so\n * a layout cannot name a field the query will not return.\n */\nfunction PivotLayoutFields({\n pivot,\n labels,\n numbers,\n readOnly,\n onChange,\n}: {\n pivot: BuilderPivot;\n labels: WidgetColumn[];\n numbers: WidgetColumn[];\n readOnly: boolean;\n onChange: (pivot: BuilderPivot) => void;\n}) {\n const { ui } = useAuthoring();\n const set = (patch: Partial<BuilderPivot>): void => {\n onChange({ ...pivot, ...patch });\n };\n const free = labels.filter(\n (column) =>\n !pivot.rows.includes(column.key) && !pivot.columns.includes(column.key),\n );\n const unused = numbers.filter(\n (column) => !pivot.measures.some((measure) => measure.field === column.key),\n );\n const first = unused[0] ?? numbers[0];\n\n return (\n <div className=\"space-y-4\">\n <ColumnPicker\n title=\"Down the side (row fields)\"\n empty=\"Tick some dimensions in step 4 first.\"\n help=\"One level of the row hierarchy per field, in this order. Two fields read as a group and the rows under it, for example region then store.\"\n columns={labels.filter((column) => !pivot.columns.includes(column.key))}\n selected={pivot.rows}\n readOnly={readOnly}\n onToggle={(key, checked) => {\n set({\n rows: checked\n ? [...pivot.rows, key]\n : pivot.rows.filter((field) => field !== key),\n });\n }}\n />\n <ColumnPicker\n title=\"Across the top (column fields)\"\n empty=\"Tick some dimensions in step 4 first.\"\n help=\"Each value of these fields becomes a column, so pick something with few values, such as a quarter.\"\n columns={labels.filter((column) => !pivot.rows.includes(column.key))}\n selected={pivot.columns}\n readOnly={readOnly}\n onToggle={(key, checked) => {\n set({\n columns: checked\n ? [...pivot.columns, key]\n : pivot.columns.filter((field) => field !== key),\n });\n }}\n />\n {free.length === 0 && labels.length > 0 ? (\n <p className=\"text-[11px] text-muted-foreground\">\n Every dimension this widget selects is in the layout. A field cannot\n be down the side and across the top at once.\n </p>\n ) : null}\n\n <div className=\"space-y-2\">\n <FieldLabel\n text=\"The figures inside (measures)\"\n help=\"One number per intersection of a row and a column. Several measures repeat under each column heading.\"\n />\n {pivot.measures.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n Add at least one measure, or every cell would be empty.\n </p>\n ) : (\n <div className=\"space-y-3\">\n {pivot.measures.map((measure, index) => (\n <div\n key={`${measure.field}-${index}`}\n className=\"grid gap-3 rounded-md border p-3 sm:grid-cols-[1fr_1fr_1fr_auto]\"\n >\n <ChoiceField\n label=\"Measure\"\n value={measure.field}\n placeholder=\"Pick a measure\"\n readOnly={readOnly}\n options={numbers.map((column) => ({\n value: column.key,\n label: column.label,\n }))}\n onPick={(value) => {\n onChange(\n updateMeasure(pivot, index, { ...measure, field: value }),\n );\n }}\n />\n <ChoiceField\n label=\"How it is totalled\"\n help=\"The measure already aggregates in the warehouse, and this is how those figures are combined again across a group.\"\n value={measure.agg}\n placeholder=\"Sum\"\n readOnly={readOnly}\n options={PIVOT_AGGREGATIONS.map((agg) => ({\n value: agg,\n label: AGGREGATION_LABELS[agg],\n }))}\n onPick={(value) => {\n onChange(\n updateMeasure(pivot, index, {\n ...measure,\n agg: (PIVOT_AGGREGATIONS as readonly string[]).includes(\n value,\n )\n ? (value as PivotAggregation)\n : \"sum\",\n }),\n );\n }}\n />\n <ChoiceField\n label=\"How it is printed\"\n help=\"Currency and percent print the figure the way a card would.\"\n value={measure.format ?? UNSET}\n placeholder=\"As it comes\"\n readOnly={readOnly}\n options={[\n { value: UNSET, label: \"As it comes\" },\n ...NUMBER_FORMATS.map((format) => ({\n value: format,\n label: FORMAT_LABELS[format],\n })),\n ]}\n onPick={(value) => {\n onChange(\n updateMeasure(pivot, index, {\n ...measure,\n format:\n value === UNSET ? null : (value as NumberFormat),\n }),\n );\n }}\n />\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"self-end\"\n disabled={readOnly}\n ariaLabel={`Remove ${measure.field}`}\n onClick={() => {\n onChange(removeMeasure(pivot, index));\n }}\n >\n Remove\n </ui.Button>\n <TextField\n label=\"Heading (optional)\"\n value={measure.label ?? \"\"}\n placeholder={humanizeColumn(measure.field)}\n readOnly={readOnly}\n onCommit={(value) => {\n onChange(\n updateMeasure(pivot, index, {\n ...measure,\n label: value.trim() || null,\n }),\n );\n }}\n />\n <NumberField\n label=\"Decimal places (optional)\"\n value={measure.decimals}\n placeholder=\"Default for the format\"\n min={0}\n max={6}\n readOnly={readOnly}\n onCommit={(value) => {\n onChange(\n updateMeasure(pivot, index, {\n ...measure,\n decimals: value,\n }),\n );\n }}\n />\n </div>\n ))}\n </div>\n )}\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={readOnly || first === undefined}\n title={first === undefined ? \"Pick a measure in step 4 first\" : \"\"}\n onClick={() => {\n if (first) onChange(addMeasure(pivot, first.key));\n }}\n >\n Add a measure\n </ui.Button>\n </div>\n </div>\n );\n}\n\n/** Step 6 for a pivot table: totals, empty cells, shading and the caps. */\nfunction PivotDisplayFields({\n pivot,\n readOnly,\n onChange,\n}: {\n pivot: BuilderPivot;\n readOnly: boolean;\n onChange: (pivot: BuilderPivot) => void;\n}) {\n const set = (patch: Partial<BuilderPivot>): void => {\n onChange({ ...pivot, ...patch });\n };\n\n return (\n <div className=\"space-y-3\">\n <div className=\"grid gap-3 sm:grid-cols-3\">\n <ToggleField\n label=\"Total each row\"\n help=\"A total column at the right, adding up the columns a dimension generated.\"\n checked={pivot.columnTotals}\n readOnly={readOnly}\n onToggle={(checked) => {\n set({ columnTotals: checked });\n }}\n />\n <ToggleField\n label=\"Subtotal each group\"\n help=\"A line for the group itself, above the rows under it.\"\n checked={pivot.rowTotals}\n readOnly={readOnly}\n onToggle={(checked) => {\n set({ rowTotals: checked });\n }}\n />\n <ToggleField\n label=\"Total everything\"\n help=\"The one line pinned at the foot, totalling every row in the pivot rather than only the rows on screen.\"\n checked={pivot.grandTotal}\n readOnly={readOnly}\n onToggle={(checked) => {\n set({ grandTotal: checked });\n }}\n />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <ChoiceField\n label=\"How the groups read\"\n help=\"Collapsed shows a group line and the rows under it indented. None drops the group lines entirely.\"\n value={pivot.subtotals}\n placeholder=\"Collapsed\"\n readOnly={readOnly}\n options={PIVOT_SUBTOTALS.map((option) => ({\n value: option,\n label: SUBTOTAL_LABELS[option],\n }))}\n onPick={(value) => {\n set({\n subtotals: (PIVOT_SUBTOTALS as readonly string[]).includes(value)\n ? (value as PivotSubtotals)\n : \"collapsed\",\n });\n }}\n />\n <TextField\n label=\"What an empty cell prints\"\n help=\"An intersection with no rows behind it. This is not a zero: a dash says there was nothing there, which a zero would hide.\"\n value={pivot.emptyValue ?? \"\"}\n placeholder=\"-\"\n readOnly={readOnly}\n onCommit={(value) => {\n set({ emptyValue: value.trim() || null });\n }}\n />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <DeliveryOpenField\n label=\"Row levels open in a delivery\"\n help=\"How far a PDF, PNG or CSV delivery opens the pivot's rows. The dashboard itself is untouched.\"\n levels={pivot.snapshotExpand}\n levelCount={pivot.rows.length}\n noun=\"row level\"\n foldedHint=\"groups folded to one line each\"\n readOnly={readOnly}\n onCommit={(levels) => {\n set({ snapshotExpand: levels });\n }}\n />\n {pivot.columns.length > 0 ? (\n <DeliveryOpenField\n label=\"Column levels open in a delivery\"\n help=\"How far a PDF, PNG or CSV delivery opens the pivot's columns.\"\n levels={pivot.snapshotExpandColumns}\n levelCount={pivot.columns.length}\n noun=\"header level\"\n foldedHint=\"headers folded to their totals\"\n readOnly={readOnly}\n onCommit={(levels) => {\n set({ snapshotExpandColumns: levels });\n }}\n />\n ) : null}\n </div>\n <ChoiceField\n label=\"Shade the cells of one measure (optional)\"\n help=\"A heatmap across the whole pivot, darkest at the largest figure. The range is computed on the server, so an emailed deck matches the screen.\"\n value={pivot.heatmap ?? UNSET}\n placeholder=\"No shading\"\n readOnly={readOnly}\n options={[\n { value: UNSET, label: \"No shading\" },\n ...measureOptions(pivot),\n ]}\n onPick={(value) => {\n set({ heatmap: value === UNSET ? null : value });\n }}\n />\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <ChoiceField\n label=\"What order the rows open in\"\n help=\"Applied on the server, so the card, the CSV, the workbook and the deck all agree.\"\n value={pivot.sortMeasure ?? UNSET}\n placeholder=\"The row labels\"\n readOnly={readOnly}\n options={[\n { value: UNSET, label: \"The row labels\" },\n ...measureOptions(pivot),\n ]}\n onPick={(value) => {\n set({ sortMeasure: value === UNSET ? null : value });\n }}\n />\n <ChoiceField\n label=\"Which way it reads\"\n help=\"Biggest first is the default for a measure, and A to Z for the labels.\"\n value={pivot.sortDirection ?? UNSET}\n placeholder={pivot.sortMeasure ? \"Biggest first\" : \"A to Z\"}\n readOnly={readOnly}\n options={[\n {\n value: UNSET,\n label: pivot.sortMeasure ? \"Biggest first\" : \"A to Z\",\n },\n { value: \"desc\", label: \"Biggest first\" },\n { value: \"asc\", label: \"Smallest first\" },\n ]}\n onPick={(value) => {\n set({\n sortDirection: (PIVOT_DIRECTIONS as readonly string[]).includes(\n value,\n )\n ? (value as PivotDirection)\n : null,\n });\n }}\n />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <NumberField\n label=\"Keep only the biggest rows (optional)\"\n help=\"How many row groups are drawn. The rest is carried in one Other line, so the figures still add up to the total.\"\n value={pivot.topRows}\n placeholder=\"Every row\"\n min={1}\n max={5000}\n readOnly={readOnly}\n onCommit={(value) => {\n set({ topRows: value });\n }}\n />\n <ChoiceField\n label=\"What decides the biggest\"\n help=\"Defaults to whatever orders the rows above.\"\n value={pivot.topRowsMeasure ?? UNSET}\n placeholder=\"The order above\"\n readOnly={readOnly || pivot.topRows === null}\n options={[\n { value: UNSET, label: \"The order above\" },\n ...measureOptions(pivot),\n ]}\n onPick={(value) => {\n set({ topRowsMeasure: value === UNSET ? null : value });\n }}\n />\n <ToggleField\n label=\"Carry the rest in Other\"\n help=\"On, the rows left out are summed into one Other line and the grand total still covers everything.\"\n checked={pivot.topRowsOther}\n readOnly={readOnly || pivot.topRows === null}\n onToggle={(checked) => {\n set({ topRowsOther: checked });\n }}\n />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <NumberField\n label=\"Most row groups to keep (optional)\"\n help=\"How many top level row groups are drawn before the widget says it is showing some of them.\"\n value={pivot.rowGroupLimit}\n placeholder=\"The engine's cap\"\n min={1}\n max={5000}\n readOnly={readOnly}\n onCommit={(value) => {\n set({ rowGroupLimit: value });\n }}\n />\n <NumberField\n label=\"Most columns to generate (optional)\"\n help=\"A wide dimension can generate thousands of columns, so the engine stops at a cap and says so.\"\n value={pivot.columnLimit}\n placeholder=\"The engine's cap\"\n min={1}\n max={400}\n readOnly={readOnly}\n onCommit={(value) => {\n set({ columnLimit: value });\n }}\n />\n <ToggleField\n label=\"Let readers rearrange it\"\n help=\"On, a reader can drag dimensions and measures onto Rows, Columns and Data. What they arrange lives in their browser only.\"\n checked={pivot.explore}\n readOnly={readOnly}\n onToggle={(checked) => {\n set({ explore: checked });\n }}\n />\n </div>\n </div>\n );\n}\n\n/** The strip at the top, so the steps and how far along you are is visible. */\nfunction StepProgress({ done }: { done: boolean[] }) {\n return (\n <div className=\"sticky top-0 z-10 mb-1 flex flex-wrap items-center gap-1.5 border-b bg-background/95 px-6 py-3\">\n {STEP_TITLES.map((title, index) => (\n <a\n key={title}\n href={`#${stepAnchor(index + 1)}`}\n className={cn(\n \"flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[11px]\",\n done[index]\n ? \"border-primary/40 bg-primary/10 text-foreground\"\n : \"text-muted-foreground hover:bg-muted/60\",\n )}\n >\n <span className=\"flex h-4 w-4 items-center justify-center rounded-full bg-muted text-[10px] font-medium\">\n {index + 1}\n </span>\n <span>{title}</span>\n </a>\n ))}\n </div>\n );\n}\n\nexport interface WidgetBuilderProps {\n specYaml: string;\n onChange: (specYaml: string) => void;\n readOnly: boolean;\n /** Sends the author to the YAML tab for anything the builder cannot edit. */\n onEditInYaml: () => void;\n}\n\n/**\n * Build a widget by clicking, with the YAML still authoritative.\n *\n * The panel is a sequence of steps rather than a form, because the order is\n * what makes the result safe: a mapping can only name a column the widget\n * selects, and a column can only be one the chosen dataset can answer. That is\n * the blank chart removed at the source rather than diagnosed after the fact.\n */\nexport function WidgetBuilder({\n specYaml,\n onChange,\n readOnly,\n onEditInYaml,\n}: WidgetBuilderProps) {\n const { transport, ui } = useAuthoring();\n const [modelYaml, setModelYaml] = useState<string | null>(null);\n const [modelError, setModelError] = useState<string | null>(null);\n const [reload, setReload] = useState(0);\n const [preview, setPreview] = useState<DatasetPreviewResult | null>(null);\n const [previewError, setPreviewError] = useState<string | null>(null);\n const [previewing, setPreviewing] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n const controller = new AbortController();\n async function load(): Promise<void> {\n try {\n const model = await transport.loadModel({ signal: controller.signal });\n if (!cancelled) {\n setModelYaml(model.specYaml);\n setModelError(null);\n }\n } catch (error) {\n if (!cancelled) {\n setModelError(\n error instanceof Error\n ? error.message\n : \"Could not read the semantic model\",\n );\n }\n }\n }\n void load();\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [transport, reload]);\n\n const outline = useMemo(() => readWidgetOutline(specYaml), [specYaml]);\n const model: SemanticSummary = useMemo(() => {\n const parsed = readModelOutline(modelYaml ?? \"\");\n return {\n datasets: parsed.datasets,\n relationships: parsed.relationships,\n modelMetrics: parsed.modelMetrics,\n };\n }, [modelYaml]);\n\n const widget = outline.widget;\n const columns = useMemo(\n () => widgetColumns(widget?.datasetId ?? null, model),\n [widget?.datasetId, model],\n );\n const issues = useMemo(\n () => (widget ? widgetIssues(widget, model) : []),\n [widget, model],\n );\n\n function write(next: BuilderWidget): void {\n onChange(writeWidget(specYaml, next));\n setPreview(null);\n }\n\n function pickComponent(component: string): void {\n onChange(writeComponent(specYaml, component));\n setPreview(null);\n }\n\n async function runPreview(current: BuilderWidget): Promise<void> {\n if (modelYaml === null || !current.datasetId) return;\n setPreviewing(true);\n setPreviewError(null);\n try {\n const result = await transport.previewDataset({\n specYaml: modelYaml,\n datasetId: current.datasetId,\n limit: 20,\n columns: current.columns,\n });\n setPreview(result);\n } catch (error) {\n setPreviewError(\n error instanceof Error ? error.message : \"Could not run this widget\",\n );\n } finally {\n setPreviewing(false);\n }\n }\n\n if (outline.error) {\n return (\n <div className=\"flex h-full items-center justify-center p-6\">\n <div className=\"max-w-md space-y-3 rounded-md border border-amber-300 bg-amber-50 p-4 text-sm text-amber-900\">\n <div className=\"font-medium\">This widget has a YAML syntax error</div>\n <p>{`${outline.error.message} (line ${outline.error.line})`}</p>\n <ui.Button size=\"sm\" variant=\"secondary\" onClick={onEditInYaml}>\n Open the YAML tab\n </ui.Button>\n </div>\n </div>\n );\n }\n\n const identity = outline.identity;\n const selectable = (widget?.columns ?? []).length\n ? columns.filter((column) => widget?.columns.includes(column.key))\n : [];\n const labels = labelColumns(selectable);\n const numbers = numericColumns(selectable);\n const chart = widget?.component === \"echarts\";\n const single = widget?.component === \"kpi\";\n const tabular =\n widget?.component === \"table\" || widget?.component === \"tabulator\";\n const pivot = widget?.component === \"pivot_table\";\n const pivotLaidOut = Boolean(\n widget && widget.pivot.rows.length > 0 && widget.pivot.measures.length > 0,\n );\n const stepsDone = builderStepsDone({ identity, widget, issues });\n\n function mappingOptions(\n source: WidgetColumn[],\n ): { value: string; label: string }[] {\n return [\n { value: UNSET, label: \"Not set\" },\n ...source.map((column) => ({ value: column.key, label: column.label })),\n ];\n }\n\n return (\n <div className=\"space-y-4 p-6\">\n <StepProgress done={stepsDone} />\n\n <StepFrame\n anchor={stepAnchor(1)}\n number={1}\n title=\"Name it\"\n blurb=\"The title on the card, and the id the dashboard layout references.\"\n help=\"The title is what a viewer reads on the dashboard. The id is how the layout finds this widget, so it has to stay stable once the widget is placed.\"\n done={stepsDone[0] ?? false}\n >\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <TextField\n label=\"Title\"\n value={identity.name ?? \"\"}\n placeholder=\"Sales and labor\"\n readOnly={readOnly}\n onCommit={(value) => {\n onChange(writeIdentity(specYaml, \"name\", value));\n }}\n />\n <TextField\n label=\"Id\"\n value={identity.id}\n placeholder=\"sales_and_labor\"\n hint=\"Changing this changes what the layout must reference.\"\n help=\"Lowercase with underscores. If this widget is already on the grid, renaming the id removes it from the layout until the layout is pointed at the new id.\"\n mono\n readOnly={readOnly}\n onCommit={(value) => {\n onChange(writeIdentity(specYaml, \"id\", value));\n }}\n />\n </div>\n </StepFrame>\n\n <StepFrame\n anchor={stepAnchor(2)}\n number={2}\n title=\"Choose what it is\"\n blurb=\"Switch type at any time. The five data types are built here; the rest hold content and are written in YAML.\"\n help=\"Switching type only rewrites the component line, so the dataset, columns and anything else the widget holds survive the switch.\"\n done\n >\n <PickList\n options={COMPONENTS.map((option) => ({\n id: option.id,\n label: option.label,\n blurb: option.blurb,\n }))}\n value={\n (ALL_COMPONENTS as readonly string[]).includes(identity.component)\n ? (identity.component as (typeof ALL_COMPONENTS)[number])\n : null\n }\n readOnly={readOnly}\n onPick={pickComponent}\n />\n {chart && widget ? (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Chart type\n </span>\n <Info text=\"Line and area suit a date axis, bar suits a handful of categories, pie needs one slice column plus one measure, scatter plots two measures against each other.\" />\n </div>\n <PickList\n options={CHART_TYPES.map((type) => ({\n id: type,\n label: CHART_LABELS[type],\n }))}\n value={widget.chartType}\n readOnly={readOnly}\n columns={3}\n onPick={(type) => {\n write({ ...widget, chartType: type });\n }}\n />\n </div>\n ) : null}\n </StepFrame>\n\n {!widget ? (\n [3, 4, 5, 6, 7].map((number) => (\n <StepFrame\n key={number}\n anchor={stepAnchor(number)}\n number={number}\n title={STEP_TITLES[number - 1] ?? \"\"}\n >\n <p className=\"text-xs text-muted-foreground\">\n {outline.readOnlyReason ??\n \"The builder has no form for this widget.\"}\n </p>\n <ui.Button size=\"sm\" variant=\"secondary\" onClick={onEditInYaml}>\n Open the YAML tab\n </ui.Button>\n </StepFrame>\n ))\n ) : (\n <>\n <StepFrame\n anchor={stepAnchor(3)}\n number={3}\n title=\"Pick where the numbers come from\"\n blurb=\"Datasets come from the semantic model, so a widget never names a table.\"\n help=\"A dataset is a named source in the semantic model: a table or view plus the dimensions and metrics you are allowed to ask it for, and the column that carries the scope key. Changing dataset clears the columns and mappings, because they belong to the old one.\"\n done={Boolean(widget.datasetId)}\n >\n {modelError !== null ? (\n <div className=\"space-y-2\">\n <p className=\"text-xs text-destructive\">\n {`Could not load the semantic model: ${modelError}`}\n </p>\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => {\n setReload((n) => n + 1);\n }}\n >\n Try again\n </ui.Button>\n </div>\n ) : modelYaml === null ? (\n <p className=\"text-xs text-muted-foreground\">\n Reading the semantic model...\n </p>\n ) : model.datasets.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n The semantic model has no datasets yet. Add one in the model\n editor, then come back here.\n </p>\n ) : (\n <PickList\n options={model.datasets.map((dataset) => ({\n id: dataset.id,\n label: dataset.name ?? dataset.id,\n blurb: dataset.source ?? undefined,\n }))}\n value={widget.datasetId}\n readOnly={readOnly}\n onPick={(datasetId) => {\n write(setDataset(widget, datasetId));\n }}\n />\n )}\n </StepFrame>\n\n <StepFrame\n anchor={stepAnchor(4)}\n number={4}\n title=\"Pick the columns it asks for\"\n blurb=\"These are exactly the columns the query returns, so nothing else can be plotted.\"\n help=\"Ticking a dimension groups the query by it. Ticking a measure aggregates it. Unticking a column also clears anything in step 5 that read it, which is what stops a widget rendering blank.\"\n done={widget.columns.length > 0}\n >\n {!widget.datasetId ? (\n <p className=\"text-xs text-muted-foreground\">\n Pick a dataset in step 3 first.\n </p>\n ) : (\n <>\n <ColumnPicker\n title={\n single ? \"Group by (leave these unticked)\" : \"Group by\"\n }\n empty=\"This dataset declares no dimensions.\"\n help={\n single\n ? \"A single number is one figure. Grouping returns one row per group and the card can only show the first, so leave these unticked.\"\n : \"Dimensions are what the query groups by: a date on the axis, a store name per slice.\"\n }\n columns={labelColumns(columns)}\n selected={widget.columns}\n readOnly={readOnly}\n onToggle={(key, checked) => {\n write(toggleColumn(widget, key, checked));\n }}\n />\n {single ? (\n <p className=\"text-[11px] text-muted-foreground\">\n A single number is one figure, so grouping splits the query\n into one row per group and the card can only show the first\n one. Tick measures alone here.\n </p>\n ) : null}\n <ColumnPicker\n title=\"Measure\"\n empty=\"This dataset declares no metrics.\"\n help=\"Measures are the aggregations the semantic model declares, such as SUM(NET_SALES).\"\n columns={numericColumns(columns)}\n selected={widget.columns}\n readOnly={readOnly}\n onToggle={(key, checked) => {\n write(toggleColumn(widget, key, checked));\n }}\n />\n {columns.some((column) => column.joined) ? (\n <p className=\"text-[11px] text-muted-foreground\">\n A column badged joins comes from another dataset, and asking\n for it is what makes the engine build the join. Its rows\n come back under that same name.\n </p>\n ) : null}\n </>\n )}\n </StepFrame>\n\n <StepFrame\n anchor={stepAnchor(5)}\n number={5}\n title=\"Say what each part reads\"\n blurb=\"Only the columns picked in step 4 are offered, so a mapping cannot name a column the query will not return.\"\n help=\"Mappings tell the renderer which returned column to read for each part of the widget. A mapping naming a column the query does not return is exactly what draws an empty card.\"\n done={\n pivot\n ? pivotLaidOut\n : tabular\n ? widget.columns.length > 0\n : Boolean(widget.mappings.value)\n }\n >\n {pivot ? (\n widget.columns.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n Pick some columns in step 4 first.\n </p>\n ) : (\n <PivotLayoutFields\n pivot={widget.pivot}\n labels={labels}\n numbers={numbers}\n readOnly={readOnly}\n onChange={(next) => {\n write({ ...widget, pivot: next });\n }}\n />\n )\n ) : tabular ? (\n <p className=\"text-xs text-muted-foreground\">\n A table shows the columns from step 4 in the order they are\n picked, so there is nothing to map. Widths, formats and totals\n live in YAML under display.\n </p>\n ) : widget.columns.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n Pick some columns in step 4 first.\n </p>\n ) : widget.component === \"kpi\" ? (\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <ChoiceField\n label=\"The number\"\n value={widget.mappings.value ?? UNSET}\n placeholder=\"Pick a measure\"\n readOnly={readOnly}\n help=\"The figure printed on the card. It reads the first returned row, which is why a single number must not group by anything.\"\n options={mappingOptions(numbers)}\n onPick={(value) => {\n write(setMapping(widget, \"value\", value));\n }}\n />\n <ChoiceField\n label=\"What it is compared against (optional)\"\n help=\"A second measure the number is measured against. The card shows the change between the two, not the second measure itself.\"\n value={widget.mappings.delta ?? UNSET}\n placeholder=\"Not set\"\n readOnly={readOnly}\n options={mappingOptions(\n numbers.filter(\n (column) => column.key !== widget.mappings.value,\n ),\n )}\n hint=\"The pill beside the number reads the change against this.\"\n onPick={(value) => {\n write(setMapping(widget, \"delta\", value));\n }}\n />\n {widget.mappings.delta ? (\n <ChoiceField\n label=\"How the change is shown\"\n help=\"A percentage divides the change by the comparison, so 110 against 100 reads +10%. A difference prints 10 instead.\"\n value={widget.deltaFormat}\n placeholder=\"Percentage\"\n readOnly={readOnly}\n options={[\n {\n value: \"percent\",\n label: \"Percentage change, for example +10%\",\n },\n { value: \"number\", label: \"Difference, for example +10\" },\n {\n value: \"currency\",\n label: \"Difference in currency, for example +$10\",\n },\n ]}\n hint={`Compared with ${humanizeColumn(widget.mappings.delta)}.`}\n onPick={(value) => {\n write({\n ...widget,\n deltaFormat: (\n DELTA_FORMATS as readonly string[]\n ).includes(value)\n ? (value as DeltaFormat)\n : \"percent\",\n });\n }}\n />\n ) : null}\n </div>\n ) : (\n <>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <ChoiceField\n label={\n widget.chartType === \"pie\"\n ? \"What names each slice\"\n : \"The horizontal axis\"\n }\n value={\n (widget.chartType === \"pie\"\n ? widget.mappings.category\n : widget.mappings.x) ?? UNSET\n }\n placeholder=\"Pick a column\"\n readOnly={readOnly}\n help={\n widget.chartType === \"pie\"\n ? \"The dimension that names each slice.\"\n : \"The dimension that runs along the bottom of the chart, usually a date.\"\n }\n options={mappingOptions(labels)}\n onPick={(value) => {\n write(setAxis(widget, value));\n }}\n />\n <ChoiceField\n label=\"The value\"\n value={widget.mappings.value ?? UNSET}\n placeholder=\"Pick a measure\"\n readOnly={readOnly}\n help=\"The measure the chart plots when there are no named series below. With named series, this is the fallback.\"\n options={mappingOptions(numbers)}\n onPick={(value) => {\n write(setMapping(widget, \"value\", value));\n }}\n />\n </div>\n\n <div className=\"space-y-2\">\n <FieldLabel\n text=\"Named series (optional)\"\n help=\"One line or bar per measure, each with its own legend name. This is how sales and labor cost appear side by side on the same chart.\"\n />\n {widget.series.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n Without these the chart draws the value column alone. Add\n one per measure to plot sales and labor side by side.\n </p>\n ) : (\n <div className=\"space-y-3\">\n {widget.series.map((entry, index) => (\n <div\n key={`${entry.field}-${index}`}\n className=\"grid gap-3 rounded-md border p-3 sm:grid-cols-[1fr_1fr_auto]\"\n >\n <ChoiceField\n label=\"Measure\"\n value={entry.field}\n placeholder=\"Pick a measure\"\n readOnly={readOnly}\n options={numbers.map((column) => ({\n value: column.key,\n label: column.label,\n }))}\n onPick={(value) => {\n write(\n updateSeries(widget, index, {\n ...entry,\n field: value,\n }),\n );\n }}\n />\n <TextField\n label=\"Legend name\"\n value={entry.name ?? \"\"}\n placeholder={entry.field}\n readOnly={readOnly}\n onCommit={(value) => {\n write(\n updateSeries(widget, index, {\n ...entry,\n name: value || null,\n }),\n );\n }}\n />\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"self-end\"\n disabled={readOnly}\n ariaLabel={`Remove series ${entry.field}`}\n onClick={() => {\n write(removeSeries(widget, index));\n }}\n >\n Remove\n </ui.Button>\n </div>\n ))}\n </div>\n )}\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={readOnly || numbers.length === 0}\n title={\n numbers.length === 0\n ? \"Pick a measure in step 4 first\"\n : \"\"\n }\n onClick={() => {\n const field =\n nextSeriesField(widget, numbers) ?? numbers[0]?.key;\n if (field) write(addSeries(widget, field));\n }}\n >\n Add a series\n </ui.Button>\n </div>\n </>\n )}\n </StepFrame>\n\n <StepFrame\n anchor={stepAnchor(6)}\n number={6}\n title=\"Set how it reads\"\n blurb=\"Units, rounding and the small print. Everything here is optional and changes nothing about the query.\"\n help=\"These write the display block of the YAML. Leaving a field empty means the renderer's own default.\"\n done\n >\n {pivot ? (\n <PivotDisplayFields\n pivot={widget.pivot}\n readOnly={readOnly}\n onChange={(next) => {\n write({ ...widget, pivot: next });\n }}\n />\n ) : (\n <AppearanceFields\n widget={widget}\n labels={labels}\n readOnly={readOnly}\n onChange={(appearance) => {\n write({ ...widget, appearance });\n }}\n />\n )}\n </StepFrame>\n\n <StepFrame\n anchor={stepAnchor(7)}\n number={7}\n title=\"Check it before saving\"\n blurb=\"Preview runs the saved model with the columns above, so the headers are exactly the keys the widget reads.\"\n help=\"Preview runs the real query with a row limit, with scoping applied exactly as it will be for a viewer. Mapped columns are highlighted in the result headers.\"\n done={issues.length === 0}\n >\n {issues.length > 0 ? (\n <ul className=\"space-y-1 rounded-md border border-destructive/40 p-3 text-xs text-destructive\">\n {issues.map((issue) => (\n <li key={issue}>{issue}</li>\n ))}\n </ul>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n Nothing here would render blank.\n </p>\n )}\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <ui.Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={previewing || !widget.datasetId || modelYaml === null}\n onClick={() => {\n void runPreview(widget);\n }}\n >\n {previewing ? \"Running...\" : \"Preview the data\"}\n </ui.Button>\n </div>\n\n {previewError !== null ? (\n <p className=\"text-xs text-destructive\">{previewError}</p>\n ) : null}\n\n {preview ? (\n <div className=\"space-y-2\">\n <div className=\"text-xs text-muted-foreground\">\n {`${preview.rowCount} rows`}\n {preview.effectiveLocations\n ? `, scoped to ${preview.effectiveLocations.length} locations`\n : \", unscoped for this caller\"}\n </div>\n <div className=\"max-h-56 overflow-auto rounded-md border\">\n <table className=\"w-full text-left text-xs\">\n <thead className=\"bg-muted\">\n <tr>\n {preview.columns.map((column) => (\n <th\n key={column}\n className={cn(\n \"px-2 py-1 font-medium\",\n isMapped(widget, column) ? \"text-primary\" : \"\",\n )}\n >\n {column}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {preview.rows.map((row, index) => (\n <tr key={index} className=\"border-t\">\n {preview.columns.map((column) => (\n <td key={column} className=\"px-2 py-1\">\n {String(row[column] ?? \"\")}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n ) : null}\n </StepFrame>\n </>\n )}\n\n <BuilderYamlStrip fragment={widgetFragment(specYaml)} />\n </div>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\n\nimport { useAuthoring } from \"./authoring-context.js\";\nimport type { WidgetDiagnosticsResponse } from \"./authoring-ports.js\";\n\nexport interface WidgetDiagnosticsProps {\n widgetId: string | null;\n filters?: Record<string, unknown> | undefined;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\n/**\n * What a widget actually asked the warehouse, in the author's own words.\n *\n * This is the answer to \"why is this card empty\": the SQL, the scope it was\n * narrowed to, the columns that came back, and which of them the mappings\n * found. The port returns rows and text, never a host record.\n */\nexport function WidgetDiagnostics({\n widgetId,\n filters,\n open,\n onOpenChange,\n}: WidgetDiagnosticsProps) {\n const { transport, ui, dashboardId } = useAuthoring();\n const [data, setData] = useState<WidgetDiagnosticsResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n /** Hosts pass a fresh filter object each render, so compare by value. */\n const filterKey = filters ? JSON.stringify(filters) : \"\";\n const asked = useMemo(\n () =>\n filterKey === \"\"\n ? null\n : (JSON.parse(filterKey) as Record<string, unknown>),\n [filterKey],\n );\n\n useEffect(() => {\n if (!open || !widgetId) {\n setData(null);\n setError(null);\n return;\n }\n const id = widgetId;\n let cancelled = false;\n const controller = new AbortController();\n async function load(): Promise<void> {\n setLoading(true);\n setError(null);\n try {\n const result = await transport.diagnoseWidget({\n dashboardId,\n widgetId: id,\n ...(asked ? { filters: asked } : {}),\n signal: controller.signal,\n });\n if (!cancelled) setData(result);\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Diagnostics failed\");\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n void load();\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [transport, dashboardId, open, widgetId, asked]);\n\n return (\n <ui.Modal\n open={open}\n size=\"lg\"\n title=\"Widget diagnostics\"\n description={\n widgetId ? `Audit queries for ${widgetId}` : \"Select a widget to audit\"\n }\n onOpenChange={onOpenChange}\n >\n <div className=\"space-y-6\">\n {loading ? (\n <p className=\"text-sm text-muted-foreground\">\n Running diagnostics...\n </p>\n ) : null}\n\n {error !== null ? (\n <div className=\"rounded border border-destructive/20 bg-destructive/10 p-3 text-sm text-destructive\">\n {error}\n </div>\n ) : null}\n\n {!loading && data ? (\n <>\n <div className=\"text-sm text-muted-foreground\">\n Component:{\" \"}\n <span className=\"font-medium text-foreground\">\n {data.component}\n </span>\n </div>\n\n {data.error !== undefined ? (\n <div className=\"space-y-1 rounded-lg border border-destructive/30 bg-destructive/10 p-4 text-destructive\">\n <div className=\"text-sm font-medium\">\n The query failed, so this widget has no data\n </div>\n <pre className=\"whitespace-pre-wrap break-all font-mono text-xs\">\n {data.error}\n </pre>\n </div>\n ) : null}\n\n {data.queries.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No data source query. This widget is static, a filter, or a no\n data component.\n </p>\n ) : (\n data.queries.map((query, index) => (\n <div key={index} className=\"space-y-2 rounded-lg border p-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm font-medium\">\n {query.kind.toUpperCase()}\n {query.note ? ` - ${query.note}` : \"\"}\n </div>\n {query.dataStoreId !== null ? (\n <div className=\"text-xs text-muted-foreground\">\n {`Data store: ${query.dataStoreId}`}\n </div>\n ) : null}\n </div>\n\n {query.filterField !== null ? (\n <div className=\"text-xs text-muted-foreground\">\n {`Filter field: ${query.filterField}`}\n </div>\n ) : null}\n\n {query.effectiveLocations !== null ? (\n <div className=\"text-xs text-muted-foreground\">\n {`Effective locations: ${\n query.effectiveLocations.length > 0\n ? query.effectiveLocations.join(\", \")\n : \"all / none\"\n }`}\n </div>\n ) : null}\n\n <div className=\"overflow-x-auto rounded bg-muted p-3\">\n <pre className=\"whitespace-pre-wrap break-all font-mono text-xs\">\n {query.sql}\n </pre>\n </div>\n\n {query.cache !== undefined ? (\n <div className=\"text-xs text-muted-foreground\">\n {`Dataset cache: ${query.cache}`}\n {query.cacheTtlSeconds !== undefined\n ? ` (ttl ${query.cacheTtlSeconds}s)`\n : \"\"}\n </div>\n ) : null}\n\n {query.rowCount !== undefined ? (\n <div className=\"text-xs text-muted-foreground\">\n {`Returned ${query.rowCount} row${\n query.rowCount === 1 ? \"\" : \"s\"\n }`}\n {query.returnedColumns && query.returnedColumns.length > 0\n ? `: ${query.returnedColumns.join(\", \")}`\n : \"\"}\n </div>\n ) : null}\n\n {Object.keys(query.params).length > 0 ? (\n <div className=\"text-xs\">\n <span className=\"font-medium\">Params:</span>{\" \"}\n <pre className=\"inline whitespace-pre-wrap break-all font-mono\">\n {JSON.stringify(query.params, null, 2)}\n </pre>\n </div>\n ) : null}\n </div>\n ))\n )}\n\n {data.notes && data.notes.length > 0 ? (\n <div className=\"space-y-2 rounded-lg border p-4\">\n <div className=\"text-sm font-medium\">WORTH KNOWING</div>\n {data.notes.map((note) => (\n <div key={note} className=\"text-xs text-muted-foreground\">\n {note}\n </div>\n ))}\n </div>\n ) : null}\n\n {data.mapping ? (\n <div className=\"space-y-2 rounded-lg border p-4\">\n <div className=\"text-sm font-medium\">WIDGET DATA</div>\n <div className=\"text-xs text-muted-foreground\">\n {`${data.mapping.rowCount} row${\n data.mapping.rowCount === 1 ? \"\" : \"s\"\n } reached the widget`}\n {data.mapping.availableColumns.length > 0\n ? `: ${data.mapping.availableColumns.join(\", \")}`\n : \"\"}\n </div>\n {Object.entries(data.mapping.mappedFields).map(\n ([role, field]) => (\n <div key={role} className=\"text-xs text-muted-foreground\">\n {`${role}: ${field}`}\n </div>\n ),\n )}\n {data.mapping.issues.map((issue) => (\n <div\n key={issue}\n className=\"rounded border border-destructive/20 bg-destructive/10 p-2 text-xs text-destructive\"\n >\n {issue}\n </div>\n ))}\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n </ui.Modal>\n );\n}\n","import { useState } from \"react\";\n\nimport {\n FILTER_CONTROLS,\n TEMPLATE_COMPONENTS,\n templateComponentLabel,\n widgetTemplate,\n type FilterControlType,\n type TemplateComponent,\n} from \"@dlh.io/bideux-dashboard-core\";\nimport type { WidgetSpec } from \"@dlh.io/bideux-dashboard-renderers\";\n\nimport { useAuthoring } from \"./authoring-context.js\";\nimport { ChoiceField, TextField } from \"./builder-fields.js\";\n\nconst FILTER_LABELS: Record<FilterControlType, string> = {\n select: \"Select\",\n date: \"Date\",\n date_range: \"Date range\",\n custom: \"Custom\",\n};\n\nexport interface WidgetInventoryProps {\n widgets: Record<string, WidgetSpec>;\n unplacedWidgetIds: string[];\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onEdit: (widgetId: string) => void;\n onAdd: (widgetId: string) => void;\n onRemove: (widgetId: string) => void;\n onDelete: (widgetId: string) => Promise<void>;\n onCreated: (widgetId: string) => void | Promise<void>;\n /** Opens the assistant, which writes the whole widget instead of a blank one. */\n onCreateWithAssistant?: (() => void) | undefined;\n onEditWithAssistant?: ((widgetId: string) => void) | undefined;\n}\n\n/**\n * Everything belonging to one dashboard, placed or not.\n *\n * A widget exists whether or not the layout references it, which is what lets\n * an author park a half-built card without it appearing on the grid. Blank\n * widgets are written from the core templates, so a new widget always parses.\n */\nexport function WidgetInventory({\n widgets,\n unplacedWidgetIds,\n open,\n onOpenChange,\n onEdit,\n onAdd,\n onRemove,\n onDelete,\n onCreated,\n onCreateWithAssistant,\n onEditWithAssistant,\n}: WidgetInventoryProps) {\n const { transport, ui, dashboardId, canEdit, onNotice } = useAuthoring();\n const [newType, setNewType] = useState<TemplateComponent>(\"kpi\");\n const [filterSubtype, setFilterSubtype] =\n useState<FilterControlType>(\"select\");\n const [newName, setNewName] = useState(\"\");\n const [creating, setCreating] = useState(false);\n\n const unplaced = new Set(unplacedWidgetIds);\n const list = Object.values(widgets).sort((a, b) =>\n a.metadata.name.localeCompare(b.metadata.name),\n );\n\n async function create(): Promise<void> {\n setCreating(true);\n try {\n const specYaml = widgetTemplate(newType, {\n ...(newName ? { name: newName } : {}),\n ...(newType === \"filter\" ? { filterControl: filterSubtype } : {}),\n });\n const created = await transport.createWidget({ dashboardId, specYaml });\n setNewName(\"\");\n await onCreated(created.widgetId);\n } catch (error) {\n onNotice({\n tone: \"error\",\n message: \"Could not add the widget\",\n ...(error instanceof Error ? { detail: error.message } : {}),\n });\n } finally {\n setCreating(false);\n }\n }\n\n return (\n <ui.Modal\n open={open}\n size=\"lg\"\n title=\"Widgets\"\n description=\"Everything belonging to this dashboard. Add one, place it on the grid, or edit one without placing it.\"\n onOpenChange={onOpenChange}\n >\n <div className=\"flex min-w-0 flex-col gap-4\">\n {onCreateWithAssistant ? (\n <div className=\"space-y-2 rounded-lg border border-primary/40 bg-primary/5 p-3\">\n <div className=\"text-sm font-medium\">Describe a widget</div>\n <p className=\"text-xs text-muted-foreground\">\n Say what you want to see and read the numbers it returns before it\n is added.\n </p>\n <ui.Button\n size=\"sm\"\n variant=\"primary\"\n disabled={!canEdit}\n onClick={onCreateWithAssistant}\n >\n Describe a widget\n </ui.Button>\n </div>\n ) : null}\n\n <div className=\"space-y-2 rounded-lg border p-3\">\n <div className=\"text-sm font-medium\">Start from a blank widget</div>\n <ChoiceField\n label=\"Type\"\n value={newType}\n placeholder=\"KPI\"\n readOnly={!canEdit}\n options={TEMPLATE_COMPONENTS.map((component) => ({\n value: component,\n label: templateComponentLabel(component),\n }))}\n onPick={(value) => {\n if ((TEMPLATE_COMPONENTS as readonly string[]).includes(value)) {\n setNewType(value as TemplateComponent);\n }\n }}\n />\n {newType === \"filter\" ? (\n <ChoiceField\n label=\"Control\"\n value={filterSubtype}\n placeholder=\"Select\"\n readOnly={!canEdit}\n options={FILTER_CONTROLS.map((control) => ({\n value: control,\n label: FILTER_LABELS[control],\n }))}\n onPick={(value) => {\n if ((FILTER_CONTROLS as readonly string[]).includes(value)) {\n setFilterSubtype(value as FilterControlType);\n }\n }}\n />\n ) : null}\n <TextField\n label=\"Name (optional)\"\n value={newName}\n placeholder=\"Sales and labor\"\n readOnly={!canEdit}\n onCommit={setNewName}\n />\n <ui.Button\n size=\"sm\"\n variant=\"primary\"\n disabled={creating || !canEdit}\n onClick={() => {\n void create();\n }}\n >\n {creating ? \"Adding...\" : \"Add\"}\n </ui.Button>\n </div>\n\n <div className=\"grid gap-3\">\n {list.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No widgets yet. A blank one is the quickest way to start.\n </p>\n ) : null}\n {list.map((widget) => {\n const isUnplaced = unplaced.has(widget.metadata.id);\n return (\n <div\n key={widget.metadata.id}\n className=\"flex items-center justify-between gap-3 rounded-lg border p-3\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium\">\n {widget.metadata.name}\n </div>\n <div className=\"mt-0.5 flex items-center gap-2 text-xs text-muted-foreground\">\n <span>{widget.spec.component}</span>\n <ui.Badge tone={isUnplaced ? \"neutral\" : \"info\"}>\n {isUnplaced ? \"Not in use\" : \"On grid\"}\n </ui.Badge>\n </div>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center justify-end gap-1\">\n {onEditWithAssistant ? (\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n ariaLabel={`Edit ${widget.metadata.name} with the assistant`}\n disabled={!canEdit}\n onClick={() => {\n onEditWithAssistant(widget.metadata.id);\n }}\n >\n Ask\n </ui.Button>\n ) : null}\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n ariaLabel={`Edit ${widget.metadata.name}`}\n onClick={() => {\n onEdit(widget.metadata.id);\n }}\n >\n Edit\n </ui.Button>\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={!canEdit}\n ariaLabel={\n isUnplaced\n ? `Add ${widget.metadata.name} to the grid`\n : `Remove ${widget.metadata.name} from the grid`\n }\n onClick={() => {\n if (isUnplaced) onAdd(widget.metadata.id);\n else onRemove(widget.metadata.id);\n }}\n >\n {isUnplaced ? \"Add to grid\" : \"Remove from grid\"}\n </ui.Button>\n <ui.Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={!canEdit}\n ariaLabel={`Delete ${widget.metadata.name}`}\n onClick={() => {\n void onDelete(widget.metadata.id);\n }}\n >\n Delete\n </ui.Button>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </ui.Modal>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n readModelOutline,\n readWidgetOutline,\n widgetIssues,\n widgetMarkers,\n type SemanticSummary,\n} from \"@dlh.io/bideux-dashboard-core\";\n\nimport { useAuthoring } from \"./authoring-context.js\";\nimport { cn } from \"./cn.js\";\nimport { WidgetBuilder } from \"./widget-builder.js\";\nimport { WidgetAskPanel } from \"./widget-ask-panel.js\";\n\nexport type WidgetEditorMode = \"ask\" | \"builder\" | \"yaml\";\n\nexport interface WidgetYamlEditorProps {\n widgetId: string | null;\n open: boolean;\n /** Which tab to land on. The host owns remembering a preference. */\n initialMode?: WidgetEditorMode;\n onOpenChange: (open: boolean) => void;\n onSaved: () => void | Promise<void>;\n onAddToLayout?: (widgetId: string) => void;\n}\n\n/**\n * One widget, edited three ways over the same text.\n *\n * Builder and YAML are two views of one document, so switching keeps comments\n * and every key the builder has no form for. Ask appears only when the host\n * wired a proposal port, because an assistant is a host capability rather than\n * something this package can assume.\n */\nexport function WidgetYamlEditor({\n widgetId,\n open,\n initialMode,\n onOpenChange,\n onSaved,\n onAddToLayout,\n}: WidgetYamlEditorProps) {\n const {\n transport,\n ui,\n editor: Editor,\n dashboardId,\n canEdit,\n } = useAuthoring();\n const canAsk = typeof transport.proposeDocument === \"function\";\n const [value, setValue] = useState(\"\");\n const [mode, setMode] = useState<WidgetEditorMode>(initialMode ?? \"builder\");\n const [loading, setLoading] = useState(false);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [modelYaml, setModelYaml] = useState<string | null>(null);\n const [saveAnyway, setSaveAnyway] = useState(false);\n /** The text as the server holds it, which is what an assistant reads. */\n const [saved, setSaved] = useState(\"\");\n /** The proposal whose text is in the editor, so a save can report it was kept. */\n const [appliedProposal, setAppliedProposal] = useState<string | null>(null);\n\n // Host callbacks are commonly fresh arrows on every render, and the loads\n // below must not run again because a parent re-rendered.\n const onSavedRef = useRef(onSaved);\n const onAddToLayoutRef = useRef(onAddToLayout);\n const onOpenChangeRef = useRef(onOpenChange);\n useEffect(() => {\n onSavedRef.current = onSaved;\n onAddToLayoutRef.current = onAddToLayout;\n onOpenChangeRef.current = onOpenChange;\n }, [onSaved, onAddToLayout, onOpenChange]);\n\n useEffect(() => {\n if (!open) return;\n setMode(initialMode ?? \"builder\");\n }, [open, initialMode, widgetId]);\n\n useEffect(() => {\n if (!widgetId || !open) return;\n const id = widgetId;\n let cancelled = false;\n const controller = new AbortController();\n async function load(): Promise<void> {\n setLoading(true);\n setError(null);\n try {\n const document = await transport.loadWidgetDocument({\n dashboardId,\n widgetId: id,\n signal: controller.signal,\n });\n if (!cancelled) {\n setValue(document.specYaml);\n setSaved(document.specYaml);\n }\n } catch (err) {\n if (!cancelled) {\n setError(\n err instanceof Error ? err.message : \"Failed to load widget YAML\",\n );\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n void load();\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [transport, dashboardId, widgetId, open]);\n\n useEffect(() => {\n if (!open) return;\n let cancelled = false;\n const controller = new AbortController();\n async function loadModel(): Promise<void> {\n try {\n const model = await transport.loadModel({ signal: controller.signal });\n if (!cancelled) setModelYaml(model.specYaml);\n } catch {\n // The builder reports the failure. Here it only means the save time\n // checks stay quiet rather than blocking on a model nobody could read.\n if (!cancelled) setModelYaml(null);\n }\n }\n void loadModel();\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [transport, open]);\n\n const model: SemanticSummary | null = useMemo(() => {\n if (modelYaml === null) return null;\n const parsed = readModelOutline(modelYaml);\n return {\n datasets: parsed.datasets,\n relationships: parsed.relationships,\n modelMetrics: parsed.modelMetrics,\n };\n }, [modelYaml]);\n\n /**\n * What would render blank, checked against the text as it stands.\n *\n * Reading the YAML rather than the builder's state is what lets the same\n * warning appear in both tabs, so a widget hand-edited in YAML cannot be\n * saved broken just because the builder was not the one that wrote it.\n */\n const issues = useMemo(() => {\n if (!value || !model) return [];\n const outline = readWidgetOutline(value);\n if (outline.error) {\n return [`This YAML does not parse: ${outline.error.message}`];\n }\n if (!outline.widget) return [];\n return widgetIssues(outline.widget, model);\n }, [value, model]);\n\n /** The same findings, underlined on the line that causes each one. */\n const markers = useMemo(\n () => (value && model ? widgetMarkers(value, model) : []),\n [value, model],\n );\n\n function handleOpenChange(openValue: boolean): void {\n if (!openValue) {\n setValue(\"\");\n setSaved(\"\");\n setSaveAnyway(false);\n setAppliedProposal(null);\n }\n onOpenChangeRef.current(openValue);\n }\n\n /**\n * True when the widget would not render and the author has not insisted yet.\n * The first click reports why, a second click saves regardless, so a\n * half-built widget can still be parked without losing the work.\n */\n function blockedByIssues(): boolean {\n if (issues.length === 0 || saveAnyway) return false;\n setSaveAnyway(true);\n return true;\n }\n\n async function persist(addToLayout: boolean): Promise<void> {\n if (!widgetId) return;\n if (blockedByIssues()) return;\n setSaving(true);\n setError(null);\n try {\n await transport.saveWidget({ dashboardId, widgetId, specYaml: value });\n if (appliedProposal && transport.recordProposalOutcome) {\n // A proposal somebody corrected before saving is the most useful record\n // there is, since the correction is what should be learned from.\n void transport.recordProposalOutcome({\n proposalId: appliedProposal,\n applied: true,\n });\n }\n await onSavedRef.current();\n if (addToLayout) onAddToLayoutRef.current?.(widgetId);\n handleOpenChange(false);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to save widget YAML\",\n );\n } finally {\n setSaving(false);\n }\n }\n\n const modes: [WidgetEditorMode, string][] = [\n ...(canAsk ? ([[\"ask\", \"Ask\"]] as [WidgetEditorMode, string][]) : []),\n [\"builder\", \"Builder\"],\n [\"yaml\", \"YAML\"],\n ];\n\n return (\n <ui.Modal\n open={open}\n size=\"xl\"\n title=\"Widget\"\n description=\"Builder and YAML edit the same text, so switching keeps your comments and anything the builder does not show. Nothing reaches the dashboard until you save.\"\n onOpenChange={handleOpenChange}\n footer={\n <div className=\"flex items-center justify-end gap-3\">\n <ui.Button\n variant=\"secondary\"\n disabled={saving}\n onClick={() => {\n handleOpenChange(false);\n }}\n >\n Cancel\n </ui.Button>\n {onAddToLayout ? (\n <ui.Button\n variant=\"secondary\"\n disabled={saving || loading || !widgetId || !canEdit}\n onClick={() => {\n void persist(true);\n }}\n >\n Save and add to layout\n </ui.Button>\n ) : null}\n <ui.Button\n variant=\"primary\"\n disabled={saving || loading || !widgetId || !canEdit}\n onClick={() => {\n void persist(false);\n }}\n >\n Save\n </ui.Button>\n </div>\n }\n >\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"flex items-center gap-2 pb-3\">\n <div className=\"flex rounded-md border p-0.5\">\n {modes.map(([id, label]) => (\n <button\n key={id}\n type=\"button\"\n aria-pressed={mode === id}\n onClick={() => {\n setMode(id);\n }}\n className={cn(\n \"rounded px-3 py-1 text-xs\",\n mode === id\n ? \"bg-muted font-medium\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {loading ? (\n <p className=\"p-6 text-sm text-muted-foreground\">\n Loading widget YAML...\n </p>\n ) : mode === \"ask\" ? (\n <WidgetAskPanel\n widgetId={widgetId}\n specYaml={value}\n unsaved={value !== saved}\n onApply={(proposed, proposalId) => {\n setValue(proposed);\n setAppliedProposal(proposalId);\n setSaveAnyway(false);\n setMode(\"builder\");\n }}\n onBuildByHand={() => {\n setMode(\"builder\");\n }}\n />\n ) : mode === \"builder\" ? (\n <WidgetBuilder\n specYaml={value}\n readOnly={!canEdit}\n onChange={(next) => {\n setValue(next);\n setSaveAnyway(false);\n }}\n onEditInYaml={() => {\n setMode(\"yaml\");\n }}\n />\n ) : (\n <Editor\n value={value}\n language=\"yaml\"\n readOnly={!canEdit}\n markers={markers}\n ariaLabel=\"Widget YAML\"\n onChange={(next) => {\n setValue(next);\n setSaveAnyway(false);\n }}\n />\n )}\n </div>\n\n {error !== null ? (\n <div className=\"border-t bg-red-50 px-6 py-3 text-sm text-red-700\">\n {error}\n </div>\n ) : null}\n\n {issues.length > 0 ? (\n <div className=\"border-t bg-amber-50 px-6 py-3 text-sm text-amber-900\">\n <div className=\"font-medium\">\n {saveAnyway\n ? \"This widget will render empty. Click Save again to save it anyway.\"\n : \"This widget will render empty:\"}\n </div>\n <ul className=\"mt-1 list-disc space-y-0.5 pl-6 text-xs\">\n {issues.map((issue) => (\n <li key={issue}>{issue}</li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n </ui.Modal>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nexport interface Resource<T> {\n readonly data: T | null;\n readonly error: string | null;\n readonly loading: boolean;\n readonly reload: () => void;\n}\n\n/**\n * Loads once per dependency change and offers a reload. The load in flight is\n * abandoned when the dependencies move on, so a stale answer never lands.\n */\nexport function useResource<T>(\n loader: (signal: AbortSignal) => Promise<T>,\n deps: readonly unknown[],\n): Resource<T> {\n const [data, setData] = useState<T | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [tick, setTick] = useState(0);\n\n useEffect(() => {\n const controller = new AbortController();\n setLoading(true);\n loader(controller.signal)\n .then((value) => {\n if (controller.signal.aborted) return;\n setData(value);\n setError(null);\n })\n .catch((failure: unknown) => {\n if (controller.signal.aborted) return;\n setError(failure instanceof Error ? failure.message : String(failure));\n })\n .finally(() => {\n if (!controller.signal.aborted) setLoading(false);\n });\n return () => controller.abort();\n }, [...deps, tick]);\n\n const reload = useCallback(() => setTick((value) => value + 1), []);\n return { data, error, loading, reload };\n}\n","/**\n * Small pieces the list page and the workspace share: the notice list, the export menu and the share dialog. All draw through the\n * `ui` and `icons` ports and talk to the host through\n * `DashboardManagementTransport`, so a host that wants a different share\n * dialog passes its own and keeps the rest.\n */\nimport { useState } from \"react\";\n\nimport { cn } from \"./cn.js\";\nimport { useIcons, useUiKit } from \"./context.js\";\nimport type {\n DashboardDetail,\n DashboardManagementTransport,\n Principal,\n} from \"./management-ports.js\";\nimport type { Notice, NoticeSink } from \"./ports.js\";\nimport { useResource } from \"./use-resource.js\";\n\nconst NOTICE_TONE: Record<Notice[\"tone\"], string> = {\n info: \"border-secondary/40 bg-secondary/10 text-foreground\",\n success: \"border-primary/40 bg-primary/10 text-foreground\",\n warning: \"border-amber-300 bg-amber-50 text-amber-900\",\n error: \"border-destructive/40 bg-destructive/10 text-destructive\",\n};\n\nexport function NoticeList({ notices }: { notices: readonly Notice[] }) {\n if (notices.length === 0) return null;\n return (\n <ul aria-label=\"Notices\" className=\"space-y-1\">\n {notices.map((notice, index) => (\n <li\n className={cn(\n \"rounded-md border px-3 py-2 text-sm\",\n NOTICE_TONE[notice.tone],\n )}\n key={`${notice.message}-${String(index)}`}\n >\n {notice.message}\n {notice.detail === undefined ? null : (\n <span className=\"ml-2 text-xs opacity-80\">{notice.detail}</span>\n )}\n </li>\n ))}\n </ul>\n );\n}\n\n/** Hands a downloaded report to the browser's download folder. */\nexport function saveBlob(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = filename;\n anchor.rel = \"noopener\";\n document.body.append(anchor);\n anchor.click();\n anchor.remove();\n URL.revokeObjectURL(url);\n}\n\nexport interface ExportMenuProps {\n dashboardId: string;\n transport: Pick<\n DashboardManagementTransport,\n \"listReportFormats\" | \"downloadReport\"\n >;\n /** The filters currently applied to the reader, sent with the report run. */\n filters?: Record<string, unknown> | undefined;\n onNotice: NoticeSink;\n}\n\n/** Download as ... with the formats the host's report port offers. */\nexport function ExportMenu({\n dashboardId,\n transport,\n filters,\n onNotice,\n}: ExportMenuProps) {\n const ui = useUiKit();\n const icons = useIcons();\n const list = transport.listReportFormats;\n const download = transport.downloadReport;\n const formats = useResource(\n (signal) => (list === undefined ? Promise.resolve([]) : list({ signal })),\n [list],\n );\n const [busy, setBusy] = useState(false);\n if (list === undefined || download === undefined) return null;\n const Download = icons.download;\n\n const run = async (format: string) => {\n setBusy(true);\n try {\n const result = await download({\n dashboardId,\n format,\n filters: filters ?? {},\n });\n saveBlob(result.blob, result.filename);\n onNotice({\n tone: \"success\",\n message: `Downloaded ${result.filename}`,\n detail: `${String(result.blob.size)} bytes`,\n });\n } catch (failure) {\n onNotice({\n tone: \"error\",\n message: \"The export failed\",\n ...(failure instanceof Error ? { detail: failure.message } : {}),\n });\n } finally {\n setBusy(false);\n }\n };\n\n const items = (formats.data ?? []).map((format) => ({\n id: format.format,\n label: format.label,\n onSelect: () => void run(format.format),\n }));\n if (formats.error !== null) {\n items.push({\n id: \"error\",\n label: formats.error,\n onSelect: () => undefined,\n });\n }\n return (\n <ui.Menu\n ariaLabel=\"Export\"\n items={items}\n trigger={\n <ui.Button disabled={busy} size=\"sm\" variant=\"secondary\">\n <Download />\n Export\n </ui.Button>\n }\n />\n );\n}\n\nexport interface ShareDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n dashboard: DashboardDetail;\n transport: Pick<\n DashboardManagementTransport,\n \"replaceShares\" | \"revokeShare\" | \"setVisibility\" | \"searchPrincipals\"\n >;\n onChanged: (detail: DashboardDetail) => void;\n}\n\nconst VISIBILITY_OPTIONS: readonly { value: string; label: string }[] = [\n { value: \"personal\", label: \"Personal\" },\n { value: \"shared\", label: \"Shared\" },\n { value: \"org\", label: \"Organisation\" },\n];\n\n/**\n * Visibility, the people with access and an add row. With\n * `searchPrincipals` the add row is a search box over the host's directory;\n * without it the caller types a principal identifier the host understands.\n */\nexport function ShareDialog({\n open,\n onOpenChange,\n dashboard,\n transport,\n onChanged,\n}: ShareDialogProps) {\n const ui = useUiKit();\n const icons = useIcons();\n const [query, setQuery] = useState(\"\");\n const [picked, setPicked] = useState<Principal | null>(null);\n const [permission, setPermission] = useState(\"view\");\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const search = transport.searchPrincipals;\n const candidates = useResource(\n (signal) =>\n search === undefined || query.trim() === \"\"\n ? Promise.resolve<Principal[]>([])\n : search({ query: query.trim(), signal }),\n [search, query],\n );\n const Trash = icons.trash;\n\n const run = async (action: () => Promise<DashboardDetail>) => {\n setBusy(true);\n setError(null);\n try {\n onChanged(await action());\n } catch (failure) {\n setError(failure instanceof Error ? failure.message : String(failure));\n } finally {\n setBusy(false);\n }\n };\n\n const principalId =\n picked?.principalId ?? (search === undefined ? query.trim() : \"\");\n const taken = new Set([\n ...dashboard.shares.map((share) => share.principalId),\n ]);\n const suggestions = (candidates.data ?? []).filter(\n (candidate) => !taken.has(candidate.principalId),\n );\n const visibilityOptions = VISIBILITY_OPTIONS.filter(\n (option) => option.value !== \"org\" || dashboard.canPublish,\n );\n if (\n !visibilityOptions.some((option) => option.value === dashboard.visibility)\n ) {\n visibilityOptions.push({\n value: dashboard.visibility,\n label: dashboard.visibility,\n });\n }\n\n return (\n <ui.Modal\n description=\"Choose who may see this dashboard and who may change it.\"\n onOpenChange={onOpenChange}\n open={open}\n title={`Share ${dashboard.name}`}\n >\n <div className=\"space-y-4\" data-bideux=\"share-dialog\">\n <div className=\"space-y-1.5\">\n <span className=\"text-sm font-medium\">Visibility</span>\n <ui.Select\n ariaLabel=\"Visibility\"\n disabled={busy || transport.setVisibility === undefined}\n onChange={(value) => {\n const set = transport.setVisibility;\n if (set === undefined) return;\n void run(() =>\n set({ dashboardId: dashboard.dashboardId, visibility: value }),\n );\n }}\n options={visibilityOptions}\n value={dashboard.visibility}\n />\n {dashboard.canPublish ? null : (\n <p className=\"text-xs text-muted-foreground\">\n Only an owner or administrator may publish to the organisation.\n </p>\n )}\n </div>\n\n <div className=\"space-y-2 border-t pt-4\">\n <span className=\"text-sm font-medium\">People with access</span>\n {dashboard.shares.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n Nobody besides the owner.\n </p>\n ) : (\n <ul className=\"divide-y divide-border rounded-md border border-border\">\n {dashboard.shares.map((share) => (\n <li\n className=\"flex items-center justify-between px-3 py-2 text-sm\"\n key={share.principalId}\n >\n <span>\n {share.displayName ?? share.principalId}\n <span className=\"ml-2 text-xs text-muted-foreground\">\n {share.permission}\n </span>\n </span>\n {transport.revokeShare === undefined ? null : (\n <ui.Button\n ariaLabel={`Revoke ${share.displayName ?? share.principalId}`}\n disabled={busy}\n onClick={() => {\n const revoke = transport.revokeShare;\n if (revoke === undefined) return;\n void run(() =>\n revoke({\n dashboardId: dashboard.dashboardId,\n principalId: share.principalId,\n }),\n );\n }}\n size=\"sm\"\n variant=\"ghost\"\n >\n <Trash />\n </ui.Button>\n )}\n </li>\n ))}\n </ul>\n )}\n </div>\n\n {transport.replaceShares === undefined ? null : (\n <div className=\"space-y-2\">\n <div className=\"flex items-end gap-2\">\n <div className=\"flex-1 space-y-1.5\">\n <span className=\"text-sm font-medium\">\n {search === undefined ? \"Add by identifier\" : \"Add a person\"}\n </span>\n <ui.TextInput\n ariaLabel={\n search === undefined\n ? \"Principal identifier\"\n : \"Search people\"\n }\n onChange={(value) => {\n setQuery(value);\n setPicked(null);\n }}\n placeholder={\n search === undefined\n ? \"user or role identifier\"\n : \"Type a name\"\n }\n value={picked === null ? query : picked.displayName}\n />\n </div>\n <div className=\"w-28 space-y-1.5\">\n <span className=\"text-sm font-medium\">Access</span>\n <ui.Select\n ariaLabel=\"Access\"\n onChange={setPermission}\n options={[\n { value: \"view\", label: \"View\" },\n { value: \"edit\", label: \"Edit\" },\n ]}\n value={permission}\n />\n </div>\n <ui.Button\n disabled={busy || principalId === \"\"}\n onClick={() => {\n const replace = transport.replaceShares;\n if (replace === undefined) return;\n const grants = [\n ...dashboard.shares.map((share) => ({\n principalId: share.principalId,\n permission: share.permission,\n })),\n { principalId, permission },\n ];\n void run(() =>\n replace({ dashboardId: dashboard.dashboardId, grants }),\n );\n setQuery(\"\");\n setPicked(null);\n }}\n variant=\"primary\"\n >\n Add\n </ui.Button>\n </div>\n {search !== undefined &&\n picked === null &&\n suggestions.length > 0 ? (\n <ul\n aria-label=\"Matching people\"\n className=\"max-h-40 overflow-y-auto rounded-md border border-border text-sm\"\n >\n {suggestions.map((candidate) => (\n <li key={candidate.principalId}>\n <button\n className=\"flex w-full items-center justify-between px-3 py-1.5 text-left hover:bg-muted\"\n onClick={() => setPicked(candidate)}\n type=\"button\"\n >\n <span>{candidate.displayName}</span>\n {candidate.detail === undefined ? null : (\n <span className=\"text-xs text-muted-foreground\">\n {candidate.detail}\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n )}\n {error === null ? null : (\n <p className=\"text-sm text-destructive\">{error}</p>\n )}\n </div>\n </ui.Modal>\n );\n}\n","/**\n * The whole dashboard page as one component: header with inline rename,\n * toolbar (share, copy, edit mode, placement, grid, YAML, save and reset\n * layout, AI, widgets, semantic model, preview, export, refresh), the\n * editable reader, the widget inventory and editors, the share dialog and the\n * unsaved changes dialogs. The same flow the origin application's custom dashboard page\n * runs, so a host that mounts this gets that page.\n *\n * Every dependency still arrives through a port: the reader transport, the\n * authoring transport, the management transport, and optional `ui`, `icons`,\n * `renderers` and `links`. A host that wants a different toolbar composes the\n * pieces itself exactly as before; nothing here is the only way in.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport type { Breakpoint } from \"@dlh.io/bideux-dashboard-core\";\n\nimport { DashboardAuthoringProvider } from \"./authoring-context.js\";\nimport type {\n AuthoringTransport,\n CodeEditor,\n WidgetInventoryResponse,\n} from \"./authoring-ports.js\";\nimport { cn } from \"./cn.js\";\nimport { DashboardReaderProvider, useIcons, useUiKit } from \"./context.js\";\nimport { ExportMenu, NoticeList, ShareDialog } from \"./dashboard-chrome.js\";\nimport { DashboardYamlEditor } from \"./dashboard-yaml-editor.js\";\nimport { GridSettingsPanel } from \"./grid-settings-panel.js\";\nimport { InlineText } from \"./inline-edit.js\";\nimport { LayoutDraftDialogs } from \"./layout-dialogs.js\";\nimport type { DashboardManagementTransport } from \"./management-ports.js\";\nimport { ModelEditor } from \"./model-editor.js\";\nimport type {\n AssetResolver,\n DashboardTransport,\n HostLinks,\n IconSet,\n Notice,\n NoticeSink,\n RendererFactories,\n UiKit,\n} from \"./ports.js\";\nimport { DashboardReaderLoader } from \"./reader-loader.js\";\nimport type { LoadedDashboard } from \"./reader-loader.js\";\nimport { useLayoutDraft } from \"./use-layout-draft.js\";\nimport type { LayoutDraftDocuments } from \"./use-layout-draft.js\";\nimport { useResource } from \"./use-resource.js\";\nimport { WidgetDiagnostics } from \"./widget-diagnostics.js\";\nimport { WidgetInventory } from \"./widget-inventory.js\";\nimport { VisibilityBadge } from \"./widget-states.js\";\nimport { WidgetYamlEditor } from \"./widget-yaml-editor.js\";\nimport type { WidgetEditorMode } from \"./widget-yaml-editor.js\";\n\nconst EMPTY_INVENTORY: WidgetInventoryResponse = {\n widgets: {},\n unplacedWidgetIds: [],\n};\n\n/** The preview widths the origin application offers, so a layout checked here matches there. */\nconst VIEWPORTS: readonly { label: string; width: number }[] = [\n { label: \"Mobile\", width: 480 },\n { label: \"Tablet\", width: 768 },\n { label: \"Desktop\", width: 1024 },\n { label: \"Wide\", width: 1440 },\n];\n\nconst BREAKPOINT_FOR_KEY: Record<string, Breakpoint> = {\n lg: \"wide\",\n md: \"desktop\",\n sm: \"tablet\",\n xs: \"mobile\",\n xxs: \"mobile\",\n};\n\nexport type AssistantIntent = \"create\" | \"edit\";\n\n/** Maps a host visibility onto the badge's vocabulary; unknown values read as shared. */\nfunction badgeVisibility(\n visibility: string,\n): \"private\" | \"shared\" | \"public\" | \"organisation\" {\n switch (visibility) {\n case \"personal\":\n case \"private\":\n return \"private\";\n case \"public\":\n return \"public\";\n case \"org\":\n case \"organisation\":\n return \"organisation\";\n default:\n return \"shared\";\n }\n}\n\nexport interface DashboardWorkspaceProps {\n dashboardId: string;\n /** The reader's data client. */\n transport: DashboardTransport;\n /** Without it the page is read only: no edit mode, editors or inventory. */\n authoringTransport?: AuthoringTransport | undefined;\n /** Detail, sharing and exports. */\n management: DashboardManagementTransport;\n ui?: Partial<UiKit> | undefined;\n icons?: Partial<IconSet> | undefined;\n renderers?: RendererFactories | undefined;\n links?: HostLinks | undefined;\n assets?: AssetResolver | undefined;\n editor?: CodeEditor | undefined;\n /** Shows the Semantic model button in edit mode. */\n canEditModel?: boolean | undefined;\n /** Opens in edit mode when the caller may write, for a freshly created dashboard. */\n startInEditMode?: boolean | undefined;\n filters?: Record<string, unknown> | undefined;\n onFiltersChange?: ((filters: Record<string, unknown>) => void) | undefined;\n /** Where unsaved drafts survive a reload; defaults to localStorage, null keeps them in memory. */\n storage?:\n | Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\">\n | null\n | undefined;\n /** The Dashboards button; hidden when the host gives no way back. */\n onBack?: (() => void) | undefined;\n /** Runs after Make a copy with the new identifier. */\n onOpenDashboard?: ((dashboardId: string) => void) | undefined;\n /** Create with AI and Edit with AI; hidden when the host has no assistant. */\n onAssistant?:\n | ((intent: AssistantIntent, dashboardId: string) => void)\n | undefined;\n /** Notices also reach the host, for its own toasts or logs. */\n onNotice?: NoticeSink | undefined;\n /** Host buttons placed at the end of the toolbar, a Schedule button for example. */\n toolbarExtra?: ReactNode;\n className?: string | undefined;\n}\n\nfunction useMeasuredWidth(): [(node: HTMLDivElement | null) => void, number] {\n const [width, setWidth] = useState(1280);\n const observer = useRef<ResizeObserver | null>(null);\n const attach = useCallback((node: HTMLDivElement | null) => {\n observer.current?.disconnect();\n observer.current = null;\n if (node === null) return;\n const measure = (value: number) =>\n setWidth(Math.max(320, Math.floor(value)));\n measure(node.getBoundingClientRect().width);\n const watcher = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry !== undefined) measure(entry.contentRect.width);\n });\n watcher.observe(node);\n observer.current = watcher;\n }, []);\n return [attach, width];\n}\n\nexport function DashboardWorkspace(props: DashboardWorkspaceProps) {\n const { transport, ui, icons, renderers, links, assets, onNotice } = props;\n const [notices, setNotices] = useState<readonly Notice[]>([]);\n const pushNotice = useCallback<NoticeSink>(\n (notice) => {\n setNotices((current) => [notice, ...current].slice(0, 5));\n onNotice?.(notice);\n },\n [onNotice],\n );\n return (\n <DashboardReaderProvider\n onNotice={pushNotice}\n transport={transport}\n {...(assets === undefined ? {} : { assets })}\n {...(icons === undefined ? {} : { icons })}\n {...(links === undefined ? {} : { links })}\n {...(renderers === undefined ? {} : { renderers })}\n {...(ui === undefined ? {} : { ui })}\n >\n <WorkspaceBody {...props} notices={notices} pushNotice={pushNotice} />\n </DashboardReaderProvider>\n );\n}\n\nfunction WorkspaceBody({\n dashboardId,\n transport,\n authoringTransport,\n management,\n ui,\n icons,\n editor,\n canEditModel = false,\n startInEditMode = false,\n filters,\n onFiltersChange,\n storage,\n onBack,\n onOpenDashboard,\n onAssistant,\n toolbarExtra,\n className,\n notices,\n pushNotice,\n}: DashboardWorkspaceProps & {\n notices: readonly Notice[];\n pushNotice: NoticeSink;\n}) {\n const kit = useUiKit();\n const glyphs = useIcons();\n const detail = useResource(\n (signal) => management.loadDashboard({ dashboardId, signal }),\n [management, dashboardId],\n );\n const [shareOpen, setShareOpen] = useState(false);\n const [inventory, setInventory] = useState(EMPTY_INVENTORY);\n const [inventoryOpen, setInventoryOpen] = useState(false);\n const [editorWidget, setEditorWidget] = useState<string | null>(null);\n const [editorMode, setEditorMode] = useState<WidgetEditorMode>(\"builder\");\n const [editorOpen, setEditorOpen] = useState(false);\n const [diagnosticsWidget, setDiagnosticsWidget] = useState<string | null>(\n null,\n );\n const [diagnosticsOpen, setDiagnosticsOpen] = useState(false);\n const [modelOpen, setModelOpen] = useState(false);\n const [yamlOpen, setYamlOpen] = useState(false);\n const [gridOpen, setGridOpen] = useState(false);\n const [preview, setPreview] = useState(false);\n const [viewport, setViewport] = useState(\n VIEWPORTS[2] ?? { label: \"Desktop\", width: 1024 },\n );\n const [customWidth, setCustomWidth] = useState(\"1024\");\n const [snap, setSnap] = useState(false);\n const [copying, setCopying] = useState(false);\n const [running, setRunning] = useState(false);\n const [appliedFilters, setAppliedFilters] = useState<Record<string, unknown>>(\n filters ?? {},\n );\n const onFiltersChangeRef = useRef(onFiltersChange);\n onFiltersChangeRef.current = onFiltersChange;\n const trackFilters = useCallback((next: Record<string, unknown>) => {\n setAppliedFilters(next);\n onFiltersChangeRef.current?.(next);\n }, []);\n const [reloadToken, setReloadToken] = useState(0);\n const [loaded, setLoaded] = useState<LoadedDashboard | null>(null);\n const [attachMeasure, measuredWidth] = useMeasuredWidth();\n\n const canEdit =\n authoringTransport !== undefined && (detail.data?.canWrite ?? false);\n\n const refreshInventory = useCallback(async () => {\n if (authoringTransport === undefined) return;\n try {\n setInventory(await authoringTransport.listWidgets({ dashboardId }));\n } catch (failure) {\n pushNotice({\n tone: \"error\",\n message: \"Could not list the widgets\",\n ...(failure instanceof Error ? { detail: failure.message } : {}),\n });\n }\n }, [authoringTransport, dashboardId, pushNotice]);\n\n /** Redraws the reader in place: filters and query results stay where they are. */\n const redraw = useCallback(async () => {\n await refreshInventory();\n detail.reload();\n setReloadToken((count) => count + 1);\n }, [refreshInventory, detail]);\n\n const documents = useMemo<LayoutDraftDocuments | null>(() => {\n if (loaded === null) return null;\n const stamp = detail.data?.updatedAt;\n return {\n dashboard: loaded.dashboard,\n widgets: loaded.widgets,\n unplacedWidgetIds: inventory.unplacedWidgetIds,\n ...(stamp === null || stamp === undefined ? {} : { updatedAt: stamp }),\n };\n }, [loaded, inventory.unplacedWidgetIds, detail.data?.updatedAt]);\n\n const draft = useLayoutDraft({\n dashboardId,\n documents,\n ...(transport.saveLayout === undefined\n ? {}\n : { saveLayout: transport.saveLayout }),\n storage:\n storage !== undefined\n ? storage\n : typeof window === \"undefined\"\n ? null\n : window.localStorage,\n onSaved: redraw,\n onError: (message) =>\n pushNotice({\n tone: \"error\",\n message: \"Could not save layout\",\n detail: message,\n }),\n });\n\n const startedInEdit = useRef(startInEditMode);\n useEffect(() => {\n if (startedInEdit.current && canEdit) {\n startedInEdit.current = false;\n draft.setEditMode(true);\n }\n }, [canEdit, draft]);\n\n const editing = draft.editMode && canEdit && !preview;\n\n useEffect(() => {\n if (canEdit) void refreshInventory();\n }, [canEdit, refreshInventory]);\n\n const openEditor = useCallback((widgetId: string, mode: WidgetEditorMode) => {\n setEditorWidget(widgetId);\n setEditorMode(mode);\n setEditorOpen(true);\n setInventoryOpen(false);\n }, []);\n\n const goToAssistant = useCallback(\n (intent: AssistantIntent) => {\n if (onAssistant === undefined) return;\n draft.requestExit(() => onAssistant(intent, dashboardId));\n },\n [draft, onAssistant, dashboardId],\n );\n\n const saveMetadata = useCallback(\n async (patch: { name?: string; description?: string }) => {\n if (authoringTransport?.saveDashboardMetadata === undefined) return;\n try {\n await authoringTransport.saveDashboardMetadata({\n dashboardId,\n ...patch,\n });\n detail.reload();\n } catch (failure) {\n pushNotice({\n tone: \"error\",\n message: \"Could not rename the dashboard\",\n ...(failure instanceof Error ? { detail: failure.message } : {}),\n });\n }\n },\n [authoringTransport, dashboardId, detail, pushNotice],\n );\n\n const copyDashboard = useCallback(async () => {\n if (authoringTransport?.copyDashboard === undefined) return;\n setCopying(true);\n try {\n const copy = await authoringTransport.copyDashboard({ dashboardId });\n pushNotice({ tone: \"success\", message: `Copied as ${copy.dashboardId}` });\n onOpenDashboard?.(copy.dashboardId);\n } catch (failure) {\n pushNotice({\n tone: \"error\",\n message: \"Could not copy the dashboard\",\n ...(failure instanceof Error ? { detail: failure.message } : {}),\n });\n } finally {\n setCopying(false);\n }\n }, [authoringTransport, dashboardId, onOpenDashboard, pushNotice]);\n\n const selectViewport = useCallback(\n (value: string) => {\n if (value === \"custom\") {\n setViewport({ label: \"Custom\", width: Number(customWidth) || 1024 });\n return;\n }\n const preset = VIEWPORTS.find(\n (item) => item.label.toLowerCase() === value,\n );\n if (preset) setViewport(preset);\n },\n [customWidth],\n );\n\n const activeBreakpoint = BREAKPOINT_FOR_KEY[draft.activeLayoutKey] ?? \"wide\";\n const ArrowLeft = glyphs.arrowLeft;\n const Refresh = glyphs.refresh;\n\n if (detail.error !== null) {\n return (\n <div className={cn(\"space-y-4\", className)} data-bideux=\"workspace\">\n {onBack === undefined ? null : (\n <kit.Button onClick={onBack} size=\"sm\" variant=\"ghost\">\n <ArrowLeft />\n Back\n </kit.Button>\n )}\n <p className=\"rounded-md border border-destructive/40 bg-destructive/10 p-4 text-sm text-destructive\">\n {detail.error}\n </p>\n </div>\n );\n }\n\n if (detail.data === null) {\n return (\n <div className={cn(\"space-y-4\", className)} data-bideux=\"workspace\">\n <kit.Skeleton className=\"h-8 w-64\" />\n <kit.Skeleton className=\"h-96 w-full\" />\n </div>\n );\n }\n\n const dashboard = detail.data;\n const viewportWidth = preview ? viewport.width : measuredWidth;\n\n const refreshButton = (\n <kit.Button\n ariaLabel=\"Refresh dashboard\"\n disabled={running}\n onClick={() => setReloadToken((count) => count + 1)}\n size=\"sm\"\n title=\"Refresh dashboard\"\n variant=\"ghost\"\n >\n <Refresh className={cn(running && \"animate-spin\")} />\n </kit.Button>\n );\n\n const exportMenu = (\n <ExportMenu\n dashboardId={dashboardId}\n filters={appliedFilters}\n onNotice={pushNotice}\n transport={management}\n />\n );\n\n const readerBlock = (\n <div\n className=\"rounded-lg border border-border bg-card p-4\"\n ref={attachMeasure}\n >\n <DashboardReaderLoader\n dashboardId={dashboardId}\n {...(filters === undefined ? {} : { filters })}\n onFiltersChange={trackFilters}\n onLoaded={setLoaded}\n onRunningChange={setRunning}\n reloadToken={reloadToken}\n viewportWidth={viewportWidth}\n canvas={{\n editMode: editing,\n snap,\n gridOverrides: draft.gridOverrides,\n gridConfig:\n draft.draftMaxRows === undefined\n ? draft.gridConfig\n : { ...draft.gridConfig, maxRows: draft.draftMaxRows },\n unplacedWidgetIds: draft.unplacedWidgetIds,\n onLayoutChange: draft.onLayoutChange,\n onLayoutKeyChange: draft.setActiveLayoutKey,\n onIncreaseMaxRows: draft.onIncreaseMaxRows,\n onEditWidget: (widgetId) => openEditor(widgetId, \"builder\"),\n onAskWidget: (widgetId) => openEditor(widgetId, \"ask\"),\n onDiagnoseWidget: (widgetId) => {\n setDiagnosticsWidget(widgetId);\n setDiagnosticsOpen(true);\n },\n onRemoveWidget: draft.removeFromGrid,\n ...(draft.draftLayout === undefined\n ? {}\n : { draftLayout: draft.draftLayout }),\n }}\n />\n <LayoutDraftDialogs draft={draft} />\n </div>\n );\n\n if (preview) {\n const Close = glyphs.close;\n return (\n <div\n className=\"fixed inset-0 z-50 flex flex-col bg-background\"\n data-bideux=\"workspace-preview\"\n >\n <div className=\"flex min-h-14 shrink-0 flex-wrap items-center justify-between gap-2 border-b bg-background px-4 py-2 sm:px-6\">\n <div className=\"flex min-w-0 items-center gap-2 sm:gap-4\">\n <kit.Button\n onClick={() => setPreview(false)}\n size=\"sm\"\n variant=\"ghost\"\n >\n <Close />\n Close preview\n </kit.Button>\n <span className=\"text-sm font-medium\">{dashboard.name}</span>\n </div>\n <div className=\"flex flex-wrap items-center gap-2 sm:gap-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"hidden text-sm text-muted-foreground sm:inline\">\n Viewport\n </span>\n <kit.Select\n ariaLabel=\"Viewport\"\n className=\"w-32\"\n onChange={selectViewport}\n options={[\n ...VIEWPORTS.map((item) => ({\n value: item.label.toLowerCase(),\n label: item.label,\n })),\n { value: \"custom\", label: \"Custom\" },\n ]}\n value={viewport.label.toLowerCase()}\n />\n {viewport.label === \"Custom\" ? (\n <kit.TextInput\n ariaLabel=\"Custom width\"\n className=\"w-24\"\n onChange={(value) => {\n setCustomWidth(value);\n setViewport({\n label: \"Custom\",\n width: Number(value) || 1024,\n });\n }}\n type=\"number\"\n value={customWidth}\n />\n ) : null}\n <span className=\"hidden text-sm text-muted-foreground sm:inline\">\n {viewport.width}px\n </span>\n </div>\n {exportMenu}\n {refreshButton}\n </div>\n </div>\n <div className=\"flex-1 overflow-auto bg-muted/30 p-2 sm:p-4\">\n <div\n className=\"mx-auto\"\n style={{ width: viewport.width + 32, maxWidth: \"100%\" }}\n >\n {readerBlock}\n </div>\n </div>\n </div>\n );\n }\n\n const Share = glyphs.share;\n const Copy = glyphs.copy;\n const Sliders = glyphs.sliders;\n const Code = glyphs.code;\n const Save = glyphs.save;\n const Loader = glyphs.loader;\n const Undo = glyphs.undo;\n const Sparkles = glyphs.sparkles;\n const Layers = glyphs.layers;\n const Eye = glyphs.eye;\n const Alert = glyphs.alert;\n\n const page = (\n <div className={cn(\"space-y-4\", className)} data-bideux=\"workspace\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n {onBack === undefined ? null : (\n <kit.Button\n className=\"-ml-2 mb-1 text-muted-foreground\"\n onClick={() => draft.requestExit(onBack)}\n size=\"sm\"\n variant=\"ghost\"\n >\n <ArrowLeft />\n Dashboards\n </kit.Button>\n )}\n {editing ? (\n <div className=\"max-w-xl space-y-1\">\n <InlineText\n empty=\"Name this dashboard\"\n label=\"Name\"\n onCommit={(value) => void saveMetadata({ name: value })}\n value={dashboard.name}\n />\n <InlineText\n empty=\"Add a description\"\n label=\"Description\"\n onCommit={(value) => void saveMetadata({ description: value })}\n value={dashboard.description}\n />\n </div>\n ) : (\n <>\n <div className=\"flex flex-wrap items-center gap-2\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">\n {dashboard.name}\n </h1>\n <VisibilityBadge\n visibility={badgeVisibility(dashboard.visibility)}\n />\n <kit.Badge tone=\"warning\">{dashboard.permission}</kit.Badge>\n </div>\n {dashboard.description !== null &&\n dashboard.description !== \"\" ? (\n <p className=\"mt-1 line-clamp-2 text-sm text-muted-foreground\">\n {dashboard.description}\n </p>\n ) : null}\n </>\n )}\n </div>\n <div className=\"ml-auto flex flex-wrap items-center gap-2\">\n {dashboard.isOwner ? (\n <kit.Button onClick={() => setShareOpen(true)} size=\"sm\">\n <Share />\n Share\n </kit.Button>\n ) : null}\n {authoringTransport?.copyDashboard === undefined ? null : (\n <kit.Button\n disabled={copying}\n onClick={() => void copyDashboard()}\n size=\"sm\"\n title=\"Take your own copy of this dashboard\"\n >\n <Copy />\n Make a copy\n </kit.Button>\n )}\n {canEdit ? (\n <kit.Checkbox\n checked={draft.editMode}\n label=\"Edit mode\"\n onChange={draft.setEditMode}\n />\n ) : (\n <span\n className=\"text-sm text-muted-foreground\"\n title=\"You can view this dashboard. Make a copy to change it.\"\n >\n Read only\n </span>\n )}\n {editing ? (\n <span\n title={\n snap\n ? \"Dragging pushes the widgets it lands on out of the way, and rows close up behind a widget you move away.\"\n : \"Widgets stay exactly where you put them. Dropping one on top of another is refused, so nothing can end up hidden underneath.\"\n }\n >\n <kit.Checkbox\n checked={snap}\n label={snap ? \"Push neighbours\" : \"Free placement\"}\n onChange={setSnap}\n />\n </span>\n ) : null}\n {editing ? (\n <kit.Popover\n align=\"end\"\n className=\"w-80\"\n onOpenChange={setGridOpen}\n open={gridOpen}\n trigger={\n <kit.Button size=\"sm\">\n <Sliders />\n Grid\n </kit.Button>\n }\n >\n {loaded === null ? null : (\n <GridSettingsPanel\n breakpoint={activeBreakpoint}\n dashboard={loaded.dashboard}\n draft={draft}\n />\n )}\n </kit.Popover>\n ) : null}\n {editing ? (\n <kit.Button onClick={() => setYamlOpen(true)} size=\"sm\">\n <Code />\n Edit YAML\n </kit.Button>\n ) : null}\n {editing ? (\n <kit.Button\n disabled={draft.saving || !draft.hasUnsavedChanges}\n onClick={() => void draft.save()}\n size=\"sm\"\n title={\n draft.hasUnsavedChanges\n ? \"Save your dashboard changes\"\n : \"No dashboard changes to save\"\n }\n variant={draft.hasUnsavedChanges ? \"primary\" : \"secondary\"}\n >\n {draft.saving ? <Loader className=\"animate-spin\" /> : <Save />}\n Save layout\n </kit.Button>\n ) : null}\n {editing ? (\n <kit.Button onClick={draft.reset} size=\"sm\">\n <Undo />\n Reset layout\n </kit.Button>\n ) : null}\n {editing && onAssistant !== undefined ? (\n <kit.Button\n onClick={() => goToAssistant(\"create\")}\n size=\"sm\"\n title=\"Describe a widget in a sentence and review it before it is added\"\n variant=\"primary\"\n >\n <Sparkles />\n Create with AI\n </kit.Button>\n ) : null}\n {editing && onAssistant !== undefined ? (\n <kit.Button\n onClick={() => goToAssistant(\"edit\")}\n size=\"sm\"\n title=\"Change many widgets at once, such as making everything obey the location filter\"\n >\n <Sparkles />\n Edit with AI\n </kit.Button>\n ) : null}\n {editing ? (\n <kit.Button onClick={() => setInventoryOpen(true)} size=\"sm\">\n <Layers />\n Widgets\n </kit.Button>\n ) : null}\n {editing && canEditModel ? (\n <kit.Button onClick={() => setModelOpen(true)} size=\"sm\">\n Semantic model\n </kit.Button>\n ) : null}\n <kit.Button onClick={() => setPreview(true)} size=\"sm\">\n <Eye />\n Preview\n </kit.Button>\n {exportMenu}\n {toolbarExtra}\n {refreshButton}\n </div>\n </div>\n\n {editing && draft.hasUnsavedChanges ? (\n <div\n className=\"flex items-center gap-2 rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-sm font-medium text-amber-900 dark:border-amber-900 dark:bg-amber-950 dark:text-amber-200\"\n role=\"status\"\n >\n <Alert className=\"shrink-0\" />\n <span>\n Unsaved changes. Click Save layout to keep them, or they are lost\n when you leave.\n </span>\n </div>\n ) : null}\n\n <NoticeList notices={notices} />\n\n {authoringTransport === undefined ? null : (\n <>\n <WidgetInventory\n onAdd={(widgetId) => {\n draft.setEditMode(true);\n draft.placeOnGrid(widgetId);\n }}\n onCreated={(widgetId) => {\n openEditor(widgetId, \"builder\");\n return redraw();\n }}\n onCreateWithAssistant={\n onAssistant === undefined\n ? undefined\n : () => goToAssistant(\"create\")\n }\n onEditWithAssistant={(widgetId) => openEditor(widgetId, \"ask\")}\n onDelete={async (widgetId) => {\n await authoringTransport.deleteWidget({ dashboardId, widgetId });\n await redraw();\n }}\n onEdit={(widgetId) => openEditor(widgetId, \"builder\")}\n onOpenChange={setInventoryOpen}\n onRemove={(widgetId) => {\n void authoringTransport\n .removeWidgetFromLayout({ dashboardId, widgetId })\n .then(redraw);\n }}\n open={inventoryOpen}\n unplacedWidgetIds={inventory.unplacedWidgetIds}\n widgets={inventory.widgets}\n />\n <WidgetYamlEditor\n initialMode={editorMode}\n onAddToLayout={(widgetId) => {\n draft.setEditMode(true);\n draft.placeOnGrid(widgetId);\n }}\n onOpenChange={setEditorOpen}\n onSaved={redraw}\n open={editorOpen}\n widgetId={editorWidget}\n />\n <WidgetDiagnostics\n onOpenChange={setDiagnosticsOpen}\n open={diagnosticsOpen}\n widgetId={diagnosticsWidget}\n />\n <DashboardYamlEditor\n onOpenChange={setYamlOpen}\n onSaved={async () => {\n draft.reset();\n await redraw();\n }}\n open={yamlOpen}\n />\n <ModelEditor\n onOpenChange={setModelOpen}\n onSaved={redraw}\n open={modelOpen}\n />\n </>\n )}\n\n {readerBlock}\n\n <ShareDialog\n dashboard={dashboard}\n onChanged={() => detail.reload()}\n onOpenChange={setShareOpen}\n open={shareOpen}\n transport={management}\n />\n </div>\n );\n\n if (authoringTransport === undefined) return page;\n return (\n <DashboardAuthoringProvider\n canEdit={canEdit}\n dashboardId={dashboardId}\n onNotice={pushNotice}\n transport={authoringTransport}\n {...(editor === undefined ? {} : { editor })}\n {...(icons === undefined ? {} : { icons })}\n {...(ui === undefined ? {} : { ui })}\n >\n {page}\n </DashboardAuthoringProvider>\n );\n}\n","/**\n * The dashboards page: shelves of cards grouped by visibility, a New dashboard\n * dialog, and per card actions the host's management port allows. The same\n * page the origin application draws; who appears on which shelf is whatever `listDashboards`\n * returned, the component adds no rule of its own.\n */\nimport { useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { dashboardTemplate } from \"@dlh.io/bideux-dashboard-core\";\n\nimport { cn } from \"./cn.js\";\nimport { createDefaultUiKit } from \"./defaults/ui.js\";\nimport { mergeIcons } from \"./defaults/icons.js\";\nimport type {\n DashboardManagementTransport,\n DashboardSummary,\n} from \"./management-ports.js\";\nimport type { IconSet, UiKit } from \"./ports.js\";\nimport { useResource } from \"./use-resource.js\";\n\nexport interface DashboardShelf {\n /** Whether a dashboard sits on this shelf; the first shelf that holds it wins. */\n holds: (item: DashboardSummary) => boolean;\n title: string;\n blurb?: string | undefined;\n}\n\nconst ORG_VISIBILITIES: readonly string[] = [\"org\", \"organisation\", \"public\"];\n\nfunction isOrgWide(item: DashboardSummary): boolean {\n return ORG_VISIBILITIES.includes(item.visibility);\n}\n\n/** A dashboard the caller owns is theirs wherever it is shared, so ownership is checked before reach. */\nexport const DEFAULT_SHELVES: readonly DashboardShelf[] = [\n {\n holds: (item) => item.isOwner && !isOrgWide(item),\n title: \"My dashboards\",\n blurb: \"Yours, including the ones you have shared with other people.\",\n },\n {\n holds: (item) => !item.isOwner && !isOrgWide(item),\n title: \"Shared with me\",\n blurb: \"Dashboards colleagues gave you access to.\",\n },\n {\n holds: isOrgWide,\n title: \"Organization\",\n blurb:\n \"Everyone in the organization can see these. Copy one to make it yours.\",\n },\n];\n\nexport interface DashboardListProps {\n management: DashboardManagementTransport;\n /** Opens a dashboard; `editing` is set for a dashboard just created. */\n onOpen: (dashboardId: string, options: { editing: boolean }) => void;\n ui?: Partial<UiKit> | undefined;\n icons?: Partial<IconSet> | undefined;\n shelves?: readonly DashboardShelf[] | undefined;\n title?: string | undefined;\n description?: string | undefined;\n /** Extra header actions beside New dashboard. */\n actions?: ReactNode;\n /** The visibility a new dashboard starts with. */\n newVisibility?: string | undefined;\n className?: string | undefined;\n}\n\n/** A URL safe identifier from a name; the host may still grant another. */\nexport function slugify(name: string): string {\n return name\n .toLowerCase()\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 64);\n}\n\nconst VISIBILITY_LABEL: Record<string, string> = {\n personal: \"Personal\",\n private: \"Private\",\n shared: \"Shared\",\n org: \"Organisation\",\n organisation: \"Organisation\",\n public: \"Public\",\n};\n\nexport function DashboardList({\n management,\n onOpen,\n ui,\n icons,\n shelves = DEFAULT_SHELVES,\n title = \"Dashboards\",\n description,\n actions,\n newVisibility = \"personal\",\n className,\n}: DashboardListProps) {\n const kit = useMemo(() => createDefaultUiKit(ui), [ui]);\n const glyphs = useMemo(() => mergeIcons(icons), [icons]);\n const listings = useResource(\n (signal) => management.listDashboards({ signal }),\n [management],\n );\n const [creating, setCreating] = useState(false);\n const [name, setName] = useState(\"\");\n const [about, setAbout] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [pendingDelete, setPendingDelete] = useState<DashboardSummary | null>(\n null,\n );\n const Plus = glyphs.plus;\n const Trash = glyphs.trash;\n\n const create = async () => {\n const make = management.createDashboard;\n if (make === undefined) return;\n setBusy(true);\n setError(null);\n try {\n const slug = slugify(name) || \"dashboard\";\n const created = await make({\n name: name.trim(),\n description: about.trim() === \"\" ? null : about.trim(),\n dashboardId: slug,\n specYaml: dashboardTemplate({\n slug,\n name: name.trim(),\n description: about.trim(),\n }),\n visibility: newVisibility,\n });\n setCreating(false);\n setName(\"\");\n setAbout(\"\");\n onOpen(created.dashboardId, { editing: true });\n } catch (failure) {\n setError(failure instanceof Error ? failure.message : String(failure));\n } finally {\n setBusy(false);\n }\n };\n\n const remove = async (item: DashboardSummary) => {\n const drop = management.deleteDashboard;\n if (drop === undefined) return;\n setBusy(true);\n try {\n await drop({ dashboardId: item.dashboardId });\n setPendingDelete(null);\n listings.reload();\n } catch (failure) {\n setError(failure instanceof Error ? failure.message : String(failure));\n } finally {\n setBusy(false);\n }\n };\n\n const items = listings.data ?? [];\n const shelved = new Set<string>();\n const groups = shelves.map((shelf) => {\n const members = items.filter(\n (item) =>\n item.canRead && !shelved.has(item.dashboardId) && shelf.holds(item),\n );\n for (const member of members) shelved.add(member.dashboardId);\n return { shelf, members };\n });\n const rest = items.filter(\n (item) => item.canRead && !shelved.has(item.dashboardId),\n );\n if (rest.length > 0) {\n groups.push({\n shelf: { holds: () => true, title: \"Other dashboards\" },\n members: rest,\n });\n }\n\n return (\n <div className={cn(\"space-y-8\", className)} data-bideux=\"dashboard-list\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1>\n {description === undefined ? null : (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {actions}\n {management.createDashboard === undefined ? null : (\n <kit.Button onClick={() => setCreating(true)} variant=\"primary\">\n <Plus />\n New dashboard\n </kit.Button>\n )}\n </div>\n </div>\n\n {listings.error === null ? null : (\n <p className=\"text-sm text-destructive\">{listings.error}</p>\n )}\n\n {listings.loading && listings.data === null ? (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {[0, 1, 2].map((index) => (\n <kit.Skeleton className=\"h-32\" key={index} />\n ))}\n </div>\n ) : (\n groups.map(({ shelf, members }) => (\n <section className=\"space-y-3\" key={shelf.title}>\n <div>\n <h2 className=\"text-lg font-semibold\">{shelf.title}</h2>\n {shelf.blurb === undefined ? null : (\n <p className=\"text-sm text-muted-foreground\">{shelf.blurb}</p>\n )}\n </div>\n {members.length === 0 ? (\n <p className=\"rounded-md border border-dashed border-border p-6 text-center text-sm text-muted-foreground\">\n Nothing here yet.\n </p>\n ) : (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {members.map((item) => (\n <article\n className=\"relative flex h-full flex-col rounded-lg border border-border bg-card text-card-foreground shadow-sm transition-colors hover:border-primary\"\n key={item.dashboardId}\n >\n <button\n className=\"flex flex-1 flex-col items-start gap-1.5 p-6 text-left outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={() =>\n onOpen(item.dashboardId, { editing: false })\n }\n type=\"button\"\n >\n <span className=\"flex w-full items-start justify-between gap-2\">\n <span className=\"text-base font-semibold leading-none tracking-tight\">\n {item.name}\n </span>\n <kit.Badge tone=\"info\">\n {VISIBILITY_LABEL[item.visibility] ?? item.visibility}\n </kit.Badge>\n </span>\n <span className=\"text-sm text-muted-foreground\">\n {item.description ?? \"No description.\"}\n </span>\n <span className=\"mt-auto flex flex-wrap items-center gap-2 pt-3 text-xs text-muted-foreground\">\n <span>Owner: {item.ownerName ?? \"unknown\"}</span>\n <kit.Badge tone=\"warning\">{item.permission}</kit.Badge>\n {item.sharedWithCount > 0 ? (\n <span>Shared with {item.sharedWithCount}</span>\n ) : null}\n </span>\n </button>\n {item.isOwner &&\n management.deleteDashboard !== undefined ? (\n <div className=\"absolute right-2 top-2\">\n <kit.Button\n ariaLabel={`Delete ${item.name}`}\n onClick={() => {\n setError(null);\n setPendingDelete(item);\n }}\n size=\"sm\"\n variant=\"ghost\"\n >\n <Trash />\n </kit.Button>\n </div>\n ) : null}\n </article>\n ))}\n </div>\n )}\n </section>\n ))\n )}\n\n <kit.Modal\n description=\"Starts personal with an empty overview tab. Add widgets in the builder, then share or publish from the dashboard page.\"\n onOpenChange={(open) => {\n setCreating(open);\n if (!open) setError(null);\n }}\n open={creating}\n title=\"New dashboard\"\n >\n <div className=\"space-y-3\">\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Name</span>\n <kit.TextInput\n onChange={setName}\n placeholder=\"Labour versus sales\"\n value={name}\n />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Description</span>\n <kit.TextInput onChange={setAbout} value={about} />\n </label>\n {error === null ? null : (\n <p className=\"text-sm text-destructive\">{error}</p>\n )}\n <div className=\"flex justify-end gap-2 pt-2\">\n <kit.Button onClick={() => setCreating(false)}>Cancel</kit.Button>\n <kit.Button\n disabled={busy || name.trim() === \"\"}\n onClick={() => void create()}\n variant=\"primary\"\n >\n Create\n </kit.Button>\n </div>\n </div>\n </kit.Modal>\n\n <kit.Modal\n description=\"The dashboard, its widgets and its shares are removed for everyone.\"\n onOpenChange={(open) => {\n if (!open) setPendingDelete(null);\n }}\n open={pendingDelete !== null}\n title={pendingDelete === null ? \"\" : `Delete ${pendingDelete.name}?`}\n >\n {error === null ? null : (\n <p className=\"pb-3 text-sm text-destructive\">{error}</p>\n )}\n <div className=\"flex justify-end gap-2\">\n <kit.Button onClick={() => setPendingDelete(null)}>Cancel</kit.Button>\n <kit.Button\n disabled={busy}\n onClick={() => {\n if (pendingDelete !== null) void remove(pendingDelete);\n }}\n variant=\"primary\"\n >\n Delete\n </kit.Button>\n </div>\n </kit.Modal>\n </div>\n );\n}\n","/**\n * Fetch transports for hosts whose API follows the Bideux route shape (the\n * shape `bideux.fastapi.build_dashboard_router` serves and both example hosts\n * expose). The base URL, the fetch function and a request decorator are the\n * host's; everything else is the same for every host, so it lives here once.\n *\n * A host with different routes writes its own `DashboardTransport` and\n * `AuthoringTransport` exactly as before; nothing in the reader or builder\n * depends on these helpers.\n */\nimport { LayoutConflictError } from \"@dlh.io/bideux-dashboard-react\";\nimport type {\n AuthoringTransport,\n DashboardDetail,\n DashboardDocument,\n DashboardManagementTransport,\n DashboardSummary,\n DashboardTransport,\n DataModelConnection,\n DatasetPreviewResult,\n ModelDocument,\n ModelVersionSummary,\n WarehouseTable,\n WidgetDiagnosticsResponse,\n WidgetDocument,\n WidgetInventoryResponse,\n} from \"@dlh.io/bideux-dashboard-react\";\nimport type { DashboardModelDiagnostics } from \"@dlh.io/bideux-dashboard-core\";\nimport type {\n PivotDetailResult,\n WidgetResult,\n WidgetSpec,\n} from \"@dlh.io/bideux-dashboard-renderers\";\nimport type { DashboardSpec } from \"@dlh.io/bideux-dashboard-spec\";\n\nexport interface HttpTransportOptions {\n /** The dashboards prefix, for example `/api/custom-dashboards`. */\n readonly baseUrl: string;\n /** The authoring prefix; defaults to `${baseUrl}/authoring`. */\n readonly authoringUrl?: string;\n /** Defaults to the global `fetch`. */\n readonly fetch?: typeof fetch;\n /**\n * Last word on every request: add an Authorization header, a tenant query\n * parameter, credentials, whatever the host's API expects.\n */\n readonly prepare?: (url: string, init: RequestInit) => RequestInit | void;\n /** Extra query parameters appended to every URL, for example `{ person }`. */\n readonly query?: Readonly<Record<string, string>>;\n}\n\ninterface Http {\n json<T>(path: string, init?: RequestInit): Promise<T>;\n raw(path: string, init?: RequestInit): Promise<Response>;\n}\n\nexport async function httpRefusal(response: Response): Promise<string> {\n const payload = (await response.json().catch(() => null)) as {\n detail?: unknown;\n } | null;\n const detail = payload?.detail;\n if (typeof detail === \"string\") return detail;\n if (detail !== null && typeof detail === \"object\" && \"message\" in detail) {\n const message = (detail as { message?: unknown }).message;\n if (typeof message === \"string\") return message;\n }\n return `Request failed with ${String(response.status)}`;\n}\n\nfunction http(options: HttpTransportOptions): Http {\n const run = options.fetch ?? fetch;\n const withQuery = (path: string): string => {\n const entries = Object.entries(options.query ?? {});\n if (entries.length === 0) return path;\n const params = new URLSearchParams(entries).toString();\n return `${path}${path.includes(\"?\") ? \"&\" : \"?\"}${params}`;\n };\n const raw = async (\n path: string,\n init: RequestInit = {},\n ): Promise<Response> => {\n const url = withQuery(path);\n const prepared: RequestInit = {\n ...init,\n ...(init.body === undefined\n ? {}\n : {\n headers: {\n \"content-type\": \"application/json\",\n ...(init.headers as Record<string, string> | undefined),\n },\n }),\n };\n return await run(url, options.prepare?.(url, prepared) ?? prepared);\n };\n return {\n raw,\n json: async <T>(path: string, init: RequestInit = {}): Promise<T> => {\n const response = await raw(path, init);\n if (!response.ok) throw new Error(await httpRefusal(response));\n if (response.status === 204) return undefined as T;\n return (await response.json()) as T;\n },\n };\n}\n\nconst signalOf = (signal: AbortSignal | undefined): RequestInit =>\n signal === undefined ? {} : { signal };\n\ninterface ReaderRunPayload {\n readonly name: string;\n readonly dashboard: DashboardSpec;\n readonly widgets: Record<string, WidgetSpec>;\n readonly results: Record<string, WidgetResult>;\n}\n\n/** The reader's data client over the `/{id}/reader`, `/reader/{widget}` and `/layout` routes. */\nexport function createHttpDashboardTransport(\n options: HttpTransportOptions,\n): DashboardTransport {\n const api = http(options);\n const id = encodeURIComponent;\n const base = options.baseUrl;\n return {\n runDashboard: async (request) => {\n const payload = await api.json<ReaderRunPayload>(\n `${base}/${id(request.dashboardId)}/reader`,\n {\n method: \"POST\",\n body: JSON.stringify({ filters: request.filters ?? {} }),\n ...signalOf(request.signal),\n },\n );\n return {\n name: payload.name,\n dashboard: payload.dashboard,\n widgets: payload.widgets,\n results: payload.results,\n };\n },\n runWidget: async (request) =>\n await api.json<WidgetResult>(\n `${base}/${id(request.dashboardId)}/reader/${id(request.widgetId)}`,\n {\n method: \"POST\",\n body: JSON.stringify({ filters: request.filters ?? {} }),\n ...signalOf(request.signal),\n },\n ),\n runWidgetDetail: async (request) =>\n await api.json<PivotDetailResult>(\n `${base}/${id(request.dashboardId)}/reader/${id(request.widgetId)}/detail`,\n {\n method: \"POST\",\n body: JSON.stringify({\n cell: request.cell,\n filters: request.filters ?? {},\n }),\n ...signalOf(request.signal),\n },\n ),\n saveLayout: async (request) => {\n const response = await api.raw(\n `${base}/${id(request.dashboardId)}/layout`,\n {\n method: \"PUT\",\n body: JSON.stringify({\n layouts: request.layouts,\n grid_overrides: request.gridOverrides ?? {},\n unplaced_widget_ids: request.unplacedWidgetIds ?? [],\n max_rows: request.maxRows ?? null,\n max_layout_width: request.maxLayoutWidth ?? null,\n clear_max_layout_width: request.maxLayoutWidth === null,\n grid: request.grid ?? {},\n data_model_id:\n request.dataModelId === undefined\n ? null\n : (request.dataModelId ?? \"\"),\n expected_updated_at: request.expectedUpdatedAt ?? null,\n }),\n ...signalOf(request.signal),\n },\n );\n if (response.status === 409) {\n throw new LayoutConflictError(await httpRefusal(response));\n }\n if (!response.ok) throw new Error(await httpRefusal(response));\n const payload = (await response.json()) as { updated_at: string | null };\n return payload.updated_at === null\n ? {}\n : { updatedAt: payload.updated_at };\n },\n };\n}\n\ninterface WidgetDocumentPayload {\n readonly widget_id: string;\n readonly spec_yaml: string;\n}\n\ninterface DashboardDocumentPayload {\n readonly slug: string;\n readonly spec_yaml: string;\n readonly updated_at: string | null;\n}\n\ninterface InventoryPayload {\n readonly widgets: Record<string, WidgetSpec>;\n readonly unplaced_widget_ids: string[];\n}\n\ninterface ModelDocumentPayload {\n readonly spec_yaml: string;\n readonly version: number | null;\n readonly editable: boolean;\n}\n\ninterface ModelVersionPayload {\n readonly version: number;\n readonly created_at: string;\n readonly size_bytes: number;\n readonly dataset_count: number;\n readonly note: string | null;\n readonly is_current: boolean;\n}\n\ninterface ConnectionPayload {\n readonly id: string;\n readonly label: string;\n readonly vendor: string | null;\n}\n\ninterface WarehouseTablePayload {\n readonly schema_name: string;\n readonly table_name: string;\n readonly table_type: string;\n readonly columns: readonly { readonly name: string; data_type: string }[];\n}\n\ninterface DiagnosticsPayload {\n readonly widget_id: string;\n readonly component: string;\n readonly queries: readonly {\n readonly kind: string;\n readonly sql: string;\n readonly params: Record<string, unknown>;\n readonly data_store_id: string | null;\n readonly filter_field: string | null;\n readonly effective_locations: string[] | null;\n }[];\n readonly mapping: {\n readonly row_count: number;\n readonly available_columns: string[];\n readonly mapped_fields: Record<string, string>;\n readonly issues: string[];\n } | null;\n readonly notes: string[];\n readonly error: string | null;\n}\n\ninterface PreviewPayload {\n readonly columns: string[];\n readonly rows: Record<string, unknown>[];\n readonly row_count: number;\n readonly effective_locations: string[] | null;\n readonly sql: string | null;\n}\n\nfunction dashboardDocument(\n payload: DashboardDocumentPayload,\n): DashboardDocument {\n return {\n dashboardId: payload.slug,\n specYaml: payload.spec_yaml,\n ...(payload.updated_at === null ? {} : { updatedAt: payload.updated_at }),\n };\n}\n\nfunction widgetDocument(payload: WidgetDocumentPayload): WidgetDocument {\n return { widgetId: payload.widget_id, specYaml: payload.spec_yaml };\n}\n\nfunction modelDocument(payload: ModelDocumentPayload): ModelDocument {\n return {\n specYaml: payload.spec_yaml,\n version: payload.version,\n editable: payload.editable,\n };\n}\n\n/** The builder's client over the `/authoring/*` routes, snake case on the wire. */\nexport function createHttpAuthoringTransport(\n options: HttpTransportOptions,\n): AuthoringTransport {\n const api = http(options);\n const id = encodeURIComponent;\n const dashboards = options.baseUrl;\n const base = options.authoringUrl ?? `${options.baseUrl}/authoring`;\n return {\n loadDashboardDocument: async (input) =>\n dashboardDocument(\n await api.json<DashboardDocumentPayload>(\n `${dashboards}/${id(input.dashboardId)}/document`,\n signalOf(input.signal),\n ),\n ),\n saveDashboardDocument: async (input) =>\n dashboardDocument(\n await api.json<DashboardDocumentPayload>(\n `${dashboards}/${id(input.dashboardId)}/document`,\n {\n method: \"PUT\",\n body: JSON.stringify({\n spec_yaml: input.specYaml,\n expected_updated_at: input.expectedUpdatedAt ?? null,\n }),\n },\n ),\n ),\n saveDashboardMetadata: async (input) => {\n await api.json<unknown>(`${dashboards}/${id(input.dashboardId)}`, {\n method: \"PATCH\",\n body: JSON.stringify({\n name: input.name ?? null,\n description: input.description ?? null,\n }),\n });\n },\n copyDashboard: async (input) => {\n const payload = await api.json<{ slug: string }>(\n `${dashboards}/${id(input.dashboardId)}/copy`,\n { method: \"POST\", body: JSON.stringify({ name: input.name ?? null }) },\n );\n return { dashboardId: payload.slug };\n },\n loadWidgetDocument: async (input) =>\n widgetDocument(\n await api.json<WidgetDocumentPayload>(\n `${base}/${id(input.dashboardId)}/widgets/${id(input.widgetId)}`,\n signalOf(input.signal),\n ),\n ),\n saveWidget: async (input) => {\n await api.json<WidgetDocumentPayload>(\n `${base}/${id(input.dashboardId)}/widgets/${id(input.widgetId)}`,\n { method: \"PUT\", body: JSON.stringify({ spec_yaml: input.specYaml }) },\n );\n },\n createWidget: async (input) =>\n widgetDocument(\n await api.json<WidgetDocumentPayload>(\n `${base}/${id(input.dashboardId)}/widgets`,\n {\n method: \"POST\",\n body: JSON.stringify({ spec_yaml: input.specYaml }),\n },\n ),\n ),\n deleteWidget: async (input) => {\n await api.json<InventoryPayload>(\n `${base}/${id(input.dashboardId)}/widgets/${id(input.widgetId)}`,\n { method: \"DELETE\" },\n );\n },\n listWidgets: async (input): Promise<WidgetInventoryResponse> => {\n const payload = await api.json<InventoryPayload>(\n `${base}/${id(input.dashboardId)}/widgets`,\n signalOf(input.signal),\n );\n return {\n widgets: payload.widgets,\n unplacedWidgetIds: payload.unplaced_widget_ids,\n };\n },\n diagnoseWidget: async (input): Promise<WidgetDiagnosticsResponse> => {\n const payload = await api.json<DiagnosticsPayload>(\n `${base}/${id(input.dashboardId)}/widgets/${id(input.widgetId)}/diagnostics`,\n {\n method: \"POST\",\n body: JSON.stringify({ filters: input.filters ?? {} }),\n ...signalOf(input.signal),\n },\n );\n return {\n widgetId: payload.widget_id,\n component: payload.component,\n queries: payload.queries.map((query) => ({\n kind: query.kind,\n sql: query.sql,\n params: query.params,\n dataStoreId: query.data_store_id,\n filterField: query.filter_field,\n effectiveLocations: query.effective_locations,\n })),\n ...(payload.mapping\n ? {\n mapping: {\n rowCount: payload.mapping.row_count,\n availableColumns: payload.mapping.available_columns,\n mappedFields: payload.mapping.mapped_fields,\n issues: payload.mapping.issues,\n },\n }\n : {}),\n notes: payload.notes,\n ...(payload.error ? { error: payload.error } : {}),\n };\n },\n loadModel: async (input) =>\n modelDocument(\n await api.json<ModelDocumentPayload>(\n `${base}/model`,\n signalOf(input.signal),\n ),\n ),\n saveModel: async (input) =>\n modelDocument(\n await api.json<ModelDocumentPayload>(`${base}/model`, {\n method: \"PUT\",\n body: JSON.stringify({\n spec_yaml: input.specYaml,\n note: input.note ?? null,\n }),\n }),\n ),\n validateModel: async (input) =>\n await api.json<DashboardModelDiagnostics>(`${base}/model/validate`, {\n method: \"POST\",\n body: JSON.stringify({ spec_yaml: input.specYaml }),\n ...signalOf(input.signal),\n }),\n listModelVersions: async (input): Promise<ModelVersionSummary[]> => {\n const payload = await api.json<ModelVersionPayload[]>(\n `${base}/model/versions`,\n signalOf(input.signal),\n );\n return payload.map((version) => ({\n version: version.version,\n createdAt: version.created_at,\n sizeBytes: version.size_bytes,\n datasetCount: version.dataset_count,\n note: version.note,\n isCurrent: version.is_current,\n }));\n },\n loadModelVersion: async (input) =>\n modelDocument(\n await api.json<ModelDocumentPayload>(\n `${base}/model/versions/${String(input.version)}`,\n signalOf(input.signal),\n ),\n ),\n restoreModelVersion: async (input) =>\n modelDocument(\n await api.json<ModelDocumentPayload>(\n `${base}/model/versions/${String(input.version)}/restore`,\n { method: \"POST\" },\n ),\n ),\n listConnections: async (input): Promise<DataModelConnection[]> => {\n const payload = await api.json<ConnectionPayload[]>(\n `${base}/connections`,\n signalOf(input.signal),\n );\n return payload.map((connection) => ({\n id: connection.id,\n label: connection.label,\n vendor: connection.vendor,\n }));\n },\n listWarehouseTables: async (input): Promise<WarehouseTable[]> => {\n const query =\n input.connectionId === null\n ? \"\"\n : `?connection_id=${encodeURIComponent(input.connectionId)}`;\n const payload = await api.json<WarehouseTablePayload[]>(\n `${base}/warehouse/tables${query}`,\n signalOf(input.signal),\n );\n return payload.map((table) => ({\n schemaName: table.schema_name,\n tableName: table.table_name,\n tableType: table.table_type,\n columns: table.columns.map((column) => ({\n name: column.name,\n dataType: column.data_type,\n })),\n }));\n },\n previewDataset: async (input): Promise<DatasetPreviewResult> => {\n const payload = await api.json<PreviewPayload>(`${base}/model/preview`, {\n method: \"POST\",\n body: JSON.stringify({\n spec_yaml: input.specYaml,\n dataset_id: input.datasetId,\n limit: input.limit,\n columns: input.columns ?? null,\n }),\n ...signalOf(input.signal),\n });\n return {\n columns: payload.columns,\n rows: payload.rows,\n rowCount: payload.row_count,\n effectiveLocations: payload.effective_locations,\n sql: payload.sql,\n };\n },\n addWidgetToLayout: async (input) => {\n await api.json<WidgetDocumentPayload>(\n `${base}/${id(input.dashboardId)}/layout/${id(input.widgetId)}/place`,\n { method: \"POST\" },\n );\n },\n removeWidgetFromLayout: async (input) => {\n await api.json<WidgetDocumentPayload>(\n `${base}/${id(input.dashboardId)}/layout/${id(input.widgetId)}/unplace`,\n { method: \"POST\" },\n );\n },\n };\n}\n\nexport interface HttpManagementOptions extends HttpTransportOptions {\n /** The reports prefix; defaults to `${baseUrl}/reports`. */\n readonly reportsUrl?: string;\n /** Route groups the host serves; the matching optional methods are omitted otherwise. */\n readonly features?: {\n /** `DELETE {baseUrl}/{id}`. */\n readonly delete?: boolean;\n /** `GET {baseUrl}/principals?q=`. */\n readonly principals?: boolean;\n /** `GET {reportsUrl}/formats` and `POST {reportsUrl}/{id}/{format}`. */\n readonly reports?: boolean;\n };\n}\n\ninterface ListingPayload {\n readonly slug?: string;\n readonly dashboard_id?: string;\n readonly name: string;\n readonly description: string | null;\n readonly visibility: string;\n readonly owner_name: string | null;\n readonly permission: string;\n readonly can_read?: boolean;\n readonly can_write: boolean;\n readonly is_owner: boolean;\n readonly shared_with_count?: number;\n readonly updated_at: string | null;\n}\n\ninterface DetailPayload extends ListingPayload {\n readonly shares: readonly {\n readonly principal_id: string;\n readonly permission: string;\n readonly display_name: string | null;\n }[];\n readonly can_publish?: boolean;\n}\n\nfunction summary(payload: ListingPayload): DashboardSummary {\n return {\n dashboardId: payload.slug ?? payload.dashboard_id ?? \"\",\n name: payload.name,\n description: payload.description,\n visibility: payload.visibility,\n ownerName: payload.owner_name,\n permission: payload.permission,\n canRead: payload.can_read ?? true,\n canWrite: payload.can_write,\n isOwner: payload.is_owner,\n sharedWithCount: payload.shared_with_count ?? 0,\n updatedAt: payload.updated_at,\n };\n}\n\nfunction detail(payload: DetailPayload): DashboardDetail {\n return {\n ...summary(payload),\n shares: payload.shares.map((share) => ({\n principalId: share.principal_id,\n permission: share.permission,\n displayName: share.display_name,\n })),\n canPublish: payload.can_publish ?? payload.is_owner,\n };\n}\n\nfunction filenameOf(response: Response, fallback: string): string {\n const header = response.headers.get(\"content-disposition\") ?? \"\";\n const utf8 = /filename\\*=UTF-8''([^;]+)/i.exec(header);\n if (utf8?.[1] !== undefined) return decodeURIComponent(utf8[1]);\n const plain = /filename=\"?([^\";]+)\"?/i.exec(header);\n return plain?.[1] ?? fallback;\n}\n\n/**\n * Listing, detail, create, sharing, visibility and reports over the route\n * shape both example hosts serve: `GET/POST {baseUrl}`, `GET {baseUrl}/{id}`,\n * `POST {baseUrl}/{id}/shares|shares/revoke|visibility`, `PATCH {baseUrl}/{id}`,\n * `POST {baseUrl}/{id}/copy`, plus the optional groups in `features`.\n */\nexport function createHttpManagementTransport(\n options: HttpManagementOptions,\n): DashboardManagementTransport {\n const api = http(options);\n const id = encodeURIComponent;\n const base = options.baseUrl;\n const reports = options.reportsUrl ?? `${base}/reports`;\n const features = options.features ?? {};\n const transport: DashboardManagementTransport = {\n listDashboards: async (input) =>\n (await api.json<ListingPayload[]>(base, signalOf(input.signal))).map(\n summary,\n ),\n loadDashboard: async (input) =>\n detail(\n await api.json<DetailPayload>(\n `${base}/${id(input.dashboardId)}`,\n signalOf(input.signal),\n ),\n ),\n createDashboard: async (input) =>\n summary(\n await api.json<ListingPayload>(base, {\n method: \"POST\",\n body: JSON.stringify({\n name: input.name,\n description: input.description,\n slug: input.dashboardId ?? null,\n spec_yaml: input.specYaml ?? \"\",\n visibility: input.visibility ?? \"personal\",\n }),\n }),\n ),\n replaceShares: async (input) =>\n detail(\n await api.json<DetailPayload>(\n `${base}/${id(input.dashboardId)}/shares`,\n {\n method: \"POST\",\n body: JSON.stringify({\n grants: input.grants.map((grant) => ({\n principal_id: grant.principalId,\n permission: grant.permission,\n })),\n }),\n },\n ),\n ),\n revokeShare: async (input) =>\n detail(\n await api.json<DetailPayload>(\n `${base}/${id(input.dashboardId)}/shares/revoke`,\n {\n method: \"POST\",\n body: JSON.stringify({ principal_id: input.principalId }),\n },\n ),\n ),\n setVisibility: async (input) =>\n detail(\n await api.json<DetailPayload>(\n `${base}/${id(input.dashboardId)}/visibility`,\n {\n method: \"POST\",\n body: JSON.stringify({ visibility: input.visibility }),\n },\n ),\n ),\n };\n if (features.delete === true) {\n transport.deleteDashboard = async (input) => {\n await api.json<undefined>(`${base}/${id(input.dashboardId)}`, {\n method: \"DELETE\",\n });\n };\n }\n if (features.principals === true) {\n transport.searchPrincipals = async (input) =>\n (\n await api.json<\n { principal_id: string; display_name: string; detail?: string }[]\n >(\n `${base}/principals?q=${encodeURIComponent(input.query)}`,\n signalOf(input.signal),\n )\n ).map((principal) => ({\n principalId: principal.principal_id,\n displayName: principal.display_name,\n ...(principal.detail === undefined ? {} : { detail: principal.detail }),\n }));\n }\n if (features.reports !== false) {\n transport.listReportFormats = async (input) =>\n (\n await api.json<{ format: string; label: string; mime_type: string }[]>(\n `${reports}/formats`,\n signalOf(input.signal),\n )\n ).map((format) => ({\n format: format.format,\n label: format.label,\n mimeType: format.mime_type,\n }));\n transport.downloadReport = async (input) => {\n const response = await api.raw(\n `${reports}/${id(input.dashboardId)}/${id(input.format)}`,\n {\n method: \"POST\",\n body: JSON.stringify({ filters: input.filters, pivot_expand: {} }),\n },\n );\n if (!response.ok) throw new Error(await httpRefusal(response));\n const blob = await response.blob();\n return {\n blob,\n filename: filenameOf(response, `${input.dashboardId}.${input.format}`),\n format: input.format,\n mimeType: response.headers.get(\"content-type\") ?? blob.type,\n };\n };\n }\n return transport;\n}\n","/**\n * The one-line React entry points. `BideuxDashboard` is the whole dashboard\n * page (reader, edit mode, editors, sharing, exports) and `BideuxDashboardList`\n * the dashboards page, each composed from the same providers and ports a host\n * can still assemble by hand. Every piece is a prop: give a `baseUrl` and the\n * fetch transports are built for you, give your own transports and they win.\n */\nimport { useMemo } from \"react\";\n\nimport {\n DashboardList,\n DashboardWorkspace,\n} from \"@dlh.io/bideux-dashboard-react\";\nimport type {\n AuthoringTransport,\n DashboardListProps,\n DashboardManagementTransport,\n DashboardTransport,\n DashboardWorkspaceProps,\n} from \"@dlh.io/bideux-dashboard-react\";\n\nimport { createDefaultRenderers } from \"../renderers/index.js\";\nimport type { DefaultRenderersOptions } from \"../renderers/index.js\";\nimport {\n createHttpAuthoringTransport,\n createHttpDashboardTransport,\n createHttpManagementTransport,\n} from \"../transports.js\";\nimport type { HttpManagementOptions } from \"../transports.js\";\n\n/** How the component reaches the host's API when no transport is given. */\nexport interface BideuxHttpOptions extends HttpManagementOptions {\n /** Set to false for a read only page that never builds an authoring transport. */\n readonly authoring?: boolean;\n}\n\ntype WorkspaceRest = Omit<\n DashboardWorkspaceProps,\n \"transport\" | \"authoringTransport\" | \"management\" | \"renderers\"\n>;\n\nexport interface BideuxDashboardProps extends WorkspaceRest {\n /** The dashboards prefix, for example `/api/custom-dashboards`; the transports are built from it. */\n baseUrl?: string | undefined;\n /** Everything about the HTTP client: fetch, prepare, query, reports URL, features. */\n http?: Omit<BideuxHttpOptions, \"baseUrl\"> | undefined;\n /** Custom clients; each one given replaces the HTTP one for that role. */\n transport?: DashboardTransport | undefined;\n authoringTransport?: AuthoringTransport | undefined;\n management?: DashboardManagementTransport | undefined;\n /** Widget renderers; defaults to ECharts, Tabulator, RevoGrid and the DOM renderer. */\n renderers?: DashboardWorkspaceProps[\"renderers\"];\n /** Theme and overrides for the default renderers when `renderers` is not given. */\n rendererOptions?: DefaultRenderersOptions | undefined;\n}\n\nfunction useHttp(\n baseUrl: string | undefined,\n http: Omit<BideuxHttpOptions, \"baseUrl\"> | undefined,\n) {\n return useMemo(() => {\n if (baseUrl === undefined) return null;\n const options: BideuxHttpOptions = { ...http, baseUrl };\n return {\n reader: createHttpDashboardTransport(options),\n authoring:\n options.authoring === false\n ? undefined\n : createHttpAuthoringTransport(options),\n management: createHttpManagementTransport(options),\n };\n }, [baseUrl, http]);\n}\n\nfunction missing(name: string): never {\n throw new Error(\n `BideuxDashboard needs either baseUrl or a ${name} transport.`,\n );\n}\n\nexport function BideuxDashboard({\n baseUrl,\n http,\n transport,\n authoringTransport,\n management,\n renderers,\n rendererOptions,\n ...rest\n}: BideuxDashboardProps) {\n const built = useHttp(baseUrl, http);\n const factories = useMemo(\n () => renderers ?? createDefaultRenderers(rendererOptions),\n [renderers, rendererOptions],\n );\n const reader = transport ?? built?.reader ?? missing(\"dashboard\");\n const manager = management ?? built?.management ?? missing(\"management\");\n const author = authoringTransport ?? built?.authoring;\n return (\n <DashboardWorkspace\n {...rest}\n management={manager}\n renderers={factories}\n transport={reader}\n {...(author === undefined ? {} : { authoringTransport: author })}\n />\n );\n}\n\nexport interface BideuxDashboardListProps\n extends Omit<DashboardListProps, \"management\"> {\n baseUrl?: string | undefined;\n http?: Omit<HttpManagementOptions, \"baseUrl\"> | undefined;\n management?: DashboardManagementTransport | undefined;\n}\n\nexport function BideuxDashboardList({\n baseUrl,\n http,\n management,\n ...rest\n}: BideuxDashboardListProps) {\n const built = useMemo(\n () =>\n baseUrl === undefined\n ? null\n : createHttpManagementTransport({ ...http, baseUrl }),\n [baseUrl, http],\n );\n const manager = management ?? built ?? missing(\"management\");\n return <DashboardList {...rest} management={manager} />;\n}\n"]}
|