@fayz-ai/plugin-menu 0.10.6 → 0.10.8

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context.tsx","../src/lib/availability.ts","../src/lib/extract-transport.ts","../src/lib/images.ts","../src/lib/agent-surface.ts","../src/components/SectionCard.tsx","../src/types.ts","../src/components/ScheduleEditor.tsx","../src/components/MenuRailPage.tsx","../src/components/ItemRailPage.tsx","../src/components/DraftSectionCard.tsx","../src/components/MenuPreview.tsx","../src/views/MenuManagerView.tsx","../src/views/MenuPage.tsx"],"names":["useTranslation","jsxs","jsx","Switch","useState","Button","useEffect","RightRailPage","SheetBody","Input","SheetFooter","Trash2","useMemo","Dropdown","DropdownTrigger","DropdownContent","DropdownItem","Pencil","Copy","DropdownSeparator","Plus","Sparkles","UtensilsCrossed"],"mappings":";;;;;;;;;;;AAgCA,IAAM,GAAA,GAAM,oBAAuE,UAAU,CAAA;AAEtF,IAAM,sBAAsB,GAAA,CAAI,eAAA;AAChC,IAAM,gBAAgB,GAAA,CAAI,SAAA;AACF,GAAA,CAAI;AAC5B,IAAM,eAAe,GAAA,CAAI,QAAA;ACvBzB,SAAS,UAAU,KAAA,EAA0C;AAClE,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AACrD,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAC/B,EAAA,IAAI,KAAA,GAAQ,EAAA,IAAM,OAAA,GAAU,EAAA,EAAI,OAAO,IAAA;AACvC,EAAA,OAAO,QAAQ,EAAA,GAAK,OAAA;AACtB;AAEO,SAAS,kBAAkB,YAAA,EAAqD;AACrF,EAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAC1B,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM,IAAG,GAAI,YAAA;AACvC,EAAA,OAAA,CAAQ,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,KAAM,CAAC,KAAA,IAAS,CAAC,GAAA,IAAO,CAAC,IAAA,IAAQ,CAAC,EAAA;AACrE;AAGO,SAAS,WAAA,CAAY,YAAA,EAA4C,EAAA,mBAAW,IAAI,MAAK,EAAY;AACtG,EAAA,IAAI,iBAAA,CAAkB,YAAY,CAAA,EAAG,OAAO,IAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,YAAA;AAEb,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,EAAA,CAAG,WAAA,EAAa,IAAI,MAAA,CAAO,EAAA,CAAG,QAAA,EAAS,GAAI,CAAC,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAC1H,EAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,OAAA,GAAU,IAAA,CAAK,MAAM,OAAO,KAAA;AAC7C,EAAA,IAAI,IAAA,CAAK,EAAA,IAAM,OAAA,GAAU,IAAA,CAAK,IAAI,OAAO,KAAA;AAEzC,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AAClC,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA;AAC9B,EAAA,MAAM,aAAa,EAAA,CAAG,QAAA,EAAS,GAAI,EAAA,GAAK,GAAG,UAAA,EAAW;AACtD,EAAA,MAAM,SAAA,GAAY,KAAA,KAAU,IAAA,IAAQ,GAAA,KAAQ,QAAQ,GAAA,IAAO,KAAA;AAI3D,EAAA,MAAM,UAAA,GAAa,SAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAA,GAAa,KAAA,GAAA,CAC1D,EAAA,CAAG,MAAA,EAAO,GAAI,CAAA,IAAK,CAAA,GACpB,EAAA,CAAG,MAAA,EAAO;AAEd,EAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,CAAC,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG,OAAO,KAAA;AAEjF,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,GAAA,KAAQ,IAAA,EAAM,OAAO,IAAA;AAC3C,EAAA,OAAO,YACH,UAAA,IAAc,KAAA,IAAS,aAAa,GAAA,GACpC,UAAA,IAAc,SAAS,UAAA,GAAa,GAAA;AAC1C;AAYO,SAAS,cAAc,MAAA,EAA0B;AACtD,EAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,cAAA,CAAe,QAAQ,EAAE,OAAA,EAAS,SAAS,CAAA;AAEtE,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,GAAE,EAAG,CAAC,CAAA,EAAG,CAAA,KACnC,SAAA,CAAU,MAAA,CAAO,IAAI,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAC,CAAA;AACnE;AAMO,SAAS,oBAAA,CACd,YAAA,EACA,MAAA,EACA,WAAA,EACQ;AACR,EAAA,IAAI,iBAAA,CAAkB,YAAY,CAAA,EAAG,OAAO,WAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,YAAA;AACb,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC7D,IAAA,MAAM,MAAA,GAAS,cAAc,MAAM,CAAA;AACnC,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAElD,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,CAAC,GAAA,EAAK,CAAA,KAAM,CAAA,KAAM,CAAA,IAAK,GAAA,KAAQ,MAAA,CAAO,CAAA,GAAI,CAAC,IAAI,CAAC,CAAA;AAChF,IAAA,KAAA,CAAM,IAAA,CAAK,UAAA,IAAc,MAAA,CAAO,MAAA,GAAS,CAAA,GACrC,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,GAAA,EAAM,OAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAC,CAAC,CAAA,CAAA,GAC3D,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,MAAA,EAAI,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAAA,OAAA,IACzD,KAAK,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAE3D,EAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,EAAA,QAAU,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,IAAA,IAAQ,QAAG,CAAA,QAAA,EAAM,IAAA,CAAK,EAAA,IAAM,QAAG,CAAA,CAAE,CAAA;AAE9E,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,QAAK,CAAA,GAAI,WAAA;AAChD;AC9EO,SAAS,qBAAqB,OAAA,EAAoD;AAGvF,EAAA,MAAM,SAAS,yBAAA,EAA0B;AACzC,EAAA,IAAI,CAAC,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,OAAO,IAAA;AACvC,EAAA,MAAM,YAAA,GAAwC,cAAA;AAE9C,EAAA,OAAO,OAAO,QAAkB,IAAA,KAA0C;AACxE,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,MAAA,CAAO,SAAA,CAAU,OAAO,YAAA,EAAc;AAAA,MAClE,IAAA,EAAM,EAAE,MAAA,EAAQ,IAAA;AAAK,KACtB,CAAA;AACD,IAAA,IAAI,KAAA,EAAO;AAGT,MAAA,MAAM,MAAA,GAAU,MAAM,WAAA,CAAY,KAAK,KAAM,KAAA,CAAM,OAAA;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,MAAA,IAAU,wBAAwB,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,oBAAoB,IAAI,CAAA;AAAA,EACjC,CAAA;AACF;AAEA,eAAe,YAAY,KAAA,EAAoC;AAC7D,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,EAAO,OAAA,EAAS,IAAA,IAAO;AAC1C,IAAA,OAAO,OAAO,IAAA,EAAM,KAAA,KAAU,QAAA,GAAW,KAAK,KAAA,GAAQ,IAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACzCA,eAAsB,cAAA,CAAe,MAAY,OAAA,EAA6C;AAC5F,EAAA,MAAM,YAAA,GAAwC,IAAA;AAC9C,EAAA,MAAM,OAAA,GAA8B,IAAA;AAEpC,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAC9E,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAQ,KAAK,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAS,KAAK,CAAA;AAE/C,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,aAAA,CAAc,IAAI,CAAA;AACvC,EAAA,OAAA,CAAQ,SAAA,CAAU,MAAA,EAA6B,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AAClE,EAAA,OAAO,MAAA,CAAO,SAAA,CAAU,YAAA,EAAc,OAAO,CAAA;AAC/C;AAEA,eAAe,UAAU,IAAA,EAAqD;AAC5E,EAAA,IAAI,OAAO,sBAAsB,UAAA,EAAY;AAC3C,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,kBAAkB,IAAI,CAAA;AAAA,IACrC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,MAAM,aAAA,CAAc,IAAI,CAAA;AACpC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,EAAM;AACxB,IAAA,KAAA,CAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAClC,IAAA,KAAA,CAAM,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,0BAA0B,CAAC,CAAA;AAClE,IAAA,KAAA,CAAM,GAAA,GAAM,GAAA;AAAA,EACd,CAAC,CAAA;AACH;AAEO,SAAS,cAAc,IAAA,EAA6B;AACzD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,IAAA,MAAA,CAAO,SAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AACnD,IAAA,MAAA,CAAO,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,yBAAyB,CAAC,CAAA;AAClE,IAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAAA,EAC3B,CAAC,CAAA;AACH;ACpCA,IAAM,YAAA,GAAe,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA,4IAAA,CAAA;AA8CrB,SAAS,KACP,EAAA,EACA,IAAA,EACA,aACA,UAAA,EACA,QAAA,EACA,OAA2B,SAAA,EACb;AACd,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,IAAA;AAAA,IACA,WAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,QAAA,EAAS;AAAA,IACnD,SAAA,EAAW,EAAE,KAAA,EAAO,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA,IAI7B,oBAAA,EAAsB,KAAA;AAAA,IACtB,UAAA,EAAY,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAQ,MAAA;AAAO,GAChD;AACF;AAEO,SAAS,oBAAoB,IAAA,EAAkC;AAGpE,EAAA,MAAM,YAAA,GAAe,QAAkC,MAAM;AAC3D,IAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAA0C;AAC7D,MAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,IAAQ,EAAE,CAAA;AACpC,MAAA,OAAO,IAAA,CAAK,SAAS,IAAA,CAAK,CAAC,MAAM,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,KAAM,GAAG,CAAA,IACzD,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,aAAA,CAAc,EAAE,IAAI,CAAA,CAAE,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,IACpE,CAAA;AACA,IAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,EAAyB,IAAA,KAA2C;AAC5F,MAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,IAAQ,EAAE,CAAA;AACpC,MAAA,OAAO,KAAA,EAAO,SAAS,IAAA,CAAK,CAAC,MAAM,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,KAAM,GAAG,CAAA,IAC3D,OAAO,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,aAAA,CAAc,EAAE,IAAI,CAAA,CAAE,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,IACtE,CAAA;AACA,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,EAAyB,WAAA,EAAqB,QAAA,KAAqB;AACpF,MAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,KAAA,EAAO,WAAW,CAAA;AACnD,MAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,MAAA,MAAM,GAAA,GAAM,aAAA,CAAc,QAAA,IAAY,EAAE,CAAA;AACxC,MAAA,MAAM,IAAA,GAAO,QAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,KAAM,GAAG,KAC/D,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,aAAA,CAAc,EAAE,IAAI,CAAA,CAAE,QAAA,CAAS,GAAG,CAAC,CAAA;AAClE,MAAA,OAAO,IAAA,GAAO,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,MAAA;AAAA,IACpC,CAAA;AACA,IAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAA4E;AAC5F,MAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,IAAQ,EAAE,CAAA;AACpC,MAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAChD,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,CAAC,MAAM,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,KAAM,GAAG,KACvD,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,aAAA,CAAc,EAAE,IAAI,CAAA,CAAE,QAAA,CAAS,GAAG,CAAC,CAAA;AAC1D,MAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,IAAA,CAAK,EAAE,CAAA,EAAE;AAAA,IAC9E,CAAA;AAEA,IAAA,MAAM,KAAA,GAA4B;AAAA,MAChC;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,UAAK,6BAAA;AAAA,UAA+B,mBAAA;AAAA,UACxC,yEAAA;AAAA,UACA,EAAE,IAAA,EAAM,EAAE,MAAM,QAAA,EAAU,WAAA,EAAa,uBAAgB,EAAE;AAAA,UAAG,CAAC,MAAM;AAAA,SAAC;AAAA,QACtE,OAAA,EAAS,OAAO,EAAE,IAAA,EAAK,KAAW;AAChC,UAAA,MAAM,UAAU,MAAM,IAAA,CAAK,QAAQ,aAAA,CAAc,MAAA,CAAO,IAAI,CAAC,CAAA;AAC7D,UAAA,OAAO,OAAA,GAAU,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,QAAQ,IAAA,EAAK,GAAI,EAAE,KAAA,EAAO,qBAAA,EAAsB;AAAA,QACxF;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,UAAK,6BAAA;AAAA,UAA+B,mBAAA;AAAA,UACxC,iDAAA;AAAA,UACA,EAAE,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,IAAY,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,UAAG,CAAC,eAAe,SAAS;AAAA,SAAC;AAAA,QAC9F,OAAA,EAAS,OAAO,EAAE,WAAA,EAAa,SAAQ,KAAW;AAChD,UAAA,MAAM,OAAA,GAAU,YAAY,WAAW,CAAA;AACvC,UAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAE,KAAA,EAAO,qBAAqB,WAAA,EAAY;AAC/D,UAAA,MAAM,KAAK,OAAA,CAAQ,aAAA,CAAc,QAAQ,EAAA,EAAI,MAAA,CAAO,OAAO,CAAC,CAAA;AAC5D,UAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,QACpB;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,UAAK,+BAAA;AAAA,UAAiC,qBAAA;AAAA,UAC1C,yFAAA;AAAA,UACA,EAAE,YAAA,EAAc,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,WAAA,EAAa,sCAAA,EAAiC,EAAE;AAAA,UAC5G,CAAC,cAAc;AAAA,SAAC;AAAA,QAClB,OAAA,EAAS,OAAO,EAAE,YAAA,EAAa,KAAW;AACxC,UAAA,MAAM,GAAA,GAAO,YAAA,CAA0B,GAAA,CAAI,CAAC,IAAA,KAAS,WAAA,CAAY,IAAI,CAAA,EAAG,EAAE,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAC1F,UAAA,IAAI,IAAI,MAAA,KAAW,IAAA,CAAK,QAAA,CAAS,MAAA,SAAe,EAAE,KAAA,EAAO,kBAAA,EAAoB,QAAA,EAAU,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,EAAE;AACxH,UAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,GAAG,CAAA;AACtC,UAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,QACpB;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,UAAK,0BAAA;AAAA,UAA4B,gBAAA;AAAA,UACrC,gEAAA;AAAA,UACA;AAAA,YACE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACvB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACxB,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,wBAAA,EAAmB;AAAA,YAC/D,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA;AAAS,WAChC;AAAA,UAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,aAAa;AAAA,SAAC;AAAA,QACrC,SAAS,OAAO,EAAE,MAAM,KAAA,EAAO,WAAA,EAAa,aAAY,KAAW;AACjE,UAAA,MAAM,OAAA,GAAU,YAAY,WAAW,CAAA;AACvC,UAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAE,OAAO,mBAAA,EAAqB,WAAA,EAAa,SAAA,EAAW,IAAA,CAAK,SAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,EAAE;AAC5G,UAAA,MAAM,UAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,QAAQ,EAAA,EAAI;AAAA,YACxD,IAAA,EAAM,OAAO,IAAI,CAAA;AAAA,YAAG,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,IAAK,CAAA;AAAA,YAAG,WAAA,EAAa,WAAA,GAAc,MAAA,CAAO,WAAW,CAAA,GAAI;AAAA,WACjG,CAAA;AACD,UAAA,OAAO,OAAA,GAAU,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,QAAQ,IAAA,EAAK,GAAI,EAAE,KAAA,EAAO,kBAAA,EAAmB;AAAA,QAClF;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,UAAK,0BAAA;AAAA,UAA4B,gBAAA;AAAA,UACrC,uEAAA;AAAA,UACA;AAAA,YACE,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC3B,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACxB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,WAAA,EAAY;AAAA,YACjD,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC9B,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,WAAA,EAAa,UAAA,EAAY,QAAQ,CAAA;AAAE,WACtE;AAAA,UAAG,CAAC,UAAU;AAAA,SAAC;AAAA,QACjB,OAAA,EAAS,OAAO,EAAE,QAAA,EAAU,OAAO,IAAA,EAAM,WAAA,EAAa,QAAO,KAAW;AACtE,UAAA,MAAM,KAAA,GAAQ,SAAS,QAAQ,CAAA;AAC/B,UAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,KAAA,EAAO,kBAAkB,QAAA,EAAS;AACvD,UAAA,IAAI,KAAA,KAAU,MAAA,IAAa,IAAA,KAAS,MAAA,IAAa,gBAAgB,MAAA,EAAW;AAC1E,YAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,KAAA,CAAM,KAAK,EAAA,EAAI;AAAA,cAC3C,KAAA,EAAO,KAAA,KAAU,MAAA,GAAY,MAAA,CAAO,KAAK,CAAA,GAAI,MAAA;AAAA,cAC7C,IAAA,EAAM,IAAA,KAAS,MAAA,GAAY,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AAAA,cAC1C,WAAA,EAAa,WAAA,KAAgB,MAAA,GAAY,MAAA,CAAO,WAAW,CAAA,GAAI;AAAA,aAChE,CAAA;AAAA,UACH;AACA,UAAA,IAAI,MAAA,QAAc,IAAA,CAAK,OAAA,CAAQ,cAAc,KAAA,CAAM,IAAA,CAAK,IAAI,MAAwB,CAAA;AACpF,UAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,QACpB;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,UAAK,wBAAA;AAAA,UAA0B,cAAA;AAAA,UACnC,4DAAA;AAAA,UACA,EAAE,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,IAAY,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,UAAG,CAAC,YAAY,eAAe;AAAA,SAAC;AAAA,QACpG,OAAA,EAAS,OAAO,EAAE,QAAA,EAAU,eAAc,KAAW;AACnD,UAAA,MAAM,KAAA,GAAQ,SAAS,QAAQ,CAAA;AAC/B,UAAA,IAAI,CAAC,KAAA,EAAO,SAAA,SAAkB,EAAE,KAAA,EAAO,oBAAoB,QAAA,EAAS;AACpE,UAAA,MAAM,OAAA,GAAU,YAAY,aAAa,CAAA;AACzC,UAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAE,KAAA,EAAO,qBAAqB,aAAA,EAAc;AACjE,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,KAAc,OAAA,CAAQ,EAAE,CAAA,CAAE,MAAA;AACzE,UAAA,MAAM,IAAA,CAAK,QAAQ,QAAA,CAAS,KAAA,CAAM,UAAU,EAAA,EAAI,OAAA,CAAQ,IAAI,MAAM,CAAA;AAClE,UAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,QACpB;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,UAAK,0BAAA;AAAA,UAA4B,YAAA;AAAA,UACrC,8GAAA;AAAA,UACA;AAAA,YACE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACvB,gBAAA,EAAkB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,mDAAA,EAA2C;AAAA,YAC7F,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,WAAA,EAAa,8BAAA,EAAuB;AAAA,YACtF,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,OAAA,EAAQ;AAAA,YAC9C,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,OAAA;AAAQ,WAC9C;AAAA,UAAG,CAAC,MAAM;AAAA,SAAC;AAAA,QACb,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,kBAAkB,IAAA,EAAM,KAAA,EAAO,KAAI,KAAW;AACpE,UAAA,IAAI,gBAAA,IAAoB,KAAK,IAAA,EAAM;AACjC,YAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAK,IAAA,CAAK,EAAA,EAAI,MAAA,CAAO,IAAI,CAAC,CAAA;AACxE,YAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAM,IAAA,CAAK,IAAA,EAAM,MAAM,kCAAA,EAA6B;AAAA,UACzE;AACA,UAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,EAAE,IAAA,EAAM,MAAA,CAAO,IAAI,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA;AACtF,UAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,QACxC;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,UAAK,6BAAA;AAAA,UAA+B,mBAAA;AAAA,UACxC,0NAAA;AAAA,UACA,EAAC;AAAA,UAAG,EAAC;AAAA,UAAG;AAAA,SAAM;AAAA,QAChB,SAAS,YAAY;AACnB,UAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,YAAA,OAAO,EAAE,KAAA,EAAO,uBAAA,EAAyB,OAAA,EAAS,wGAAA,EAAmG;AAAA,UACvJ;AACA,UAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAC3B,UAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAM,iIAAA,EAAiH;AAAA,QACzJ;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,UAAK,gCAAA;AAAA,UAAkC,qBAAA;AAAA,UAC3C,wGAAA;AAAA,UACA;AAAA,YACE,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC9B,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC3B,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACxB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,WAAA,EAAY;AAAA,YACjD,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA;AAAS,WAChC;AAAA,UAAG,CAAC,eAAe,UAAU;AAAA,SAAC;AAAA,QAChC,OAAA,EAAS,OAAO,EAAE,WAAA,EAAa,UAAU,KAAA,EAAO,IAAA,EAAM,aAAY,KAAW;AAC3E,UAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,aAAa,QAAQ,CAAA;AACzD,UAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,KAAA,EAAO,wBAAwB,QAAA,EAAS;AAC7D,UAAA,IAAA,CAAK,QAAQ,eAAA,CAAgB,KAAA,CAAM,QAAQ,GAAA,EAAK,KAAA,CAAM,KAAK,GAAA,EAAK;AAAA,YAC9D,KAAA,EAAO,KAAA,KAAU,MAAA,GAAY,MAAA,CAAO,KAAK,CAAA,GAAI,MAAA;AAAA,YAC7C,IAAA,EAAM,IAAA,KAAS,MAAA,GAAY,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AAAA,YAC1C,WAAA,EAAa,WAAA,KAAgB,MAAA,GAAY,MAAA,CAAO,WAAW,CAAA,GAAI;AAAA,WAChE,CAAA;AACD,UAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,QACpB;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,UAAK,gCAAA;AAAA,UAAkC,qBAAA;AAAA,UAC3C,2DAAA;AAAA,UACA,EAAE,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,IAAY,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,UAAG,CAAC,eAAe,UAAU;AAAA,SAAC;AAAA,QAChG,OAAA,EAAS,OAAO,EAAE,WAAA,EAAa,UAAS,KAAW;AACjD,UAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,aAAa,QAAQ,CAAA;AACzD,UAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,KAAA,EAAO,wBAAwB,QAAA,EAAS;AAC7D,UAAA,IAAA,CAAK,QAAQ,eAAA,CAAgB,KAAA,CAAM,QAAQ,GAAA,EAAK,KAAA,CAAM,KAAK,GAAG,CAAA;AAC9D,UAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,QACpB;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,UAAK,mCAAA;AAAA,UAAqC,wBAAA;AAAA,UAC9C,oHAAA;AAAA,UACA;AAAA,YACE,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC9B,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC1B,mBAAA,EAAqB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,yDAAA;AAAoD,WAC1G;AAAA,UAAG,CAAC,aAAa;AAAA,SAAC;AAAA,QACpB,SAAS,OAAO,EAAE,WAAA,EAAa,OAAA,EAAS,qBAAoB,KAAW;AACrE,UAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,IAAA,CAAK,KAAA,EAAO,WAAW,CAAA;AACxD,UAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAE,KAAA,EAAO,2BAA2B,WAAA,EAAY;AACrE,UAAA,MAAM,MAAA,GAAS,mBAAA,GAAsB,WAAA,CAAY,mBAAmB,CAAA,GAAI,MAAA;AACxE,UAAA,IAAI,uBAAuB,CAAC,MAAA,SAAe,EAAE,KAAA,EAAO,qBAAqB,mBAAA,EAAoB;AAC7F,UAAA,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,OAAA,CAAQ,GAAA,EAAK;AAAA,YAC3C,IAAA,EAAM,OAAA,GAAU,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA;AAAA,YAClC,iBAAiB,MAAA,EAAQ;AAAA,WAC1B,CAAA;AACD,UAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,QACpB;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,UAAK,2BAAA;AAAA,UAA6B,iBAAA;AAAA,UACtC,iFAAA;AAAA,UACA,EAAC;AAAA,UAAG;AAAC,SAAC;AAAA,QACR,SAAS,YAAY;AACnB,UAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,EAAE,OAAO,UAAA,EAAW;AAC5C,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAC9C,UAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,GAAG,MAAA,EAAO;AAAA,QAC/B;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,UAAK,4BAAA;AAAA,UAA8B,kBAAA;AAAA,UACvC,qDAAA;AAAA,UACA,EAAC;AAAA,UAAG;AAAC,SAAC;AAAA,QACR,SAAS,YAAY;AACnB,UAAA,IAAA,CAAK,QAAQ,YAAA,EAAa;AAC1B,UAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,QACpB;AAAA;AACF,KACF;AAEA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,cAAA;AAAA,MACJ,QAAA,EAAU,MAAA;AAAA;AAAA;AAAA;AAAA,MAIV,YAAA,EAAc,YAAA;AAAA,MACd,KAAA;AAAA,MACA,UAAU,OAAO;AAAA,QACf,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,IAAA,IAAQ,aAAA;AAAA,QAC1B,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,KAAK,IAAA,EAAM,IAAA;AAAA,UACvB,UAAU,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,UACtC,sBAAsB,IAAA,CAAK,YAAA;AAAA;AAAA;AAAA,UAG3B,KAAA,EAAO,KAAK,KAAA,GAAQ;AAAA,YAClB,MAAA,EAAQ,KAAK,KAAA,CAAM,MAAA;AAAA,YACnB,KAAA,EAAO,KAAK,KAAA,CAAM,KAAA;AAAA,YAClB,UAAU,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,cAC9C,MAAM,OAAA,CAAQ,IAAA;AAAA,cACd,WAAA,EAAa,OAAA,CAAQ,eAAA,GACjB,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,OAAA,CAAQ,eAAe,GAAG,IAAA,GAC7D,MAAA;AAAA,cACJ,OAAO,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,UAAU,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA,EAAO,WAAA,EAAa,IAAA,CAAK,aAAY,CAAE;AAAA,aAC5G,CAAE,CAAA;AAAA,YACF,iBAAA,EAAmB,KAAK,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAC,OAAA,KAC9C,QAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,UAAU,CAAC,CAAA,CAAE,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAC;AAAA,WAC7E,GAAI,MAAA;AAAA,UACJ,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,YACxC,MAAM,OAAA,CAAQ,IAAA;AAAA,YACd,KAAA,EAAO,IAAA,CAAK,UAAA,CACT,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,OAAA,CAAQ,EAAE,CAAA,CACxC,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,cAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAE,MAAM,CAAA;AACxC,cAAA,OAAO,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,aAAA,IAAiB,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,QAAO,GAAI,IAAA;AAAA,YACjG,CAAC,CAAA,CACA,MAAA,CAAO,OAAO;AAAA,WACnB,CAAE;AAAA;AACJ,OACF;AAAA,KACF;AAAA,EACF,GAAG,CAAC,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,EAAO,KAAK,QAAA,EAAU,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,WAAW,IAAA,CAAK,KAAA,EAAO,KAAK,YAAA,EAAc,IAAA,CAAK,OAAO,CAAC,CAAA;AAEvH,EAAA,eAAA,CAAgB,YAAY,CAAA;AAC9B;ACjUA,IAAM,YAAA,GAA+C;AAAA,EACnD,SAAA,EAAW,8CAAA;AAAA,EACX,QAAA,EAAU,sDAAA;AAAA,EACV,MAAA,EAAQ;AACV,CAAA;AAGA,SAAS,YAAY,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAO,EAKnD;AACD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,EAAE,CAAA;AAErC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,UAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,UAAA,QAAA,CAAS,MAAA,CAAO,KAAA,IAAS,CAAC,CAAC,CAAA;AAAG,UAAA,UAAA,CAAW,IAAI,CAAA;AAAA,QAAE,CAAA;AAAA,QACtF,SAAA,EAAW,CAAA,4EAAA,EAA+E,KAAA,GAAQ,uBAAA,GAA0B,aAAa,CAAA,CAAA;AAAA,QAExI,QAAA,EAAA,cAAA,CAAe,KAAA,IAAS,CAAA,EAAG,QAAQ;AAAA;AAAA,KACtC;AAAA,EAEJ;AAEA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,MAAM,SAAS,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAC,CAAA;AAC7C,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IAAK,MAAA,KAAW,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,EAC7E,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAO,KAAA;AAAA,MACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACxC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,MAClC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,MAAA,EAAO;AAC9B,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,UAAA,CAAW,KAAK,CAAA;AAAA,MAC1C,CAAA;AAAA,MACA,SAAA,EAAU;AAAA;AAAA,GACZ;AAEJ;AAEA,SAAS,OAAA,CAAQ,EAAE,SAAA,EAAW,IAAA,EAAM,UAAU,eAAA,EAAiB,SAAA,EAAW,OAAA,EAAS,QAAA,EAAS,EASzF;AACD,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,MAAM,EAAE,YAAY,SAAA,EAAW,UAAA,EAAY,WAAW,UAAA,EAAY,UAAA,KAAe,WAAA,CAAY;AAAA,IAC3F,IAAI,SAAA,CAAU,EAAA;AAAA,IACd,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,UAAU,SAAA;AAAU,GACtD,CAAA;AAED,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,aAAA,IAAiB,IAAA,CAAK,KAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,aAAA,KAAkB,MAAA,IAAa,UAAU,aAAA,KAAkB,IAAA;AAExF,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,KAAA,EAAO,EAAE,SAAA,EAAW,GAAA,CAAI,UAAU,QAAA,CAAS,SAAS,GAAG,UAAA,EAAW;AAAA,MAClE,SAAA,EAAW,kEAAkE,UAAA,GAAa,YAAA,GAAe,mBAAmB,CAAA,CAAA,EAAI,OAAA,GAAU,mCAAmC,EAAE,CAAA,CAAA;AAAA,MAE/K,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACE,GAAG,UAAA;AAAA,YACH,GAAG,SAAA;AAAA,YACJ,YAAA,EAAY,EAAE,uBAAuB,CAAA;AAAA,YACrC,SAAA,EAAU,kHAAA;AAAA,YAEV,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,SACpC;AAAA,wBAEA,GAAA,CAAC,SAAI,SAAA,EAAU,0FAAA,EACZ,eAAK,QAAA,mBACF,GAAA,CAAC,SAAI,GAAA,EAAK,IAAA,CAAK,UAAU,GAAA,EAAI,EAAA,EAAG,WAAU,4BAAA,EAA6B,CAAA,uBACtE,QAAA,EAAA,EAAS,SAAA,EAAU,wCAAuC,CAAA,EACjE,CAAA;AAAA,wBAEA,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,QAAA,CAAS,UAAA,CAAW,MAAM,SAAS,CAAA;AAAA,YAClD,SAAA,EAAU,0BAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EACb,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,6BAAA,EAAgC,IAAA,CAAK,MAAA,KAAW,WAAW,uBAAA,GAA0B,EAAE,CAAA,CAAA,EACrG,QAAA,EAAA,IAAA,CAAK,IAAA,EACR,CAAA;AAAA,gBACC,IAAA,CAAK,UAAA,oBAAc,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,4CAAA,EAA6C,CAAA;AAAA,gBAChF,IAAA,CAAK,WAAW,WAAA,oBACf,GAAA,CAAC,UAAK,SAAA,EAAW,CAAA,kDAAA,EAAqD,aAAa,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,EAC5F,QAAA,EAAA,IAAA,CAAK,WAAW,UAAA,GAAa,CAAA,CAAE,sBAAsB,CAAA,GAAI,CAAA,CAAE,qBAAqB,CAAA,EACnF;AAAA,eAAA,EAEJ,CAAA;AAAA,cACC,KAAK,WAAA,oBAAe,GAAA,CAAC,OAAE,SAAA,EAAU,4CAAA,EAA8C,eAAK,WAAA,EAAY;AAAA;AAAA;AAAA,SACnG;AAAA,wBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,KAAA;AAAA,cACP,QAAA;AAAA,cACA,MAAA,EAAQ,CAAC,IAAA,KAAS;AAGhB,gBAAA,IAAI,SAAA,WAAoB,mBAAA,CAAoB,SAAA,CAAU,IAAI,IAAA,KAAS,IAAA,CAAK,KAAA,GAAQ,MAAA,GAAY,IAAI,CAAA;AAAA,qBAC3F,QAAA,CAAS,WAAW,EAAE,GAAG,MAAM,KAAA,EAAO,IAAA,IAAQ,SAAS,CAAA;AAAA,cAC9D;AAAA;AAAA,WACF;AAAA,UACC,UAAA,oBACC,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,CAAA,CAAE,6BAA6B,CAAA,EAAG,SAAA,EAAU,+CAAA,EACtD,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAC9B;AAAA,SAAA,EAEJ,CAAA;AAAA,QAEC,eAAA,oBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+DAAA,EACb,QAAA,EAAA,IAAA,CAAK,aAAA,IAAiB,IAAA,GAAO,cAAA,CAAe,IAAA,CAAK,aAAA,EAAe,QAAQ,IAAI,QAAA,EAC/E,CAAA;AAAA,wBAGF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAO,IAAA,EAAK,IAAA,EAAK,SAAS,IAAA,CAAK,eAAA,EAAiB,iBAAiB,CAAC,CAAA,KAAM,SAAS,YAAA,CAAa,IAAA,CAAK,IAAI,iBAAA,EAAmB,CAAC,GAAG,KAAA,EAAO,CAAA,CAAE,kBAAkB,CAAA,EAAG,CAAA;AAAA,0BAC7J,GAAA,CAAC,UAAO,IAAA,EAAK,IAAA,EAAK,SAAS,IAAA,CAAK,oBAAA,EAAsB,iBAAiB,CAAC,CAAA,KAAM,SAAS,YAAA,CAAa,IAAA,CAAK,IAAI,sBAAA,EAAwB,CAAC,GAAG,KAAA,EAAO,CAAA,CAAE,uBAAuB,CAAA,EAAG;AAAA,SAAA,EAC9K,CAAA;AAAA,6BAEC,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,mBAAgB,OAAA,EAAO,IAAA,EACtB,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAO,WAAU,0FAAA,EAA2F,YAAA,EAAY,CAAA,CAAE,0BAA0B,GACnJ,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,SAAA,EAAU,GACtC,CAAA,EACF,CAAA;AAAA,0BACA,IAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,KAAA,EACrB,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,gBAAa,OAAA,EAAS,MAAM,SAAS,UAAA,CAAW,IAAA,EAAM,SAAS,CAAA,EAC9D,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAO,WAAU,kBAAA,EAAmB,CAAA;AAAA,cAAE,GAAA;AAAA,cAAE,EAAE,mBAAmB;AAAA,aAAA,EAChE,CAAA;AAAA,4BACA,IAAA,CAAC,gBAAa,OAAA,EAAS,MAAM,SAAS,eAAA,CAAgB,IAAA,EAAM,SAAA,CAAU,SAAS,CAAA,EAC7E,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,kBAAA,EAAmB,CAAA;AAAA,cAAE,GAAA;AAAA,cAAE,EAAE,wBAAwB;AAAA,aAAA,EACnE,CAAA;AAAA,4BACA,IAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,MAAM,QAAA,CAAS,eAAA,CAAgB,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,MAAA,KAAW,UAAA,GAAa,WAAA,GAAc,UAAU,CAAA,EAClH,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,kBAAA,EAAmB,CAAA;AAAA,cACrC,KAAK,MAAA,KAAW,UAAA,GAAa,EAAE,4BAA4B,CAAA,GAAI,EAAE,0BAA0B;AAAA,aAAA,EAC9F,CAAA;AAAA,4BACA,IAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,MAAM,QAAA,CAAS,YAAA,CAAa,IAAA,CAAK,EAAA,EAAI,YAAA,EAAc,CAAC,IAAA,CAAK,UAAU,CAAA,EACxF,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,kBAAA,EAAmB,CAAA;AAAA,cAClC,KAAK,UAAA,GAAa,CAAA,CAAE,wBAAwB,CAAA,GAAI,EAAE,sBAAsB;AAAA,aAAA,EAC3E,CAAA;AAAA,gCACC,iBAAA,EAAA,EAAkB,CAAA;AAAA,iCAGlB,YAAA,EAAA,EAAa,OAAA,EAAS,MAAM,QAAA,CAAS,gBAAA,CAAiB,SAAS,CAAA,EAC9D,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,kBAAA,EAAmB,CAAA;AAAA,cAAE,GAAA;AAAA,cAAE,EAAE,6BAA6B;AAAA,aAAA,EAC3E,CAAA;AAAA,4BACA,IAAA,CAAC,gBAAa,SAAA,EAAU,yCAAA,EAA0C,SAAS,MAAM,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA,EACzG,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAO,WAAU,kBAAA,EAAmB,CAAA;AAAA,cAAE,GAAA;AAAA,cAAE,EAAE,yBAAyB;AAAA,aAAA,EACtE;AAAA,WAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,WAAA,CAAY;AAAA,EAC1B,OAAA;AAAA,EAAS,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,eAAA;AAAA,EAAiB,SAAA;AAAA,EAAW,UAAA;AAAA,EAAY;AAC5F,CAAA,EAWG;AACD,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,CAAS,QAAQ,IAAI,CAAA;AAC/C,EAAA,MAAM,EAAE,YAAY,SAAA,EAAW,UAAA,EAAY,WAAW,UAAA,EAAY,UAAA,KAAe,WAAA,CAAY;AAAA,IAC3F,IAAI,OAAA,CAAQ,EAAA;AAAA,IACZ,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA;AAAU,GACzB,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,CAAC,iBAAA,CAAkB,OAAA,CAAQ,YAAY,CAAA;AACzD,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,OAAA,CAAQ,YAAY,CAAA;AACnD,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,UAAA,IAAc,EAAE,CAAA;AACxC,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA;AAE7C,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,KAAA,EAAO,EAAE,SAAA,EAAW,GAAA,CAAI,UAAU,QAAA,CAAS,SAAS,GAAG,UAAA,EAAW;AAAA,MAClE,SAAA,EAAW,yDAAyD,UAAA,GAAa,YAAA,GAAe,EAAE,CAAA,CAAA,EAAI,cAAA,GAAiB,eAAe,EAAE,CAAA,CAAA;AAAA,MAExI,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wDAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACE,GAAG,UAAA;AAAA,cACH,GAAG,SAAA;AAAA,cACJ,YAAA,EAAY,EAAE,0BAA0B,CAAA;AAAA,cACxC,SAAA,EAAU,mFAAA;AAAA,cAEV,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WACpC;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAS,MAAM,YAAA,CAAa,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,cACrC,SAAA,EAAU,6CAAA;AAAA,cACV,cAAY,SAAA,GAAY,CAAA,CAAE,qBAAqB,CAAA,GAAI,EAAE,uBAAuB,CAAA;AAAA,cAE3E,QAAA,EAAA,SAAA,uBAAa,YAAA,EAAA,EAAa,SAAA,EAAU,WAAU,CAAA,mBAAK,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WACvF;AAAA,UAEC,QAAA,mBACC,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAS,IAAA;AAAA,cACT,KAAA,EAAO,KAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACxC,QAAQ,MAAM;AAAE,gBAAA,WAAA,CAAY,KAAK,CAAA;AAAG,gBAAA,IAAI,KAAA,CAAM,IAAA,EAAK,IAAK,KAAA,KAAU,OAAA,CAAQ,IAAA,EAAM,QAAA,CAAS,eAAA,CAAgB,OAAA,CAAQ,EAAA,EAAI,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,cAAE,CAAA;AAAA,cACnI,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,gBAAA,IAAI,EAAE,GAAA,KAAQ,OAAA,EAAU,CAAA,CAAE,OAA4B,IAAA,EAAK;AAC3D,gBAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AAAE,kBAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AAAG,kBAAA,WAAA,CAAY,KAAK,CAAA;AAAA,gBAAE;AAAA,cACvE,CAAA;AAAA,cACA,SAAA,EAAU;AAAA;AAAA,WACZ,mBAEA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAS,MAAM;AAAE,gBAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AAAG,gBAAA,WAAA,CAAY,IAAI,CAAA;AAAA,cAAE,CAAA;AAAA,cAC3D,SAAA,EAAU,4EAAA;AAAA,cAET,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,WACX;AAAA,0BAGF,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EAAqC,QAAA,EAAA,CAAA,CAAE,yBAAA,EAA2B,EAAE,KAAA,EAAO,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,EAAG,CAAA,EAAE,CAAA;AAAA,UACvH,cAAA,oBAAkB,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,UAElF,SAAA,oBACC,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,CAAA,kEAAA,EAAqE,UAAA,GAAa,8CAAA,GAAiD,gCAAgC,CAAA,CAAA;AAAA,cAC9K,OAAO,oBAAA,CAAqB,OAAA,CAAQ,cAAc,MAAA,EAAQ,CAAA,CAAE,sBAAsB,CAAC,CAAA;AAAA,cAElF,+BAAqB,OAAA,CAAQ,YAAA,EAAc,MAAA,EAAQ,CAAA,CAAE,sBAAsB,CAAC;AAAA;AAAA,WAC/E;AAAA,UAED,CAAC,QAAQ,QAAA,oBACR,GAAA,CAAC,UAAK,SAAA,EAAU,iFAAA,EACb,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAC9B,CAAA;AAAA,0BAGF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,MAAM,QAAA,CAAS,SAAA,CAAU,OAAA,CAAQ,EAAE,CAAA,EAC9E,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,aAAA,EAAc,CAAA;AAAA,cAAE,GAAA;AAAA,cAAE,EAAE,sBAAsB;AAAA,aAAA,EAC5D,CAAA;AAAA,iCACC,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,mBAAgB,OAAA,EAAO,IAAA,EACtB,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAO,WAAU,0FAAA,EAA2F,YAAA,EAAY,CAAA,CAAE,6BAA6B,GACtJ,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,SAAA,EAAU,GACtC,CAAA,EACF,CAAA;AAAA,8BACA,IAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,KAAA,EACrB,QAAA,EAAA;AAAA,gCAAA,IAAA,CAAC,gBAAa,OAAA,EAAS,MAAM,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA,EACzD,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,MAAA,EAAA,EAAO,WAAU,kBAAA,EAAmB,CAAA;AAAA,kBAAE,GAAA;AAAA,kBAAE,EAAE,0BAA0B;AAAA,iBAAA,EACvE,CAAA;AAAA,oCACC,iBAAA,EAAA,EAAkB,CAAA;AAAA,gCACnB,IAAA,CAAC,gBAAa,SAAA,EAAU,yCAAA,EAA0C,SAAS,MAAM,QAAA,CAAS,eAAA,CAAgB,OAAO,CAAA,EAC/G,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,MAAA,EAAA,EAAO,WAAU,kBAAA,EAAmB,CAAA;AAAA,kBAAE,GAAA;AAAA,kBAAE,EAAE,4BAA4B;AAAA,iBAAA,EACzE;AAAA,eAAA,EACF;AAAA,aAAA,EACF;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,QAEC,CAAC,SAAA,KACA,UAAA,CAAW,MAAA,KAAW,CAAA,mBACpB,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,QAAA,CAAS,SAAA,CAAU,QAAQ,EAAE,CAAA;AAAA,YAC5C,SAAA,EAAU,wIAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,eAAA,EAAA,EAAgB,WAAU,kCAAA,EAAmC,CAAA;AAAA,kCAC7D,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAAE;AAAA;AAAA;AAAA,4BAGlF,GAAA,CAAC,KAAA,EAAA,EACE,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,qBACf,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YAEC,SAAA;AAAA,YACA,IAAA,EAAM,SAAA,CAAU,GAAA,CAAI,SAAA,CAAU,MAAM,CAAA;AAAA,YACpC,QAAA;AAAA,YACA,eAAA;AAAA,YACA,SAAA;AAAA,YACA,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,EAAE,CAAA;AAAA,YACjC;AAAA,WAAA;AAAA,UAPK,SAAA,CAAU;AAAA,SASlB,CAAA,EACH,CAAA;AAAA;AAAA;AAAA,GAGN;AAEJ;;;AChVO,IAAM,aAAA,GAA+B,CAAC,KAAA,EAAO,UAAA,EAAY,SAAS,CAAA;ACJzE,IAAM,eAAA,GAAyD;AAAA,EAC7D,EAAE,EAAA,EAAI,8BAAA,EAAgC,IAAA,EAAM,CAAC,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,EAC5D,EAAE,EAAA,EAAI,6BAAA,EAA+B,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,EAClD,EAAE,EAAA,EAAI,8BAAA,EAAgC,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAClE,CAAA;AAEO,SAAS,cAAA,CAAe,EAAE,KAAA,EAAO,QAAA,EAAU,QAAO,EAItD;AACD,EAAA,MAAM,IAAIA,cAAAA,EAAe;AACzB,EAAA,MAAM,MAAA,GAAS,cAAc,MAAM,CAAA;AACnC,EAAA,MAAM,UAAA,GAAa,CAAC,iBAAA,CAAkB,KAAK,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,IAAQ,EAAC;AAE5B,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,KAAgB;AACjC,IAAA,MAAM,IAAA,GAAO,KAAK,QAAA,CAAS,GAAG,IAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACrG,IAAA,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,MAAM,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAACC,MAAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAS,UAAA;AAAA,QACT,eAAA,EAAiB,CAAC,OAAA,KAAY,QAAA,CAAS,UAAU,EAAE,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAC,GAAG,KAAA,EAAO,OAAA,EAAS,KAAK,OAAA,EAAQ,GAAI,EAAE,CAAA;AAAA,QAC7G,KAAA,kBACEF,IAAAA,CAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAAE,CAAA;AAAA,0BACnEA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yCAAA,EAA2C,QAAA,EAAA,CAAA,CAAE,4BAA4B,CAAA,EAAE;AAAA,SAAA,EAC7F;AAAA;AAAA,KAEJ;AAAA,IAEC,UAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,wEAAA,EACd,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EACzB,CAAA;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACZ,iBAAO,GAAA,CAAI,CAAC,KAAA,EAAO,GAAA,qBAClBA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,SAAA,CAAU,GAAG,CAAA;AAAA,YAC5B,WAAW,CAAA,0EAAA,EACT,IAAA,CAAK,SAAS,GAAG,CAAA,GACb,uCACA,kDACN,CAAA,CAAA;AAAA,YAEC,QAAA,EAAA;AAAA,WAAA;AAAA,UATI;AAAA,SAWR,CAAA,EACH,CAAA;AAAA,wBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACZ,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,MAAA,qBACpBA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,YACvD,SAAA,EAAU,4FAAA;AAAA,YAET,QAAA,EAAA,CAAA,CAAE,OAAO,EAAE;AAAA,WAAA;AAAA,UALP,MAAA,CAAO;AAAA,SAOf,CAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,wEAAA,EACd,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EACzB,CAAA;AAAA,0BACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,KAAA,CAAM,SAAS,OAAA,EAAS,QAAA,EAAU,CAAC,IAAA,KAAS,SAAS,EAAE,GAAG,OAAO,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG;AAAA,SAAA,EACtG,CAAA;AAAA,wBACAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,wEAAA,EACd,QAAA,EAAA,CAAA,CAAE,kBAAkB,CAAA,EACvB,CAAA;AAAA,0BACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,KAAA,CAAM,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,IAAA,KAAS,SAAS,EAAE,GAAG,OAAO,GAAA,EAAK,IAAA,EAAM,CAAA,EAAG;AAAA,SAAA,EAClG;AAAA,OAAA,EACF,CAAA;AAAA,sBAGAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mCAAA,EAAqC,QAAA,EAAA,CAAA,CAAE,6BAA6B,CAAA,EAAE;AAAA,KAAA,EACrF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AC/FA,IAAM,aAAA,GAA6C;AAAA,EACjD,GAAA,EAAK,kBAAA;AAAA,EACL,QAAA,EAAU,uBAAA;AAAA,EACV,OAAA,EAAS;AACX,CAAA;AAEO,SAAS,aAAa,EAAE,IAAA,EAAM,MAAM,MAAA,EAAQ,OAAA,EAAS,UAAS,EAalE;AACD,EAAA,MAAM,IAAIF,cAAAA,EAAe;AACzB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAII,SAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAIA,SAAwB,CAAC,GAAG,aAAa,CAAC,CAAA;AAC1E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,QAAAA,CAA2B,EAAE,CAAA;AACrE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,OAAA,CAAQ,IAAA,EAAM,QAAQ,EAAE,CAAA;AACxB,IAAA,cAAA,CAAe,IAAA,EAAM,eAAe,EAAE,CAAA;AACtC,IAAA,WAAA,CAAY,IAAA,EAAM,QAAA,IAAY,CAAC,GAAG,aAAa,CAAC,CAAA;AAChD,IAAA,eAAA,CAAgB,IAAA,EAAM,YAAA,IAAgB,EAAE,CAAA;AACxC,IAAA,WAAA,CAAY,IAAA,EAAM,YAAY,IAAI,CAAA;AAClC,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,EACjB,CAAA,EAAG,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAEf,EAAA,MAAM,aAAA,GAAgB,CAAC,OAAA,KAAyB;AAC9C,IAAA,WAAA,CAAY,CAAC,OAAA,KACX,OAAA,CAAQ,QAAA,CAAS,OAAO,IAAI,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,OAAO,CAAA,GAAI,CAAC,GAAG,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,EAC5F,CAAA;AAEA,EAAA,MAAM,SAAS,YAAY;AACzB,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,IAAK,MAAA,EAAQ;AAC5B,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,CAAS,EAAE,IAAA,EAAM,IAAA,CAAK,MAAK,EAAG,WAAA,EAAa,WAAA,CAAY,IAAA,EAAK,IAAK,KAAA,CAAA,EAAW,QAAA,EAAU,YAAA,EAAc,UAAU,CAAA;AACpH,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEH,IAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,OAAO,IAAA,GAAO,CAAA,CAAE,2BAA2B,CAAA,GAAI,EAAE,0BAA0B,CAAA;AAAA,MAC3E,IAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAM,UAAA;AAAA,MAEN,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,WAAA,EACjB,QAAA,EAAA;AAAA,0BAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,2CAAA,EAA6C,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAAE,CAAA;AAAA,4BACxFA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAS,IAAA;AAAA,gBACT,KAAA,EAAO,IAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBACvC,WAAA,EAAa,EAAE,iCAAiC,CAAA;AAAA,gBAChD,SAAA,EAAW,CAAC,CAAA,KAAM;AAAE,kBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,KAAK,MAAA,EAAO;AAAA,gBAAE;AAAA;AAAA;AAC3D,WAAA,EACF,CAAA;AAAA,0BAEAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,2CAAA,EAA6C,QAAA,EAAA,CAAA,CAAE,6BAA6B,CAAA,EAAE,CAAA;AAAA,4BAC/FA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,WAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC9C,WAAA,EAAa,EAAE,wCAAwC;AAAA;AAAA;AACzD,WAAA,EACF,CAAA;AAAA,0BAEAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,wEAAA,EACd,QAAA,EAAA,CAAA,CAAE,0BAA0B,CAAA,EAC/B,CAAA;AAAA,4BACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCACZ,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,OAAA,qBAClBA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,aAAA,CAAc,OAAO,CAAA;AAAA,gBACpC,WAAW,CAAA,6DAAA,EACT,QAAA,CAAS,SAAS,OAAO,CAAA,GACrB,uCACA,kDACN,CAAA,CAAA;AAAA,gBAEC,QAAA,EAAA,CAAA,CAAE,aAAA,CAAc,OAAO,CAAC;AAAA,eAAA;AAAA,cATpB;AAAA,aAWR,CAAA,EACH;AAAA,WAAA,EACF,CAAA;AAAA,0BAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAO,YAAA,EAAc,QAAA,EAAU,iBAAiB,MAAA,EAAgB,CAAA;AAAA,0BAEhFA,GAAAA;AAAA,YAACC,MAAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAS,QAAA;AAAA,cACT,eAAA,EAAiB,WAAA;AAAA,cACjB,KAAA,kBACEF,IAAAA,CAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAAE,CAAA;AAAA,gCACnEA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yCAAA,EAA2C,QAAA,EAAA,CAAA,CAAE,4BAA4B,CAAA,EAAE;AAAA,eAAA,EAC7F;AAAA;AAAA;AAEJ,SAAA,EACJ,CAAA;AAAA,wBACAD,IAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,aAAA,EACrB,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAACG,MAAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,MAAA,EAAS,QAAA,EAAA,CAAA,CAAE,kBAAkB,CAAA,EAAE,CAAA;AAAA,0BACrFH,IAACG,MAAAA,EAAA,EAAO,SAAS,MAAM,KAAK,QAAO,EAAG,QAAA,EAAU,CAAC,IAAA,CAAK,IAAA,MAAU,MAAA,EAC7D,QAAA,EAAA,MAAA,GAAS,EAAE,kBAAkB,CAAA,GAAI,CAAA,CAAE,gBAAgB,CAAA,EACtD;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;ACvGO,SAAS,YAAA,CAAa;AAAA,EAC3B,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,eAAA;AAAA,EAAiB,SAAA;AAAA,EAC5D,aAAA;AAAA,EAAe,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU;AACpC,CAAA,EAYG;AACD,EAAA,MAAM,IAAIL,cAAAA,EAAe;AACzB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAII,QAAAA,CAAyB;AAAA,IACnD,IAAA,EAAM,EAAA;AAAA,IAAI,KAAA,EAAO,CAAA;AAAA,IAAG,MAAA,EAAQ,WAAA;AAAA,IAC5B,eAAA,EAAiB,IAAA;AAAA,IAAM,oBAAA,EAAsB,IAAA;AAAA,IAAM,UAAA,EAAY,KAAA;AAAA,IAAO;AAAA,GACvE,CAAA;AACD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,SAAA,CAAU;AAAA,MACR,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAA;AAAA,MACpB,WAAA,EAAa,MAAM,WAAA,IAAe,EAAA;AAAA,MAClC,KAAA,EAAO,MAAM,KAAA,IAAS,CAAA;AAAA,MACtB,MAAM,IAAA,EAAM,IAAA;AAAA,MACZ,eAAe,IAAA,EAAM,aAAA;AAAA,MACrB,iBAAiB,IAAA,EAAM,eAAA;AAAA,MACvB,UAAU,IAAA,EAAM,QAAA;AAAA,MAChB,MAAA,EAAQ,MAAM,MAAA,IAAU,WAAA;AAAA,MACxB,eAAA,EAAiB,MAAM,eAAA,IAAmB,IAAA;AAAA,MAC1C,oBAAA,EAAsB,MAAM,oBAAA,IAAwB,IAAA;AAAA,MACpD,UAAA,EAAY,MAAM,UAAA,IAAc,KAAA;AAAA,MAChC,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,EACjB,GAAG,CAAC,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,aAAa,CAAC,CAAA;AAEzC,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAkC,SAAA,CAAU,CAAC,OAAA,MAAa,EAAE,GAAG,OAAA,EAAS,GAAG,IAAA,EAAK,CAAE,CAAA;AAEjG,EAAA,MAAM,SAAS,YAAY;AACzB,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,IAAA,MAAU,MAAA,EAAQ;AACnC,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,CAAS,EAAE,GAAG,MAAA,EAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,IAAA,EAAK,EAAG,CAAA;AACtD,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEL,IAAAA;AAAA,IAACM,aAAAA;AAAA,IAAA;AAAA,MACC,OAAO,IAAA,GAAO,CAAA,CAAE,yBAAyB,CAAA,GAAI,EAAE,wBAAwB,CAAA;AAAA,MACvE,IAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAM,UAAA;AAAA,MAMN,QAAA,EAAA;AAAA,wBAAAN,IAAAA,CAACO,SAAAA,EAAA,EAAU,SAAA,EAAU,WAAA,EACnB,QAAA,EAAA;AAAA,0BAAAP,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,SAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,QAAA;AAAA,kBACN,OAAO,MAAA,CAAO,QAAA;AAAA,kBACd,QAAA,EAAU,gBAAgB,OAAO,IAAA,KAAU,MAAM,aAAA,CAAc,IAAI,KAAM,EAAA,GAAK,MAAA;AAAA,kBAC9E,UAAU,CAAC,GAAA,KAAQ,MAAM,EAAE,QAAA,EAAU,KAAK;AAAA;AAAA,eAC5C,EACF,CAAA;AAAA,8BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAA,EAAuC,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAAE,CAAA;AAAA,gCAC7EA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,uDAAA,EACV,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAC9B;AAAA,eAAA,EACF;AAAA,aAAA,EACF,CAAA;AAAA,4BAEAA,GAAAA,CAAC,KAAA,EAAA,EAAM,OAAO,CAAA,CAAE,oBAAoB,GAClC,QAAA,kBAAAA,GAAAA;AAAA,cAACO,KAAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAS,IAAA;AAAA,gBACT,OAAO,MAAA,CAAO,IAAA;AAAA,gBACd,QAAA,EAAU,CAAC,CAAA,KAAM,KAAA,CAAM,EAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,gBAC/C,WAAA,EAAa,EAAE,+BAA+B;AAAA;AAAA,aAChD,EACF,CAAA;AAAA,4BAEAP,GAAAA,CAAC,KAAA,EAAA,EAAM,OAAO,CAAA,CAAE,2BAA2B,GACzC,QAAA,kBAAAA,GAAAA;AAAA,cAACO,KAAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,OAAO,WAAA,IAAe,EAAA;AAAA,gBAC7B,QAAA,EAAU,CAAC,CAAA,KAAM,KAAA,CAAM,EAAE,WAAA,EAAa,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,gBACtD,WAAA,EAAa,EAAE,sCAAsC;AAAA;AAAA,aACvD,EACF;AAAA,WAAA,EACF,CAAA;AAAA,0BAEAR,IAAAA,CAAC,KAAA,EAAA,EAAM,KAAA,EAAO,CAAA,CAAE,4BAA4B,CAAA,EAE1C,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,aAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,kBAC9B,OAAO,MAAA,CAAO,KAAA;AAAA,kBACd,UAAU,CAAC,KAAA,KAAU,KAAA,CAAM,EAAE,OAAO,CAAA;AAAA,kBACpC,QAAQ,QAAA,CAAS,MAAA;AAAA,kBACjB,QAAQ,QAAA,CAAS,MAAA;AAAA,kBACjB,cAAc,QAAA,CAAS;AAAA;AAAA,eACzB;AAAA,8BACAA,GAAAA;AAAA,gBAAC,aAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO,EAAE,oBAAoB,CAAA;AAAA,kBAC7B,KAAA,EAAO,OAAO,IAAA,IAAQ,CAAA;AAAA,kBACtB,UAAU,CAAC,IAAA,KAAS,KAAA,CAAM,EAAE,MAAM,CAAA;AAAA,kBAClC,QAAQ,QAAA,CAAS,MAAA;AAAA,kBACjB,QAAQ,QAAA,CAAS,MAAA;AAAA,kBACjB,cAAc,QAAA,CAAS;AAAA;AAAA;AACzB,aAAA,EACF,CAAA;AAAA,YAEC,mCACCA,GAAAA;AAAA,cAAC,aAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,EAAE,6BAA6B,CAAA;AAAA,gBACtC,KAAA,EAAO,OAAO,aAAA,IAAiB,CAAA;AAAA,gBAC/B,UAAU,CAAC,aAAA,KAAkB,KAAA,CAAM,EAAE,eAAe,CAAA;AAAA,gBACpD,QAAQ,QAAA,CAAS,MAAA;AAAA,gBACjB,QAAQ,QAAA,CAAS,MAAA;AAAA,gBACjB,cAAc,QAAA,CAAS;AAAA;AAAA,aACzB;AAAA,YAID,SAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAA,EAAuC,QAAA,EAAA,CAAA,CAAE,6BAA6B,CAAA,EAAE,CAAA;AAAA,8BACrFA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,uDAAA,EACV,QAAA,EAAA,CAAA,CAAE,iCAAiC,CAAA,EACtC,CAAA;AAAA,8BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,GAAAA;AAAA,kBAAC,aAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO,OAAO,aAAA,IAAiB,CAAA;AAAA,oBAC/B,UAAU,CAAC,IAAA,KAAS,MAAM,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,oBACjD,QAAQ,QAAA,CAAS,MAAA;AAAA,oBACjB,QAAQ,QAAA,CAAS,MAAA;AAAA,oBACjB,cAAc,QAAA,CAAS;AAAA;AAAA,iBACzB;AAAA,gBACC,MAAA,CAAO,aAAA,KAAkB,MAAA,oBACxBA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,SAAS,MAAM,KAAA,CAAM,EAAE,aAAA,EAAe,QAAW,CAAA;AAAA,oBACjD,SAAA,EAAU,8GAAA;AAAA,oBAET,YAAE,6BAA6B;AAAA;AAAA;AAClC,eAAA,EAEJ;AAAA,aAAA,EACF;AAAA,WAAA,EAEJ,CAAA;AAAA,0BAEAD,IAAAA,CAAC,KAAA,EAAA,EAAM,KAAA,EAAO,CAAA,CAAE,yBAAyB,CAAA,EACvC,QAAA,EAAA;AAAA,4BAAAC,IAAC,KAAA,EAAA,EAAM,KAAA,EAAO,CAAA,CAAE,uBAAuB,GACrC,QAAA,kBAAAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAO,MAAA,CAAO,SAAA;AAAA,gBACd,QAAA,EAAU,CAAC,CAAA,KAAM,KAAA,CAAM,EAAE,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,gBACpD,SAAA,EAAU,sHAAA;AAAA,gBAET,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,qBACbA,GAAAA,CAAC,QAAA,EAAA,EAAwB,KAAA,EAAO,OAAA,CAAQ,EAAA,EAAK,QAAA,EAAA,OAAA,CAAQ,IAAA,EAAA,EAAxC,OAAA,CAAQ,EAAqC,CAC3D;AAAA;AAAA,aACH,EACF,CAAA;AAAA,4BAEAA,GAAAA,CAAC,KAAA,EAAA,EAAM,OAAO,CAAA,CAAE,sBAAsB,GACpC,QAAA,kBAAAA,GAAAA;AAAA,cAAC,gBAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,QAAA;AAAA,gBACV,OAAO,MAAA,CAAO,MAAA;AAAA,gBACd,UAAU,CAAC,MAAA,KAAW,KAAA,CAAM,EAAE,QAAkC,CAAA;AAAA,gBAChE,OAAA,EAAS;AAAA,kBACP,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,CAAA,CAAE,wBAAwB,CAAA,EAAE;AAAA,kBACzD,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,CAAA,CAAE,sBAAsB,CAAA,EAAE;AAAA,kBACtD,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,CAAA,CAAE,qBAAqB,CAAA;AAAE;AACrD;AAAA,aACF,EACF,CAAA;AAAA,4BAEAA,GAAAA,CAAC,KAAA,EAAA,EAAM,OAAO,CAAA,CAAE,wBAAwB,GACtC,QAAA,kBAAAA,GAAAA;AAAA,cAACO,KAAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,GAAA,EAAK,CAAA;AAAA,gBACL,SAAA,EAAU,SAAA;AAAA,gBACV,KAAA,EAAO,OAAO,eAAA,IAAmB,EAAA;AAAA,gBACjC,QAAA,EAAU,CAAC,CAAA,KAAM,KAAA,CAAM,EAAE,eAAA,EAAiB,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,GAAI,QAAW,CAAA;AAAA,gBAC/F,WAAA,EAAY;AAAA;AAAA,aACd,EACF,CAAA;AAAA,4BAKAR,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,SAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO,EAAE,kBAAkB,CAAA;AAAA,kBAC3B,IAAA,EAAM,EAAE,uBAAuB,CAAA;AAAA,kBAC/B,SAAS,MAAA,CAAO,eAAA;AAAA,kBAChB,UAAU,CAAC,CAAA,KAAM,MAAM,EAAE,eAAA,EAAiB,GAAG;AAAA;AAAA,eAC/C;AAAA,8BACAA,GAAAA;AAAA,gBAAC,SAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO,EAAE,uBAAuB,CAAA;AAAA,kBAChC,IAAA,EAAM,EAAE,4BAA4B,CAAA;AAAA,kBACpC,SAAS,MAAA,CAAO,oBAAA;AAAA,kBAChB,UAAU,CAAC,CAAA,KAAM,MAAM,EAAE,oBAAA,EAAsB,GAAG;AAAA;AAAA,eACpD;AAAA,8BACAA,GAAAA;AAAA,gBAAC,SAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO,EAAE,uBAAuB,CAAA;AAAA,kBAChC,IAAA,EAAM,EAAE,4BAA4B,CAAA;AAAA,kBACpC,SAAS,MAAA,CAAO,UAAA;AAAA,kBAChB,UAAU,CAAC,CAAA,KAAM,MAAM,EAAE,UAAA,EAAY,GAAG;AAAA;AAAA;AAC1C,aAAA,EACF;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBACAD,IAAAA,CAACS,WAAAA,EAAA,EAAY,WAAU,aAAA,EACrB,QAAA,EAAA;AAAA,0BAAAR,GAAAA,CAACG,MAAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,MAAA,EAAS,QAAA,EAAA,CAAA,CAAE,kBAAkB,CAAA,EAAE,CAAA;AAAA,0BACrFH,IAACG,MAAAA,EAAA,EAAO,SAAS,MAAM,KAAK,MAAA,EAAO,EAAG,QAAA,EAAU,CAAC,OAAO,IAAA,CAAK,IAAA,MAAU,MAAA,EACpE,QAAA,EAAA,MAAA,GAAS,EAAE,kBAAkB,CAAA,GAAI,CAAA,CAAE,gBAAgB,CAAA,EACtD;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAGA,SAAS,KAAA,CAAM,EAAE,KAAA,EAAO,QAAA,EAAS,EAAiD;AAChF,EAAA,uBACEJ,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,sDAAA,EAAwD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAC9E;AAAA,GAAA,EACH,CAAA;AAEJ;AAGA,SAAS,KAAA,CAAM,EAAE,KAAA,EAAO,QAAA,EAAS,EAAkD;AACjF,EAAA,uBACED,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,WAAA,EAChB,QAAA,EAAA;AAAA,IAAA,KAAA,oBACCC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4EAA4E,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAEjG;AAAA,GAAA,EACH,CAAA;AAEJ;AAGA,SAAS,UAAU,EAAE,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,UAAS,EAKjD;AACD,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MACV,OAAA,EAAS,MAAM,QAAA,CAAS,CAAC,OAAO,CAAA;AAAA,MAChC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,QAAA,CAAS,CAAC,OAAO,CAAA;AAAA,QACnB;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAU,+FAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UAC7B,wBAAQA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAkD,QAAA,EAAA,IAAA,EAAK;AAAA,SAAA,EAC/E,CAAA;AAAA,wBACAA,GAAAA,CAACC,MAAAA,EAAA,EAAO,IAAA,EAAK,MAAK,OAAA,EAAkB,eAAA,EAAiB,QAAA,EAAU,YAAA,EAAY,KAAA,EAAO;AAAA;AAAA;AAAA,GACpF;AAEJ;AClTA,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,UAAS,EAI1C;AACD,EAAA,MAAM,IAAIH,cAAAA,EAAe;AACzB,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0EAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,OAAO,IAAA,CAAK,IAAA;AAAA,QACZ,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,QAClD,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACAA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAK,WAAA,IAAe,EAAA;AAAA,QAC3B,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,WAAA,EAAa,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,QACzD,WAAA,EAAa,EAAE,2BAA2B,CAAA;AAAA,QAC1C,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACAA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,SAAA,EAAU,SAAA;AAAA,QACV,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,OAAO,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,QAAQ,GAAA,EAAK,GAAG,CAAC,CAAA,IAAK,GAAG,CAAA;AAAA,QAClF,WAAW,CAAA,0HAAA,EAA6H,IAAA,CAAK,KAAA,KAAU,CAAA,GAAI,gCAAgC,EAAE,CAAA;AAAA;AAAA,KAC/L;AAAA,oBACAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,QAAA;AAAA,QACT,SAAA,EAAU,0DAAA;AAAA,QACV,YAAA,EAAY,EAAE,sBAAsB,CAAA;AAAA,QAEpC,QAAA,kBAAAA,GAAAA,CAACS,MAAAA,EAAA,EAAO,WAAU,aAAA,EAAc;AAAA;AAAA;AAClC,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,gBAAA,CAAiB,EAAE,OAAA,EAAS,QAAA,EAAU,gBAAgB,eAAA,EAAiB,WAAA,EAAa,cAAa,EAO9G;AACD,EAAA,MAAM,IAAIX,cAAAA,EAAe;AACzB,EAAA,MAAM,QAAA,GAAW,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,QAAQ,eAAe,CAAA;AAEtE,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yFAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sFAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,0BAAA,EAA2B,CAAA;AAAA,sBAC/CA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,OAAO,OAAA,CAAQ,IAAA;AAAA,UACf,QAAA,EAAU,CAAC,CAAA,KAAM,cAAA,CAAe,EAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,UACxD,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACAD,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,QAAQ,eAAA,IAAmB,EAAA;AAAA,UAClC,QAAA,EAAU,CAAC,CAAA,KAAM,cAAA,CAAe,EAAE,iBAAiB,CAAA,CAAE,MAAA,CAAO,KAAA,IAAS,MAAA,EAAW,CAAA;AAAA,UAChF,SAAA,EAAU,4CAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAC,IAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAI,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAAE,CAAA;AAAA,YAChD,QAAA,CAAS,IAAI,CAAC,CAAA,qBACbA,GAAAA,CAAC,QAAA,EAAA,EAAkB,OAAO,CAAA,CAAE,EAAA,EAAK,YAAE,yBAAA,EAA2B,EAAE,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,EAAA,EAAjE,CAAA,CAAE,EAAiE,CACjF;AAAA;AAAA;AAAA,OACH;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCACb,QAAA,EAAA,CAAA,CAAE,yBAAA,EAA2B,EAAE,KAAA,EAAO,OAAO,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,EAAG,CAAA,EACvE,CAAA;AAAA,MACC,QAAA,oBACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qEAAA,EACb,QAAA,EAAA,CAAA,CAAE,wBAAA,EAA0B,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,CAAA,EACtD,CAAA;AAAA,sBAEFA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,eAAA;AAAA,UACT,SAAA,EAAU,kEAAA;AAAA,UACV,YAAA,EAAY,EAAE,yBAAyB,CAAA;AAAA,UAEvC,QAAA,kBAAAA,GAAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACzB,KAAA,EACF,CAAA;AAAA,oBACAA,IAAC,KAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,MAAM,GAAA,CAAI,CAAC,yBAClBA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA;AAAA,QACA,UAAU,CAAC,KAAA,KAAU,WAAA,CAAY,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,QAChD,QAAA,EAAU,MAAM,YAAA,CAAa,IAAA,CAAK,GAAG;AAAA,OAAA;AAAA,MAHhC,IAAA,CAAK;AAAA,KAKb,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAIO,SAAS,SAAS,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,WAAU,EAK3D;AACD,EAAA,MAAM,IAAIF,cAAAA,EAAe;AACzB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,MAAA,CAAO,CAAC,KAAA,EAAO,OAAA,KAAY,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AACvF,EAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,MAAA;AAAA,IAClC,CAAC,KAAA,EAAO,OAAA,KAAY,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,KAAU,CAAC,CAAA,CAAE,MAAA;AAAA,IAAQ;AAAA,GAAC;AAExF,EAAA,uBACEE,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAI,IAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,CAAA,CAAE,wBAAA,EAA0B,EAAE,OAAO,MAAA,CAAO,KAAK,CAAA,EAAG,QAAA,EAAU,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,MAAM,GAAG,CAAA;AAAA,MACpG,IAAA,EAAM,YAAA,GAAe,CAAA,GACjB,CAAA,CAAE,+BAAA,EAAiC,EAAE,KAAA,EAAO,MAAA,CAAO,YAAY,CAAA,EAAG,CAAA,GAClE,EAAE,uBAAuB,CAAA;AAAA,MAC7B,YAAA,EAAc,EAAE,qBAAqB,CAAA;AAAA,MACrC,SAAA;AAAA,MACA,WAAA,EAAa,EAAE,oBAAA,EAAsB,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,MAC7D,QAAA;AAAA,MACA,IAAA,EAAM;AAAA;AAAA,GACR;AAEJ;AC5HO,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,YAAY,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAQ,EASlG;AACD,EAAA,MAAM,IAAIF,cAAAA,EAAe;AACzB,EAAA,MAAM,OAAA,GAAU,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,YAAY,CAAA,GAAI,IAAA;AAExD,EAAA,uBACEE,GAAAA,CAAC,KAAA,EAAA,EAAM,IAAA,EAAY,YAAA,EAAc,CAAC,IAAA,KAAS;AAAE,IAAA,IAAI,CAAC,MAAM,OAAA,EAAQ;AAAA,EAAE,CAAA,EAChE,QAAA,kBAAAD,IAAAA,CAAC,YAAA,EAAA,EAAa,MAAK,IAAA,EACjB,QAAA,EAAA;AAAA,oBAAAA,KAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,UAAA,EAAA,EAAY,QAAA,EAAA,IAAA,EAAM,IAAA,IAAQ,CAAA,CAAE,oBAAoB,CAAA,EAAE,CAAA;AAAA,sBACnDD,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EACV,QAAA,EAAA;AAAA,QAAA,IAAA,GAAO,qBAAqB,IAAA,CAAK,YAAA,EAAc,QAAQ,CAAA,CAAE,sBAAsB,CAAC,CAAA,GAAI,EAAA;AAAA,QACpF,QAAQ,CAAC,OAAA,IAAW,CAAA,MAAA,EAAM,CAAA,CAAE,4BAA4B,CAAC,CAAA;AAAA,OAAA,EAC5D;AAAA,KAAA,EACF,CAAA;AAAA,oBACAC,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,kBAClB,QAAA,EAAA,QAAA,CACE,MAAA,CAAO,CAAC,OAAA,KAAY,OAAA,CAAQ,QAAQ,CAAA,CACpC,GAAA,CAAI,CAAC,OAAA,KAAY;AAChB,MAAA,MAAM,IAAA,GAAO,UAAA,CACV,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,KAAc,OAAA,CAAQ,EAAA,IAAM,EAAE,QAAQ,CAAA,CACtD,GAAA,CAAI,CAAC,OAAO,EAAE,SAAA,EAAW,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,MAAM,GAAE,CAAE,CAAA,CAC5D,MAAA,CAAO,CAAC,QAAQ,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,IAAA,CAAK,WAAW,QAAQ,CAAA;AAC3D,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC9B,MAAA,uBACED,KAAC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oFAAA,EACX,kBAAQ,IAAA,EACX,CAAA;AAAA,QACC,OAAA,CAAQ,+BAAeA,GAAAA,CAAC,OAAE,SAAA,EAAU,oCAAA,EAAsC,kBAAQ,WAAA,EAAY,CAAA;AAAA,wBAC/FA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gBAAA,EACX,eAAK,GAAA,CAAI,CAAC,EAAE,SAAA,EAAW,MAAK,qBAC3BD,IAAAA,CAAC,IAAA,EAAA,EAAsB,WAAU,2BAAA,EAC/B,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,eAAM,IAAA,EAAK,CAAA;AAAA,YACjD,IAAA,CAAM,MAAA,KAAW,UAAA,oBAChBA,GAAAA,CAAC,UAAK,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAAE,CAAA;AAAA,YAE1F,IAAA,CAAM,+BACLA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAiC,eAAM,WAAA,EAAY;AAAA,WAAA,EAEpE,CAAA;AAAA,0BAGAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6FAAA,EAA8F,CAAA;AAAA,0BAC9GA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA,cAAA,CAAe,SAAA,CAAU,aAAA,IAAiB,IAAA,CAAM,KAAA,EAAO,QAAQ,CAAA,EAClE;AAAA,SAAA,EAAA,EAfO,SAAA,CAAU,EAgBnB,CACD,CAAA,EACH;AAAA,OAAA,EAAA,EAzBY,QAAQ,EA0BtB,CAAA;AAAA,IAEJ,CAAC,CAAA,EACL;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AChDO,SAAS,eAAA,GAAkB;AAChC,EAAA,MAAM,IAAIF,cAAAA,EAAe;AACzB,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAQ,GAAI,aAAA,EAAc;AAE5C,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACzC,EAAA,MAAM,YAAA,GAAe,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACvD,EAAA,MAAM,YAAA,GAAe,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACvD,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AACnD,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AACrD,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACjD,EAAmB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,UAAU;AACnD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AAEnD,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AACnD,EAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,cAAc,CAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AACnD,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AACnD,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AACnD,EAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,aAAa,CAAA;AACzD,EAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,aAAa,CAAA;AACzD,EAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,aAAa,CAAA;AACzD,EAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,aAAa,CAAA;AACzD,EAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,eAAe,CAAA;AAC7D,EAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,gBAAgB,CAAA;AAC/D,EAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,eAAe,CAAA;AAC7D,EAAA,MAAM,iBAAA,GAAoB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,iBAAiB,CAAA;AACjE,EAAA,MAAM,iBAAA,GAAoB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,iBAAiB,CAAA;AACjE,EAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,aAAa,CAAA;AACzD,EAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,cAAc,CAAA;AAC3D,EAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,cAAc,CAAA;AAC3D,EAAA,MAAM,iBAAA,GAAoB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,iBAAiB,CAAA;AACjE,EAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,aAAa,CAAA;AACzD,EAAA,MAAM,kBAAA,GAAqB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,kBAAkB,CAAA;AACnE,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AACrD,EAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,aAAa,CAAA;AACzD,EAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,eAAe,CAAA;AAC7D,EAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,eAAe,CAAA;AAC7D,EAAA,MAAM,kBAAA,GAAqB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,kBAAkB,CAAA;AACnE,EAAA,MAAM,kBAAA,GAAqB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,kBAAkB,CAAA;AACnE,EAAA,MAAM,YAAA,GAAe,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAErD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAII,SAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,YAAY,aAAa,CAAA,GAAIA,SAA+C,EAAE,IAAA,EAAM,OAAO,CAAA;AAClG,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,QAAAA,CAA2F,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,EAAA,EAAI,CAAA;AAC7J,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAiF,IAAI,CAAA;AACnH,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM,YAAYQ,OAAAA,CAAQ,MAAM,oBAAA,EAAqB,EAAG,EAAE,CAAA;AAI1D,EAAA,MAAM,UAAA,GAAa,OAAO,KAAA,KAAkB;AAC1C,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,cAAA,CAAe,IAAI,CAAC,CAAC,CAAA;AAC1E,IAAA,MAAM,aAAA,CAAc,QAAQ,SAAS,CAAA;AAAA,EACvC,CAAA;AAGA,EAAA,MAAM,YAAA,GAAe,MAAM,iBAAA,CAAkB;AAAA,IAC3C,KAAA,EAAO,EAAE,uBAAuB,CAAA;AAAA,IAChC,WAAA,EAAa,EAAE,wBAAwB,CAAA;AAAA,IACvC,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,aAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACV,CAAA;AAMD,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,YAAA,EAAa;AACb,IAAA,KAAA,CAAM;AAAA,MACJ,MAAA,EAAQ,EAAE,uBAAuB,CAAA;AAAA,MACjC,IAAA,EAAM,EAAE,qBAAqB,CAAA;AAAA,MAC7B,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,EAAE,wBAAwB,CAAA;AAAA,QACnC,KAAA,EAAO,EAAE,sBAAsB,CAAA;AAAA,QAC/B,WAAA,EAAa,EAAE,4BAA4B,CAAA;AAAA,QAC3C,WAAA,EAAa;AAAA,UACX,EAAE,KAAA,EAAO,CAAA,CAAE,6BAA6B,CAAA,EAAE;AAAA,UAC1C,EAAE,KAAA,EAAO,CAAA,CAAE,6BAA6B,CAAA,EAAE;AAAA,UAC1C,EAAE,KAAA,EAAO,CAAA,CAAE,6BAA6B,CAAA;AAAE;AAC5C;AACF,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAAN,UAAU,MAAM;AACd,IAAA,KAAK,UAAA,EAAW;AAChB,IAAA,KAAK,cAAA,CAAe,EAAE,CAAA;AAAA,EACxB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAa,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,YAAY,CAAA;AAC1D,EAAA,MAAM,YAAYM,OAAAA,CAAQ,MAAM,IAAI,GAAA,CAAI,SAAA,CAAU,IAAI,CAAC,IAAA,KAAS,CAAC,IAAA,CAAK,IAAI,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAI9F,EAAA,MAAM,OAAA,GAAUA,QAAQ,MAAM;AAC5B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,EAAY;AACvC,IAAA,MAAM,OAAA,GAAU,CAAC,SAAA,KAA6B;AAC5C,MAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,SAAA,CAAU,MAAM,CAAA;AAC3C,MAAA,OAAO,CAAC,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,IAAI,CAAA,IAAA,CAAM,KAAK,WAAA,IAAe,EAAA,EAAI,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA,CAAA;AAAA,IAClH,CAAA;AACA,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAA6B;AACnD,IAAA,KAAA,MAAW,SAAA,IAAa,CAAC,GAAG,UAAU,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA,EAAG;AACjF,MAAA,IAAI,CAAC,OAAA,CAAQ,SAAS,CAAA,EAAG;AACzB,MAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,SAAA,CAAU,SAAS,KAAK,EAAC;AACpD,MAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AACnB,MAAA,SAAA,CAAU,GAAA,CAAI,SAAA,CAAU,SAAA,EAAW,IAAI,CAAA;AAAA,IACzC;AACA,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA;AACtE,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAA,CAAO,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG,MAAA,IAAU,CAAA,IAAK,CAAC,CAAA,GAAI,OAAA;AAAA,MACjF;AAAA,KACF;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,UAAA,EAAY,SAAA,EAAW,MAAM,CAAC,CAAA;AAE5C,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,SAAA,CAAU,aAAA,EAAe,EAAE,oBAAA,EAAsB,EAAE,QAAA,EAAU,CAAA,EAAE,EAAG,CAAC,CAAA;AAE9F,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC7C,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,KAAA;AACzB,IAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,CAAO,EAAA,KAAO,KAAK,EAAA,EAAI;AACpC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,IAAA;AAElC,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,MAAM,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAC5C,MAAA,MAAM,OAAO,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA;AAC1C,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AACtC,MAAA,IAAI,IAAA,GAAO,CAAA,IAAK,EAAA,GAAK,CAAA,EAAG;AACxB,MAAA,MAAM,IAAA,GAAO,CAAC,GAAG,GAAG,CAAA;AACpB,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG,IAAA,CAAK,OAAO,IAAA,EAAM,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1C,MAAA,KAAK,gBAAgB,IAAI,CAAA;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,cAAc,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,aAAa,EAAE,CAAA;AAC/D,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,IAAA;AACpC,MAAA,MAAM,SAAA,GAAY,QAAA,KAAa,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,SAAA,IAAa,EAAE,CAAA;AACtG,MAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,MAAA,MAAM,MAAA,GAAA,CAAU,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA,IAAK,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA;AACvE,MAAA,IAAI,gBAAgB,SAAA,EAAW;AAC7B,QAAA,MAAM,OAAO,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA;AAC7C,QAAA,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AACzC,QAAA,IAAI,IAAA,GAAO,CAAA,IAAK,EAAA,GAAK,CAAA,EAAG;AACxB,QAAA,MAAM,IAAA,GAAO,CAAC,GAAG,MAAM,CAAA;AACvB,QAAA,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG,IAAA,CAAK,OAAO,IAAA,EAAM,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1C,QAAA,KAAK,iBAAA,CAAkB,WAAW,IAAI,CAAA;AAAA,MACxC,CAAA,MAAO;AACL,QAAA,MAAM,KAAA,GAAQ,QAAA,KAAa,SAAA,GAAY,MAAA,CAAO,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AAClG,QAAA,KAAK,cAAc,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA,EAAG,WAAW,KAAK,CAAA;AAAA,MACxD;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,QAAA,GAA4B;AAAA,IAChC,eAAA,EAAiB,CAAC,SAAA,EAAW,IAAA,KAAS,KAAK,aAAA,CAAc,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA;AAAA,IAC5E,aAAA,EAAe,CAAC,OAAA,KAAY,KAAK,aAAA,CAAc,OAAA,CAAQ,EAAA,EAAI,EAAE,QAAA,EAAU,CAAC,OAAA,CAAQ,QAAA,EAAU,CAAA;AAAA,IAC1F,eAAA,EAAiB,CAAC,OAAA,KAAY,UAAA,CAAW,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,OAAA,CAAQ,EAAA,EAAI,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChG,SAAA,EAAW,CAAC,SAAA,KAAc,aAAA,CAAc,EAAE,IAAA,EAAM,IAAA,EAAM,WAAW,CAAA;AAAA,IACjE,UAAA,EAAY,CAAC,IAAA,EAAM,SAAA,KAAc,aAAA,CAAc,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,SAAA,CAAU,SAAA,EAAW,WAAW,CAAA;AAAA,IAC9G,eAAA,EAAiB,CAAC,IAAA,EAAM,SAAA,KAAc,KAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,SAAS,CAAA;AAAA,IAC/E,kBAAkB,CAAC,SAAA,KAAc,KAAK,eAAA,CAAgB,UAAU,EAAE,CAAA;AAAA,IAClE,YAAA,EAAc,CAAC,IAAA,KAAS,UAAA,CAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,IACjF,YAAA,EAAc,CAAC,MAAA,EAAQ,KAAA,EAAO,UAAU,KAAK,kBAAA,CAAmB,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAA;AAAA,IACpF,iBAAiB,CAAC,MAAA,EAAQ,WAAW,KAAK,aAAA,CAAc,QAAQ,MAAwB,CAAA;AAAA,IACxF,qBAAqB,CAAC,WAAA,EAAa,UAAU,KAAK,iBAAA,CAAkB,aAAa,KAAK;AAAA,GACxF;AAIA,EAAA,mBAAA,CAAoB;AAAA,IAClB,IAAA,EAAM,UAAA;AAAA,IACN,KAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA,EAAc,CAAC,CAAC,SAAA;AAAA,IAChB,OAAA,EAAS;AAAA,MACP,aAAA,EAAe,CAAC,IAAA,KAAS,aAAA,CAAc,IAAI,CAAA;AAAA,MAC3C,aAAA,EAAe,CAAC,SAAA,EAAW,IAAA,KAAS,cAAc,SAAA,EAAW,EAAE,MAAM,CAAA;AAAA,MACrE,eAAA;AAAA,MACA,YAAY,CAAC,SAAA,EAAW,KAAA,KAAU,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAAA,MACnE,YAAY,CAAC,MAAA,EAAQ,KAAA,KAAU,cAAA,CAAe,QAAQ,KAAK,CAAA;AAAA,MAC3D,aAAA;AAAA,MACA,QAAA,EAAU,aAAA;AAAA,MACV,UAAA,EAAY,CAAC,EAAE,IAAA,EAAM,MAAM,KAAA,EAAO,GAAA,OAAU,UAAA,CAAW;AAAA,QACrD,IAAA;AAAA,QACA,YAAA,EAAc,QAAQ,KAAA,IAAS,GAAA,GAAM,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAI,GAAI;AAAC,OAC9D,CAAA;AAAA,MACD,aAAA;AAAA,MACA,aAAA,EAAe,YAAA;AAAA,MACf,eAAA;AAAA,MACA,eAAA;AAAA,MACA,kBAAA;AAAA,MACA,kBAAA;AAAA,MACA,aAAa,YAAY;AACvB,QAAA,MAAM,MAAA,GAAS,MAAM,WAAA,EAAY;AACjC,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAAA,MACA;AAAA;AACF,GACD,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,OAAO,MAAA,KAA2B;AACnD,IAAA,MAAM,EAAE,SAAA,EAAW,aAAA,EAAe,GAAG,MAAK,GAAI,MAAA;AAC9C,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,MAAM,cAAA,CAAe,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAC7C,MAAA,IAAI,WAAW,SAAA,EAAW;AACxB,QAAA,IAAI,aAAA,KAAkB,UAAA,CAAW,SAAA,CAAU,aAAA,EAAe;AACxD,UAAA,MAAM,iBAAA,CAAkB,UAAA,CAAW,SAAA,CAAU,EAAA,EAAI,aAAa,CAAA;AAAA,QAChE;AACA,QAAA,IAAI,SAAA,KAAc,UAAA,CAAW,SAAA,CAAU,SAAA,EAAW;AAChD,UAAA,MAAM,aAAA,CAAc,UAAA,CAAW,SAAA,CAAU,EAAA,EAAI,WAAW,CAAC,CAAA;AAAA,QAC3D;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,gBAAA,CAAiB,WAAW,IAAI,CAAA;AAAA,IACxC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAgB,YAAY;AAChC,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,QAAQ,IAAA,KAAS,SAAA,EAAW,MAAM,aAAA,CAAc,QAAQ,EAAE,CAAA;AAC9D,IAAA,IAAI,QAAQ,IAAA,KAAS,MAAA,EAAQ,MAAM,cAAA,CAAe,QAAQ,EAAE,CAAA;AAC5D,IAAA,IAAI,QAAQ,IAAA,KAAS,MAAA,EAAQ,MAAM,UAAA,CAAW,QAAQ,EAAE,CAAA;AACxD,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,UAAA,GAClB,oBAAA,CAAqB,UAAA,CAAW,YAAA,EAAc,SAAS,MAAA,EAAQ,CAAA,CAAE,sBAAsB,CAAC,CAAA,GACxF,EAAA;AAMJ,EAAA,MAAM,cAAc,CAAC,IAAA,qBACnBX,IAAAA,CAACY,UAAA,EACC,QAAA,EAAA;AAAA,oBAAAX,GAAAA,CAACY,eAAAA,EAAA,EAAgB,OAAA,EAAO,IAAA,EACtB,QAAA,kBAAAZ,GAAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,CAAA,CAAE,0BAA0B,CAAA,EACvC,QAAA,kBAAAA,GAAAA;AAAA,MAACG,MAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAK,MAAA;AAAA,QAIL,SAAA,EAAU,yHAAA;AAAA,QACV,cAAY,CAAA,EAAG,CAAA,CAAE,0BAA0B,CAAC,CAAA,QAAA,EAAM,KAAK,IAAI,CAAA,CAAA;AAAA,QAE3D,QAAA,kBAAAH,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA,OAE1C,CAAA,EACF,CAAA;AAAA,oBACAD,IAAAA,CAACc,eAAAA,EAAA,EAAgB,OAAM,OAAA,EACrB,QAAA,EAAA;AAAA,sBAAAd,IAAAA,CAACe,YAAAA,EAAA,EAAa,OAAA,EAAS,MAAM,aAAA,CAAc,EAAE,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAA,EACtE,QAAA,EAAA;AAAA,wBAAAd,GAAAA,CAACe,MAAAA,EAAA,EAAO,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,EAAE,uBAAuB;AAAA,OAAA,EACpE,CAAA;AAAA,sBACAhB,IAAAA,CAACe,YAAAA,EAAA,EAAa,SAAS,MAAM,KAAK,aAAA,CAAc,IAAA,CAAK,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,IAAI,aAAU,CAAA,EAC7E,QAAA,EAAA;AAAA,wBAAAd,GAAAA,CAACgB,IAAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,EAAE,4BAA4B;AAAA,OAAA,EACvE,CAAA;AAAA,sBACAjB,IAAAA,CAACe,YAAAA,EAAA,EAAa,OAAA,EAAS,MAAM,KAAK,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI,EAAE,QAAA,EAAU,CAAC,IAAA,CAAK,QAAA,EAAU,CAAA,EAChF,QAAA,EAAA;AAAA,wBAAAd,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,QACnC,KAAK,QAAA,GAAW,CAAA,CAAE,6BAA6B,CAAA,GAAI,EAAE,2BAA2B;AAAA,OAAA,EACnF,CAAA;AAAA,sBACAD,KAACe,YAAAA,EAAA,EAAa,SAAS,MAAM,cAAA,CAAe,IAAI,CAAA,EAC9C,QAAA,EAAA;AAAA,wBAAAd,GAAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,EAAE,qBAAqB;AAAA,OAAA,EAC/D,CAAA;AAAA,sBACAA,GAAAA,CAACiB,iBAAAA,EAAA,EAAkB,CAAA;AAAA,sBACnBlB,IAAAA;AAAA,QAACe,YAAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,yCAAA;AAAA,UACV,OAAA,EAAS,MAAM,UAAA,CAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,UAExE,QAAA,EAAA;AAAA,4BAAAd,GAAAA,CAACS,MAAAA,EAAA,EAAO,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,YAAE,GAAA;AAAA,YAAE,EAAE,yBAAyB;AAAA;AAAA;AAAA;AACtE,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,uBACEV,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAUb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,qBACC,QAAA,kBAAAA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS;AAAA,UACP,GAAI,YAAY,CAAC;AAAA,YACf,EAAA,EAAI,UAAA;AAAA,YACJ,KAAA,EAAO,EAAE,sBAAsB,CAAA;AAAA,YAC/B,IAAA,EAAMkB,IAAAA;AAAA,YACN,MAAA,EAAQ,SAAA;AAAA,YACR,OAAA,EAAS,IAAA;AAAA,YACT,UAAU,MAAM,aAAA,CAAc,EAAE,IAAA,EAAM,MAAM;AAAA,WAC7C,IAAI,EAAC;AAAA,UACN,GAAI,YAAY,CAAC;AAAA,YACf,EAAA,EAAI,WAAA;AAAA,YACJ,KAAA,EAAO,EAAE,oBAAoB,CAAA;AAAA,YAC7B,WAAA,EAAa,EAAE,wBAAwB,CAAA;AAAA,YACvC,IAAA,EAAMC,QAAAA;AAAA;AAAA;AAAA,YAGN,MAAA,EAAS,YAAY,WAAA,GAAc,SAAA;AAAA,YACnC,OAAA,EAAS,IAAA;AAAA,YACT,QAAA,EAAU,MAAM,aAAA;AAAc,WAC/B,IAAI;AAAC;AACR;AAAA,KACF,EACF,CAAA;AAAA,IAaC,6BACCnB,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,MAAA;AAAA,QACV,YAAA,EAAY,EAAE,sBAAsB,CAAA;AAAA,QACpC,KAAA,EAAO,YAAA,IAAgB,KAAA,CAAM,CAAC,GAAG,EAAA,IAAM,EAAA;AAAA,QACvC,QAAA,EAAU,CAAC,EAAA,KAAO,KAAK,SAAS,EAAE,CAAA;AAAA,QAClC,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACxB,UAAA,MAAM,SAAS,IAAA,CAAK,EAAA,MAAQ,YAAA,IAAgB,KAAA,CAAM,CAAC,CAAA,EAAG,EAAA,CAAA;AACtD,UAAA,OAAO;AAAA,YACL,OAAO,IAAA,CAAK,EAAA;AAAA,YACZ,OAAO,IAAA,CAAK,IAAA;AAAA,YACZ,KAAA,EAAO,KAAK,SAAA,IAAa,CAAA;AAAA;AAAA;AAAA;AAAA,YAIzB,KAAA,EAAO,MAAA,GAAS,MAAA,mBACdA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAW,IAAA;AAAA,gBACX,SAAA,EAAW,mCACT,IAAA,CAAK,QAAA,IAAY,YAAY,IAAA,CAAK,YAAY,CAAA,GAAI,YAAA,GAAe,wBACnE,CAAA;AAAA;AAAA,aACF;AAAA;AAAA;AAAA;AAAA,YAKF,GAAA,EAAK,CAAC,IAAA,CAAK,QAAA;AAAA,YACX,QAAA,EAAU,MAAA,GAAS,WAAA,CAAY,IAAI,CAAA,GAAI;AAAA,WACzC;AAAA,QACF,CAAC;AAAA;AAAA,KACH;AAAA,IAMD,UAAA,IAAc,CAAC,iBAAA,CAAkB,UAAA,CAAW,YAAY,qBACvDD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,UAAM,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,sBACrBA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,oDACf,WAAA,CAAY,UAAA,CAAW,YAAY,CAAA,GAAI,8CAAA,GAAiD,UAC1F,CAAA,CAAA,EACG,QAAA,EAAA,WAAA,CAAY,WAAW,YAAY,CAAA,GAAI,EAAE,yBAAyB,CAAA,GAAI,CAAA,CAAE,yBAAyB,CAAA,EACpG;AAAA,KAAA,EACF,CAAA;AAAA,oBAGFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,kGAAA,EAAmG,CAAA;AAAA,wBACrHA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,MAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACzC,WAAA,EAAa,EAAE,qBAAqB,CAAA;AAAA,YACpC,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EACF,CAAA;AAAA,sBACAD,IAAAA,CAACI,MAAAA,EAAA,EAAO,SAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,MAAM,KAAK,aAAA,CAAc,CAAA,CAAE,6BAA6B,CAAC,CAAA,EACpG,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAACkB,IAAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,EAAE,yBAAyB;AAAA,OAAA,EAC/D;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,YAAA,IAAgB,WAAA,mBACflB,GAAAA,CAAC,SAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,sBACdA,GAAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAU,oDAAA,EAAA,EAAb,CAAkE,CAC7E,CAAA,EACH,IACE,OAAA,CAAQ,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,CAAC,KAAA,mBACpCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wFAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAACoB,eAAAA,EAAA,EAAgB,SAAA,EAAU,kCAAA,EAAmC,CAAA;AAAA,sBAC9DpB,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,yBAAA,EAA2B,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EAAE,CAAA;AAAA,sBAChEA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,wCAAA,EAA0C,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAAE,CAAA;AAAA,sBACnFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAACI,MAAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,OAAA,EAAS,MAAM,KAAK,aAAA,CAAc,CAAA,CAAE,6BAA6B,CAAC,CAAA,EAC1F,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAACkB,IAAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,UAAE,GAAA;AAAA,UAAE,EAAE,yBAAyB;AAAA,SAAA,EAC/D,CAAA;AAAA,QACC,6BACCnB,IAAAA,CAACI,MAAAA,EAAA,EAAO,SAAS,aAAA,EACf,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAACmB,QAAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,UAAE,GAAA;AAAA,UAAE,EAAE,oBAAoB;AAAA,SAAA,EAC9D;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,oBAEApB,IAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,kBAAA,EAAoB,aAAA;AAAA,QACpB,WAAA,EAAa,CAAC,KAAA,KAA0B,WAAA,CAAY,OAAO,KAAA,CAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,QAC3E,SAAA,EAAW,aAAA;AAAA,QACX,YAAA,EAAc,MAAM,WAAA,CAAY,IAAI,CAAA;AAAA,QAEpC,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,mBAAgB,KAAA,EAAO,OAAA,CAAQ,SAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,EAAG,UAAU,2BAAA,EACnE,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY;AACjC,YAAA,MAAM,OAAO,OAAA,CAAQ,SAAA,CAAU,IAAI,OAAA,CAAQ,EAAE,KAAK,EAAC;AACnD,YAAA,uBACEA,GAAAA,CAAC,eAAA,EAAA,EAAiC,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,EAAG,QAAA,EAAU,6BACxE,QAAA,kBAAAA,GAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,OAAA;AAAA,gBACA,UAAA,EAAY,IAAA;AAAA,gBACZ,SAAA;AAAA,gBACA,QAAA;AAAA,gBACA,QAAQ,QAAA,CAAS,MAAA;AAAA,gBACjB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,gBACzB,SAAA;AAAA,gBACA,UAAA;AAAA,gBACA;AAAA;AAAA,aACF,EAAA,EAXoB,QAAQ,EAY9B,CAAA;AAAA,UAEJ,CAAC,GACH,CAAA,EACF,CAAA;AAAA,0BACAA,GAAAA,CAAC,WAAA,EAAA,EAAa,QAAA,EAAA,QAAA,mBAAWA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EAA6C,CAAA,GAAK,IAAA,EAAK;AAAA;AAAA;AAAA,KACjG;AAAA,IAGD,KAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,qBACnBC,GAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UAEC,OAAA;AAAA,UACA,QAAA;AAAA,UACA,gBAAgB,CAAC,KAAA,KAAU,kBAAA,CAAmB,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,UAChE,eAAA,EAAiB,MAAM,kBAAA,CAAmB,OAAA,CAAQ,GAAG,CAAA;AAAA,UACrD,WAAA,EAAa,CAAC,OAAA,EAAS,KAAA,KAAU,gBAAgB,OAAA,CAAQ,GAAA,EAAK,SAAS,KAAK,CAAA;AAAA,UAC5E,cAAc,CAAC,OAAA,KAAY,eAAA,CAAgB,OAAA,CAAQ,KAAK,OAAO;AAAA,SAAA;AAAA,QAN1D,OAAA,CAAQ;AAAA,OAQhB,CAAA;AAAA,sBACDA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,MAAA,EAAQ,UAAA;AAAA,UACR,SAAA,EAAW,YAAA;AAAA,UACX,UAAU,YAAY;AACpB,YAAA,aAAA,CAAc,IAAI,CAAA;AAClB,YAAA,IAAI;AACF,cAAA,MAAM,MAAA,GAAS,MAAM,WAAA,EAAY;AACjC,cAAA,KAAA,CAAM,OAAA,CAAQ,EAAE,kBAAA,EAAoB;AAAA,gBAClC,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA;AAAA,gBAAG,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,eAAe;AAAA,eAC5E,CAAC,CAAA;AAAA,YACJ,CAAA,SAAE;AACA,cAAA,aAAA,CAAc,KAAK,CAAA;AAAA,YACrB;AAAA,UACF;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,oBAGFA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,MAAM,UAAA,CAAW,IAAA;AAAA,QACjB,IAAA,EAAM,UAAA,CAAW,OAAA,GAAU,UAAA,GAAa,MAAA;AAAA,QACxC,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,SAAS,MAAM,aAAA,CAAc,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA,QAC5C,QAAA,EAAU,OAAO,MAAA,KAAW;AAC1B,UAAA,IAAI,WAAW,OAAA,IAAW,UAAA,QAAkB,UAAA,CAAW,UAAA,CAAW,IAAI,MAAM,CAAA;AAAA,eACvE,MAAM,WAAW,MAAM,CAAA;AAAA,QAC9B;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,MAAM,UAAA,CAAW,IAAA;AAAA,QACjB,MAAM,UAAA,CAAW,IAAA;AAAA,QACjB,QAAA;AAAA,QACA,WAAW,UAAA,CAAW,SAAA;AAAA,QACtB,QAAA;AAAA,QACA,iBAAiB,OAAA,CAAQ,eAAA;AAAA,QACzB,SAAA;AAAA,QACA,aAAA,EAAe,WAAW,SAAA,EAAW,aAAA;AAAA,QACrC,OAAA,EAAS,MAAM,aAAA,CAAc,EAAE,MAAM,KAAA,EAAO,SAAA,EAAW,IAAI,CAAA;AAAA,QAC3D,QAAA,EAAU,UAAA;AAAA,QACV,aAAA,EAAe,CAAC,IAAA,KAAS,WAAA,CAAY,MAAM,MAAM;AAAA;AAAA,KACnD;AAAA,oBAEAA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,QAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,OAAA,EAAS,MAAM,cAAA,CAAe,KAAK;AAAA;AAAA,KACrC;AAAA,oBAEAA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,CAAC,CAAC,OAAA;AAAA,QACR,OAAA,EAAQ,aAAA;AAAA,QACR,KAAA,EAAO,OAAA,GAAU,CAAA,CAAE,CAAA,aAAA,EAAgB,OAAA,CAAQ,IAAI,CAAA,KAAA,CAAA,EAAS,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,CAAA,GAAI,EAAA;AAAA,QAClF,aAAa,OAAA,GAAU,CAAA,CAAE,gBAAgB,OAAA,CAAQ,IAAI,MAAM,CAAA,GAAI,MAAA;AAAA,QAC/D,YAAA,EAAc,EAAE,qBAAqB,CAAA;AAAA,QACrC,WAAA,EAAa,EAAE,kBAAkB,CAAA;AAAA,QACjC,SAAA,EAAW,MAAM,KAAK,aAAA,EAAc;AAAA,QACpC,QAAA,EAAU,MAAM,UAAA,CAAW,IAAI;AAAA;AAAA;AACjC,GAAA,EACF,CAAA;AAEJ;ACnjBO,SAAS,SAAS,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,YAAW,EAK5D;AACD,EAAA,uBACEA,IAAC,mBAAA,EAAA,EAAoB,MAAA,EAAgB,UAAoB,KAAA,EACvD,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,CAAA,EACnB,CAAA;AAEJ","file":"MenuPage-SO7EDR6R.js","sourcesContent":["import { createPluginContext, formatCurrency, type CurrencyConfig } from '@fayz-ai/admin'\nimport type { MenuDataProvider } from './data/types'\nimport type { MenuUIState } from './store'\n\n// ---------------------------------------------------------------------------\n// Labels\n// ---------------------------------------------------------------------------\n\nexport interface MenuPluginLabels {\n pageTitle: string\n menuManager: string\n categories: string\n newItem: string\n}\n\n// ---------------------------------------------------------------------------\n// Resolved config — fully merged, no optionals\n// ---------------------------------------------------------------------------\n\nexport interface MenuModules {\n modifiers: boolean\n deliveryPricing: boolean\n}\n\nexport type MenuCurrency = CurrencyConfig\n\nexport interface ResolvedMenuConfig {\n modules: MenuModules\n labels: MenuPluginLabels\n currency: MenuCurrency\n}\n\nconst ctx = createPluginContext<ResolvedMenuConfig, MenuDataProvider, MenuUIState>('MenuPage')\n\nexport const MenuContextProvider = ctx.ContextProvider\nexport const useMenuConfig = ctx.useConfig\nexport const useMenuProvider = ctx.useProvider\nexport const useMenuStore = ctx.useStore\n\nexport { formatCurrency }\n","import type { MenuAvailability } from '../types'\n\n// ---------------------------------------------------------------------------\n// \"Está sendo servido agora?\"\n//\n// The question the whole multi-menu idea exists to answer. Two rules that a\n// naive string compare gets wrong, so they live here with tests:\n// · a window whose end is before its start crosses midnight (22:00→02:00);\n// · an empty rule means ALWAYS — the common case must cost nothing.\n// ---------------------------------------------------------------------------\n\nconst MINUTES_IN_DAY = 24 * 60\n\n/** \"11:30\" → 690. Returns null for anything that is not HH:MM. */\nexport function parseTime(value: string | undefined): number | null {\n if (!value) return null\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(value.trim())\n if (!match) return null\n const hours = Number(match[1])\n const minutes = Number(match[2])\n if (hours > 23 || minutes > 59) return null\n return hours * 60 + minutes\n}\n\nexport function isAlwaysAvailable(availability: MenuAvailability | undefined): boolean {\n if (!availability) return true\n const { days, start, end, from, to } = availability\n return (!days || days.length === 0) && !start && !end && !from && !to\n}\n\n/** Does the rule allow the given moment? */\nexport function isServingAt(availability: MenuAvailability | undefined, at: Date = new Date()): boolean {\n if (isAlwaysAvailable(availability)) return true\n const rule = availability!\n\n const isoDate = `${at.getFullYear()}-${String(at.getMonth() + 1).padStart(2, '0')}-${String(at.getDate()).padStart(2, '0')}`\n if (rule.from && isoDate < rule.from) return false\n if (rule.to && isoDate > rule.to) return false\n\n const start = parseTime(rule.start)\n const end = parseTime(rule.end)\n const nowMinutes = at.getHours() * 60 + at.getMinutes()\n const overnight = start !== null && end !== null && end <= start\n\n // An overnight window belongs to the day it STARTED on: at 01:00 on Sunday a\n // \"Saturday 22:00→02:00\" menu is still being served.\n const dayToCheck = overnight && start !== null && nowMinutes < start\n ? (at.getDay() + 6) % 7\n : at.getDay()\n\n if (rule.days && rule.days.length > 0 && !rule.days.includes(dayToCheck)) return false\n\n if (start === null || end === null) return true\n return overnight\n ? nowMinutes >= start || nowMinutes < end\n : nowMinutes >= start && nowMinutes < end\n}\n\n/** Minutes until the rule next opens — used to say \"abre às 11:30\". */\nexport function minutesUntilOpen(availability: MenuAvailability | undefined, at: Date = new Date()): number | null {\n if (isServingAt(availability, at)) return 0\n const start = parseTime(availability?.start)\n if (start === null) return null\n const nowMinutes = at.getHours() * 60 + at.getMinutes()\n return start > nowMinutes ? start - nowMinutes : MINUTES_IN_DAY - nowMinutes + start\n}\n\n/** Short weekday names in the app's locale, Sunday first (matches Date#getDay). */\nexport function weekdayLabels(locale: string): string[] {\n const formatter = new Intl.DateTimeFormat(locale, { weekday: 'short' })\n // 2024-01-07 is a Sunday; noon avoids any timezone rolling the date over.\n return Array.from({ length: 7 }, (_, i) =>\n formatter.format(new Date(2024, 0, 7 + i, 12)).replace('.', ''))\n}\n\n/**\n * One line describing when it runs: \"Seg a Sex · 11:30–15:00\".\n * `alwaysLabel` is passed in because this package has no i18n of its own here.\n */\nexport function describeAvailability(\n availability: MenuAvailability | undefined,\n locale: string,\n alwaysLabel: string,\n): string {\n if (isAlwaysAvailable(availability)) return alwaysLabel\n const rule = availability!\n const parts: string[] = []\n\n if (rule.days && rule.days.length > 0 && rule.days.length < 7) {\n const labels = weekdayLabels(locale)\n const sorted = [...rule.days].sort((a, b) => a - b)\n // Contiguous runs read as a range (\"Seg a Sex\"); anything else is a list.\n const contiguous = sorted.every((day, i) => i === 0 || day === sorted[i - 1] + 1)\n parts.push(contiguous && sorted.length > 2\n ? `${labels[sorted[0]]} a ${labels[sorted[sorted.length - 1]]}`\n : sorted.map((d) => labels[d]).join(', '))\n }\n\n if (rule.start && rule.end) parts.push(`${rule.start}–${rule.end}`)\n else if (rule.start) parts.push(`a partir de ${rule.start}`)\n\n if (rule.from || rule.to) parts.push(`${rule.from ?? '…'} → ${rule.to ?? '…'}`)\n\n return parts.length > 0 ? parts.join(' · ') : alwaysLabel\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\n\nimport type { ExtractedMenu } from '../types'\nimport { normalizeExtraction } from './extract-parse'\n\n// ---------------------------------------------------------------------------\n// Where the photos are read.\n//\n// Today: the plugin's own edge function (`menu-extract`), reached through the\n// app's Supabase client so the user's token travels with it. The seam exists\n// because the platform broker will eventually take images too, and when it does\n// only this file changes — the screen keeps calling `extract(photos)`.\n//\n// Resolution returns null rather than throwing: a workspace with no function\n// deployed should hide the button, not blow up the menu screen.\n// ---------------------------------------------------------------------------\n\nexport type MenuExtractFn = (images: string[], hint?: string) => Promise<ExtractedMenu>\n\nexport interface MenuExtractOptions {\n /** Host override — an app that already owns an extraction endpoint. */\n extract?: MenuExtractFn\n /** Edge function name (default `menu-extract`). */\n functionName?: string\n}\n\nexport function resolveMenuExtractor(options?: MenuExtractOptions): MenuExtractFn | null {\n if (options?.extract) return options.extract\n\n const client = getSupabaseClientOptional() as any\n if (!client?.functions?.invoke) return null\n const functionName = options?.functionName ?? 'menu-extract'\n\n return async (images: string[], hint?: string): Promise<ExtractedMenu> => {\n const { data, error } = await client.functions.invoke(functionName, {\n body: { images, hint },\n })\n if (error) {\n // Edge functions answer 4xx with a body worth reading — a truncated\n // response tells the user to send fewer photos, which \"failed\" does not.\n const detail = (await safeMessage(error)) ?? error.message\n throw new Error(detail || 'menu extraction failed')\n }\n return normalizeExtraction(data)\n }\n}\n\nasync function safeMessage(error: any): Promise<string | null> {\n try {\n const body = await error?.context?.json?.()\n return typeof body?.error === 'string' ? body.error : null\n } catch {\n return null\n }\n}\n","// ---------------------------------------------------------------------------\n// Photos go to the model, not to storage — so they are shrunk first.\n//\n// A modern phone photo is 4000px and several megabytes; a menu is legible at\n// 1600px, and the difference is the request going through or timing out. The\n// original file is never touched: this returns a data URL to send.\n// ---------------------------------------------------------------------------\n\nexport interface DownscaleOptions {\n maxDimension?: number\n quality?: number\n}\n\nexport async function downscaleImage(file: File, options?: DownscaleOptions): Promise<string> {\n const maxDimension = options?.maxDimension ?? 1600\n const quality = options?.quality ?? 0.82\n\n const bitmap = await loadImage(file)\n const scale = Math.min(1, maxDimension / Math.max(bitmap.width, bitmap.height))\n const width = Math.round(bitmap.width * scale)\n const height = Math.round(bitmap.height * scale)\n\n const canvas = document.createElement('canvas')\n canvas.width = width\n canvas.height = height\n const context = canvas.getContext('2d')\n if (!context) return fileToDataUrl(file)\n context.drawImage(bitmap as CanvasImageSource, 0, 0, width, height)\n return canvas.toDataURL('image/jpeg', quality)\n}\n\nasync function loadImage(file: File): Promise<HTMLImageElement | ImageBitmap> {\n if (typeof createImageBitmap === 'function') {\n try {\n return await createImageBitmap(file)\n } catch {\n // HEIC and friends: fall through to the <img> path.\n }\n }\n const url = await fileToDataUrl(file)\n return new Promise((resolve, reject) => {\n const image = new Image()\n image.onload = () => resolve(image)\n image.onerror = () => reject(new Error('Could not read the image'))\n image.src = url\n })\n}\n\nexport function fileToDataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result))\n reader.onerror = () => reject(new Error('Could not read the file'))\n reader.readAsDataURL(file)\n })\n}\n","import { useMemo } from 'react'\nimport type { PluginAITool } from '@fayz-ai/core'\nimport { useAgentSurface, type AgentSurfaceContribution, type AgentSurfaceTool } from '@fayz-ai/admin'\n\nimport type {\n DraftItem, DraftSection, ImportResult, Menu, MenuDraft, MenuItem, MenuItemStatus, MenuPlacement, MenuSection,\n} from '../types'\nimport { normalizeName } from './extract-parse'\n\n// ---------------------------------------------------------------------------\n// The menu, as the assistant sees it.\n//\n// The screen publishes what is open and what can be done to it, so \"cria uma\n// seção de sobremesas e move o pudim pra lá\" happens on the menu in front of\n// the user instead of the agent guessing ids. Everything here is client-plane:\n// it runs against the store that is already loaded, which is why it can speak\n// in NAMES — the thing a person actually says.\n// ---------------------------------------------------------------------------\n\nconst INSTRUCTIONS = `Você está com a tela de Cardápio aberta e é VOCÊ quem conduz o cadastro.\n- Trabalhe sempre no cardápio ativo mostrado no estado; se o usuário pedir outro, troque ou crie.\n- Seções e itens são identificados por NOME, do jeito que o usuário fala. Preço é número (29.9), sem moeda.\n\nCadastro por FOTO (o caminho principal para um cardápio novo):\n1. Diga em uma linha o que vai fazer e chame requestMenuPhotos. Isso põe um botão grande aqui na conversa (\"Subir foto do cardápio\") que abre a câmera ou os arquivos — não peça para o usuário usar o clipe, e não mande ele fazer nada na tela.\n2. Espere. O envio dispara a leitura sozinho.\n3. Quando \\`draft\\` aparecer no estado, LEIA em voz alta o que veio: quantas seções, quantos itens, e quais ficaram com preço 0.\n4. Resolva as pendências conversando — pergunte o preço que faltou e chame updateMenuDraftItem. O usuário também pode editar direto na tela; o estado sempre reflete o que está lá.\n5. Só chame commitMenuDraft depois que o usuário confirmar. Se ele desistir, discardMenuDraft.\n\nNUNCA escreva um botão em texto (nada de \"[Subir foto do cardápio]\" ou \"clique no botão abaixo\") — o botão só existe se você chamar a ferramenta. Se ela não estiver disponível, diga isso com todas as letras e ofereça cadastrar item a item.\n\nNunca invente preço, descrição ou item que não estava na foto: um preço errado vai para a mesa do cliente. Prefira perguntar.`\n\nexport interface MenuAgentSurfaceDeps {\n menu?: Menu\n menus: Menu[]\n sections: MenuSection[]\n placements: MenuPlacement[]\n itemsById: Map<string, MenuItem>\n /** What the photos produced, still uncommitted. Both hands edit it. */\n draft: MenuDraft | null\n /** False when no extraction backend is configured — the tool then says so. */\n hasExtractor: boolean\n actions: {\n createSection: (name: string) => Promise<MenuSection | null>\n renameSection: (sectionId: string, name: string) => Promise<void> | void\n reorderSections: (orderedIds: string[]) => Promise<void>\n createItem: (sectionId: string, input: { name: string; price: number; description?: string }) => Promise<MenuItem | null>\n updateItem: (itemId: string, patch: { name?: string; price?: number; description?: string }) => Promise<void>\n setItemStatus: (itemId: string, status: MenuItemStatus) => Promise<void>\n moveItem: (placementId: string, toSectionId: string, toIndex: number) => Promise<void>\n createMenu: (input: { name: string; days?: number[]; start?: string; end?: string }) => Promise<Menu>\n duplicateMenu: (menuId: string, name: string) => Promise<Menu>\n /** Puts the upload button in the conversation and reads what comes back. */\n requestPhotos: () => void\n updateDraftItem: (sectionKey: string, itemKey: string, patch: Partial<DraftItem>) => void\n removeDraftItem: (sectionKey: string, itemKey: string) => void\n updateDraftSection: (sectionKey: string, patch: Partial<Pick<DraftSection, 'name' | 'targetSectionId'>>) => void\n removeDraftSection: (sectionKey: string) => void\n commitDraft: () => Promise<ImportResult>\n discardDraft: () => void\n }\n}\n\nfunction tool(\n id: string,\n name: string,\n description: string,\n properties: Record<string, any>,\n required: string[],\n mode: 'read' | 'persist' = 'persist',\n): PluginAITool {\n return {\n id,\n name,\n description,\n mode,\n parameters: { type: 'object', properties, required },\n execution: { plane: 'client' },\n // The screen is in front of the user and every one of these is reversible\n // by hand; a confirmation card per rename would make the agent useless for\n // the one job it is good at here — bulk tidying.\n requiresConfirmation: false,\n permission: { feature: 'menu', action: 'edit' },\n }\n}\n\nexport function useMenuAgentSurface(deps: MenuAgentSurfaceDeps): void {\n // A ref-free memo would re-register on every keystroke; the contribution is\n // rebuilt only when the shape of the menu changes.\n const contribution = useMemo<AgentSurfaceContribution>(() => {\n const findSection = (name: string): MenuSection | undefined => {\n const key = normalizeName(name ?? '')\n return deps.sections.find((s) => normalizeName(s.name) === key)\n ?? deps.sections.find((s) => normalizeName(s.name).includes(key))\n }\n const findDraftSection = (draft: MenuDraft | null, name: string): DraftSection | undefined => {\n const key = normalizeName(name ?? '')\n return draft?.sections.find((s) => normalizeName(s.name) === key)\n ?? draft?.sections.find((s) => normalizeName(s.name).includes(key))\n }\n const findDraft = (draft: MenuDraft | null, sectionName: string, itemName: string) => {\n const section = findDraftSection(draft, sectionName)\n if (!section) return undefined\n const key = normalizeName(itemName ?? '')\n const item = section.items.find((i) => normalizeName(i.name) === key)\n ?? section.items.find((i) => normalizeName(i.name).includes(key))\n return item ? { section, item } : undefined\n }\n const findItem = (name: string): { item: MenuItem; placement?: MenuPlacement } | undefined => {\n const key = normalizeName(name ?? '')\n const items = Array.from(deps.itemsById.values())\n const item = items.find((i) => normalizeName(i.name) === key)\n ?? items.find((i) => normalizeName(i.name).includes(key))\n if (!item) return undefined\n return { item, placement: deps.placements.find((p) => p.itemId === item.id) }\n }\n\n const tools: AgentSurfaceTool[] = [\n {\n tool: tool('menu.surface.create-section', 'createMenuSection',\n 'Cria uma seção no cardápio aberto (ex.: Sobremesas, Entradas).',\n { name: { type: 'string', description: 'Nome da seção' } }, ['name']),\n execute: async ({ name }: any) => {\n const created = await deps.actions.createSection(String(name))\n return created ? { ok: true, section: created.name } : { error: 'section_not_created' }\n },\n },\n {\n tool: tool('menu.surface.rename-section', 'renameMenuSection',\n 'Renomeia uma seção do cardápio aberto.',\n { sectionName: { type: 'string' }, newName: { type: 'string' } }, ['sectionName', 'newName']),\n execute: async ({ sectionName, newName }: any) => {\n const section = findSection(sectionName)\n if (!section) return { error: 'section_not_found', sectionName }\n await deps.actions.renameSection(section.id, String(newName))\n return { ok: true }\n },\n },\n {\n tool: tool('menu.surface.reorder-sections', 'reorderMenuSections',\n 'Reordena as seções do cardápio aberto. Passe TODOS os nomes na ordem desejada.',\n { orderedNames: { type: 'array', items: { type: 'string' }, description: 'Nomes das seções na nova ordem' } },\n ['orderedNames']),\n execute: async ({ orderedNames }: any) => {\n const ids = (orderedNames as string[]).map((name) => findSection(name)?.id).filter(Boolean) as string[]\n if (ids.length !== deps.sections.length) return { error: 'incomplete_order', expected: deps.sections.map((s) => s.name) }\n await deps.actions.reorderSections(ids)\n return { ok: true }\n },\n },\n {\n tool: tool('menu.surface.create-item', 'createMenuItem',\n 'Cria um item no cardápio aberto, dentro de uma seção.',\n {\n name: { type: 'string' },\n price: { type: 'number' },\n sectionName: { type: 'string', description: 'Seção onde entra' },\n description: { type: 'string' },\n }, ['name', 'price', 'sectionName']),\n execute: async ({ name, price, sectionName, description }: any) => {\n const section = findSection(sectionName)\n if (!section) return { error: 'section_not_found', sectionName, available: deps.sections.map((s) => s.name) }\n const created = await deps.actions.createItem(section.id, {\n name: String(name), price: Number(price) || 0, description: description ? String(description) : undefined,\n })\n return created ? { ok: true, item: created.name } : { error: 'item_not_created' }\n },\n },\n {\n tool: tool('menu.surface.update-item', 'updateMenuItem',\n 'Altera nome, preço, descrição ou disponibilidade de um item.',\n {\n itemName: { type: 'string' },\n price: { type: 'number' },\n name: { type: 'string', description: 'Novo nome' },\n description: { type: 'string' },\n status: { type: 'string', enum: ['available', 'sold_out', 'hidden'] },\n }, ['itemName']),\n execute: async ({ itemName, price, name, description, status }: any) => {\n const found = findItem(itemName)\n if (!found) return { error: 'item_not_found', itemName }\n if (price !== undefined || name !== undefined || description !== undefined) {\n await deps.actions.updateItem(found.item.id, {\n price: price !== undefined ? Number(price) : undefined,\n name: name !== undefined ? String(name) : undefined,\n description: description !== undefined ? String(description) : undefined,\n })\n }\n if (status) await deps.actions.setItemStatus(found.item.id, status as MenuItemStatus)\n return { ok: true }\n },\n },\n {\n tool: tool('menu.surface.move-item', 'moveMenuItem',\n 'Move um item para outra seção do cardápio aberto.',\n { itemName: { type: 'string' }, toSectionName: { type: 'string' } }, ['itemName', 'toSectionName']),\n execute: async ({ itemName, toSectionName }: any) => {\n const found = findItem(itemName)\n if (!found?.placement) return { error: 'item_not_in_menu', itemName }\n const section = findSection(toSectionName)\n if (!section) return { error: 'section_not_found', toSectionName }\n const target = deps.placements.filter((p) => p.sectionId === section.id).length\n await deps.actions.moveItem(found.placement.id, section.id, target)\n return { ok: true }\n },\n },\n {\n tool: tool('menu.surface.create-menu', 'createMenu',\n 'Cria outro cardápio (ex.: Executivo de segunda a sexta, Fim de semana). Pode copiar o cardápio aberto.',\n {\n name: { type: 'string' },\n copyFromOpenMenu: { type: 'boolean', description: 'Copiar seções e itens do cardápio aberto' },\n days: { type: 'array', items: { type: 'number' }, description: '0=domingo … 6=sábado' },\n start: { type: 'string', description: 'HH:MM' },\n end: { type: 'string', description: 'HH:MM' },\n }, ['name']),\n execute: async ({ name, copyFromOpenMenu, days, start, end }: any) => {\n if (copyFromOpenMenu && deps.menu) {\n const copy = await deps.actions.duplicateMenu(deps.menu.id, String(name))\n return { ok: true, menu: copy.name, note: 'A cópia começa desativada.' }\n }\n const created = await deps.actions.createMenu({ name: String(name), days, start, end })\n return { ok: true, menu: created.name }\n },\n },\n {\n tool: tool('menu.surface.request-photos', 'requestMenuPhotos',\n 'Pede as fotos do cardápio ao usuário: aparece um botão grande aqui na conversa para tirar a foto ou escolher o arquivo. O que for lido vira um rascunho no estado, que você confere com ele antes de gravar.',\n {}, [], 'read'),\n execute: async () => {\n if (!deps.hasExtractor) {\n return { error: 'extractor_unavailable', message: 'Este espaço ainda não tem a leitura por foto configurada. O cadastro pode ser feito item a item.' }\n }\n deps.actions.requestPhotos()\n return { ok: true, asked: true, next: 'O botão já está na conversa. Espere o usuário enviar — o rascunho aparece no estado quando a leitura terminar.' }\n },\n },\n {\n tool: tool('menu.surface.update-draft-item', 'updateMenuDraftItem',\n 'Corrige um item do RASCUNHO lido das fotos (preço, nome, descrição). Não grava nada ainda.',\n {\n sectionName: { type: 'string' },\n itemName: { type: 'string' },\n price: { type: 'number' },\n name: { type: 'string', description: 'Novo nome' },\n description: { type: 'string' },\n }, ['sectionName', 'itemName']),\n execute: async ({ sectionName, itemName, price, name, description }: any) => {\n const found = findDraft(deps.draft, sectionName, itemName)\n if (!found) return { error: 'draft_item_not_found', itemName }\n deps.actions.updateDraftItem(found.section.key, found.item.key, {\n price: price !== undefined ? Number(price) : undefined,\n name: name !== undefined ? String(name) : undefined,\n description: description !== undefined ? String(description) : undefined,\n })\n return { ok: true }\n },\n },\n {\n tool: tool('menu.surface.remove-draft-item', 'removeMenuDraftItem',\n 'Tira um item do rascunho (leitura errada, item repetido).',\n { sectionName: { type: 'string' }, itemName: { type: 'string' } }, ['sectionName', 'itemName']),\n execute: async ({ sectionName, itemName }: any) => {\n const found = findDraft(deps.draft, sectionName, itemName)\n if (!found) return { error: 'draft_item_not_found', itemName }\n deps.actions.removeDraftItem(found.section.key, found.item.key)\n return { ok: true }\n },\n },\n {\n tool: tool('menu.surface.update-draft-section', 'updateMenuDraftSection',\n 'Renomeia uma seção do rascunho, ou manda os itens dela para uma seção que já existe no cardápio.',\n {\n sectionName: { type: 'string' },\n newName: { type: 'string' },\n intoExistingSection: { type: 'string', description: 'Nome de uma seção existente para receber os itens' },\n }, ['sectionName']),\n execute: async ({ sectionName, newName, intoExistingSection }: any) => {\n const section = findDraftSection(deps.draft, sectionName)\n if (!section) return { error: 'draft_section_not_found', sectionName }\n const target = intoExistingSection ? findSection(intoExistingSection) : undefined\n if (intoExistingSection && !target) return { error: 'section_not_found', intoExistingSection }\n deps.actions.updateDraftSection(section.key, {\n name: newName ? String(newName) : undefined,\n targetSectionId: target?.id,\n })\n return { ok: true }\n },\n },\n {\n tool: tool('menu.surface.commit-draft', 'commitMenuDraft',\n 'Grava o rascunho no cardápio. Só chame depois que o usuário confirmar.',\n {}, []),\n execute: async () => {\n if (!deps.draft) return { error: 'no_draft' }\n const result = await deps.actions.commitDraft()\n return { ok: true, ...result }\n },\n },\n {\n tool: tool('menu.surface.discard-draft', 'discardMenuDraft',\n 'Descarta o rascunho lido das fotos sem gravar nada.',\n {}, []),\n execute: async () => {\n deps.actions.discardDraft()\n return { ok: true }\n },\n },\n ]\n\n return {\n id: 'menu.manager',\n pluginId: 'menu',\n // No role on purpose: whoever is answering is answering ABOUT this\n // screen, and a persona filter here is what silently removed these tools\n // from the catalogue while the instructions still arrived.\n instructions: INSTRUCTIONS,\n tools,\n describe: () => ({\n title: deps.menu?.name ?? 'Cardápio',\n state: {\n activeMenu: deps.menu?.name,\n allMenus: deps.menus.map((m) => m.name),\n photoImportAvailable: deps.hasExtractor,\n // The draft is the conversation's subject while it exists, so it goes\n // FIRST in the snapshot the model reads.\n draft: deps.draft ? {\n source: deps.draft.source,\n model: deps.draft.model,\n sections: deps.draft.sections.map((section) => ({\n name: section.name,\n appendingTo: section.targetSectionId\n ? deps.sections.find((s) => s.id === section.targetSectionId)?.name\n : undefined,\n items: section.items.map((item) => ({ name: item.name, price: item.price, description: item.description })),\n })),\n itemsMissingPrice: deps.draft.sections.flatMap((section) =>\n section.items.filter((item) => item.price === 0).map((item) => item.name)),\n } : undefined,\n sections: deps.sections.map((section) => ({\n name: section.name,\n items: deps.placements\n .filter((p) => p.sectionId === section.id)\n .map((p) => {\n const item = deps.itemsById.get(p.itemId)\n return item ? { name: item.name, price: p.priceOverride ?? item.price, status: item.status } : null\n })\n .filter(Boolean),\n })),\n },\n }),\n }\n }, [deps.menu, deps.menus, deps.sections, deps.placements, deps.itemsById, deps.draft, deps.hasExtractor, deps.actions])\n\n useAgentSurface(contribution)\n}\n","import React, { useState } from 'react'\nimport {\n ChevronDown, ChevronRight, Copy, GripVertical, ImageOff, Loader2, MoreHorizontal,\n Pencil, Plus, Star, Trash2, UtensilsCrossed, XCircle,\n} from 'lucide-react'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { useTranslation } from '@fayz-ai/core'\nimport {\n Button, Dropdown, DropdownContent, DropdownItem, DropdownSeparator, DropdownTrigger, Switch,\n} from '@fayz-ai/ui'\n\nimport type { MenuItem, MenuItemStatus, MenuPlacement, MenuSection } from '../types'\nimport { formatCurrency } from '../context'\nimport { describeAvailability, isAlwaysAvailable, isServingAt } from '../lib/availability'\n\n// ---------------------------------------------------------------------------\n// A section and the dishes in it. Both levels are draggable — the order on this\n// screen IS the order the customer reads, and typing numbers into a \"position\"\n// field is not how anyone thinks about a menu.\n// ---------------------------------------------------------------------------\n\nexport interface SectionHandlers {\n onRenameSection: (sectionId: string, name: string) => void\n onEditSection: (section: MenuSection) => void\n onDeleteSection: (section: MenuSection) => void\n onAddItem: (sectionId: string) => void\n onEditItem: (item: MenuItem, placement: MenuPlacement) => void\n onDuplicateItem: (item: MenuItem, sectionId: string) => void\n onRemoveFromMenu: (placement: MenuPlacement) => void\n onDeleteItem: (item: MenuItem) => void\n onToggleItem: (itemId: string, field: 'availableForPos' | 'availableForDelivery' | 'isFeatured', value: boolean) => void\n onSetItemStatus: (itemId: string, status: MenuItemStatus) => void\n onSetPlacementPrice: (placementId: string, price: number | undefined) => void\n}\n\nconst STATUS_STYLE: Record<MenuItemStatus, string> = {\n available: 'bg-success-soft text-success-soft-foreground',\n sold_out: 'bg-destructive-soft text-destructive-soft-foreground',\n hidden: 'bg-muted text-muted-foreground',\n}\n\n/** Click the price, type, Enter. The menu's most repeated edit by far. */\nfunction InlinePrice({ value, currency, muted, onSave }: {\n value: number\n currency: { code: string; locale: string; symbol: string }\n muted?: boolean\n onSave: (next: number) => void\n}) {\n const [editing, setEditing] = useState(false)\n const [draft, setDraft] = useState('')\n\n if (!editing) {\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); setDraft(String(value ?? 0)); setEditing(true) }}\n className={`rounded px-1.5 py-0.5 text-sm tabular-nums transition-colors hover:bg-muted ${muted ? 'text-muted-foreground' : 'font-medium'}`}\n >\n {formatCurrency(value ?? 0, currency)}\n </button>\n )\n }\n\n const commit = () => {\n const parsed = Number(draft.replace(',', '.'))\n setEditing(false)\n if (Number.isFinite(parsed) && parsed !== value) onSave(Math.max(0, parsed))\n }\n\n return (\n <input\n autoFocus\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commit}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commit()\n if (e.key === 'Escape') setEditing(false)\n }}\n className=\"w-20 rounded border bg-card px-1.5 py-0.5 text-right text-sm tabular-nums focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n )\n}\n\nfunction ItemRow({ placement, item, currency, deliveryPricing, multiMenu, pending, handlers }: {\n placement: MenuPlacement\n item: MenuItem | undefined\n currency: { code: string; locale: string; symbol: string }\n deliveryPricing: boolean\n multiMenu: boolean\n /** Drawn, not yet written. Dimmed and inert rather than absent. */\n pending?: boolean\n handlers: SectionHandlers\n}) {\n const t = useTranslation()\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: placement.id,\n data: { type: 'item', sectionId: placement.sectionId },\n })\n\n if (!item) return null\n\n const price = placement.priceOverride ?? item.price\n const overridden = placement.priceOverride !== undefined && placement.priceOverride !== null\n\n return (\n <div\n ref={setNodeRef}\n style={{ transform: CSS.Transform.toString(transform), transition }}\n className={`group flex items-center gap-3 border-b px-3 py-2 last:border-0 ${isDragging ? 'opacity-40' : 'hover:bg-muted/20'} ${pending ? 'pointer-events-none opacity-60' : ''}`}\n >\n <button\n {...attributes}\n {...listeners}\n aria-label={t('menu.manager.dragItem')}\n className=\"cursor-grab text-muted-foreground/40 opacity-0 transition-opacity group-hover:opacity-100 active:cursor-grabbing\"\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted/40\">\n {item.imageUrl\n ? <img src={item.imageUrl} alt=\"\" className=\"h-full w-full object-cover\" />\n : <ImageOff className=\"h-3.5 w-3.5 text-muted-foreground/40\" />}\n </div>\n\n <button\n type=\"button\"\n onClick={() => handlers.onEditItem(item, placement)}\n className=\"min-w-0 flex-1 text-left\"\n >\n <div className=\"flex items-center gap-1.5\">\n <span className={`truncate text-sm font-medium ${item.status === 'hidden' ? 'text-muted-foreground' : ''}`}>\n {item.name}\n </span>\n {item.isFeatured && <Star className=\"h-3 w-3 shrink-0 fill-warning text-warning\" />}\n {item.status !== 'available' && (\n <span className={`rounded-full px-1.5 py-0.5 text-[9px] font-medium ${STATUS_STYLE[item.status]}`}>\n {item.status === 'sold_out' ? t('menu.manager.soldOut') : t('menu.manager.hidden')}\n </span>\n )}\n </div>\n {item.description && <p className=\"truncate text-[11px] text-muted-foreground\">{item.description}</p>}\n </button>\n\n <div className=\"flex items-center gap-1\">\n <InlinePrice\n value={price}\n currency={currency}\n onSave={(next) => {\n // In a multi-menu world the number next to a dish belongs to THIS\n // menu, so typing it sets the override, not the product's price.\n if (multiMenu) handlers.onSetPlacementPrice(placement.id, next === item.price ? undefined : next)\n else handlers.onEditItem({ ...item, price: next }, placement)\n }}\n />\n {overridden && (\n <span title={t('menu.manager.overriddenHint')} className=\"text-[9px] font-medium uppercase text-primary\">\n {t('menu.manager.overridden')}\n </span>\n )}\n </div>\n\n {deliveryPricing && (\n <span className=\"hidden w-20 text-right text-xs text-muted-foreground sm:block\">\n {item.deliveryPrice != null ? formatCurrency(item.deliveryPrice, currency) : '—'}\n </span>\n )}\n\n <div className=\"hidden items-center gap-3 md:flex\">\n <Switch size=\"sm\" checked={item.availableForPos} onCheckedChange={(v) => handlers.onToggleItem(item.id, 'availableForPos', v)} label={t('menu.manager.pos')} />\n <Switch size=\"sm\" checked={item.availableForDelivery} onCheckedChange={(v) => handlers.onToggleItem(item.id, 'availableForDelivery', v)} label={t('menu.manager.delivery')} />\n </div>\n\n <Dropdown>\n <DropdownTrigger asChild>\n <button className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\" aria-label={t('menu.manager.itemActions')}>\n <MoreHorizontal className=\"h-4 w-4\" />\n </button>\n </DropdownTrigger>\n <DropdownContent align=\"end\">\n <DropdownItem onClick={() => handlers.onEditItem(item, placement)}>\n <Pencil className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.edit')}\n </DropdownItem>\n <DropdownItem onClick={() => handlers.onDuplicateItem(item, placement.sectionId)}>\n <Copy className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.duplicate')}\n </DropdownItem>\n <DropdownItem onClick={() => handlers.onSetItemStatus(item.id, item.status === 'sold_out' ? 'available' : 'sold_out')}>\n <XCircle className=\"mr-2 h-3.5 w-3.5\" />\n {item.status === 'sold_out' ? t('menu.manager.markAvailable') : t('menu.manager.markSoldOut')}\n </DropdownItem>\n <DropdownItem onClick={() => handlers.onToggleItem(item.id, 'isFeatured', !item.isFeatured)}>\n <Star className=\"mr-2 h-3.5 w-3.5\" />\n {item.isFeatured ? t('menu.manager.unfeature') : t('menu.manager.feature')}\n </DropdownItem>\n <DropdownSeparator />\n {/* Two different removals, and the difference matters: one takes the\n dish off this menu, the other deletes the dish. */}\n <DropdownItem onClick={() => handlers.onRemoveFromMenu(placement)}>\n <XCircle className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.removeFromMenu')}\n </DropdownItem>\n <DropdownItem className=\"text-destructive focus:text-destructive\" onClick={() => handlers.onDeleteItem(item)}>\n <Trash2 className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.deleteItem')}\n </DropdownItem>\n </DropdownContent>\n </Dropdown>\n </div>\n )\n}\n\nexport function SectionCard({\n section, placements, itemsById, currency, locale, deliveryPricing, multiMenu, pendingIds, handlers,\n}: {\n section: MenuSection\n placements: MenuPlacement[]\n itemsById: Map<string, MenuItem>\n currency: { code: string; locale: string; symbol: string }\n locale: string\n deliveryPricing: boolean\n multiMenu: boolean\n /** Ids of rows already on screen whose write has not landed. */\n pendingIds?: string[]\n handlers: SectionHandlers\n}) {\n const t = useTranslation()\n const [collapsed, setCollapsed] = useState(false)\n const [renaming, setRenaming] = useState(false)\n const [draft, setDraft] = useState(section.name)\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: section.id,\n data: { type: 'section' },\n })\n\n const scheduled = !isAlwaysAvailable(section.availability)\n const servingNow = isServingAt(section.availability)\n const pending = new Set(pendingIds ?? [])\n const sectionPending = pending.has(section.id)\n\n return (\n <div\n ref={setNodeRef}\n style={{ transform: CSS.Transform.toString(transform), transition }}\n className={`overflow-hidden rounded-card border bg-card shadow-sm ${isDragging ? 'opacity-50' : ''} ${sectionPending ? 'opacity-70' : ''}`}\n >\n <div className=\"flex items-center gap-2 border-b bg-muted/20 px-3 py-2\">\n <button\n {...attributes}\n {...listeners}\n aria-label={t('menu.manager.dragSection')}\n className=\"cursor-grab text-muted-foreground/50 hover:text-foreground active:cursor-grabbing\"\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => setCollapsed((c) => !c)}\n className=\"text-muted-foreground hover:text-foreground\"\n aria-label={collapsed ? t('menu.manager.expand') : t('menu.manager.collapse')}\n >\n {collapsed ? <ChevronRight className=\"h-4 w-4\" /> : <ChevronDown className=\"h-4 w-4\" />}\n </button>\n\n {renaming ? (\n <input\n autoFocus\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => { setRenaming(false); if (draft.trim() && draft !== section.name) handlers.onRenameSection(section.id, draft.trim()) }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur()\n if (e.key === 'Escape') { setDraft(section.name); setRenaming(false) }\n }}\n className=\"rounded border bg-card px-2 py-0.5 text-sm font-semibold focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n ) : (\n <button\n type=\"button\"\n onClick={() => { setDraft(section.name); setRenaming(true) }}\n className=\"rounded px-1 py-0.5 text-sm font-semibold transition-colors hover:bg-muted\"\n >\n {section.name}\n </button>\n )}\n\n <span className=\"text-[11px] text-muted-foreground\">{t('menu.manager.itemsCount', { count: String(placements.length) })}</span>\n {sectionPending && <Loader2 className=\"h-3 w-3 animate-spin text-muted-foreground\" />}\n\n {scheduled && (\n <span\n className={`hidden rounded-full px-2 py-0.5 text-[10px] font-medium sm:inline ${servingNow ? 'bg-success-soft text-success-soft-foreground' : 'bg-muted text-muted-foreground'}`}\n title={describeAvailability(section.availability, locale, t('menu.schedule.always'))}\n >\n {describeAvailability(section.availability, locale, t('menu.schedule.always'))}\n </span>\n )}\n {!section.isActive && (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {t('menu.manager.sectionOff')}\n </span>\n )}\n\n <div className=\"ml-auto flex items-center gap-1\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => handlers.onAddItem(section.id)}>\n <Plus className=\"h-3.5 w-3.5\" /> {t('menu.manager.addItem')}\n </Button>\n <Dropdown>\n <DropdownTrigger asChild>\n <button className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\" aria-label={t('menu.manager.sectionActions')}>\n <MoreHorizontal className=\"h-4 w-4\" />\n </button>\n </DropdownTrigger>\n <DropdownContent align=\"end\">\n <DropdownItem onClick={() => handlers.onEditSection(section)}>\n <Pencil className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.editSection')}\n </DropdownItem>\n <DropdownSeparator />\n <DropdownItem className=\"text-destructive focus:text-destructive\" onClick={() => handlers.onDeleteSection(section)}>\n <Trash2 className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.deleteSection')}\n </DropdownItem>\n </DropdownContent>\n </Dropdown>\n </div>\n </div>\n\n {!collapsed && (\n placements.length === 0 ? (\n <button\n type=\"button\"\n onClick={() => handlers.onAddItem(section.id)}\n className=\"flex w-full flex-col items-center gap-1 border-2 border-dashed border-transparent py-6 text-center transition-colors hover:bg-muted/20\"\n >\n <UtensilsCrossed className=\"h-5 w-5 text-muted-foreground/40\" />\n <span className=\"text-xs text-muted-foreground\">{t('menu.manager.emptySection')}</span>\n </button>\n ) : (\n <div>\n {placements.map((placement) => (\n <ItemRow\n key={placement.id}\n placement={placement}\n item={itemsById.get(placement.itemId)}\n currency={currency}\n deliveryPricing={deliveryPricing}\n multiMenu={multiMenu}\n pending={pending.has(placement.id)}\n handlers={handlers}\n />\n ))}\n </div>\n )\n )}\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Menu Plugin — Pure TypeScript types\n//\n// The shape of the domain, in three levels: a MENU (there can be several — an\n// executive lunch, a weekend one, a delivery one), the SECTIONS inside it, and\n// the PLACEMENT of an item in a section. The item itself is a product: the same\n// dish can sit in three menus at three prices without being cloned.\n// ---------------------------------------------------------------------------\n\n// ============================================================\n// ENUMS / LITERALS\n// ============================================================\n\nexport type MenuItemStatus = 'available' | 'sold_out' | 'hidden'\n\n/** Where a menu is served. A weekend menu that never reaches delivery is a\n * channel decision, not a separate menu. */\nexport type MenuChannel = 'pos' | 'delivery' | 'digital'\n\nexport const MENU_CHANNELS: MenuChannel[] = ['pos', 'delivery', 'digital']\n\n// ============================================================\n// AVAILABILITY\n// ============================================================\n\n/**\n * When a menu (or section) is being served. An empty rule means \"always\" —\n * the common case, and the one that must not cost the user a single click.\n *\n * `days` is 0=Sunday..6=Saturday, matching Date#getDay. A window whose `end` is\n * earlier than its `start` crosses midnight (22:00→02:00 is a late-night menu),\n * which is why the evaluation is not a naive string compare.\n */\nexport interface MenuAvailability {\n /** Weekdays it runs. Empty/undefined = every day. */\n days?: number[]\n /** \"HH:MM\", 24h. Both must be set for a window to apply. */\n start?: string\n end?: string\n /** Runs only inside this date range (ISO dates) — seasonal menus. */\n from?: string\n to?: string\n}\n\n// ============================================================\n// CORE ENTITIES\n// ============================================================\n\n/** A menu — `plg_menu_menus`. */\nexport interface Menu {\n id: string\n name: string\n description?: string\n isActive: boolean\n sortOrder: number\n channels: MenuChannel[]\n availability: MenuAvailability\n /** Filled by the provider for the list header. */\n sectionCount?: number\n itemCount?: number\n tenantId: string\n createdAt: string\n updatedAt: string\n}\n\n/** A section inside a menu — `plg_menu_sections`. */\nexport interface MenuSection {\n id: string\n menuId: string\n name: string\n description?: string\n imageUrl?: string\n sortOrder: number\n isActive: boolean\n /** Sections can narrow the menu's window (sobremesas só à noite). */\n availability?: MenuAvailability\n tenantId: string\n createdAt: string\n updatedAt: string\n}\n\n/** An item's place in a section — `plg_menu_placements`. */\nexport interface MenuPlacement {\n id: string\n sectionId: string\n itemId: string\n sortOrder: number\n /** Price for THIS menu. Undefined = the item's own price. */\n priceOverride?: number\n isActive: boolean\n tenantId: string\n}\n\n/** Menu category — legacy flat grouping (public.categories, kind='menu_category').\n * Kept for providers that predate menus; the adapter maps it onto sections. */\nexport interface MenuCategory {\n id: string\n name: string\n parentId?: string\n icon?: string\n color?: string\n sortOrder: number\n isActive: boolean\n itemCount?: number\n tenantId: string\n createdAt: string\n updatedAt: string\n}\n\n/** Menu item — public.products + the plg_menu_items extension */\nexport interface MenuItem {\n id: string\n name: string\n description?: string\n price: number\n cost?: number\n currency: string\n sku?: string\n imageUrl?: string\n categoryId?: string\n categoryName?: string\n status: MenuItemStatus\n isActive: boolean\n // Extension fields\n prepTimeMinutes?: number\n allergens?: string[]\n dietaryTags?: string[]\n availableForPos: boolean\n availableForDelivery: boolean\n deliveryPrice?: number\n sortOrder: number\n isFeatured: boolean\n modifierGroupIds?: string[]\n metadata?: Record<string, unknown>\n tenantId: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface ModifierGroup {\n id: string\n name: string\n minSelections: number\n maxSelections: number\n isRequired: boolean\n sortOrder: number\n items: ModifierItem[]\n tenantId: string\n createdAt: string\n}\n\nexport interface ModifierItem {\n id: string\n groupId: string\n name: string\n priceAdjustment: number\n isActive: boolean\n sortOrder: number\n}\n\n// ============================================================\n// INPUT TYPES\n// ============================================================\n\nexport interface CreateMenuInput {\n name: string\n description?: string\n channels?: MenuChannel[]\n availability?: MenuAvailability\n isActive?: boolean\n sortOrder?: number\n}\n\nexport type UpdateMenuInput = Partial<CreateMenuInput>\n\nexport interface CreateSectionInput {\n menuId: string\n name: string\n description?: string\n imageUrl?: string\n sortOrder?: number\n isActive?: boolean\n availability?: MenuAvailability\n}\n\nexport type UpdateSectionInput = Partial<Omit<CreateSectionInput, 'menuId'>>\n\nexport interface PlaceItemInput {\n sectionId: string\n itemId: string\n sortOrder?: number\n priceOverride?: number\n isActive?: boolean\n}\n\nexport interface CreateMenuItemInput {\n name: string\n description?: string\n price: number\n cost?: number\n imageUrl?: string\n categoryId?: string\n status?: MenuItemStatus\n prepTimeMinutes?: number\n allergens?: string[]\n dietaryTags?: string[]\n availableForPos?: boolean\n availableForDelivery?: boolean\n deliveryPrice?: number\n isFeatured?: boolean\n modifierGroupIds?: string[]\n /** Drop it straight into a section — the create-and-place round trip. */\n sectionId?: string\n}\n\nexport interface UpdateMenuItemInput extends Omit<Partial<CreateMenuItemInput>, 'categoryId'> {\n /**\n * `null` CLEARS the category — which is how an item is unfiled, and the only\n * way to say it: `undefined` already means \"leave it alone\". Without this the\n * distinction is unsayable, and an item dragged out of a section had nowhere\n * to go.\n */\n categoryId?: string | null\n}\n\nexport interface CreateMenuCategoryInput {\n name: string\n parentId?: string\n icon?: string\n color?: string\n sortOrder?: number\n}\n\n// ============================================================\n// QUERY TYPES\n// ============================================================\n\nexport interface MenuItemQuery {\n categoryId?: string\n status?: MenuItemStatus | MenuItemStatus[]\n search?: string\n availableForPos?: boolean\n availableForDelivery?: boolean\n isFeatured?: boolean\n page?: number\n pageSize?: number\n}\n\nexport interface PaginatedResult<T> {\n data: T[]\n total: number\n}\n\n// ============================================================\n// AI IMPORT\n// ============================================================\n\n/** What the vision model gives back, after normalization. */\nexport interface ExtractedMenu {\n sections: ExtractedSection[]\n /** Which model read the photos — shown in the review header, and audited. */\n model?: string\n warnings?: string[]\n}\n\nexport interface ExtractedSection {\n name: string\n items: ExtractedItem[]\n}\n\nexport interface ExtractedItem {\n name: string\n price: number\n description?: string\n}\n\n/**\n * What was read off the photos, sitting ON the menu screen waiting to be\n * confirmed. Not a wizard's private state: the user edits these rows in place\n * with the same controls as a real item, and the assistant edits the same rows\n * through its tools — one draft, two hands.\n */\nexport interface MenuDraft {\n sections: DraftSection[]\n model?: string\n source: 'photo' | 'chat'\n}\n\nexport interface DraftSection {\n /** Addressing key for edits — never persisted. */\n key: string\n name: string\n /** Existing section to append to; undefined = create `name`. */\n targetSectionId?: string\n items: DraftItem[]\n}\n\nexport interface DraftItem {\n key: string\n name: string\n price: number\n description?: string\n}\n\n/** A reviewed extraction, ready to be written. */\nexport interface ImportPlan {\n menuId: string\n sections: Array<{\n /** Existing section to append to, or undefined to create `name`. */\n sectionId?: string\n name: string\n items: ExtractedItem[]\n }>\n}\n\nexport interface ImportResult {\n sectionsCreated: number\n itemsCreated: number\n failed: number\n}\n\n// ============================================================\n// AGGREGATION\n// ============================================================\n\nexport interface MenuSummary {\n totalItems: number\n availableItems: number\n soldOutItems: number\n hiddenItems: number\n categoryCount: number\n averagePrice: number\n featuredCount: number\n}\n","import React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Switch, TimePicker } from '@fayz-ai/ui'\n\nimport type { MenuAvailability } from '../types'\nimport { isAlwaysAvailable, weekdayLabels } from '../lib/availability'\n\n// ---------------------------------------------------------------------------\n// When this menu is served.\n//\n// Starts closed on \"todo dia\", because most menus are, and a restaurant that\n// has no executive lunch should not have to look at a grid of weekdays. Turning\n// the switch on is what admits the complexity.\n// ---------------------------------------------------------------------------\n\nconst WEEKDAY_PRESETS: Array<{ id: string; days: number[] }> = [\n { id: 'menu.schedule.presetWeekdays', days: [1, 2, 3, 4, 5] },\n { id: 'menu.schedule.presetWeekend', days: [0, 6] },\n { id: 'menu.schedule.presetEveryDay', days: [0, 1, 2, 3, 4, 5, 6] },\n]\n\nexport function ScheduleEditor({ value, onChange, locale }: {\n value: MenuAvailability\n onChange: (next: MenuAvailability) => void\n locale: string\n}) {\n const t = useTranslation()\n const labels = weekdayLabels(locale)\n const restricted = !isAlwaysAvailable(value)\n const days = value.days ?? []\n\n const toggleDay = (day: number) => {\n const next = days.includes(day) ? days.filter((d) => d !== day) : [...days, day].sort((a, b) => a - b)\n onChange({ ...value, days: next })\n }\n\n return (\n <div className=\"space-y-3\">\n <Switch\n size=\"md\"\n checked={restricted}\n onCheckedChange={(checked) => onChange(checked ? { days: [1, 2, 3, 4, 5], start: '11:30', end: '15:00' } : {})}\n label={\n <span>\n <span className=\"text-sm font-medium\">{t('menu.schedule.restrict')}</span>\n <span className=\"block text-[11px] text-muted-foreground\">{t('menu.schedule.restrictHint')}</span>\n </span>\n }\n />\n\n {restricted && (\n <div className=\"space-y-3 rounded-xl border p-3\">\n <div>\n <label className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n {t('menu.schedule.days')}\n </label>\n <div className=\"mt-1.5 flex flex-wrap gap-1.5\">\n {labels.map((label, day) => (\n <button\n key={day}\n type=\"button\"\n onClick={() => toggleDay(day)}\n className={`rounded-full px-2.5 py-1 text-xs font-medium capitalize transition-colors ${\n days.includes(day)\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted/50 text-muted-foreground hover:bg-muted'\n }`}\n >\n {label}\n </button>\n ))}\n </div>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {WEEKDAY_PRESETS.map((preset) => (\n <button\n key={preset.id}\n type=\"button\"\n onClick={() => onChange({ ...value, days: preset.days })}\n className=\"text-[11px] text-muted-foreground underline-offset-2 hover:text-foreground hover:underline\"\n >\n {t(preset.id)}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-end gap-3\">\n <div>\n <label className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n {t('menu.schedule.from')}\n </label>\n <TimePicker value={value.start ?? '11:00'} onChange={(next) => onChange({ ...value, start: next })} />\n </div>\n <div>\n <label className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n {t('menu.schedule.to')}\n </label>\n <TimePicker value={value.end ?? '15:00'} onChange={(next) => onChange({ ...value, end: next })} />\n </div>\n </div>\n {/* Said out loud because it is the one rule people get wrong when they\n type a bar's hours. */}\n <p className=\"text-[11px] text-muted-foreground\">{t('menu.schedule.overnightHint')}</p>\n </div>\n )}\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button, Input, SheetBody, SheetFooter, Switch } from '@fayz-ai/ui'\nimport { RightRailPage } from '@fayz-ai/admin'\n\nimport type { Menu, MenuAvailability, MenuChannel } from '../types'\nimport { MENU_CHANNELS } from '../types'\nimport { ScheduleEditor } from './ScheduleEditor'\n\n// The menu's own card — in the right rail, beside the sections it governs.\n// Name, where it is served, when, and whether it is on air.\n\nconst CHANNEL_LABEL: Record<MenuChannel, string> = {\n pos: 'menu.channel.pos',\n delivery: 'menu.channel.delivery',\n digital: 'menu.channel.digital',\n}\n\nexport function MenuRailPage({ open, menu, locale, onClose, onSubmit }: {\n open: boolean\n /** Undefined = creating. */\n menu?: Menu\n locale: string\n onClose: () => void\n onSubmit: (values: {\n name: string\n description?: string\n channels: MenuChannel[]\n availability: MenuAvailability\n isActive: boolean\n }) => Promise<void>\n}) {\n const t = useTranslation()\n const [name, setName] = useState('')\n const [description, setDescription] = useState('')\n const [channels, setChannels] = useState<MenuChannel[]>([...MENU_CHANNELS])\n const [availability, setAvailability] = useState<MenuAvailability>({})\n const [isActive, setIsActive] = useState(true)\n const [saving, setSaving] = useState(false)\n\n useEffect(() => {\n if (!open) return\n setName(menu?.name ?? '')\n setDescription(menu?.description ?? '')\n setChannels(menu?.channels ?? [...MENU_CHANNELS])\n setAvailability(menu?.availability ?? {})\n setIsActive(menu?.isActive ?? true)\n setSaving(false)\n }, [open, menu])\n\n const toggleChannel = (channel: MenuChannel) => {\n setChannels((current) =>\n current.includes(channel) ? current.filter((c) => c !== channel) : [...current, channel])\n }\n\n const submit = async () => {\n if (!name.trim() || saving) return\n setSaving(true)\n try {\n await onSubmit({ name: name.trim(), description: description.trim() || undefined, channels, availability, isActive })\n onClose()\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <RightRailPage\n title={menu ? t('menu.menuDialog.editTitle') : t('menu.menuDialog.newTitle')}\n open={open}\n onClose={onClose}\n width=\"max-w-md\"\n >\n <SheetBody className=\"space-y-4\">\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('menu.menuDialog.name')}</label>\n <Input\n autoFocus\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('menu.menuDialog.namePlaceholder')}\n onKeyDown={(e) => { if (e.key === 'Enter') void submit() }}\n />\n </div>\n\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('menu.menuDialog.description')}</label>\n <Input\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={t('menu.menuDialog.descriptionPlaceholder')}\n />\n </div>\n\n <div>\n <label className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n {t('menu.menuDialog.channels')}\n </label>\n <div className=\"mt-1.5 flex flex-wrap gap-1.5\">\n {MENU_CHANNELS.map((channel) => (\n <button\n key={channel}\n type=\"button\"\n onClick={() => toggleChannel(channel)}\n className={`rounded-full px-3 py-1 text-xs font-medium transition-colors ${\n channels.includes(channel)\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted/50 text-muted-foreground hover:bg-muted'\n }`}\n >\n {t(CHANNEL_LABEL[channel])}\n </button>\n ))}\n </div>\n </div>\n\n <ScheduleEditor value={availability} onChange={setAvailability} locale={locale} />\n\n <Switch\n size=\"md\"\n checked={isActive}\n onCheckedChange={setIsActive}\n label={\n <span>\n <span className=\"text-sm font-medium\">{t('menu.menuDialog.active')}</span>\n <span className=\"block text-[11px] text-muted-foreground\">{t('menu.menuDialog.activeHint')}</span>\n </span>\n }\n />\n </SheetBody>\n <SheetFooter className=\"justify-end\">\n <Button variant=\"outline\" onClick={onClose} disabled={saving}>{t('menu.form.cancel')}</Button>\n <Button onClick={() => void submit()} disabled={!name.trim() || saving}>\n {saving ? t('menu.form.saving') : t('menu.form.save')}\n </Button>\n </SheetFooter>\n </RightRailPage>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport {\n Button, CurrencyInput, ImageDrop, Input, SegmentedControl, SheetBody, SheetFooter, Switch,\n} from '@fayz-ai/ui'\nimport { RightRailPage } from '@fayz-ai/admin'\n\nimport type { MenuItem, MenuItemStatus, MenuSection } from '../types'\n\n// ---------------------------------------------------------------------------\n// The item, edited in the right rail — the same column the rest of the app\n// opens records in. A modal would darken the menu behind it, and this form's\n// whole job is to be filled in while looking at the section it belongs to.\n//\n// Same page for \"novo\" and \"editar\": a menu is edited far more often than it is\n// created, and two forms drift apart.\n// ---------------------------------------------------------------------------\n\nexport interface ItemFormValues {\n name: string\n description?: string\n price: number\n cost?: number\n deliveryPrice?: number\n prepTimeMinutes?: number\n imageUrl?: string\n status: MenuItemStatus\n availableForPos: boolean\n availableForDelivery: boolean\n isFeatured: boolean\n sectionId: string\n /** Price for THIS menu only. Undefined = use the item's price. */\n priceOverride?: number\n}\n\nexport function ItemRailPage({\n open, item, sections, sectionId, currency, deliveryPricing, multiMenu,\n priceOverride, onClose, onSubmit, onUploadImage,\n}: {\n open: boolean\n item?: MenuItem\n sections: MenuSection[]\n sectionId: string\n currency: { code: string; locale: string; symbol: string }\n deliveryPricing: boolean\n multiMenu: boolean\n priceOverride?: number\n onClose: () => void\n onSubmit: (values: ItemFormValues) => Promise<void>\n onUploadImage?: (file: File) => Promise<string | null>\n}) {\n const t = useTranslation()\n const [values, setValues] = useState<ItemFormValues>({\n name: '', price: 0, status: 'available',\n availableForPos: true, availableForDelivery: true, isFeatured: false, sectionId,\n })\n const [saving, setSaving] = useState(false)\n\n useEffect(() => {\n if (!open) return\n setValues({\n name: item?.name ?? '',\n description: item?.description ?? '',\n price: item?.price ?? 0,\n cost: item?.cost,\n deliveryPrice: item?.deliveryPrice,\n prepTimeMinutes: item?.prepTimeMinutes,\n imageUrl: item?.imageUrl,\n status: item?.status ?? 'available',\n availableForPos: item?.availableForPos ?? true,\n availableForDelivery: item?.availableForDelivery ?? true,\n isFeatured: item?.isFeatured ?? false,\n sectionId,\n priceOverride,\n })\n setSaving(false)\n }, [open, item, sectionId, priceOverride])\n\n const patch = (next: Partial<ItemFormValues>) => setValues((current) => ({ ...current, ...next }))\n\n const submit = async () => {\n if (!values.name.trim() || saving) return\n setSaving(true)\n try {\n await onSubmit({ ...values, name: values.name.trim() })\n onClose()\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <RightRailPage\n title={item ? t('menu.itemForm.editTitle') : t('menu.itemForm.newTitle')}\n open={open}\n onClose={onClose}\n width=\"max-w-md\"\n >\n {/* One column, three questions in order: what the dish IS, what it\n COSTS, and where it SHOWS. The rail is ~380px wide — the two- and\n three-column grids this form was born with (it started life as a wide\n modal) pushed the photo and the price field off both edges. */}\n <SheetBody className=\"space-y-6\">\n <Group>\n <div className=\"flex items-start gap-3\">\n <div className=\"w-20 shrink-0\">\n <ImageDrop\n shape=\"square\"\n value={values.imageUrl}\n onUpload={onUploadImage ? async (file) => (await onUploadImage(file)) ?? '' : undefined}\n onChange={(url) => patch({ imageUrl: url })}\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs font-medium text-foreground\">{t('menu.itemForm.photo')}</p>\n <p className=\"mt-0.5 text-[11px] leading-snug text-muted-foreground\">\n {t('menu.itemForm.photoHint')}\n </p>\n </div>\n </div>\n\n <Field label={t('menu.itemForm.name')}>\n <Input\n autoFocus\n value={values.name}\n onChange={(e) => patch({ name: e.target.value })}\n placeholder={t('menu.itemForm.namePlaceholder')}\n />\n </Field>\n\n <Field label={t('menu.itemForm.description')}>\n <Input\n value={values.description ?? ''}\n onChange={(e) => patch({ description: e.target.value })}\n placeholder={t('menu.itemForm.descriptionPlaceholder')}\n />\n </Field>\n </Group>\n\n <Group title={t('menu.itemForm.pricingGroup')}>\n {/* Two money fields fit side by side at this width; a third did not. */}\n <div className=\"grid grid-cols-2 gap-3\">\n <CurrencyInput\n label={t('menu.itemForm.price')}\n value={values.price}\n onChange={(price) => patch({ price })}\n symbol={currency.symbol}\n locale={currency.locale}\n currencyCode={currency.code}\n />\n <CurrencyInput\n label={t('menu.itemForm.cost')}\n value={values.cost ?? 0}\n onChange={(cost) => patch({ cost })}\n symbol={currency.symbol}\n locale={currency.locale}\n currencyCode={currency.code}\n />\n </div>\n\n {deliveryPricing && (\n <CurrencyInput\n label={t('menu.itemForm.deliveryPrice')}\n value={values.deliveryPrice ?? 0}\n onChange={(deliveryPrice) => patch({ deliveryPrice })}\n symbol={currency.symbol}\n locale={currency.locale}\n currencyCode={currency.code}\n />\n )}\n\n {/* Per-menu price: only where more than one menu can disagree about it. */}\n {multiMenu && (\n <div className=\"rounded-xl border bg-muted/20 p-3\">\n <p className=\"text-xs font-medium text-foreground\">{t('menu.itemForm.priceOverride')}</p>\n <p className=\"mt-0.5 text-[11px] leading-snug text-muted-foreground\">\n {t('menu.itemForm.priceOverrideHint')}\n </p>\n <div className=\"mt-2 space-y-1.5\">\n <CurrencyInput\n value={values.priceOverride ?? 0}\n onChange={(next) => patch({ priceOverride: next })}\n symbol={currency.symbol}\n locale={currency.locale}\n currencyCode={currency.code}\n />\n {values.priceOverride !== undefined && (\n <button\n type=\"button\"\n onClick={() => patch({ priceOverride: undefined })}\n className=\"text-[11px] text-muted-foreground underline-offset-2 transition-colors hover:text-foreground hover:underline\"\n >\n {t('menu.itemForm.clearOverride')}\n </button>\n )}\n </div>\n </div>\n )}\n </Group>\n\n <Group title={t('menu.itemForm.menuGroup')}>\n <Field label={t('menu.itemForm.section')}>\n <select\n value={values.sectionId}\n onChange={(e) => patch({ sectionId: e.target.value })}\n className=\"h-9 w-full rounded-md border border-input bg-background px-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n >\n {sections.map((section) => (\n <option key={section.id} value={section.id}>{section.name}</option>\n ))}\n </select>\n </Field>\n\n <Field label={t('menu.itemForm.status')}>\n <SegmentedControl\n className=\"w-full\"\n value={values.status}\n onChange={(status) => patch({ status: status as MenuItemStatus })}\n options={[\n { value: 'available', label: t('menu.manager.available') },\n { value: 'sold_out', label: t('menu.manager.soldOut') },\n { value: 'hidden', label: t('menu.manager.hidden') },\n ]}\n />\n </Field>\n\n <Field label={t('menu.itemForm.prepTime')}>\n <Input\n type=\"number\"\n min={0}\n inputMode=\"numeric\"\n value={values.prepTimeMinutes ?? ''}\n onChange={(e) => patch({ prepTimeMinutes: e.target.value ? Number(e.target.value) : undefined })}\n placeholder=\"0\"\n />\n </Field>\n\n {/* Rows, not a wrapped strip: three switches side by side broke into\n a ragged two-and-one at this width, and a switch whose label wraps\n stops reading as one control. */}\n <div className=\"divide-y rounded-xl border\">\n <ToggleRow\n label={t('menu.manager.pos')}\n hint={t('menu.itemForm.posHint')}\n checked={values.availableForPos}\n onChange={(v) => patch({ availableForPos: v })}\n />\n <ToggleRow\n label={t('menu.manager.delivery')}\n hint={t('menu.itemForm.deliveryHint')}\n checked={values.availableForDelivery}\n onChange={(v) => patch({ availableForDelivery: v })}\n />\n <ToggleRow\n label={t('menu.manager.featured')}\n hint={t('menu.itemForm.featuredHint')}\n checked={values.isFeatured}\n onChange={(v) => patch({ isFeatured: v })}\n />\n </div>\n </Group>\n </SheetBody>\n <SheetFooter className=\"justify-end\">\n <Button variant=\"outline\" onClick={onClose} disabled={saving}>{t('menu.form.cancel')}</Button>\n <Button onClick={() => void submit()} disabled={!values.name.trim() || saving}>\n {saving ? t('menu.form.saving') : t('menu.form.save')}\n </Button>\n </SheetFooter>\n </RightRailPage>\n )\n}\n\n/** A label and its control, with the one gap this form uses between them. */\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div>\n <label className=\"mb-1 block text-xs font-medium text-muted-foreground\">{label}</label>\n {children}\n </div>\n )\n}\n\n/** A run of fields that answer the same question, under one quiet heading. */\nfunction Group({ title, children }: { title?: string; children: React.ReactNode }) {\n return (\n <section className=\"space-y-3\">\n {title && (\n <h3 className=\"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground\">{title}</h3>\n )}\n {children}\n </section>\n )\n}\n\n/** Where the dish shows up. The whole row is the target, not just the switch. */\nfunction ToggleRow({ label, hint, checked, onChange }: {\n label: string\n hint?: string\n checked: boolean\n onChange: (value: boolean) => void\n}) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => onChange(!checked)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onChange(!checked)\n }\n }}\n className=\"flex min-h-11 cursor-pointer items-center gap-3 px-3 py-2 transition-colors hover:bg-muted/30\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm\">{label}</p>\n {hint && <p className=\"text-[11px] leading-snug text-muted-foreground\">{hint}</p>}\n </div>\n <Switch size=\"md\" checked={checked} onCheckedChange={onChange} aria-label={label} />\n </div>\n )\n}\n","import React from 'react'\nimport { Sparkles, Trash2, X } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button, DraftCommitBar } from '@fayz-ai/ui'\n\nimport type { DraftItem, DraftSection, MenuDraft, MenuSection } from '../types'\n\n// ---------------------------------------------------------------------------\n// What the assistant read, sitting in the menu it will become.\n//\n// Dashed, not modal: the user sees the new dishes exactly where they will land,\n// next to the ones already there, and fixes a price by clicking it. The same\n// rows are what the assistant edits when the user says \"o pudim é 22\".\n// ---------------------------------------------------------------------------\n\nfunction DraftRow({ item, onChange, onRemove }: {\n item: DraftItem\n onChange: (patch: Partial<DraftItem>) => void\n onRemove: () => void\n}) {\n const t = useTranslation()\n return (\n <div className=\"flex items-center gap-2 border-b border-dashed px-3 py-1.5 last:border-0\">\n <input\n value={item.name}\n onChange={(e) => onChange({ name: e.target.value })}\n className=\"min-w-0 flex-1 rounded border border-transparent bg-transparent px-1 py-0.5 text-sm hover:border-border focus:border-border focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n <input\n value={item.description ?? ''}\n onChange={(e) => onChange({ description: e.target.value })}\n placeholder={t('menu.itemForm.description')}\n className=\"hidden min-w-0 flex-1 rounded border border-transparent bg-transparent px-1 py-0.5 text-[11px] text-muted-foreground hover:border-border focus:border-border focus:outline-none focus:ring-2 focus:ring-ring sm:block\"\n />\n <input\n value={item.price}\n inputMode=\"decimal\"\n onChange={(e) => onChange({ price: Number(e.target.value.replace(',', '.')) || 0 })}\n className={`w-20 rounded border bg-card px-1.5 py-0.5 text-right text-sm tabular-nums focus:outline-none focus:ring-2 focus:ring-ring ${item.price === 0 ? 'border-warning text-warning' : ''}`}\n />\n <button\n onClick={onRemove}\n className=\"rounded p-1 text-muted-foreground hover:text-destructive\"\n aria-label={t('menu.import.dropItem')}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )\n}\n\nexport function DraftSectionCard({ section, sections, onPatchSection, onRemoveSection, onPatchItem, onRemoveItem }: {\n section: DraftSection\n sections: MenuSection[]\n onPatchSection: (patch: Partial<Pick<DraftSection, 'name' | 'targetSectionId'>>) => void\n onRemoveSection: () => void\n onPatchItem: (itemKey: string, patch: Partial<DraftItem>) => void\n onRemoveItem: (itemKey: string) => void\n}) {\n const t = useTranslation()\n const existing = sections.find((s) => s.id === section.targetSectionId)\n\n return (\n <div className=\"overflow-hidden rounded-card border-2 border-dashed border-primary/40 bg-primary/[0.03]\">\n <div className=\"flex flex-wrap items-center gap-2 border-b border-dashed border-primary/30 px-3 py-2\">\n <Sparkles className=\"h-3.5 w-3.5 text-primary\" />\n <input\n value={section.name}\n onChange={(e) => onPatchSection({ name: e.target.value })}\n className=\"rounded border border-transparent bg-transparent px-1 py-0.5 text-sm font-semibold hover:border-border focus:border-border focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n <select\n value={section.targetSectionId ?? ''}\n onChange={(e) => onPatchSection({ targetSectionId: e.target.value || undefined })}\n className=\"h-7 rounded-md border bg-card px-2 text-xs\"\n >\n <option value=\"\">{t('menu.import.createSection')}</option>\n {sections.map((s) => (\n <option key={s.id} value={s.id}>{t('menu.import.intoSection', { name: s.name })}</option>\n ))}\n </select>\n <span className=\"text-[11px] text-muted-foreground\">\n {t('menu.manager.itemsCount', { count: String(section.items.length) })}\n </span>\n {existing && (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-[10px] text-muted-foreground\">\n {t('menu.import.willAppend', { name: existing.name })}\n </span>\n )}\n <button\n onClick={onRemoveSection}\n className=\"ml-auto rounded p-1 text-muted-foreground hover:text-destructive\"\n aria-label={t('menu.import.dropSection')}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n <div>\n {section.items.map((item) => (\n <DraftRow\n key={item.key}\n item={item}\n onChange={(patch) => onPatchItem(item.key, patch)}\n onRemove={() => onRemoveItem(item.key)}\n />\n ))}\n </div>\n </div>\n )\n}\n\n/** The one decision bar for the whole draft — the shared primitive, wearing\n * the menu's words. */\nexport function DraftBar({ draft, saving, onCommit, onDiscard }: {\n draft: MenuDraft\n saving: boolean\n onCommit: () => void\n onDiscard: () => void\n}) {\n const t = useTranslation()\n const items = draft.sections.reduce((count, section) => count + section.items.length, 0)\n const missingPrice = draft.sections.reduce(\n (count, section) => count + section.items.filter((item) => item.price === 0).length, 0)\n\n return (\n <DraftCommitBar\n open\n icon={Sparkles}\n title={t('menu.import.draftCount', { items: String(items), sections: String(draft.sections.length) })}\n hint={missingPrice > 0\n ? t('menu.import.draftMissingPrice', { count: String(missingPrice) })\n : t('menu.import.draftHint')}\n discardLabel={t('menu.import.discard')}\n onDiscard={onDiscard}\n commitLabel={t('menu.import.commit', { count: String(items) })}\n onCommit={onCommit}\n busy={saving}\n />\n )\n}\n","import React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Modal, ModalBody, ModalContent, ModalHeader, ModalTitle } from '@fayz-ai/ui'\n\nimport type { Menu, MenuItem, MenuPlacement, MenuSection } from '../types'\nimport { formatCurrency } from '../context'\nimport { describeAvailability, isServingAt } from '../lib/availability'\n\n// ---------------------------------------------------------------------------\n// The menu as the customer meets it: no toggles, no handles, no ids. Hidden\n// items and switched-off sections are gone rather than greyed — this is the\n// answer to \"o que aparece pra quem pede\", and a struck-through row would be\n// answering a different question.\n// ---------------------------------------------------------------------------\n\nexport function MenuPreview({ open, menu, sections, placements, itemsById, currency, locale, onClose }: {\n open: boolean\n menu?: Menu\n sections: MenuSection[]\n placements: MenuPlacement[]\n itemsById: Map<string, MenuItem>\n currency: { code: string; locale: string; symbol: string }\n locale: string\n onClose: () => void\n}) {\n const t = useTranslation()\n const serving = menu ? isServingAt(menu.availability) : true\n\n return (\n <Modal open={open} onOpenChange={(next) => { if (!next) onClose() }}>\n <ModalContent size=\"xl\">\n <ModalHeader>\n <ModalTitle>{menu?.name ?? t('menu.preview.title')}</ModalTitle>\n <p className=\"text-xs text-muted-foreground\">\n {menu ? describeAvailability(menu.availability, locale, t('menu.schedule.always')) : ''}\n {menu && !serving && ` · ${t('menu.preview.notServingNow')}`}\n </p>\n </ModalHeader>\n <ModalBody className=\"space-y-6 py-2\">\n {sections\n .filter((section) => section.isActive)\n .map((section) => {\n const rows = placements\n .filter((p) => p.sectionId === section.id && p.isActive)\n .map((p) => ({ placement: p, item: itemsById.get(p.itemId) }))\n .filter((row) => row.item && row.item.status !== 'hidden')\n if (rows.length === 0) return null\n return (\n <section key={section.id}>\n <h3 className=\"border-b pb-1 text-sm font-semibold uppercase tracking-wider text-muted-foreground\">\n {section.name}\n </h3>\n {section.description && <p className=\"mt-1 text-xs text-muted-foreground\">{section.description}</p>}\n <ul className=\"mt-2 space-y-2\">\n {rows.map(({ placement, item }) => (\n <li key={placement.id} className=\"flex items-baseline gap-3\">\n <div className=\"min-w-0 flex-1\">\n <span className=\"text-sm font-medium\">{item!.name}</span>\n {item!.status === 'sold_out' && (\n <span className=\"ml-2 text-[10px] uppercase text-destructive\">{t('menu.manager.soldOut')}</span>\n )}\n {item!.description && (\n <p className=\"text-xs text-muted-foreground\">{item!.description}</p>\n )}\n </div>\n {/* The dotted leader is what makes a list of dishes read\n as a menu instead of a table. */}\n <span className=\"hidden flex-1 translate-y-[-3px] border-b border-dotted border-muted-foreground/30 sm:block\" />\n <span className=\"text-sm font-medium tabular-nums\">\n {formatCurrency(placement.priceOverride ?? item!.price, currency)}\n </span>\n </li>\n ))}\n </ul>\n </section>\n )\n })}\n </ModalBody>\n </ModalContent>\n </Modal>\n )\n}\n","import React, { useEffect, useMemo, useState } from 'react'\nimport { Copy, Eye, MoreVertical, Pencil, Plus, Power, Search, Sparkles, Trash2, UtensilsCrossed } from 'lucide-react'\nimport {\n DndContext, DragOverlay, PointerSensor, closestCenter, useSensor, useSensors,\n type DragEndEvent, type DragStartEvent,\n} from '@dnd-kit/core'\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button, ConfirmDialog, Dropdown, DropdownContent, DropdownItem, DropdownSeparator, DropdownTrigger, toast, PageTabs } from '@fayz-ai/ui'\nimport { Hint, PageHeaderActions } from '@fayz-ai/ui'\nimport { askAI, requestChatUpload, PageActions } from '@fayz-ai/admin'\n\nimport { useMenuConfig, useMenuStore } from '../context'\nimport type { MenuItem, MenuPlacement, MenuSection, MenuItemStatus } from '../types'\nimport { describeAvailability, isAlwaysAvailable, isServingAt } from '../lib/availability'\nimport { resolveMenuExtractor } from '../lib/extract-transport'\nimport { downscaleImage } from '../lib/images'\nimport { useMenuAgentSurface } from '../lib/agent-surface'\nimport { SectionCard, type SectionHandlers } from '../components/SectionCard'\nimport { MenuRailPage } from '../components/MenuRailPage'\nimport { ItemRailPage, type ItemFormValues } from '../components/ItemRailPage'\nimport { DraftBar, DraftSectionCard } from '../components/DraftSectionCard'\nimport { MenuPreview } from '../components/MenuPreview'\n\n// ---------------------------------------------------------------------------\n// The menu, whole.\n//\n// Menus across the top (executivo, fim de semana), sections down the page, and\n// the dishes inside them — dragged, priced and switched in place. The AI import\n// is not a side door: it drops its reading INTO this screen as a draft, and the\n// assistant edits the same rows the user does.\n// ---------------------------------------------------------------------------\n\nexport function MenuManagerView() {\n const t = useTranslation()\n const { currency, modules } = useMenuConfig()\n\n const multiMenu = useMenuStore((s) => s.multiMenu)\n const menus = useMenuStore((s) => s.menus)\n const menusLoading = useMenuStore((s) => s.menusLoading)\n const activeMenuId = useMenuStore((s) => s.activeMenuId)\n const sections = useMenuStore((s) => s.sections)\n const placements = useMenuStore((s) => s.placements)\n const menuLoading = useMenuStore((s) => s.menuLoading)\n const menuItems = useMenuStore((s) => s.menuItems)\n const extracting = useMenuStore((s) => s.extracting)\n const draft = useMenuStore((s) => s.draft)\n const pendingIds = useMenuStore((s) => s.pendingIds)\n\n const fetchMenus = useMenuStore((s) => s.fetchMenus)\n const fetchMenuItems = useMenuStore((s) => s.fetchMenuItems)\n const openMenu = useMenuStore((s) => s.openMenu)\n const createMenu = useMenuStore((s) => s.createMenu)\n const updateMenu = useMenuStore((s) => s.updateMenu)\n const deleteMenu = useMenuStore((s) => s.deleteMenu)\n const duplicateMenu = useMenuStore((s) => s.duplicateMenu)\n const createSection = useMenuStore((s) => s.createSection)\n const updateSection = useMenuStore((s) => s.updateSection)\n const deleteSection = useMenuStore((s) => s.deleteSection)\n const reorderSections = useMenuStore((s) => s.reorderSections)\n const addItemToSection = useMenuStore((s) => s.addItemToSection)\n const removePlacement = useMenuStore((s) => s.removePlacement)\n const setPlacementPrice = useMenuStore((s) => s.setPlacementPrice)\n const reorderPlacements = useMenuStore((s) => s.reorderPlacements)\n const movePlacement = useMenuStore((s) => s.movePlacement)\n const updateMenuItem = useMenuStore((s) => s.updateMenuItem)\n const deleteMenuItem = useMenuStore((s) => s.deleteMenuItem)\n const duplicateMenuItem = useMenuStore((s) => s.duplicateMenuItem)\n const setItemStatus = useMenuStore((s) => s.setItemStatus)\n const toggleAvailability = useMenuStore((s) => s.toggleAvailability)\n const uploadImage = useMenuStore((s) => s.uploadImage)\n const runExtraction = useMenuStore((s) => s.runExtraction)\n const updateDraftItem = useMenuStore((s) => s.updateDraftItem)\n const removeDraftItem = useMenuStore((s) => s.removeDraftItem)\n const updateDraftSection = useMenuStore((s) => s.updateDraftSection)\n const removeDraftSection = useMenuStore((s) => s.removeDraftSection)\n const discardDraft = useMenuStore((s) => s.discardDraft)\n const commitDraft = useMenuStore((s) => s.commitDraft)\n\n const [search, setSearch] = useState('')\n const [menuEditor, setMenuEditor] = useState<{ open: boolean; editing?: boolean }>({ open: false })\n const [itemEditor, setItemEditor] = useState<{ open: boolean; item?: MenuItem; sectionId: string; placement?: MenuPlacement }>({ open: false, sectionId: '' })\n const [previewOpen, setPreviewOpen] = useState(false)\n const [confirm, setConfirm] = useState<{ kind: 'section' | 'item' | 'menu'; id: string; name: string } | null>(null)\n const [dragging, setDragging] = useState<string | null>(null)\n const [committing, setCommitting] = useState(false)\n\n const extractor = useMemo(() => resolveMenuExtractor(), [])\n\n // The photos, read and dropped on the menu as a draft. Shrunk on the way:\n // a 4MB photo per page is what turns a five-page menu into a timeout.\n const readPhotos = async (files: File[]) => {\n if (!extractor) return\n const images = await Promise.all(files.map((file) => downscaleImage(file)))\n await runExtraction(images, extractor)\n }\n\n /** Puts the upload button in the conversation. */\n const askForPhotos = () => requestChatUpload({\n label: t('menu.import.uploadCta'),\n description: t('menu.import.uploadHint'),\n accept: 'image/*',\n multiple: true,\n capture: 'environment',\n onFiles: readPhotos,\n })\n\n // \"Inserir com IA\" hands the job to the ASSISTANT — it narrates and conducts\n // the review. The button itself is what RAISES the upload card, though: an\n // affordance the user was just promised must not depend on a model choosing\n // to call a tool. The tool stays for when the ask arrives in words instead.\n const startAiImport = () => {\n askForPhotos()\n askAI({\n prompt: t('menu.import.askPrompt'),\n hint: t('menu.import.askHint'),\n intro: {\n role: 'operations',\n persona: t('menu.import.askPersona'),\n pitch: t('menu.import.askPitch'),\n description: t('menu.import.askDescription'),\n suggestions: [\n { label: t('menu.import.askSuggestion.0') },\n { label: t('menu.import.askSuggestion.1') },\n { label: t('menu.import.askSuggestion.2') },\n ],\n },\n })\n }\n\n useEffect(() => {\n void fetchMenus()\n void fetchMenuItems({})\n }, [])\n\n const activeMenu = menus.find((m) => m.id === activeMenuId)\n const itemsById = useMemo(() => new Map(menuItems.map((item) => [item.id, item])), [menuItems])\n\n // Search narrows the ITEMS but keeps their sections, so what is left still\n // reads as a menu rather than a flat list of hits.\n const visible = useMemo(() => {\n const term = search.trim().toLowerCase()\n const matches = (placement: MenuPlacement) => {\n if (!term) return true\n const item = itemsById.get(placement.itemId)\n return !!item && (item.name.toLowerCase().includes(term) || (item.description ?? '').toLowerCase().includes(term))\n }\n const bySection = new Map<string, MenuPlacement[]>()\n for (const placement of [...placements].sort((a, b) => a.sortOrder - b.sortOrder)) {\n if (!matches(placement)) continue\n const list = bySection.get(placement.sectionId) ?? []\n list.push(placement)\n bySection.set(placement.sectionId, list)\n }\n const ordered = [...sections].sort((a, b) => a.sortOrder - b.sortOrder)\n return {\n sections: term ? ordered.filter((s) => (bySection.get(s.id)?.length ?? 0) > 0) : ordered,\n bySection,\n }\n }, [sections, placements, itemsById, search])\n\n const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 5 } }))\n\n const handleDragEnd = (event: DragEndEvent) => {\n setDragging(null)\n const { active, over } = event\n if (!over || active.id === over.id) return\n const type = active.data.current?.type\n\n if (type === 'section') {\n const ids = visible.sections.map((s) => s.id)\n const from = ids.indexOf(String(active.id))\n const to = ids.indexOf(String(over.id))\n if (from < 0 || to < 0) return\n const next = [...ids]\n next.splice(to, 0, next.splice(from, 1)[0])\n void reorderSections(next)\n return\n }\n\n if (type === 'item') {\n const fromSection = String(active.data.current?.sectionId ?? '')\n const overType = over.data.current?.type\n const toSection = overType === 'section' ? String(over.id) : String(over.data.current?.sectionId ?? '')\n if (!toSection) return\n\n const target = (visible.bySection.get(toSection) ?? []).map((p) => p.id)\n if (fromSection === toSection) {\n const from = target.indexOf(String(active.id))\n const to = target.indexOf(String(over.id))\n if (from < 0 || to < 0) return\n const next = [...target]\n next.splice(to, 0, next.splice(from, 1)[0])\n void reorderPlacements(toSection, next)\n } else {\n const index = overType === 'section' ? target.length : Math.max(0, target.indexOf(String(over.id)))\n void movePlacement(String(active.id), toSection, index)\n }\n }\n }\n\n const handlers: SectionHandlers = {\n onRenameSection: (sectionId, name) => void updateSection(sectionId, { name }),\n onEditSection: (section) => void updateSection(section.id, { isActive: !section.isActive }),\n onDeleteSection: (section) => setConfirm({ kind: 'section', id: section.id, name: section.name }),\n onAddItem: (sectionId) => setItemEditor({ open: true, sectionId }),\n onEditItem: (item, placement) => setItemEditor({ open: true, item, sectionId: placement.sectionId, placement }),\n onDuplicateItem: (item, sectionId) => void duplicateMenuItem(item.id, sectionId),\n onRemoveFromMenu: (placement) => void removePlacement(placement.id),\n onDeleteItem: (item) => setConfirm({ kind: 'item', id: item.id, name: item.name }),\n onToggleItem: (itemId, field, value) => void toggleAvailability(itemId, field, value),\n onSetItemStatus: (itemId, status) => void setItemStatus(itemId, status as MenuItemStatus),\n onSetPlacementPrice: (placementId, price) => void setPlacementPrice(placementId, price),\n }\n\n // What the assistant can see and do on this screen — including driving the\n // photo import and fixing the draft it produced.\n useMenuAgentSurface({\n menu: activeMenu,\n menus,\n sections,\n placements,\n itemsById,\n draft,\n hasExtractor: !!extractor,\n actions: {\n createSection: (name) => createSection(name),\n renameSection: (sectionId, name) => updateSection(sectionId, { name }),\n reorderSections,\n createItem: (sectionId, input) => addItemToSection(sectionId, input),\n updateItem: (itemId, patch) => updateMenuItem(itemId, patch),\n setItemStatus,\n moveItem: movePlacement,\n createMenu: ({ name, days, start, end }) => createMenu({\n name,\n availability: days || start || end ? { days, start, end } : {},\n }),\n duplicateMenu,\n requestPhotos: askForPhotos,\n updateDraftItem,\n removeDraftItem,\n updateDraftSection,\n removeDraftSection,\n commitDraft: async () => {\n const result = await commitDraft()\n return result\n },\n discardDraft,\n },\n })\n\n const submitItem = async (values: ItemFormValues) => {\n const { sectionId, priceOverride, ...rest } = values\n if (itemEditor.item) {\n await updateMenuItem(itemEditor.item.id, rest)\n if (itemEditor.placement) {\n if (priceOverride !== itemEditor.placement.priceOverride) {\n await setPlacementPrice(itemEditor.placement.id, priceOverride)\n }\n if (sectionId !== itemEditor.placement.sectionId) {\n await movePlacement(itemEditor.placement.id, sectionId, 0)\n }\n }\n } else {\n await addItemToSection(sectionId, rest)\n }\n }\n\n const confirmDelete = async () => {\n if (!confirm) return\n if (confirm.kind === 'section') await deleteSection(confirm.id)\n if (confirm.kind === 'item') await deleteMenuItem(confirm.id)\n if (confirm.kind === 'menu') await deleteMenu(confirm.id)\n setConfirm(null)\n }\n\n const scheduleLabel = activeMenu\n ? describeAvailability(activeMenu.availability, currency.locale, t('menu.schedule.always'))\n : ''\n\n // O menu de ações PERTENCE a um cardápio, então mora na aba dele — no lugar\n // da bolinha de \"servindo agora\", que já é dita pela etiqueta abaixo quando\n // o cardápio tem horário. Solto à direita da faixa, o \"⋯\" não dizia de qual\n // dos cardápios ele falava.\n const menuActions = (menu: { id: string; name: string; isActive?: boolean }) => (\n <Dropdown>\n <DropdownTrigger asChild>\n <Hint label={t('menu.manager.menuActions')}>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n // Do tamanho do texto da aba, não de um botão de barra: ele mora\n // DENTRO da aba, e um alvo de 24px com anel próprio brigava com o\n // sublinhado logo abaixo.\n className=\"-mr-1 h-5 w-5 rounded-full text-muted-foreground hover:text-foreground focus-visible:ring-1 focus-visible:ring-offset-0\"\n aria-label={`${t('menu.manager.menuActions')} — ${menu.name}`}\n >\n <MoreVertical className=\"h-3.5 w-3.5\" />\n </Button>\n </Hint>\n </DropdownTrigger>\n <DropdownContent align=\"start\">\n <DropdownItem onClick={() => setMenuEditor({ open: true, editing: true })}>\n <Pencil className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.editMenu')}\n </DropdownItem>\n <DropdownItem onClick={() => void duplicateMenu(menu.id, `${menu.name} (cópia)`)}>\n <Copy className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.duplicateMenu')}\n </DropdownItem>\n <DropdownItem onClick={() => void updateMenu(menu.id, { isActive: !menu.isActive })}>\n <Power className=\"mr-2 h-3.5 w-3.5\" />\n {menu.isActive ? t('menu.manager.deactivateMenu') : t('menu.manager.activateMenu')}\n </DropdownItem>\n <DropdownItem onClick={() => setPreviewOpen(true)}>\n <Eye className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.preview.action')}\n </DropdownItem>\n <DropdownSeparator />\n <DropdownItem\n className=\"text-destructive focus:text-destructive\"\n onClick={() => setConfirm({ kind: 'menu', id: menu.id, name: menu.name })}\n >\n <Trash2 className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.deleteMenu')}\n </DropdownItem>\n </DropdownContent>\n </Dropdown>\n )\n\n return (\n <div className=\"space-y-4\">\n {/* Um botão, um caret — o contrato de ações do produto inteiro.\n \n Eram TRÊS de peso igual no cabeçalho (\"Inserir com IA\", \"Ver como\n fica\", \"Novo cardápio\"), que é o desenho que o resto do app abandonou:\n três botões lado a lado não dizem qual é o próximo passo. Inserir com\n IA é outra MANEIRA de cadastrar, então mora sob o botão de cadastrar,\n como as entradas de estoque moram sob \"Novo Produto\". E \"Ver como\n fica\" não é criar nada: desceu para \"Ações do cardápio\", junto com\n editar, duplicar e ativar. */}\n <PageHeaderActions>\n <PageActions\n actions={[\n ...(multiMenu ? [{\n id: 'new-menu',\n label: t('menu.manager.newMenu'),\n icon: Plus,\n intent: 'primary' as const,\n creates: true,\n onSelect: () => setMenuEditor({ open: true }),\n }] : []),\n ...(extractor ? [{\n id: 'ai-import',\n label: t('menu.import.action'),\n description: t('menu.import.actionDesc'),\n icon: Sparkles,\n // Sem vários cardápios não há botão de criar para se esconder\n // atrás: aqui ELA é a maneira de cadastrar.\n intent: (multiMenu ? 'secondary' : 'primary') as 'secondary' | 'primary',\n creates: true,\n onSelect: () => startAiImport(),\n }] : []),\n ]}\n />\n </PageHeaderActions>\n\n {/* The menus themselves. A restaurant has more than one, and which one is\n open is the first thing this screen has to say.\n \n Drawn as the page's tab band, not as a strip of rounded chips. It is\n the same question every other screen asks at the top — which face of\n this module am I looking at — and it was the fifth different answer in\n the product (underline tabs in Financeiro, a grey pill in Pedidos, a\n bordered pair in Cozinha, bare tabs in Reservas, chips here). The\n serving dot survives as the tab's `badge`; the item count as `count`.\n \n `multiMenu` still gates it: one cardápio needs no chooser. */}\n {multiMenu && (\n <PageTabs\n className=\"mb-0\"\n aria-label={t('menu.manager.newMenu')}\n value={activeMenuId ?? menus[0]?.id ?? ''}\n onChange={(id) => void openMenu(id)}\n tabs={menus.map((menu) => {\n const isOpen = menu.id === (activeMenuId ?? menus[0]?.id)\n return {\n value: menu.id,\n label: menu.name,\n count: menu.itemCount ?? 0,\n // A bolinha continua marcando os cardápios que NÃO estão abertos\n // — é ali que ela responde uma pergunta (\"qual está servindo\n // agora?\"). No aberto, o lugar é do menu de ações dele.\n badge: isOpen ? undefined : (\n <span\n aria-hidden\n className={`ml-0.5 h-1.5 w-1.5 rounded-full ${\n menu.isActive && isServingAt(menu.availability) ? 'bg-success' : 'bg-muted-foreground/30'\n }`}\n />\n ),\n // Cardápio desligado: a aba inteira enfraquece. A etiqueta\n // \"desativado\" abaixo dizia isso em texto, longe do nome do\n // cardápio a que se referia.\n dim: !menu.isActive,\n trailing: isOpen ? menuActions(menu) : undefined,\n }\n })}\n />\n )}\n\n {/* Só o HORÁRIO fica aqui, e só quando existe um. Desativado não é mais\n uma etiqueta ao lado: é a aba do cardápio inteira, fraca — dito no\n lugar em que o nome dele está. */}\n {activeMenu && !isAlwaysAvailable(activeMenu.availability) && (\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-muted-foreground\">\n <span>{scheduleLabel}</span>\n <span className={`rounded-full px-2 py-0.5 text-[10px] font-medium ${\n isServingAt(activeMenu.availability) ? 'bg-success-soft text-success-soft-foreground' : 'bg-muted'\n }`}>\n {isServingAt(activeMenu.availability) ? t('menu.manager.servingNow') : t('menu.manager.notServing')}\n </span>\n </div>\n )}\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"relative min-w-[12rem] flex-1\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={t('menu.manager.search')}\n className=\"w-full rounded-input border bg-card py-1.5 pl-8 pr-3 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={() => void createSection(t('menu.manager.newSectionName'))}>\n <Plus className=\"h-3.5 w-3.5\" /> {t('menu.manager.addSection')}\n </Button>\n </div>\n\n {menusLoading || menuLoading ? (\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-24 animate-pulse rounded-card border bg-muted/20\" />\n ))}\n </div>\n ) : visible.sections.length === 0 && !draft ? (\n <div className=\"flex flex-col items-center gap-2 rounded-card border-2 border-dashed py-14 text-center\">\n <UtensilsCrossed className=\"h-8 w-8 text-muted-foreground/30\" />\n <p className=\"text-base font-semibold\">{t('menu.manager.empty')}</p>\n <p className=\"max-w-sm text-xs text-muted-foreground\">{t('menu.manager.emptyHint')}</p>\n <div className=\"mt-2 flex gap-2\">\n <Button variant=\"outline\" onClick={() => void createSection(t('menu.manager.newSectionName'))}>\n <Plus className=\"h-3.5 w-3.5\" /> {t('menu.manager.addSection')}\n </Button>\n {extractor && (\n <Button onClick={startAiImport}>\n <Sparkles className=\"h-3.5 w-3.5\" /> {t('menu.import.action')}\n </Button>\n )}\n </div>\n </div>\n ) : (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={(event: DragStartEvent) => setDragging(String(event.active.id))}\n onDragEnd={handleDragEnd}\n onDragCancel={() => setDragging(null)}\n >\n <SortableContext items={visible.sections.map((s) => s.id)} strategy={verticalListSortingStrategy}>\n <div className=\"space-y-3\">\n {visible.sections.map((section) => {\n const rows = visible.bySection.get(section.id) ?? []\n return (\n <SortableContext key={section.id} items={rows.map((p) => p.id)} strategy={verticalListSortingStrategy}>\n <SectionCard\n section={section}\n placements={rows}\n itemsById={itemsById}\n currency={currency}\n locale={currency.locale}\n deliveryPricing={modules.deliveryPricing}\n multiMenu={multiMenu}\n pendingIds={pendingIds}\n handlers={handlers}\n />\n </SortableContext>\n )\n })}\n </div>\n </SortableContext>\n <DragOverlay>{dragging ? <div className=\"h-10 rounded-card border bg-card shadow-lg\" /> : null}</DragOverlay>\n </DndContext>\n )}\n\n {draft && (\n <div className=\"space-y-3 pt-1\">\n {draft.sections.map((section) => (\n <DraftSectionCard\n key={section.key}\n section={section}\n sections={sections}\n onPatchSection={(patch) => updateDraftSection(section.key, patch)}\n onRemoveSection={() => removeDraftSection(section.key)}\n onPatchItem={(itemKey, patch) => updateDraftItem(section.key, itemKey, patch)}\n onRemoveItem={(itemKey) => removeDraftItem(section.key, itemKey)}\n />\n ))}\n <DraftBar\n draft={draft}\n saving={committing}\n onDiscard={discardDraft}\n onCommit={async () => {\n setCommitting(true)\n try {\n const result = await commitDraft()\n toast.success(t('menu.import.done', {\n items: String(result.itemsCreated), sections: String(result.sectionsCreated),\n }))\n } finally {\n setCommitting(false)\n }\n }}\n />\n </div>\n )}\n\n <MenuRailPage\n open={menuEditor.open}\n menu={menuEditor.editing ? activeMenu : undefined}\n locale={currency.locale}\n onClose={() => setMenuEditor({ open: false })}\n onSubmit={async (values) => {\n if (menuEditor.editing && activeMenu) await updateMenu(activeMenu.id, values)\n else await createMenu(values)\n }}\n />\n\n <ItemRailPage\n open={itemEditor.open}\n item={itemEditor.item}\n sections={sections}\n sectionId={itemEditor.sectionId}\n currency={currency}\n deliveryPricing={modules.deliveryPricing}\n multiMenu={multiMenu}\n priceOverride={itemEditor.placement?.priceOverride}\n onClose={() => setItemEditor({ open: false, sectionId: '' })}\n onSubmit={submitItem}\n onUploadImage={(file) => uploadImage(file, 'item')}\n />\n\n <MenuPreview\n open={previewOpen}\n menu={activeMenu}\n sections={sections}\n placements={placements}\n itemsById={itemsById}\n currency={currency}\n locale={currency.locale}\n onClose={() => setPreviewOpen(false)}\n />\n\n <ConfirmDialog\n open={!!confirm}\n variant=\"destructive\"\n title={confirm ? t(`menu.confirm.${confirm.kind}Title`, { name: confirm.name }) : ''}\n description={confirm ? t(`menu.confirm.${confirm.kind}Desc`) : undefined}\n confirmLabel={t('menu.confirm.delete')}\n cancelLabel={t('menu.form.cancel')}\n onConfirm={() => void confirmDelete()}\n onCancel={() => setConfirm(null)}\n />\n </div>\n )\n}\n","import React from 'react'\nimport type { StoreApi } from 'zustand/vanilla'\nimport { MenuContextProvider, type ResolvedMenuConfig } from '../context'\nimport type { MenuDataProvider } from '../data/types'\nimport type { MenuUIState } from '../store'\nimport type { PluginRegistryDef } from '@fayz-ai/core'\n\nimport { MenuManagerView } from './MenuManagerView'\n\nexport function MenuPage({ config, provider, store, registries }: {\n config: ResolvedMenuConfig\n provider: MenuDataProvider\n store: StoreApi<MenuUIState>\n registries?: PluginRegistryDef[]\n}) {\n return (\n <MenuContextProvider config={config} provider={provider} store={store}>\n <MenuManagerView />\n </MenuContextProvider>\n )\n}\n"]}
package/dist/index.js CHANGED
@@ -2433,6 +2433,7 @@ var en = {
2433
2433
  "menu.itemForm.clearOverride": "Use the item price",
2434
2434
  // AI import
2435
2435
  "menu.import.action": "Add with AI",
2436
+ "menu.import.actionDesc": "Send photos of the printed menu and the assistant fills it in for you.",
2436
2437
  "menu.import.uploadCta": "Upload a photo of the menu",
2437
2438
  "menu.import.uploadHint": "One photo per page, straight on, no glare. Several at once is fine.",
2438
2439
  "menu.import.askPrompt": "I want to add my menu from photos.",
@@ -2574,6 +2575,7 @@ var ptBR = {
2574
2575
  "menu.itemForm.clearOverride": "Usar o pre\xE7o do item",
2575
2576
  // AI import
2576
2577
  "menu.import.action": "Inserir com IA",
2578
+ "menu.import.actionDesc": "Mande fotos do card\xE1pio impresso e o assistente cadastra por voc\xEA.",
2577
2579
  "menu.import.uploadCta": "Subir foto do card\xE1pio",
2578
2580
  "menu.import.uploadHint": "Uma foto por p\xE1gina, de frente e sem reflexo. Pode mandar v\xE1rias.",
2579
2581
  "menu.import.askPrompt": "Quero cadastrar meu card\xE1pio a partir de fotos.",
@@ -2946,7 +2948,7 @@ function createFayzMenuProvider(options = {}) {
2946
2948
  }
2947
2949
 
2948
2950
  // src/index.ts
2949
- var MenuPage = React.lazy(() => import('./MenuPage-ZFBHFDZI.js').then((m) => ({ default: m.MenuPage })));
2951
+ var MenuPage = React.lazy(() => import('./MenuPage-SO7EDR6R.js').then((m) => ({ default: m.MenuPage })));
2950
2952
  var DEFAULT_LABELS = {
2951
2953
  pageTitle: "Menu",
2952
2954
  menuManager: "Menu Manager",