react-os-shell 3.6.0 → 3.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Browser-RGJLDLYV.js +7 -0
- package/dist/{Browser-KMCFAQ6B.js.map → Browser-RGJLDLYV.js.map} +1 -1
- package/dist/{Calculator-LGYXEZTY.js → Calculator-5PABMVXY.js} +4 -4
- package/dist/{Calculator-LGYXEZTY.js.map → Calculator-5PABMVXY.js.map} +1 -1
- package/dist/{CurrencyConverter-JI5ECSQA.js → CurrencyConverter-2DTZV4JC.js} +4 -4
- package/dist/{CurrencyConverter-JI5ECSQA.js.map → CurrencyConverter-2DTZV4JC.js.map} +1 -1
- package/dist/{Documents-Q3IGUDRC.js → Documents-QXCHQJKC.js} +4 -4
- package/dist/{Documents-Q3IGUDRC.js.map → Documents-QXCHQJKC.js.map} +1 -1
- package/dist/Files-TKXL7YM6.js +12 -0
- package/dist/{Files-JQMMXIM3.js.map → Files-TKXL7YM6.js.map} +1 -1
- package/dist/{Notepad-RGNFWBH7.js → Notepad-UJUXL7Y2.js} +4 -4
- package/dist/{Notepad-RGNFWBH7.js.map → Notepad-UJUXL7Y2.js.map} +1 -1
- package/dist/{PomodoroTimer-5WZ37PLI.js → PomodoroTimer-PFZVSP3I.js} +5 -5
- package/dist/{PomodoroTimer-5WZ37PLI.js.map → PomodoroTimer-PFZVSP3I.js.map} +1 -1
- package/dist/Preview-RXEAN4NM.js +8 -0
- package/dist/{Preview-6QVSOGRM.js.map → Preview-RXEAN4NM.js.map} +1 -1
- package/dist/Spreadsheet-UPQBWU7A.js +7 -0
- package/dist/{Spreadsheet-FHAQX6CU.js.map → Spreadsheet-UPQBWU7A.js.map} +1 -1
- package/dist/{Stock-ERDFTUOZ.js → Stock-OMLDYMWN.js} +4 -4
- package/dist/{Stock-ERDFTUOZ.js.map → Stock-OMLDYMWN.js.map} +1 -1
- package/dist/{Weather-6WBY4ANL.js → Weather-7QUTCZKH.js} +4 -4
- package/dist/{Weather-6WBY4ANL.js.map → Weather-7QUTCZKH.js.map} +1 -1
- package/dist/{WorldClock-ZOLBVSJC.js → WorldClock-M6IVJBYN.js} +4 -4
- package/dist/{WorldClock-ZOLBVSJC.js.map → WorldClock-M6IVJBYN.js.map} +1 -1
- package/dist/apps/index.js +19 -19
- package/dist/{chunk-L5TFGRBY.js → chunk-5AQOJ5BG.js} +5 -5
- package/dist/{chunk-L5TFGRBY.js.map → chunk-5AQOJ5BG.js.map} +1 -1
- package/dist/{chunk-65NSWQAT.js → chunk-H4NP7TMW.js} +4 -4
- package/dist/{chunk-65NSWQAT.js.map → chunk-H4NP7TMW.js.map} +1 -1
- package/dist/{chunk-2OONWKUI.js → chunk-HIJSKVIO.js} +4 -4
- package/dist/{chunk-2OONWKUI.js.map → chunk-HIJSKVIO.js.map} +1 -1
- package/dist/{chunk-6VMTAVUD.js → chunk-L7B66ALK.js} +3 -3
- package/dist/{chunk-6VMTAVUD.js.map → chunk-L7B66ALK.js.map} +1 -1
- package/dist/{chunk-CML7B3S4.js → chunk-O3BLL2WA.js} +4 -4
- package/dist/{chunk-CML7B3S4.js.map → chunk-O3BLL2WA.js.map} +1 -1
- package/dist/{chunk-6OWYD4O6.js → chunk-S22GZ4OQ.js} +31 -2
- package/dist/chunk-S22GZ4OQ.js.map +1 -0
- package/dist/{chunk-JQGXIQVO.js → chunk-UNSKKZIK.js} +4 -4
- package/dist/{chunk-JQGXIQVO.js.map → chunk-UNSKKZIK.js.map} +1 -1
- package/dist/{chunk-TVSL5Y5H.js → chunk-W75O4R5Y.js} +4 -4
- package/dist/{chunk-TVSL5Y5H.js.map → chunk-W75O4R5Y.js.map} +1 -1
- package/dist/{chunk-XRBSB7FX.js → chunk-WPZDC7HH.js} +3 -3
- package/dist/{chunk-XRBSB7FX.js.map → chunk-WPZDC7HH.js.map} +1 -1
- package/dist/index.js +10 -10
- package/package.json +1 -1
- package/dist/Browser-KMCFAQ6B.js +0 -7
- package/dist/Files-JQMMXIM3.js +0 -12
- package/dist/Preview-6QVSOGRM.js +0 -8
- package/dist/Spreadsheet-FHAQX6CU.js +0 -7
- package/dist/chunk-6OWYD4O6.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/ImageAnnotator.tsx","../src/apps/Preview.tsx"],"names":["ImageAnnotator","useRef","useEffect","useState","jsxs","jsx","Fragment","sourceMat","v","diag"],"mappings":";;;;;;;;AAoCA,IAAM,MAAA,GAAS,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS,CAAA;AACtG,IAAM,KAAA,GAAQ;AAAA,EACZ,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,QAAA,EAAY,KAAK,sCAAA,EAAuC;AAAA,EAC/E,EAAE,EAAA,EAAI,OAAA,EAAU,KAAA,EAAO,OAAA,EAAY,KAAK,mCAAA,EAAoC;AAAA,EAC5E,EAAE,EAAA,EAAI,MAAA,EAAU,KAAA,EAAO,MAAA,EAAY,KAAK,2CAAA,EAA4C;AAAA,EACpF,EAAE,EAAA,EAAI,SAAA,EAAU,KAAA,EAAO,SAAA,EAAY,KAAK,6CAAA;AAC1C,CAAA;AACA,IAAM,cAAA,GAAiB,CAAA;AACvB,IAAM,iBAAA,GAAoB,EAAA;AAC1B,IAAM,mBAAA,GAAsB,EAAA;AAC5B,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,QAAA,GAAW,IAAA;AACjB,IAAM,QAAA,GAAW,CAAA;AACjB,IAAM,SAAA,GAAY,IAAA;AAElB,IAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAoBzD,IAAM,cAAA,GAAiB,UAAA,CAAsD,SAASA,eAAAA,CACpF,EAAE,KAAK,QAAA,EAAU,OAAA,EAAS,QAAA,EAAS,EAAG,GAAA,EACtC;AACA,EAAA,MAAM,OAAA,GAAU,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,OAA0B,IAAI,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,OAAsB,IAAI,CAAA;AACzC,EAAA,MAAM,QAAA,GAAW,OAAgC,IAAI,CAAA;AAErD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAe,QAAQ,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAC,CAAA;AAC5C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,cAAc,CAAA;AACnD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,iBAAiB,CAAA;AAC1D,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAI,SAAS,KAAA,CAAM,CAAC,EAAE,EAAE,CAAA;AACpD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,mBAAmB,CAAA;AAChE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA,CAAuB,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAA0C,IAAI,CAAA;AAChF,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAA0C,IAAI,CAAA;AAC5E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,CAAC,CAAA;AAElC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAA4B,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAA6E,IAAI,CAAA;AACvH,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAgE,IAAI,CAAA;AAE1G,EAAA,MAAM,OAAA,GAAU,OAOd,IAAI,CAAA;AACN,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAM;AAChC,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO,EAAE,GAAG,OAAA,CAAQ,CAAA,GAAI,MAAM,CAAA,EAAG,OAAA,CAAQ,IAAI,IAAA,EAAK;AAAA,EACpD,CAAA,EAAG,CAAC,OAAA,EAAS,IAAI,CAAC,CAAA;AAClB,EAAA,MAAM,QAAQ,WAAA,IAAe,SAAA,GAAY,WAAA,CAAY,CAAA,GAAI,UAAU,CAAA,GAAI,CAAA;AAGvE,EAAA,MAAM,QAAA,GAAW,OAAA;AAAA,IACf,MAAM,WAAA,CAAY,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,UAAU,CAAA,IAAK,IAAA;AAAA,IACpD,CAAC,aAAa,UAAU;AAAA,GAC1B;AAIA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,KAAS,YAAY,QAAA,EAAU;AAEjC,MAAA,IAAI,OAAA,IAAW,QAAA,EAAU,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA;AAChD,MAAA,IAAI,QAAA,IAAY,QAAA,EAAU,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA;AACnD,MAAA,IAAI,QAAA,CAAS,IAAA,KAAS,MAAA,EAAQ,aAAA,CAAc,SAAS,MAAM,CAAA;AAC3D,MAAA,IAAI,QAAA,CAAS,SAAS,MAAA,EAAQ;AAC5B,QAAA,WAAA,CAAY,SAAS,IAAI,CAAA;AACzB,QAAA,WAAA,CAAY,SAAS,IAAI,CAAA;AACzB,QAAA,WAAA,CAAY,SAAS,IAAI,CAAA;AACzB,QAAA,aAAA,CAAc,SAAS,MAAM,CAAA;AAC7B,QAAA,gBAAA,CAAiB,SAAS,SAAS,CAAA;AAAA,MACrC;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,WAAA;AAClB,IAAA,GAAA,CAAI,SAAS,MAAM;AACjB,MAAA,QAAA,CAAS,OAAA,GAAU,GAAA;AACnB,MAAA,YAAA,CAAa,EAAE,CAAA,EAAG,GAAA,CAAI,cAAc,CAAA,EAAG,GAAA,CAAI,eAAe,CAAA;AAC1D,MAAA,cAAA,CAAe,EAAE,CAAA;AACjB,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB,CAAA;AACA,IAAA,GAAA,CAAI,OAAA,GAAU,MAAM,aAAA,CAAM,KAAA,CAAM,sBAAsB,CAAA;AACtD,IAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AAAA,EACZ,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAGR,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,CAAA,GAAI,KAAK,qBAAA,EAAsB;AACrC,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,QAAQ,EAAE,CAAA;AACvC,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,SAAS,EAAE,CAAA;AACxC,MAAA,IAAI,MAAA,KAAW,CAAA,IAAK,MAAA,KAAW,CAAA,EAAG;AAClC,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,CAAA,GAAI,SAAA,CAAU,CAAA;AACtC,MAAA,IAAI,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,CAAA;AACnC,MAAA,IAAI,IAAI,MAAA,EAAQ;AAAE,QAAA,CAAA,GAAI,MAAA;AAAQ,QAAA,CAAA,GAAI,CAAA,GAAI,KAAA;AAAA,MAAO;AAC7C,MAAA,IAAI,IAAI,MAAA,EAAQ;AAAE,QAAA,CAAA,GAAI,MAAA;AAAQ,QAAA,CAAA,GAAI,CAAA,GAAI,KAAA;AAAA,MAAO;AAC7C,MAAA,UAAA,CAAW,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA;AAAA,IACrB,CAAA;AACA,IAAA,MAAA,EAAO;AACP,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,MAAM,CAAA;AACpC,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,EAAA,CAAG,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAC/C,IAAA,OAAO,MAAM,GAAG,UAAA,EAAW;AAAA,EAC7B,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAKd,EAAA,MAAM,WAAA,GAAc,OAAA;AAAA,IAClB,MAAM,WAAA,CAAY,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,IACjD,CAAC,WAAW;AAAA,GACd;AACA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,MAAM,QAAA,CAAS,OAAA;AACrB,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,CAAA,IAAK,CAAC,SAAA,EAAW;AAC9B,IAAA,CAAA,CAAE,QAAQ,SAAA,CAAU,CAAA;AACpB,IAAA,CAAA,CAAE,SAAS,SAAA,CAAU,CAAA;AACrB,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA;AAC7B,IAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AACvB,IAAA,KAAA,MAAW,CAAA,IAAK,WAAA,EAAa,WAAA,CAAY,GAAA,EAAK,CAAC,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,SAAA,EAAW,WAAA,EAAa,OAAO,CAAC,CAAA;AAGpC,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAsE;AACvF,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAC9B,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,EAAe;AAC9B,IAAA,EAAA,CAAG,IAAI,CAAA,CAAE,OAAA;AAAS,IAAA,EAAA,CAAG,IAAI,CAAA,CAAE,OAAA;AAC3B,IAAA,MAAM,GAAA,GAAM,IAAI,YAAA,EAAa;AAC7B,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAC9B,IAAA,MAAM,CAAA,GAAI,EAAA,CAAG,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA;AAC1C,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AAAA,EAC1B,CAAA;AAGA,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KAA8C;AAC/D,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAAqB;AACnC,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,CAAA,GAAI,UAAU,EAAE,CAAA;AACtB,MAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,QAAA,UAAA,CAAW,SAAA,CAAU,MAAM,IAAA,CAAK,KAAA,EAAO,GAAG,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAC,CAAA;AAAA,MACtE,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,KAAA,EAAO;AAE9B,QAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA;AAC/C,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,KAAK,CAAC,CAAA,GAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG;AAC5D,UAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAClB,UAAA,UAAA,CAAW,EAAE,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,EAAM,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QACjF;AAAA,MACF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC/B,QAAA,cAAA,CAAe,aAAA,CAAc,IAAA,CAAK,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,MAC7C,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC/B,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA;AAC5B,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA;AAC5B,QAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAA,KAAO,IAAA,CAAK,EAAA,GAAK,SAAA,CAAU,KAAK,QAAA,EAAU,EAAA,EAAI,EAAE,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,MAC/F,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,QAAA,cAAA,CAAe,UAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,IAAA,CAAK,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,MACpG;AAAA,IACF,CAAA;AACA,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,IAAI,IAAA,EAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,UAAA,CAAW,CAAA,CAAA,KAAK;AACd,UAAA,IAAI,CAAC,CAAA,IAAK,SAAA,CAAU,CAAC,GAAG,OAAO,IAAA;AAC/B,UAAA,MAAM,OAAmB,EAAE,GAAG,CAAA,EAAG,EAAA,EAAI,OAAM,EAAE;AAC7C,UAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AACtC,UAAA,aAAA,CAAc,KAAK,EAAE,CAAA;AACrB,UAAA,OAAA,CAAQ,QAAQ,CAAA;AAChB,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,IAAA,EAAM,IAAA,KAAS,KAAA,EAAO;AAC/B,QAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAAE,UAAA,UAAA,CAAW,IAAI,CAAA;AAAG,UAAA;AAAA,QAAQ;AACxD,QAAA,MAAM,IAAA,GAAiB,EAAE,EAAA,EAAI,KAAA,EAAM,EAAG,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AACvF,QAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AACtC,QAAA,aAAA,CAAc,KAAK,EAAE,CAAA;AACrB,QAAA,OAAA,CAAQ,QAAQ,CAAA;AAChB,QAAA,UAAA,CAAW,IAAI,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,MAAM,CAAA;AAC7C,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,IAAI,CAAA;AACzC,IAAA,MAAA,CAAO,gBAAA,CAAiB,iBAAiB,IAAI,CAAA;AAC7C,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,MAAM,CAAA;AAChD,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC5C,MAAA,MAAA,CAAO,mBAAA,CAAoB,iBAAiB,IAAI,CAAA;AAAA,IAClD,CAAA;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,MAAM,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAC,CAAA;AAEhD,EAAA,MAAM,qBAAA,GAAwB,CAAC,CAAA,EAAmC,IAAA,KAAqB;AACrF,IAAA,IAAI,SAAS,QAAA,EAAU;AACvB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,aAAA,CAAc,KAAK,EAAE,CAAA;AACrB,IAAA,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,SAAA,CAAU,CAAC,CAAA,EAAG,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,EAC9E,CAAA;AAEA,EAAA,MAAM,uBAAA,GAA0B,CAAC,CAAA,EAAmC,IAAA,EAAkB,MAAA,KAAmB;AACvG,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,SAAA,CAAU,EAAE,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,SAAA,CAAU,CAAC,CAAA,EAAG,QAAA,EAAU,MAAM,CAAA;AAAA,EACxF,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,CAAA,KAAyC;AACrE,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,CAAA,GAAI,UAAU,CAAC,CAAA;AACrB,MAAA,cAAA,CAAe,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,KAAA,EAAO,EAAA,EAAI,CAAA;AAC5C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,CAAA;AACjC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AAEnB,MAAA,SAAA,CAAU,EAAE,IAAA,EAAM,KAAA,EAAO,QAAQ,CAAC,KAAK,GAAG,CAAA;AAC1C,MAAA,UAAA,CAAW,EAAE,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,CAAC,KAAK,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AACnE,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,UAAU,IAAA,EAAM,KAAA,EAAO,OAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAC,CAAA;AACnE,IAAA,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,CAAC,IAAA,KAAqB;AAClD,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AAC1B,IAAA,cAAA,CAAe,EAAE,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,IAAI,CAAA;AAAA,EAC/E,CAAA;AAMA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KAAsB;AACnC,MAAA,IAAI,SAAS,aAAA,IAAiB,oBAAA,CAAqB,KAAK,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA,EAAG;AACzF,MAAA,IAAA,CAAK,EAAA,CAAG,OAAA,IAAW,EAAA,CAAG,OAAA,MAAa,EAAA,CAAG,GAAA,KAAQ,GAAA,IAAO,EAAA,CAAG,GAAA,KAAQ,GAAA,CAAA,IAAQ,CAAC,EAAA,CAAG,QAAA,EAAU;AACpF,QAAA,EAAA,CAAG,cAAA,EAAe;AAClB,QAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AACxC,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,IAAI,EAAA,CAAG,GAAA,KAAQ,QAAA,IAAY,EAAA,CAAG,QAAQ,WAAA,EAAa;AACjD,QAAA,EAAA,CAAG,cAAA,EAAe;AAClB,QAAA,cAAA,CAAe,UAAQ,IAAA,CAAK,MAAA,CAAO,OAAK,CAAA,CAAE,EAAA,KAAO,UAAU,CAAC,CAAA;AAC5D,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB,CAAA,MAAA,IAAW,EAAA,CAAG,GAAA,KAAQ,QAAA,EAAU;AAC9B,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAKf,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAAc;AACtC,IAAA,QAAA,CAAS,CAAC,CAAA;AACV,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AACnC,MAAA,IAAI,CAAA,CAAE,EAAA,KAAO,UAAA,EAAY,OAAO,CAAA;AAChC,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,OAAO,CAAA;AAChC,MAAA,OAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAAA,IAC1B,CAAC,CAAC,CAAA;AAAA,EACJ,CAAA;AACA,EAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAAc;AACvC,IAAA,SAAA,CAAU,CAAC,CAAA;AACX,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AACnC,MAAA,IAAI,CAAA,CAAE,EAAA,KAAO,UAAA,EAAY,OAAO,CAAA;AAChC,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ;AACvF,QAAA,OAAO,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MAC3B;AACA,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAC,CAAA;AAAA,EACJ,CAAA;AACA,EAAA,MAAM,qBAAA,GAAwB,CAAC,CAAA,KAAc;AAC3C,IAAA,aAAA,CAAc,CAAC,CAAA;AACf,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,cAAA,CAAe,UAAQ,IAAA,CAAK,GAAA;AAAA,MAAI,CAAA,CAAA,KAC7B,CAAA,CAAE,EAAA,KAAO,UAAA,IAAc,CAAA,CAAE,IAAA,KAAS,MAAA,GAAU,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE,GAAI;AAAA,KACpE,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,mBAAA,GAAsB,CAAC,CAAA,KAAc;AACzC,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,cAAA,CAAe,UAAQ,IAAA,CAAK,GAAA;AAAA,MAAI,CAAA,CAAA,KAC7B,CAAA,CAAE,EAAA,KAAO,UAAA,IAAc,CAAA,CAAE,IAAA,KAAS,MAAA,GAAU,EAAE,GAAG,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE,GAAI;AAAA,KAClE,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,mBAAA,GAAsB,CAAC,CAAA,KAAc;AACzC,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,cAAA,CAAe,UAAQ,IAAA,CAAK,GAAA;AAAA,MAAI,CAAA,CAAA,KAC7B,CAAA,CAAE,EAAA,KAAO,UAAA,IAAc,CAAA,CAAE,IAAA,KAAS,MAAA,GAAU,EAAE,GAAG,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE,GAAI;AAAA,KAClE,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,uBAAA,GAA0B,CAAC,KAAA,KAA2C;AAC1E,IAAA,MAAM,IAAA,GAAO,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,UAAA,EAAY,SAAA,EAAW,aAAA,EAAc,CAAE,KAAK,CAAA;AACpF,IAAA,IAAI,KAAA,KAAU,MAAA,EAAQ,WAAA,CAAY,IAAI,CAAA;AACtC,IAAA,IAAI,KAAA,KAAU,QAAA,EAAU,aAAA,CAAc,IAAI,CAAA;AAC1C,IAAA,IAAI,KAAA,KAAU,WAAA,EAAa,gBAAA,CAAiB,IAAI,CAAA;AAChD,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,cAAA,CAAe,UAAQ,IAAA,CAAK,GAAA;AAAA,MAAI,CAAA,CAAA,KAC7B,CAAA,CAAE,EAAA,KAAO,UAAA,IAAc,EAAE,IAAA,KAAS,MAAA,GAAU,EAAE,GAAG,CAAA,EAAG,CAAC,KAAK,GAAG,MAAK,GAAI;AAAA,KACxE,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,MAAM,QAAQ,WAAA,CAAY,KAAA;AAC1B,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG;AACjB,MAAA,IAAI,YAAY,SAAA,EAAW;AACzB,QAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,KAAK,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,EAAA,KAAO,WAAA,CAAY,SAAS,CAAC,CAAA;AAAA,MACzE;AACA,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,YAAY,SAAA,EAAW;AACzB,MAAA,cAAA,CAAe,UAAQ,IAAA,CAAK,GAAA;AAAA,QAAI,CAAA,CAAA,KAC9B,CAAA,CAAE,EAAA,KAAO,WAAA,CAAY,SAAA,IAAa,CAAA,CAAE,IAAA,KAAS,MAAA,GACzC,EAAE,GAAG,CAAA,EAAG,IAAA,EAAM,OAAM,GACpB;AAAA,OACL,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAiB;AAAA,QACrB,IAAI,KAAA,EAAM;AAAA,QACV,IAAA,EAAM,MAAA;AAAA,QACN,GAAG,WAAA,CAAY,CAAA;AAAA,QACf,GAAG,WAAA,CAAY,CAAA;AAAA,QACf,IAAA,EAAM,KAAA;AAAA,QACN,KAAA;AAAA,QACA,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,UAAA;AAAA,QACR,SAAA,EAAW;AAAA,OACb;AACA,MAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AACtC,MAAA,aAAA,CAAc,KAAK,EAAE,CAAA;AACrB,MAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAClB;AACA,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACrB,CAAA;AAGA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,QAAA,CAAS,OAAA,IAAW,CAAC,SAAA,EAAW;AACrD,IAAA,MAAM,CAAA,GAAI,WAAA;AACV,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,GAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA;AAC1B,IAAA,GAAA,CAAI,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA;AAChC,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACpD,IAAA,YAAA,CAAa,QAAQ,SAAA,CAAU,CAAA;AAC/B,IAAA,YAAA,CAAa,SAAS,SAAA,CAAU,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,UAAA,CAAW,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AACrC,IAAA,KAAA,MAAW,CAAA,IAAK,WAAA,EAAa,WAAA,CAAY,IAAA,EAAM,CAAC,CAAA;AAChD,IAAA,IAAA,CAAK,SAAA,CAAU,YAAA,EAAc,CAAA,CAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC/D,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,EAAM;AACzB,IAAA,MAAA,CAAO,SAAS,MAAM;AACpB,MAAA,QAAA,CAAS,OAAA,GAAU,MAAA;AACnB,MAAA,YAAA,CAAa,EAAE,CAAA,EAAG,MAAA,CAAO,cAAc,CAAA,EAAG,MAAA,CAAO,eAAe,CAAA;AAChE,MAAA,cAAA;AAAA,QAAe,CAAA,IAAA,KACb,IAAA,CACG,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,CAC/B,GAAA,CAAI,CAAA,CAAA,KAAK,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA,CAAE,CAAA,EAAG,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CACjC,MAAA,CAAO,CAAA,CAAA,KAAK,YAAA,CAAa,CAAA,EAAG,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,aAAa,CAAC;AAAA,OAC3E;AACA,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,IACrB,CAAA;AACA,IAAA,MAAA,CAAO,GAAA,GAAM,GAAA,CAAI,SAAA,CAAU,WAAW,CAAA;AAAA,EACxC,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,CAAe,IAAI,CAAA;AAE5C,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AACxC,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA;AAGA,EAAA,MAAM,oBAAoB,YAA+C;AACvE,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,GAAA,IAAO,CAAC,WAAW,OAAO,IAAA;AACrC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,GAAA,CAAI,QAAQ,SAAA,CAAU,CAAA;AACtB,IAAA,GAAA,CAAI,SAAS,SAAA,CAAU,CAAA;AACvB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA;AAChC,IAAA,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACtB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,IAAI,CAAA;AAChC,IAAA,KAAA,CAAM,iBAAiB,eAAe,CAAA,CAAE,QAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA;AAC/D,IAAA,MAAM,GAAA,GAAM,IAAI,aAAA,EAAc,CAAE,kBAAkB,KAAK,CAAA;AACvD,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,CAAC,GAAG,CAAA,EAAG,EAAE,IAAA,EAAM,6BAAA,EAA+B,CAAA;AACvE,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,eAAA,CAAgB,OAAO,CAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,EAAM;AACzB,IAAA,MAAM,IAAI,QAAc,CAAA,OAAA,KAAW;AACjC,MAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC9B,MAAA,MAAA,CAAO,OAAA,GAAU,MAAM,OAAA,EAAQ;AAC/B,MAAA,MAAA,CAAO,GAAA,GAAM,MAAA;AAAA,IACf,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ,CAAA,EAAG,GAAG,SAAA,CAAU,CAAA,EAAG,UAAU,CAAC,CAAA;AACrD,IAAA,GAAA,CAAI,gBAAgB,MAAM,CAAA;AAC1B,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,mBAAA,CAAoB,KAAK,OAAO;AAAA,IAC9B,MAAM,YAAY;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,iBAAA,EAAkB;AACpC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,GAAA,CAAI,OAAO,CAAA,IAAA,KAAQ;AACjB,QAAA,IAAI,CAAC,IAAA,EAAM;AAAE,UAAA,aAAA,CAAM,MAAM,kBAAkB,CAAA;AAAG,UAAA;AAAA,QAAQ;AACtD,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,QAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAC5C,QAAA,CAAA,CAAE,QAAA,GAAW,GAAG,IAAI,CAAA,cAAA,CAAA;AACpB,QAAA,CAAA,CAAE,KAAA,EAAM;AACR,QAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,MACzB,GAAG,WAAW,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,MAAM,YAAY;AAChB,MAAA,IAAI,EAAE,WAAA,IAAe,SAAA,CAAA,IAAc,OAAO,kBAAkB,WAAA,EAAa;AACvE,QAAA,aAAA,CAAM,MAAM,gDAAgD,CAAA;AAC5D,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,iBAAA,EAAkB;AACpC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,GAAA,CAAI,MAAA,CAAO,OAAM,IAAA,KAAQ;AACvB,QAAA,IAAI,CAAC,IAAA,EAAM;AAAE,UAAA,aAAA,CAAM,MAAM,gBAAgB,CAAA;AAAG,UAAA;AAAA,QAAQ;AACpD,QAAA,IAAI;AACF,UAAA,MAAM,SAAA,CAAU,SAAA,CAAU,KAAA,CAAM,CAAC,IAAI,aAAA,CAAc,EAAE,WAAA,EAAa,IAAA,EAAM,CAAC,CAAC,CAAA;AAC1E,UAAA,aAAA,CAAM,QAAQ,qBAAqB,CAAA;AAAA,QACrC,CAAA,CAAA,MAAQ;AACN,UAAA,aAAA,CAAM,MAAM,qCAAqC,CAAA;AAAA,QACnD;AAAA,MACF,GAAG,WAAW,CAAA;AAAA,IAChB;AAAA,GACF,CAAA,EAAI,CAAC,SAAA,EAAW,QAAQ,CAAC,CAAA;AAGzB,EAAA,MAAM,KAAA,GAA0D,QAAQ,MAAM;AAAA,IAC5E,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,eAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,wBAAA,EAAyB,CAAA,EAAE,CAAA,EAAO;AAAA,IACtO,EAAE,EAAA,EAAI,MAAA,EAAU,KAAA,EAAO,YAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,iJAAA,EAAkJ,CAAA,EAAE,CAAA,EAAO;AAAA,IAC/V,EAAE,EAAA,EAAI,MAAA,EAAU,KAAA,EAAO,WAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,SAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,KAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,GAAE,CAAA,EAAO;AAAA,IACxM,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,SAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAQ,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,GAAE,CAAA,EAAO;AAAA,IAC/L,EAAE,EAAA,EAAI,OAAA,EAAU,KAAA,EAAO,OAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,yBAAA,EAA0B,CAAA,EAAE,CAAA,EAAO;AAAA,IACvO,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,QAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,oDAAA,EAAqD,CAAA,EAAE,CAAA,EAAO;AAAA,IAClQ,EAAE,EAAA,EAAI,MAAA,EAAU,KAAA,EAAO,MAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,wBAAA,EAAyB,CAAA,EAAE,CAAA,EAAO;AAAA,IACtO,EAAE,EAAA,EAAI,MAAA,EAAU,KAAA,EAAO,MAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,8CAAA,EAA+C,CAAA,EAAE,CAAA;AAAO,GAC9P,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAW,CAAC,MAAA,KAChB,CAAA,gCAAA,EAAmC,MAAA,GAAS,2BAA2B,iCAAiC,CAAA,CAAA;AAI1G,EAAA,MAAM,OAAA,GAAU,QAAA,EAAU,IAAA,KAAS,IAAA,KAAS,WAAW,IAAA,GAAO,IAAA,CAAA;AAC9D,EAAA,MAAM,oBAAoB,OAAA,KAAY,MAAA,IAAU,YAAY,QAAA,IAAY,OAAA,KAAY,WAAW,OAAA,KAAY,MAAA;AAC3G,EAAA,MAAM,iBAAoB,OAAA,KAAY,MAAA;AACtC,EAAA,MAAM,mBAAoB,OAAA,KAAY,MAAA;AAEtC,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAEb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sGAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,IAAI,CAAA,CAAA,qBACT,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,SAAS,MAAM;AAAE,YAAA,OAAA,CAAQ,EAAE,EAAE,CAAA;AAAG,YAAA,aAAA,CAAc,IAAI,CAAA;AAAA,UAAG,CAAA;AAAA,UACrD,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,SAAA,EAAW,QAAA,CAAS,IAAA,KAAS,CAAA,CAAE,EAAE,CAAA;AAAA,UAEhC,QAAA,EAAA,CAAA,CAAE;AAAA,SAAA;AAAA,QALE,CAAA,CAAE;AAAA,OAOV,CAAA;AAAA,sBAED,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,0BAG1C,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA,MAAA,CAAO,IAAI,CAAA,CAAA,qBACV,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,OAAA,EAAS,MAAM,gBAAA,CAAiB,CAAC,CAAA;AAAA,UACjC,KAAA,EAAO,CAAA;AAAA,UACP,SAAA,EAAW,CAAA,4BAAA,EAA+B,KAAA,KAAU,CAAA,GAAI,uCAAuC,iBAAiB,CAAA,CAAA;AAAA,UAChH,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA;AAAE,SAAA;AAAA,QAJlB;AAAA,OAMR,CAAA,EACH,CAAA;AAAA,MAEC,qCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EAA4B,CAAA;AAAA,wBAC3C,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAK,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BACZ,GAAA,CAAC,WAAM,IAAA,EAAK,OAAA,EAAQ,KAAK,CAAA,EAAG,GAAA,EAAK,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,QAAQ,QAAA,EAAU,CAAC,CAAA,KAAM,iBAAA,CAAkB,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAC,CAAA,EAAG,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,0BAC1J,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA+B,QAAA,EAAA,MAAA,EAAO;AAAA,SAAA,EACxD;AAAA,OAAA,EACF,CAAA;AAAA,MAGD,kCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EAA4B,CAAA;AAAA,wBAC3C,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAK,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BACZ,GAAA,CAAC,WAAM,IAAA,EAAK,OAAA,EAAQ,KAAK,CAAA,EAAG,GAAA,EAAK,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,YAAY,QAAA,EAAU,CAAC,CAAA,KAAM,qBAAA,CAAsB,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAC,CAAA,EAAG,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,0BAClK,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA+B,QAAA,EAAA,UAAA,EAAW;AAAA,SAAA,EAC5D;AAAA,OAAA,EACF,CAAA;AAAA,MAGD,oCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EAA4B,CAAA;AAAA,wBAC3C,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,CAAC,CAAA,KAAM,mBAAA,CAAoB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,EAAG,SAAA,EAAU,6DAAA,EACtF,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,qBAAK,GAAA,CAAC,QAAA,EAAA,EAAkB,KAAA,EAAO,CAAA,CAAE,EAAA,EAAK,QAAA,EAAA,CAAA,CAAE,KAAA,EAAA,EAAtB,CAAA,CAAE,EAA0B,CAAS,CAAA,EACpE,CAAA;AAAA,4BACC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,uBAAA,CAAwB,MAAM,GAAQ,SAAA,EAAW,QAAA,CAAS,QAAQ,CAAA,EAAQ,OAAM,MAAA,EAAO,QAAA,kBAAA,GAAA,CAAC,UAAK,SAAA,EAAU,WAAA,EAAY,eAAC,CAAA,EAAO,CAAA;AAAA,4BACjJ,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,uBAAA,CAAwB,QAAQ,GAAM,SAAA,EAAW,QAAA,CAAS,UAAU,CAAA,EAAM,OAAM,QAAA,EAAS,QAAA,kBAAA,GAAA,CAAC,UAAK,SAAA,EAAU,QAAA,EAAS,eAAC,CAAA,EAAO,CAAA;AAAA,4BAChJ,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,uBAAA,CAAwB,WAAW,GAAG,SAAA,EAAW,QAAA,CAAS,aAAa,CAAA,EAAG,OAAM,WAAA,EAAY,QAAA,kBAAA,GAAA,CAAC,UAAK,SAAA,EAAU,WAAA,EAAY,eAAC,CAAA,EAAO,CAAA;AAAA,wBACvJ,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAK,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,0BACV,GAAA,CAAC,WAAM,IAAA,EAAK,OAAA,EAAQ,KAAK,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,UAAU,QAAA,EAAU,CAAC,CAAA,KAAM,mBAAA,CAAoB,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAC,CAAA,EAAG,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,0BAC/J,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA+B,QAAA,EAAA,QAAA,EAAS;AAAA,SAAA,EAC1D;AAAA,OAAA,EACF,CAAA;AAAA,sBAGF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,sBAG3C,GAAA,CAAC,YAAO,OAAA,EAAS,MAAM,QAAQ,CAAA,CAAA,KAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,KAAA,CAAA,CAAO,IAAI,SAAA,IAAa,GAAG,IAAI,GAAG,CAAC,GAAG,SAAA,EAAU,mDAAA,EAAoD,KAAA,EAAM,UAAA,EAAW,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBAClL,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,QAAE;AAAA,OAAA,EAAC,CAAA;AAAA,sBACvF,GAAA,CAAC,YAAO,OAAA,EAAS,MAAM,QAAQ,CAAA,CAAA,KAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,KAAA,CAAA,CAAO,IAAI,SAAA,IAAa,GAAG,IAAI,GAAG,CAAC,GAAG,SAAA,EAAU,mDAAA,EAAoD,KAAA,EAAM,SAAA,EAAU,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACjL,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAA,EAAU,mDAAA,EAAoD,KAAA,EAAM,aAAA,EAAc,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,sBAExH,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,sBAE3C,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,YAAY,MAAA,KAAW,CAAA,EAAG,SAAA,EAAU,uEAAA,EAAwE,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,sBAErJ,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,QAAA,WAAA,oBACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,SAAA,EAAW,SAAA,EAAU,8DAA6D,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,8BAC5G,QAAA,EAAA,EAAO,OAAA,EAAS,UAAA,EAAY,SAAA,EAAU,qDAAoD,QAAA,EAAA,QAAA,EAAM;AAAA,SAAA,EACnG,CAAA;AAAA,QAED,OAAA,IAAW,CAAC,WAAA,oBACX,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAA,QAAA,wBACE,QAAA,EAAA,EAAO,OAAA,EAAS,QAAA,EAAU,SAAA,EAAU,yEAAwE,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BAErH,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAS,YAAY;AACnB,gBAAA,MAAM,GAAA,GAAM,MAAM,iBAAA,EAAkB;AACpC,gBAAA,IAAI,CAAC,GAAA,EAAK;AAAE,kBAAA,aAAA,CAAM,MAAM,kBAAkB,CAAA;AAAG,kBAAA;AAAA,gBAAQ;AACrD,gBAAA,GAAA,CAAI,OAAO,CAAA,IAAA,KAAQ;AACjB,kBAAA,IAAI,CAAC,IAAA,EAAM;AAAE,oBAAA,aAAA,CAAM,MAAM,kBAAkB,CAAA;AAAG,oBAAA;AAAA,kBAAQ;AACtD,kBAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,gBACd,GAAG,WAAW,CAAA;AAAA,cAChB,CAAA;AAAA,cACA,SAAA,EAAU,gFAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA;AAAA,wBAGC,KAAA,EAAA,EAAI,GAAA,EAAK,SAAS,SAAA,EAAU,gFAAA,EAC1B,yBAAe,SAAA,oBACd,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,8DAAA;AAAA,QACV,OAAO,EAAE,KAAA,EAAO,YAAY,CAAA,EAAG,MAAA,EAAQ,YAAY,CAAA,EAAE;AAAA,QAErD,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,CAAA,EAAG,OAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,SAAQ,EAAG,CAAA;AAAA,0BACpH,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,MAAA;AAAA,cACL,SAAS,CAAA,IAAA,EAAO,SAAA,CAAU,CAAC,CAAA,CAAA,EAAI,UAAU,CAAC,CAAA,CAAA;AAAA,cAC1C,mBAAA,EAAoB,MAAA;AAAA,cACpB,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,UAAA;AAAA,gBAAY,KAAA,EAAO,CAAA;AAAA,gBAAG,KAAA,EAAO,MAAA;AAAA,gBAAQ,MAAA,EAAQ,MAAA;AAAA,gBACvD,WAAA,EAAa,MAAA;AAAA,gBACb,QAAQ,IAAA,KAAS,QAAA,GAAW,SAAA,GAAY,IAAA,KAAS,SAAS,MAAA,GAAS;AAAA,eACrE;AAAA,cACA,aAAA,EAAe,oBAAA;AAAA,cAEd,QAAA,EAAA;AAAA,gBAAA,WAAA,CAAY,IAAI,CAAA,CAAA,qBACf,GAAA;AAAA,kBAAC,cAAA;AAAA,kBAAA;AAAA,oBAEC,IAAA,EAAM,CAAA;AAAA,oBACN,QAAA,EAAU,eAAe,CAAA,CAAE,EAAA;AAAA,oBAC3B,IAAA;AAAA,oBACA,aAAA,EAAe,CAAC,CAAA,KAAM,qBAAA,CAAsB,GAAG,CAAC,CAAA;AAAA,oBAChD,aAAA,EAAe,MAAM,qBAAA,CAAsB,CAAC,CAAA;AAAA,oBAC5C,qBAAqB,CAAC,CAAA,EAAG,WAAW,uBAAA,CAAwB,CAAA,EAAG,GAAG,MAAM;AAAA,mBAAA;AAAA,kBANnE,CAAA,CAAE;AAAA,iBAQV,CAAA;AAAA,gBACA,OAAA,oBAAW,GAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,EAAA,EAAI,WAAA,EAAY,EAAiB,OAAA,EAAO,IAAA,EAAC,CAAA;AAAA,gBACxF,WAAA,oBAAe,GAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,aAAa,SAAA,EAAsB;AAAA;AAAA;AAAA,WACxE;AAAA,UAEC,WAAA,oBACC,GAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,WAAA;AAAA,cACA,KAAA;AAAA,cACA,IAAA,EAAM,QAAA;AAAA,cACN,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,QAAQ,CAAA,EAAG,GAAA,IAAO,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA;AAAA,cAC1D,IAAA,EAAM,QAAA;AAAA,cACN,MAAA,EAAQ,UAAA;AAAA,cACR,SAAA,EAAW,aAAA;AAAA,cACX,KAAA;AAAA,cACA,QAAA,EAAU,CAAC,KAAA,KAAU,cAAA,CAAe,EAAE,GAAG,WAAA,EAAa,OAAO,CAAA;AAAA,cAC7D,QAAA,EAAU,UAAA;AAAA,cACV,QAAA,EAAU,MAAM,cAAA,CAAe,IAAI;AAAA;AAAA;AACrC;AAAA;AAAA,KAEJ,EAEJ,CAAA;AAAA,wBAGC,KAAA,EAAA,EAAI,SAAA,EAAU,oFACZ,QAAA,EAAA,IAAA,KAAS,QAAA,GACL,aAAa,+FAAA,GAAkG,mDAAA,GAChH,IAAA,KAAS,MAAA,GACP,gCACA,IAAA,KAAS,MAAA,GACP,6CACA,IAAA,KAAS,MAAA,GACP,2BACA,4BAAA,EACZ;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC,CAAA;AAED,IAAO,sBAAA,GAAQ;AAcf,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA,EAAG,aAAA,EAAe,aAAA,EAAe,mBAAA,EAAoB,EAAkB;AAC/H,EAAA,MAAM,GAAA,GAAM,YAAY,IAAI,CAAA;AAC5B,EAAA,MAAM,WAAA,GAAmB,aAAA,GACrB,EAAE,aAAA,EAAe,aAAA,EAAe,KAAA,EAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,EAAO,EAAE,GACjE,EAAC;AACL,EAAA,MAAM,IAAA,GAAY,aAAA,GAAgB,EAAE,aAAA,KAAkB,EAAC;AAEvD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,IAAA,mBACE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAG,IAAA,CAAK,CAAA;AAAA,QAAG,GAAG,IAAA,CAAK,CAAA;AAAA,QAAG,OAAO,IAAA,CAAK,CAAA;AAAA,QAAG,QAAQ,IAAA,CAAK,CAAA;AAAA,QAClD,IAAI,IAAA,CAAK,MAAA;AAAA,QAAQ,IAAI,IAAA,CAAK,MAAA;AAAA,QAC1B,IAAA,EAAK,MAAA;AAAA,QAAO,QAAQ,IAAA,CAAK,KAAA;AAAA,QAAO,aAAa,IAAA,CAAK,MAAA;AAAA,QAClD,aAAA,EAAc,OAAA;AAAA,QAAQ,cAAA,EAAe,OAAA;AAAA,QACpC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,IAAA,IAAA,mBACE,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAA;AAAA,QAAG,EAAA,EAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAA;AAAA,QAC/C,EAAA,EAAI,KAAK,CAAA,GAAI,CAAA;AAAA,QAAG,EAAA,EAAI,KAAK,CAAA,GAAI,CAAA;AAAA,QAC7B,IAAA,EAAK,MAAA;AAAA,QAAO,QAAQ,IAAA,CAAK,KAAA;AAAA,QAAO,aAAa,IAAA,CAAK,MAAA;AAAA,QACjD,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,IAAA,IAAA,mBAAO,GAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAY,WAAA,EAA0B,CAAA;AAAA,EAC3D,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC/B,IAAA,IAAA,mBACE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AAAA,QAC3B,IAAA,EAAK,MAAA;AAAA,QAAO,QAAQ,IAAA,CAAK,KAAA;AAAA,QAAO,aAAa,IAAA,CAAK,MAAA;AAAA,QAClD,aAAA,EAAc,OAAA;AAAA,QAAQ,cAAA,EAAe,OAAA;AAAA,QACpC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,IAAA,IAAA,mBACE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAG,IAAA,CAAK,CAAA;AAAA,QAAG,GAAG,IAAA,CAAK,CAAA;AAAA,QAAG,OAAO,IAAA,CAAK,CAAA;AAAA,QAAG,QAAQ,IAAA,CAAK,CAAA;AAAA,QAClD,IAAA,EAAK,mBAAA;AAAA,QACL,MAAA,EAAQ,WAAW,SAAA,GAAY,MAAA;AAAA,QAC/B,WAAA,EAAa,WAAW,CAAA,GAAI,CAAA;AAAA,QAC5B,eAAA,EAAiB,WAAW,KAAA,GAAQ,MAAA;AAAA,QACnC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ,CAAA,MAAO;AAEL,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,IAAI,CAAA,EAAG,GAAA,IAAO,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA;AAClE,IAAA,IAAA,mBACE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAG,IAAA,CAAK,CAAA;AAAA,QAAG,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,IAAA;AAAA,QAC5B,MAAM,IAAA,CAAK,KAAA;AAAA,QACX,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,UAAA,EAAY,IAAA,CAAK,IAAA,GAAO,GAAA,GAAM,GAAA;AAAA,QAC9B,SAAA,EAAW,IAAA,CAAK,MAAA,GAAS,QAAA,GAAW,QAAA;AAAA,QACpC,cAAA,EAAgB,IAAA,CAAK,SAAA,GAAY,WAAA,GAAc,MAAA;AAAA,QAC/C,UAAA,EAAY,IAAA;AAAA,QACZ,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAO;AAAA,QAC3B,GAAG,WAAA;AAAA,QACH,GAAG,IAAA;AAAA,QAEH,QAAA,EAAA,IAAA,CAAK,KAAK,KAAA,CAAM,IAAI,EAAE,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAChC,GAAA,CAAC,OAAA,EAAA,EAAc,GAAG,IAAA,CAAK,CAAA,EAAG,EAAA,EAAI,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,KAAK,IAAA,GAAO,GAAA,EAAM,QAAA,EAAA,IAAA,EAAA,EAAlD,CAAuD,CACpE;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,4BACG,GAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,IAAA;AAAA,IACA,QAAA,IAAY,CAAC,OAAA,oBACZ,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAY,WAAA;AAAA,UACZ,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA;AAAA,UAAG,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA;AAAA,UACzB,KAAA,EAAO,IAAI,CAAA,GAAI,CAAA;AAAA,UAAG,MAAA,EAAQ,IAAI,CAAA,GAAI,CAAA;AAAA,UAClC,IAAA,EAAK,MAAA;AAAA,UAAO,MAAA,EAAO,SAAA;AAAA,UAAU,aAAa,CAAA,GAAI,IAAA;AAAA,UAC9C,iBAAiB,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAAA,UACxC,aAAA,EAAc;AAAA;AAAA,OAChB;AAAA,MACC,mBAAA,oBAAuB,GAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAY,MAAY,mBAAA,EAA0C;AAAA,KAAA,EAC3G;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM;AACd,CAAA,EAIG;AACD,EAAA,MAAM,IAAI,CAAA,GAAI,IAAA;AACd,EAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,EAAA,MAAM,WAAA,GAAc,CAAC,MAAA,MAAoB;AAAA,IACvC,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA,IACR,WAAA,EAAa,EAAA;AAAA,IACb,aAAA,EAAe,KAAA;AAAA,IACf,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,IAChB,aAAA,EAAe;AAAA,GACjB,CAAA;AAEA,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,IAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,YAAO,EAAA,EAAI,IAAA,CAAK,IAAI,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,EAAO,GAAG,WAAA,CAAY,MAAM,GAAG,aAAA,EAAe,CAAC,MAAM,mBAAA,CAAoB,CAAA,EAAG,OAAO,CAAA,EAAG,CAAA;AAAA,0BACvH,QAAA,EAAA,EAAO,EAAA,EAAI,KAAK,EAAA,EAAI,EAAA,EAAI,KAAK,EAAA,EAAI,CAAA,EAAO,GAAG,WAAA,CAAY,MAAM,GAAG,aAAA,EAAe,CAAC,MAAM,mBAAA,CAAoB,CAAA,EAAG,KAAK,CAAA,EAAG;AAAA,KAAA,EACxH,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,SAAS,MAAA,EAAQ;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,CAAA;AACnD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,YAAO,EAAA,EAAI,CAAA,EAAO,EAAA,EAAI,CAAA,EAAO,GAAO,GAAG,WAAA,CAAY,aAAa,CAAA,EAAG,eAAe,CAAC,CAAA,KAAM,mBAAA,CAAoB,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA;AAAA,wBACvH,QAAA,EAAA,EAAO,EAAA,EAAI,IAAI,CAAA,EAAG,EAAA,EAAI,GAAO,CAAA,EAAO,GAAG,WAAA,CAAY,aAAa,GAAG,aAAA,EAAe,CAAC,MAAM,mBAAA,CAAoB,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA;AAAA,wBACvH,QAAA,EAAA,EAAO,EAAA,EAAI,IAAI,CAAA,EAAG,EAAA,EAAI,IAAI,CAAA,EAAG,CAAA,EAAO,GAAG,WAAA,CAAY,aAAa,GAAG,aAAA,EAAe,CAAC,MAAM,mBAAA,CAAoB,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA;AAAA,wBACvH,QAAA,EAAA,EAAO,EAAA,EAAI,GAAO,EAAA,EAAI,CAAA,GAAI,GAAG,CAAA,EAAO,GAAG,WAAA,CAAY,aAAa,GAAG,aAAA,EAAe,CAAC,MAAM,mBAAA,CAAoB,CAAA,EAAG,IAAI,CAAA,EAAG;AAAA,GAAA,EAC1H,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,WAAA,EAAY,EAA0C;AAChF,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,SAAS,CAAC,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,EAAI,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,EAAE,CAAA;AAC7D,EAAA,MAAM,EAAA,GAAK,KAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACvC,EAAA,MAAM,EAAA,GAAK,KAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACvC,EAAA,MAAM,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,KAAK,EAAE,CAAA,EAAA,EAAK,IAAA,CAAK,EAAA,GAAK,UAAU,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA,CAAA,EAAI,KAAK,EAAA,GAAK,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,EAAA,GAAK,UAAU,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,IAAI,IAAA,CAAK,EAAA,GAAK,UAAU,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA,EAAA,CAAA;AACrL,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAG,GAAG,WAAA,EACL,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,IAAI,IAAA,CAAK,EAAA;AAAA,QAAI,IAAI,IAAA,CAAK,EAAA;AAAA,QAAI,IAAI,IAAA,CAAK,EAAA;AAAA,QAAI,IAAI,IAAA,CAAK,EAAA;AAAA,QAChD,QAAQ,IAAA,CAAK,KAAA;AAAA,QAAO,aAAa,IAAA,CAAK,MAAA;AAAA,QAAQ,aAAA,EAAc;AAAA;AAAA,KAC9D;AAAA,wBACC,MAAA,EAAA,EAAK,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,KAAK,KAAA,EAAO;AAAA,GAAA,EACnC,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,SAAA,EAAU,EAAkG;AACvI,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAE,aAAA,EAAc,MAAA,EACf,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,CAAA,MAAA,EAAS,SAAA,CAAU,CAAC,CAAA,EAAA,EAAK,UAAU,CAAC,CAAA,OAAA,EAAU,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,CAAC,CAAA,EAAA,CAAA;AAAA,QACpH,IAAA,EAAK,kBAAA;AAAA,QACL,QAAA,EAAS;AAAA;AAAA,KACX;AAAA,oBACA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAG,IAAA,CAAK,CAAA;AAAA,QAAG,GAAG,IAAA,CAAK,CAAA;AAAA,QAAG,OAAO,IAAA,CAAK,CAAA;AAAA,QAAG,QAAQ,IAAA,CAAK,CAAA;AAAA,QAClD,IAAA,EAAK,MAAA;AAAA,QAAO,MAAA,EAAO,MAAA;AAAA,QAAO,WAAA,EAAa,CAAA;AAAA,QAAG,eAAA,EAAgB;AAAA;AAAA;AAC5D,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,iBAAA,CAAkB;AAAA,EACzB,WAAA;AAAA,EAAa,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU;AACtF,CAAA,EAYG;AACD,EAAA,MAAM,GAAA,GAAM,OAA4B,IAAI,CAAA;AAC5C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,EAAA,GAAK,sBAAsB,MAAM;AACrC,MAAA,GAAA,CAAI,SAAS,KAAA,EAAM;AACnB,MAAA,GAAA,CAAI,SAAS,MAAA,IAAS;AAAA,IACxB,CAAC,CAAA;AACD,IAAA,OAAO,MAAM,qBAAqB,EAAE,CAAA;AAAA,EACtC,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,IAAA,EAAM,CAAA,EAAG,WAAA,CAAY,CAAA,GAAI,KAAK,CAAA,EAAA,CAAA;AAAA,QAC9B,GAAA,EAAK,CAAA,EAAG,WAAA,CAAY,CAAA,GAAI,KAAK,CAAA,EAAA,CAAA;AAAA,QAC7B,SAAA,EAAW,kBAAA;AAAA,QACX,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,MAExC,QAAA,kBAAA,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,OAAO,WAAA,CAAY,KAAA;AAAA,UACnB,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,MAAA,EAAQ,QAAA;AAAA,UACR,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,YAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AAAE,cAAA,CAAA,CAAE,cAAA,EAAe;AAAG,cAAA,QAAA,EAAS;AAAA,YAAG,WACjD,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AAAE,cAAA,CAAA,CAAE,cAAA,EAAe;AAAG,cAAA,QAAA,EAAS;AAAA,YAAG;AAAA,UAC/E,CAAA;AAAA,UACA,WAAA,EAAY,uBAAA;AAAA,UACZ,IAAA,EAAM,CAAA;AAAA,UACN,SAAA,EAAU,2FAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,KAAA;AAAA,YACA,QAAA,EAAU,CAAA,EAAG,IAAA,GAAO,KAAK,CAAA,EAAA,CAAA;AAAA,YACzB,UAAA,EAAY,IAAA;AAAA,YACZ,UAAA,EAAY,OAAO,GAAA,GAAM,GAAA;AAAA,YACzB,SAAA,EAAW,SAAS,QAAA,GAAW,QAAA;AAAA,YAC/B,cAAA,EAAgB,YAAY,WAAA,GAAc,MAAA;AAAA,YAC1C,QAAA,EAAU;AAAA;AACZ;AAAA;AACF;AAAA,GACF;AAEJ;AAIA,SAAS,UACP,IAAA,EACA,KAAA,EACA,GAAA,EACA,KAAA,EACA,QACA,UAAA,EACmB;AACnB,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,MAAM,CAAA,GAAI,aAAA,CAAc,KAAA,EAAO,GAAG,CAAA;AAClC,IAAA,OAAO,EAAE,IAAI,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,QAAQ,UAAA,EAAW;AAAA,EACnG;AACA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,CAAA,GAAI,aAAA,CAAc,KAAA,EAAO,GAAG,CAAA;AAClC,IAAA,OAAO,EAAE,EAAA,EAAI,EAAA,EAAI,MAAM,QAAA,EAAU,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,OAAO,MAAA,EAAO;AAAA,EACjF;AACA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,OAAO,EAAE,EAAA,EAAI,EAAA,EAAI,MAAM,OAAA,EAAS,EAAA,EAAI,MAAM,CAAA,EAAG,EAAA,EAAI,KAAA,CAAM,CAAA,EAAG,IAAI,GAAA,CAAI,CAAA,EAAG,IAAI,GAAA,CAAI,CAAA,EAAG,OAAO,MAAA,EAAO;AAAA,EAChG;AACA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,CAAA,GAAI,aAAA,CAAc,KAAA,EAAO,GAAG,CAAA;AAClC,IAAA,OAAO,EAAE,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,QAAA,EAAU,GAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AAAA,EAClE;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAU,CAAA,EAAwB;AACzC,EAAA,IAAI,EAAE,IAAA,KAAS,OAAA,SAAgB,IAAA,CAAK,GAAA,CAAI,EAAE,EAAA,GAAK,CAAA,CAAE,EAAE,CAAA,GAAI,KAAK,IAAA,CAAK,GAAA,CAAI,EAAE,EAAA,GAAK,CAAA,CAAE,EAAE,CAAA,GAAI,CAAA;AACpF,EAAA,IAAI,EAAE,IAAA,KAAS,MAAA,EAAS,OAAO,CAAA,CAAE,OAAO,MAAA,GAAS,CAAA;AACjD,EAAA,IAAI,GAAA,IAAO,KAAK,GAAA,IAAO,CAAA,SAAU,CAAA,CAAE,CAAA,GAAI,CAAA,IAAK,CAAA,CAAE,CAAA,GAAI,CAAA;AAClD,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAA,CAAU,CAAA,EAAe,EAAA,EAAY,EAAA,EAAwB;AACpE,EAAA,IAAI,CAAA,CAAE,SAAS,OAAA,EAAS,OAAO,EAAE,GAAG,CAAA,EAAG,EAAA,EAAI,CAAA,CAAE,EAAA,GAAK,EAAA,EAAI,IAAI,CAAA,CAAE,EAAA,GAAK,IAAI,EAAA,EAAI,CAAA,CAAE,KAAK,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,EAAA,GAAK,EAAA,EAAG;AAClG,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAS,OAAO,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,QAAM,EAAE,CAAA,EAAG,EAAE,CAAA,GAAI,EAAA,EAAI,GAAG,CAAA,CAAE,CAAA,GAAI,EAAA,EAAG,CAAE,CAAA,EAAE;AACjG,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAS,OAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,IAAI,EAAA,EAAG;AAChE,EAAA,OAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,IAAI,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,EAAG;AAC1C;AAEA,SAAS,MAAA,CACP,QAAA,EACA,MAAA,EACA,CAAA,EACY;AACZ,EAAA,IAAI,QAAA,CAAS,SAAS,OAAA,EAAS;AAC7B,IAAA,IAAI,MAAA,KAAW,OAAA,EAAS,OAAO,EAAE,GAAG,QAAA,EAAU,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,CAAA,CAAE,CAAA,EAAE;AAC/D,IAAA,IAAI,MAAA,KAAW,KAAA,EAAS,OAAO,EAAE,GAAG,QAAA,EAAU,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,CAAA,CAAE,CAAA,EAAE;AAC/D,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAI,SAAS,IAAA,KAAS,MAAA,IAAU,QAAA,CAAS,IAAA,KAAS,QAAQ,OAAO,QAAA;AACjE,EAAA,MAAM,OAAS,QAAA,CAAS,CAAA;AACxB,EAAA,MAAM,KAAA,GAAS,QAAA,CAAS,CAAA,GAAI,QAAA,CAAS,CAAA;AACrC,EAAA,MAAM,MAAS,QAAA,CAAS,CAAA;AACxB,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,CAAA,GAAI,QAAA,CAAS,CAAA;AACrC,EAAA,IAAI,KAAK,IAAA,EAAM,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,OAAO,EAAA,GAAK,MAAA;AAC1C,EAAA,IAAI,WAAW,IAAA,EAAM;AAAE,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,EAAG;AAC3C,EAAA,IAAI,WAAW,IAAA,EAAM;AAAE,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,EAAG;AAC3C,EAAA,IAAI,WAAW,IAAA,EAAM;AAAE,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,EAAG;AAC3C,EAAA,IAAI,WAAW,IAAA,EAAM;AAAE,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,EAAG;AAC3C,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG,EAAG,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA;AAC1D,EAAA,OAAO,EAAE,GAAG,QAAA,EAAU,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AACvD;AAEA,SAAS,YAAY,CAAA,EAA+D;AAClF,EAAA,IAAI,CAAA,CAAE,SAAS,OAAA,EAAS;AACtB,IAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAC7B,IAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAC7B,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,IAAA,CAAK,GAAA,CAAI,EAAE,EAAA,GAAK,CAAA,CAAE,EAAE,CAAA,EAAG,GAAG,IAAA,CAAK,GAAA,CAAI,EAAE,EAAA,GAAK,CAAA,CAAE,EAAE,CAAA,EAAE;AAAA,EACpE;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,IAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAC3D,IAAA,IAAI,IAAA,GAAO,EAAE,MAAA,CAAO,CAAC,EAAE,CAAA,EAAG,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,GAAG,IAAA,GAAO,CAAA,CAAE,OAAO,CAAC,CAAA,CAAE,GAAG,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,CAAA;AACzF,IAAA,KAAA,MAAW,CAAA,IAAK,EAAE,MAAA,EAAQ;AACxB,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AAAG,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACrD,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AAAG,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AAAA,IACvD;AACA,IAAA,OAAO,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAG,IAAA,GAAO,IAAA,EAAM,CAAA,EAAG,IAAA,GAAO,IAAA,EAAK;AAAA,EAC5D;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC/B,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAA;AAC/D,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,OAAA,GAAU,CAAA,CAAE,OAAO,IAAA,EAAM,CAAA,EAAG,MAAM,MAAA,GAAS,CAAA,CAAE,OAAO,GAAA,EAAI;AAAA,EACtF;AACA,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAE;AAC1C;AAEA,SAAS,aAAA,CAAc,GAA6B,CAAA,EAA6B;AAC/E,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC3B,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC3B,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAC5B,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAC5B,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AACtB;AAEA,SAAS,YAAA,CAAa,CAAA,EAAe,CAAA,EAAW,CAAA,EAAoB;AAClE,EAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,EAAA,OAAO,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,KAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA,IAAK,EAAA,CAAG,CAAA,GAAI,CAAA,IAAK,GAAG,CAAA,GAAI,CAAA;AAClE;AAEA,SAAS,aAAa,MAAA,EAA4C;AAChE,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAChC,EAAA,IAAI,CAAA,GAAI,CAAA,EAAA,EAAK,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA;AACvC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,IAAK,CAAA,GAAA,EAAM,MAAA,CAAO,CAAC,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,CAAC,EAAE,CAAC,CAAA,CAAA;AAC7E,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,WAAA,CACP,KACA,IAAA,EACA;AACA,EAAA,MAAM,CAAA,GAAI,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AACxC,EAAA,MAAM,CAAA,GAAI,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AACxC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AAC3D,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AAC5D,EAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG;AACpB,EAAA,MAAM,OAAO,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,YAAA;AACd,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,MAAM,KAAA,EAAO;AACpC,IAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,MAAM,KAAA,EAAO;AACpC,MAAA,IAAI,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA;AACpC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAI,EAAE,CAAA;AACrC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAI,EAAE,CAAA;AACrC,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,MAAA,EAAQ,EAAA,EAAA,EAAM;AAClC,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,MAAA,EAAQ,EAAA,EAAA,EAAM;AAClC,UAAA,MAAM,CAAA,GAAA,CAAA,CAAM,EAAA,GAAK,EAAA,IAAM,CAAA,IAAK,KAAK,EAAA,CAAA,IAAO,CAAA;AACxC,UAAA,CAAA,IAAK,IAAA,CAAK,KAAK,CAAC,CAAA;AAAG,UAAA,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AAAG,UAAA,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AAAG,UAAA,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACrF,UAAA,CAAA,EAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAAG,MAAA,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAAG,MAAA,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAAG,MAAA,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AACzF,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,MAAA,EAAQ,EAAA,EAAA,EAAM;AAClC,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,MAAA,EAAQ,EAAA,EAAA,EAAM;AAClC,UAAA,MAAM,CAAA,GAAA,CAAA,CAAM,EAAA,GAAK,EAAA,IAAM,CAAA,IAAK,KAAK,EAAA,CAAA,IAAO,CAAA;AACxC,UAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AAAG,UAAA,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AAAG,UAAA,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AAAG,UAAA,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AAAA,QACnF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAC7B;AC9jCA,IAAM,kBAAA,GAAqB,cAAkC,IAAI,CAAA;AACjE,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAAkC;AACjE,EAAA,MAAM,IAAA,GAAO,WAAW,kBAAkB,CAAA;AAC1C,EAAA,OAAO,IAAA,GAAO,YAAA,CAAa,QAAA,EAAU,IAAI,CAAA,GAAI,IAAA;AAC/C;AASA,IAAI,sBAAA,GAAyB,KAAA;AAC7B,SAAS,6BAAA,GAAgC;AACvC,EAAA,IAAI,sBAAA,EAAwB;AAC5B,EAAA,IAAI,OAAO,sBAAsB,WAAA,EAAa;AAC9C,EAAA,sBAAA,GAAyB,IAAA;AACzB,EAAA,MAAM,IAAA,GAAO,kBAAkB,SAAA,CAAU,UAAA;AACzC,EAAA,iBAAA,CAAkB,SAAA,CAAU,UAAA,GAAa,SAAS,iBAAA,CAEhD,MACA,KAAA,EACA;AACA,IAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,QAAA,IAAY,SAAS,oBAAA,EAAsB;AAE1E,MAAA,KAAA,GAAQ,EAAE,GAAI,KAAA,IAAS,EAAC,EAAI,SAAS,IAAA,EAAK;AAAA,IAC5C;AACA,IAAA,OAAQ,IAAA,CAAa,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,OAAA,CAAQ,KAAK,mEAAmE,CAAA;AAClF;AAEA,IAAM,iBAAA,GAAoB,EAAA;AAC1B,SAAS,iBAAiB,CAAA,EAAW;AACnC,EAAA,OAAO,CAAA,CAAE,MAAA,GAAS,iBAAA,GAAoB,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,iBAAA,GAAoB,CAAC,CAAC,CAAA,MAAA,CAAA,GAAM,CAAA;AAClF;AAMA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAU,6BAAoB,SAAA,EAAW;AAC5E,EAAS,QAAA,CAAA,mBAAA,CAAoB,SAAA,GAC3B,CAAA,6BAAA,EAAyC,QAAA,CAAA,OAAO,CAAA,yBAAA,CAAA;AACpD;AAyBA,IAAM,UAAA,GAAa,mCAAA;AAgBnB,IAAI,OAAA,GAA+B,IAAA;AACnC,IAAI,SAAA,GAAY,CAAA;AAKT,SAAS,cAAc,IAAA,EAAwC;AACpE,EAAA,MAAM,QAAQ,EAAE,SAAA;AAChB,EAAA,OAAA,GAAU,EAAE,OAAO,IAAA,EAAK;AACxB,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,EAAsB;AAC3B,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,MAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,UAAA,EAAY,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,IACrF;AAAA,GACF;AACF;AAEe,SAAR,OAAA,GAA2B;AAQhC,EAAA,MAAM,WAAA,GAAcC,OAAwC,MAAS,CAAA;AACrE,EAAA,IAAI,WAAA,CAAY,YAAY,MAAA,EAAW;AACrC,IAAA,WAAA,CAAY,OAAA,GAAU,OAAA;AAAA,EACxB;AACA,EAAAC,UAAU,MAAM;AAId,IAAA,IAAI,WAAA,CAAY,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,YAAY,OAAA,EAAS;AACnE,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,CAAC,MAAM,OAAO,CAAA,GAAIC,SAAgC,WAAA,CAAY,OAAA,EAAS,QAAQ,IAAI,CAAA;AAGzF,EAAAD,UAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,YAAY,OAAA,EAAS,KAAA;AACrC,IAAA,IAAI,WAAW,IAAA,EAAM;AACrB,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAa;AAC5B,MAAA,MAAM,SAAU,CAAA,CAAgC,MAAA;AAChD,MAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,KAAA,KAAU,OAAA,EAAS;AACzC,MAAA,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACd,QAAA,IAAI,IAAA,EAAM,GAAA,IAAO,IAAA,CAAK,GAAA,KAAQ,MAAA,CAAO,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AAC7E,UAAA,GAAA,CAAI,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,QAC9B;AACA,QAAA,OAAO,MAAA,CAAO,IAAA;AAAA,MAChB,CAAC,CAAA;AAAA,IACH,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,OAAO,CAAA;AAC3C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,UAAA,EAAY,OAAO,CAAA;AAAA,EAC7D,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,SAAAA,CAAU,MAAM,MAAM;AACpB,IAAA,IAAI,IAAA,EAAM,KAAK,UAAA,CAAW,OAAO,GAAG,GAAA,CAAI,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,EAElE,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAY,IAAA,EAAM,QAAA,GAAW,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA,GAAI,UAAA;AAErE,EAAA,MAAM,OAAA,GAAUD,OAAyB,IAAI,CAAA;AAC7C,EAAA,MAAM,OAAA,GAAUA,OAAuB,IAAI,CAAA;AAG3C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIE,SAAgC,IAAI,CAAA;AAC9E,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAIlD,EAAA,MAAM,YAAA,GAAeF,OAAO,CAAC,CAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAM;AAChD,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,YAAA,CAAa,OAAA,GAAU,CAAA;AACvB,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA;AAKA,EAAA,MAAM,cAAA,GAAiB,CAAC,EAAA,KAAoB;AAC1C,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,iBAAiB,CAAA;AAC5C,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO,gBAAA,EAAiB,KAAM,OAAA,CAAQ,OAAA,CAAQ,OAAA;AAAA,EAChD,CAAA;AAIA,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,eAAA,GAAkB,MAAM,SAAA,EAAU;AACxC,IAAA,MAAM,YAAA,GAAe,MAAM,SAAA,EAAU;AACrC,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,SAAA,EAAU;AAAA,IACpC,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,eAAe,CAAA;AAClD,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,YAAY,CAAA;AAC5C,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,eAAe,CAAA;AACrD,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,YAAY,CAAA;AAC/C,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAC7C,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAe;AACjC,IAAA,MAAM,GAAA,GAAA,CAAO,KAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA,EAAI,WAAA,EAAY;AAC3D,IAAA,MAAM,OACJ,GAAA,KAAQ,KAAA,GAAQ,KAAA,GACd,GAAA,KAAQ,QAAQ,KAAA,GAChB,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,GAAI,UAC5E,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,OAAO,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA,EAAO,KAAK,EAAE,QAAA,CAAS,GAAG,IAAI,IAAA,GACjG,MAAA;AACJ,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAI,GAAA,KAAQ,KAAA,EAAO,aAAA,CAAM,KAAA,CAAM,qEAAqE,CAAA;AAAA,WAC/F,aAAA,CAAM,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAA,IAAO,SAAS,CAAA,CAAE,CAAA;AAC9D,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AAIpC,IAAA,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACd,MAAA,IAAI,MAAM,GAAA,EAAK,UAAA,CAAW,OAAO,CAAA,IAAK,IAAA,CAAK,QAAQ,GAAA,EAAK;AACtD,QAAA,GAAA,CAAI,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,MAC9B;AACA,MAAA,OAAO,EAAE,GAAA,EAAK,QAAA,EAAU,IAAA,CAAK,MAAM,IAAA,EAAK;AAAA,IAC1C,CAAC,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAA2C;AAC7D,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC/B,IAAA,IAAI,IAAA,aAAiB,IAAI,CAAA;AACzB,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAAA,EAC/C,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAuB;AACzC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,SAAA,EAAU;AACV,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,YAAA,CAAa,KAAA,GAAQ,CAAC,CAAA;AACrC,IAAA,IAAI,IAAA,aAAiB,IAAI,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,OAAA,mBACJE,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gFAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAO,gHAAA;AAAA,QACP,QAAA,EAAU,UAAA;AAAA,QACV,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACAD,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,UAAA;AAAA,QACT,SAAA,EAAU,yHAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC9F,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,oUAAA,EAAqU,CAAA,EAC5X,CAAA;AAAA,UAAM;AAAA;AAAA;AAAA,KAER;AAAA,oBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAiC,QAAA,EAAA,kCAAA,EAAuB,CAAA;AAAA,IACvE,IAAA,EAAM,QAAA,oBACLD,IAAAA,CAAAE,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,sBAC3CA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4DAA2D,KAAA,EAAO,IAAA,CAAK,QAAA,EAAW,QAAA,EAAA,IAAA,CAAK,QAAA,EAAS;AAAA,KAAA,EAClH,CAAA;AAAA,oBAIFA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,gBAAA,EAAkB,WAAU,yCAAA,EAA0C;AAAA,GAAA,EAClF,CAAA;AAGF,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAA,mBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EAA0B,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC1G,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,8PAAA,EAA+P,CAAA,EACtT,CAAA;AAAA,sBACAD,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA;AAAA,QAAA,6BAAA;AAAA,wBAA2BC,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,UAAA,EAAY,SAAA,EAAU,iCAAgC,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,QAAS;AAAA,OAAA,EAAC,CAAA;AAAA,sBACzJD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sEAAA,EAAuE,QAAA,EAAA,mBAAA,EAAiB,CAAA;AAAA,wBACrGD,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA;AAAA,0BAAAA,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,YAAO;AAAA,WAAA,EAA6B,CAAA;AAAA,0BACtFD,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,YAAO,wCAAA;AAAA,4BAAiCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAY,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,YAAO;AAAA,WAAA,EAAU,CAAA;AAAA,0BACjJD,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,4CAAA,EAA0C,CAAA;AAAA,YAAO,8BAAA;AAAA,4BAAuBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAY,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,YAAO;AAAA,WAAA,EAAU,CAAA;AAAA,0BACnLD,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,4CAAA,EAA0C,CAAA;AAAA,YAAO;AAAA,WAAA,EAAgB;AAAA,SAAA,EACjH,CAAA;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yCAAwC,QAAA,EAAA,mEAAA,EAAiE;AAAA,OAAA,EACxH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,IAAc,CAAC,KAAK,GAAA,EAAK;AACvC,IAAA,IAAA,mBAAOA,IAAC,eAAA,EAAA,EAAgB,QAAA,EAAU,KAAK,QAAA,EAAU,OAAA,EAAS,KAAK,iBAAA,EAAmB,CAAA;AAAA,EACpF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,KAAA,EAAO;AAC9B,IAAA,IAAA,mBAAOA,GAAAA,CAAC,QAAA,EAAA,EAAwB,GAAA,EAAK,IAAA,CAAK,KAAK,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,UAAA,EAAY,KAAK,UAAA,EAAY,OAAA,EAAS,IAAA,CAAK,OAAA,EAAA,EAA7F,KAAK,GAAiG,CAAA;AAAA,EAC9H,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,IAAA,EAAM;AAC7B,IAAA,IAAA,mBAAOA,GAAAA,CAAC,SAAA,EAAA,EAAyB,GAAA,EAAK,IAAA,CAAK,KAAK,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,UAAA,EAAY,KAAK,UAAA,EAAY,OAAA,EAAS,IAAA,CAAK,OAAA,EAAA,EAA7F,KAAK,GAAiG,CAAA;AAAA,EAC/H,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,IAAA,IAAA,mBAAOA,GAAAA,CAAC,UAAA,EAAA,EAA0B,GAAA,EAAK,IAAA,CAAK,KAAK,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,UAAA,EAAY,KAAK,UAAA,EAAY,OAAA,EAAS,IAAA,CAAK,OAAA,EAAA,EAA7F,KAAK,GAAiG,CAAA;AAAA,EAChI,CAAA,MAAO;AACL,IAAA,IAAA,mBAAOA,GAAAA,CAAC,QAAA,EAAA,EAAwB,GAAA,EAAK,IAAA,CAAK,KAAK,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,UAAA,EAAY,KAAK,UAAA,EAAY,OAAA,EAAS,IAAA,CAAK,OAAA,EAAA,EAA7F,KAAK,GAAiG,CAAA;AAAA,EAC9H;AAEA,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,+BAAA;AAAA,MACV,GAAA,EAAK,OAAA;AAAA,MACL,WAAA,EAAa,CAAC,CAAA,KAAM;AAGlB,QAAA,IAAI,CAAC,CAAA,CAAE,YAAA,EAAc,KAAA,EAAO,QAAA,GAAW,OAAO,CAAA,EAAG;AAEjD,QAAA,IAAI,CAAC,cAAA,CAAe,CAAA,CAAE,aAA4B,CAAA,EAAG;AACrD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,YAAA,CAAa,OAAA,EAAA;AACb,QAAA,IAAI,CAAC,UAAA,EAAY,aAAA,CAAc,IAAI,CAAA;AAAA,MACrC,CAAA;AAAA,MACA,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,IAAI,CAAC,CAAA,CAAE,YAAA,EAAc,KAAA,EAAO,QAAA,GAAW,OAAO,CAAA,EAAG;AACjD,QAAA,IAAI,CAAC,cAAA,CAAe,CAAA,CAAE,aAA4B,CAAA,EAAG;AACrD,QAAA,CAAA,CAAE,cAAA,EAAe;AAAA,MACnB,CAAA;AAAA,MACA,aAAa,MAAM;AACjB,QAAA,IAAI,YAAA,CAAa,OAAA,GAAU,CAAA,EAAG,YAAA,CAAa,OAAA,EAAA;AAC3C,QAAA,IAAI,YAAA,CAAa,OAAA,KAAY,CAAA,EAAG,aAAA,CAAc,KAAK,CAAA;AAAA,MACrD,CAAA;AAAA,MACA,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,QAAA,IAAI,CAAC,cAAA,CAAe,CAAA,CAAE,aAA4B,CAAA,EAAG;AACnD,UAAA,SAAA,EAAU;AACV,UAAA;AAAA,QACF;AACA,QAAA,UAAA,CAAW,CAAC,CAAA;AAAA,MACd,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,CAAA,EAAG,SAAS,CAAA,UAAA,CAAA,EAAc,CAAA;AAAA,wBAC9CA,GAAAA,CAAC,QAAA,EAAA,EAAS,GAAA,EAAI,SAAA,EAAU,CAAA;AAAA,QACvB,OAAA;AAAA,wBACDA,GAAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,KAAA,EAAO,aAAA,EAClC,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAkB,gBAAK,CAAA,EACxC,CAAA;AAAA,QACC,UAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kIAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EAA4E,QAAA,EAAA,cAAA,EAE3F,CAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ;AAEA,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAU,OAAA,EAAQ,EAA2C;AACtF,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EAAuC,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,CAAA,EACvH,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,YAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,aAAA,EAAc,KAAA,EAAM,CAAA;AAAA,wBACnDA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B,eAAc,OAAA,EAAQ;AAAA,OAAA,EAC3D,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EAAiE,qBAAW,iBAAA,EAAkB,CAAA;AAAA,sBAC7GA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAA2C,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EACrE,CAAA;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAsD,KAAA,EAAO,EAAE,SAAA,EAAW,uCAAA,IAA2C,CAAA,EACtI,CAAA;AAAA,oBACAA,GAAAA,CAAC,OAAA,EAAA,EAAO,QAAA,EAAA,CAAA,qGAAA,CAAA,EAAwG;AAAA,GAAA,EAClH,CAAA;AAEJ;AASA,IAAM,YAAA,GAAe,CAAC,EAAA,EAAI,EAAA,EAAI,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAW1D,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAyDvB,SAAS,SAAS,EAAE,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,SAAQ,EAAkB;AACvE,EAAA,MAAM,SAAA,GAAYJ,OAA0B,IAAI,CAAA;AAChD,EAAA,MAAM,YAAA,GAAeA,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,YAAA,GAAeA,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIE,SAA2C,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,CAAC,CAAA;AAClC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,CAAC,CAAA;AAC9C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,CAAC,CAAA;AAIpC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,IAAI,CAAA;AAE3C,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAS,QAAA,CAAA,WAAA,CAAY,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA,GAAA,KAAO;AAC5C,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,MAAA,CAAO,GAAG,CAAA;AACV,MAAA,aAAA,CAAc,IAAI,QAAQ,CAAA;AAC1B,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AACb,MAAA,IAAI,CAAC,SAAA,EAAW;AAAE,QAAA,aAAA,CAAM,MAAM,oBAAoB,CAAA;AAAG,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAAG;AAAA,IAC1E,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAMR,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,OAAA,IAAW,CAAC,aAAa,OAAA,EAAS;AAC/C,IAAA,MAAM,MAAM,MAAM;AAChB,MAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAC3B,MAAA,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK;AAC1B,QAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,WAAA,IAAe,GAAA;AACxD,QAAA,MAAM,WAAW,CAAA,CAAE,WAAA,CAAY,EAAE,KAAA,EAAO,GAAG,CAAA;AAC3C,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAA,CAAK,UAAA,GAAa,EAAA,IAAM,QAAA,CAAS,KAAA,EAAO,GAAG,CAAA,EAAG,CAAC,CAAA;AAC1E,QAAA,QAAA,CAAS,CAAA,IAAA,KAAS,KAAK,GAAA,CAAI,IAAA,GAAO,IAAI,CAAA,GAAI,IAAA,GAAQ,OAAO,IAAK,CAAA;AAAA,MAChE,CAAC,CAAA;AAAA,IACH,CAAA;AACA,IAAA,GAAA,EAAI;AACJ,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,GAAG,CAAA;AACjC,IAAA,EAAA,CAAG,OAAA,CAAQ,aAAa,OAAO,CAAA;AAC/B,IAAA,OAAO,MAAM,GAAG,UAAA,EAAW;AAAA,EAC7B,CAAA,EAAG,CAAC,GAAA,EAAK,IAAA,EAAM,OAAO,CAAC,CAAA;AAEvB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,SAAA,CAAU,OAAA,EAAS;AAChC,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,IAAA,GAA8D,IAAA;AAClE,IAAA,IAAI,SAAA,GAAuC,IAAA;AAC3C,IAAA,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK;AAC1B,MAAA,IAAI,SAAA,IAAa,CAAC,SAAA,CAAU,OAAA,EAAS;AACrC,MAAA,MAAM,QAAA,GAAW,CAAA,CAAE,WAAA,CAAY,EAAE,OAAO,CAAA;AACxC,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,MAAA,CAAO,QAAQ,QAAA,CAAS,KAAA;AACxB,MAAA,MAAA,CAAO,SAAS,QAAA,CAAS,MAAA;AAKzB,MAAA,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA,EAAA,CAAA;AACtC,MAAA,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,EAAA,CAAA;AACxC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,MAAA,IAAA,GAAO,EAAE,MAAA,CAAO,EAAE,QAAQ,aAAA,EAAe,GAAA,EAAK,UAAU,CAAA;AACxD,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAI3B,MAAA,MAAM,SAAS,YAAA,CAAa,OAAA;AAC5B,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,eAAA,EAAgB;AACvB,QAAA,MAAA,CAAO,MAAM,WAAA,CAAY,sBAAA,EAAwB,MAAA,CAAO,QAAA,CAAS,KAAK,CAAC,CAAA;AACvE,QAAA,SAAA,GAAY,IAAa,QAAA,CAAA,SAAA,CAAU;AAAA,UACjC,iBAAA,EAAmB,EAAE,iBAAA,EAAkB;AAAA,UACvC,SAAA,EAAW,MAAA;AAAA,UACX;AAAA,SACD,CAAA;AACD,QAAA,SAAA,CAAU,MAAA,EAAO,CAAE,IAAA,CAAK,MAAM;AAC5B,UAAA,IAAI,SAAA,EAAW;AACf,UAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,UAAA,GAAA,CAAI,SAAA,GAAY,cAAA;AAChB,UAAA,MAAA,CAAO,OAAO,GAAG,CAAA;AAAA,QACnB,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACnB;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,IAAA,EAAM,MAAA,EAAO;AACb,MAAA,SAAA,EAAW,MAAA,EAAO;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,IAAA,EAAM,KAAK,CAAC,CAAA;AAIrB,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,MAAM,YAAA,CAAa,OAAA,EAAS,SAAA,CAAU,OAAO,WAAW,CAAA;AACnE,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,EAAE,CAAA;AACvC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,WAAA,EAAa,EAAE,CAAA;AAAA,EACzD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,EAAA,EAAI,QAAQ,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AAAE,MAAA,aAAA,CAAM,MAAM,uBAAuB,CAAA;AAAG,MAAA;AAAA,IAAQ;AAC1D,IAAA,MAAM,WAA8B,EAAC;AACrC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,UAAA,EAAY,CAAA,EAAA,EAAK;AACpC,MAAA,QAAA,CAAS,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAK,CAAA,CAAA,KAAK;AACrC,QAAA,MAAM,KAAK,CAAA,CAAE,WAAA,CAAY,EAAE,KAAA,EAAO,GAAG,CAAA;AACrC,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACzC,QAAA,CAAA,CAAE,QAAQ,EAAA,CAAG,KAAA;AAAO,QAAA,CAAA,CAAE,SAAS,EAAA,CAAG,MAAA;AAClC,QAAA,OAAO,EAAE,MAAA,CAAO,EAAE,QAAQ,CAAA,EAAG,aAAA,EAAe,EAAE,UAAA,CAAW,IAAI,GAAI,QAAA,EAAU,EAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,KAAK,MAAM,CAAA,CAAE,WAAW,CAAA;AAAA,MACnH,CAAC,CAAC,CAAA;AAAA,IACJ;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAA,MAAA,KAAU;AACnC,MAAA,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,CAAA,mBAAA,EAAsB,QAAQ,CAAA,uGAAA,CAAyG,CAAA;AAC1J,MAAA,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,UAAA,EAAa,GAAG,CAAA,GAAA,CAAK,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AACpE,MAAA,GAAA,CAAI,QAAA,CAAS,MAAM,gBAAgB,CAAA;AACnC,MAAA,GAAA,CAAI,SAAS,KAAA,EAAM;AACnB,MAAA,UAAA,CAAW,MAAM;AAAE,QAAA,GAAA,CAAI,KAAA,EAAM;AAAG,QAAA,GAAA,CAAI,KAAA,EAAM;AAAA,MAAG,GAAG,GAAG,CAAA;AAAA,IACrD,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,IAAA,CAAA,CAAE,KAAA,EAAM;AAAA,EACV,CAAA;AAIA,EAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,IAAI,CAAA;AAKtC,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAwC;AAC3D,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAI,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,EAAS;AAC5B,IAAA,MAAM,KAAK,YAAA,CAAa,OAAA;AACxB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,KAAA,GAAQ,GAAG,SAAA,IAAa,CAAA;AAC9B,IAAA,MAAM,WAAW,EAAA,CAAG,SAAA,GAAY,EAAA,CAAG,YAAA,IAAgB,GAAG,YAAA,GAAe,CAAA;AACrE,IAAA,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,QAAA,IAAY,OAAO,UAAA,EAAY;AACjD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,CAAQ,OAAK,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,CAAA,GAAI,CAAC,CAAC,CAAA;AAIxC,MAAA,qBAAA,CAAsB,MAAM;AAAE,QAAA,IAAI,YAAA,CAAa,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,SAAA,GAAY,CAAA;AAAA,MAAG,CAAC,CAAA;AAAA,IAC/F,WAAW,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,KAAA,IAAS,OAAO,CAAA,EAAG;AAC5C,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,CAAQ,OAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAC/B,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,IAAI,aAAa,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,SAAA,GAAY,aAAa,OAAA,CAAQ,YAAA;AAAA,MAClF,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AACA,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAA2C;AAC5D,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,MAAM,GAAA,GAAA,CAAO,QAAA,CAAS,aAAA,EAAe,OAAA,IAAW,IAAI,WAAA,EAAY;AAChE,IAAA,IAAI,QAAQ,OAAA,IAAW,GAAA,KAAQ,UAAA,IAAe,QAAA,CAAS,eAA+B,iBAAA,EAAmB;AACzG,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,UAAA,IAAc,CAAA,CAAE,QAAQ,YAAA,EAAc;AAClD,MAAA,IAAI,OAAO,UAAA,EAAY;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,OAAA,CAAQ,OAAK,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,MAAG;AAAA,IAC1F,WAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,CAAA,CAAE,QAAQ,WAAA,EAAa;AACtD,MAAA,IAAI,OAAO,CAAA,EAAG;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,OAAA,CAAQ,OAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,MAAG;AAAA,IACxE,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,MAAA,EAAQ;AAC3B,MAAA,CAAA,CAAE,cAAA,EAAe;AAAG,MAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,KAAA,EAAO;AAC1B,MAAA,CAAA,CAAE,cAAA,EAAe;AAAG,MAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,IACxC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,6FAAA;AAEZ,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAA,CAAA,KAAK,KAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA,EAAG,SAAA,EAAU,yEACtF,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAc,IAAA,EAAK,MAAA,EAAO,SAAQ,WAAA,EAAY,MAAA,EAAO,gBAAe,WAAA,EAAa,CAAA,EAAG,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAAE,6BAAA,EAA8B,GAAE,CAAA,EAC1L,CAAA;AAAA,sBACAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QAAK,KAAA;AAAA,QAAI;AAAA,OAAA,EAAW,CAAA;AAAA,sBAC9EC,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,MAAM,OAAA,CAAQ,OAAK,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG,QAAA,EAAU,QAAQ,UAAA,EAAY,SAAA,EAAU,yEACxG,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAc,IAAA,EAAK,MAAA,EAAO,SAAQ,WAAA,EAAY,MAAA,EAAO,gBAAe,WAAA,EAAa,CAAA,EAAG,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAAE,2BAAA,EAA4B,GAAE,CAAA,EACxL,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,sBAC3CA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,SAAS,MAAM;AAAE,YAAA,UAAA,CAAW,KAAK,CAAA;AAAG,YAAA,QAAA,CAAS,CAAA,CAAA,KAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAA,CAAO,CAAA,GAAI,IAAA,IAAQ,GAAG,CAAA,GAAI,GAAG,CAAC,CAAA;AAAA,UAAG,CAAA;AAAA,UACtG,SAAA,EAAW,GAAA;AAAA,UACZ,QAAA,EAAA;AAAA;AAAA,OAAC;AAAA,sBACFD,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,OAAA,GAAU,KAAA,GAAS,YAAA,CAAa,SAAS,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA,GAAI,QAAA;AAAA,UACrG,UAAU,CAAA,CAAA,KAAK;AACb,YAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,KAAA;AACnB,YAAA,IAAI,MAAM,KAAA,EAAO;AAAE,cAAA,UAAA,CAAW,IAAI,CAAA;AAAG,cAAA;AAAA,YAAQ;AAC7C,YAAA,IAAI,MAAM,QAAA,EAAU;AAAE,cAAA,UAAA,CAAW,KAAK,CAAA;AAAG,cAAA,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,GAAI,GAAG,CAAA;AAAA,YAAG;AAAA,UACtE,CAAA;AAAA,UACA,SAAA,EAAU,kJAAA;AAAA,UACV,KAAA,EAAM,MAAA;AAAA,UAEN,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,YACtB,CAAC,OAAA,IAAW,CAAC,YAAA,CAAa,SAAS,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAC,CAAA,oBACzDD,IAAAA,CAAC,QAAA,EAAA,EAAO,OAAM,QAAA,EAAU,QAAA,EAAA;AAAA,cAAA,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAG,CAAA;AAAA,cAAE;AAAA,aAAA,EAAC,CAAA;AAAA,YAElD,aAAa,GAAA,CAAI,CAAA,CAAA,qBAAKA,IAAAA,CAAC,QAAA,EAAA,EAAe,OAAO,CAAA,EAAI,QAAA,EAAA;AAAA,cAAA,CAAA;AAAA,cAAE;AAAA,aAAA,EAAA,EAAhB,CAAiB,CAAS;AAAA;AAAA;AAAA,OAChE;AAAA,sBACAC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,SAAS,MAAM;AAAE,YAAA,UAAA,CAAW,KAAK,CAAA;AAAG,YAAA,QAAA,CAAS,CAAA,CAAA,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAA,CAAO,CAAA,GAAI,IAAA,IAAQ,GAAG,CAAA,GAAI,GAAG,CAAC,CAAA;AAAA,UAAG,CAAA;AAAA,UACpG,SAAA,EAAW,GAAA;AAAA,UACZ,QAAA,EAAA;AAAA;AAAA,OAAC;AAAA,sBACFA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAW,GAAA,IAAO,OAAA,GAAU,4BAAA,GAA+B,EAAA,CAAA;AAAA,UAC3D,KAAA,EAAM,2EAAA;AAAA,UACP,QAAA,EAAA;AAAA;AAAA,OAAG;AAAA,sBACJA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,sBAC3CD,IAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,WAAA,EAAa,WAAW,GAAA,EACvC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,0lBAAA,EAA2lB,CAAA,EAAE,CAAA;AAAA,QAAM;AAAA,OAAA,EAE/vB,CAAA;AAAA,sBACAD,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,UAAA,IAAc,qBAAA,EAAuB,WAAW,GAAA,EAC/D,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,0GAAA,EAA2G,CAAA,EAAE,CAAA;AAAA,QAAM;AAAA,OAAA,EAE/Q,CAAA;AAAA,MACC,2BACCD,IAAAA,CAAC,YAAO,OAAA,EAAS,OAAA,EAAS,WAAW,GAAA,EACnC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,wPAAA,EAAyP,CAAA,EAAE,CAAA;AAAA,QAAM;AAAA,OAAA,EAE7Z;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,SAAA,EAAU,+CAAA;AAAA,QAKV,QAAA,EAAU,CAAA;AAAA,QACV,OAAA,EAAS,WAAA;AAAA,QACT,SAAA,EAAW,SAAA;AAAA,QAEV,QAAA,EAAA,OAAA,mBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EAAgE,QAAA,EAAA,gBAAA,EAAc,CAAA,mBAE7FD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,WAAO,QAAA,EAAA,cAAA,EAAe,CAAA;AAAA,0BACvBD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,QAAA,EAAA,EAAO,GAAA,EAAK,SAAA,EAAW,WAAU,eAAA,EAAgB,CAAA;AAAA,4BAClDA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,YAAA;AAAA,gBACL,SAAA,EAAU,uBAAA;AAAA,gBACV,eAAe,CAAA,CAAA,KAAK,CAAA,CAAE,aAAA,CAAc,SAAA,CAAU,IAAI,WAAW;AAAA;AAAA;AAC/D,WAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ;AAaA,IAAM,iBAAA,GAA8B;AAAA,EAClC,0GAAA;AAAA,EACA,gIAAA;AAAA,EACA;AACF,CAAA;AAYA,IAAM,iBAAA,GAA4C;AAAA,EAChD,CAAA,EAAG,MAAA;AAAA,EAAQ,IAAA,EAAM,MAAA;AAAA,EAAQ,EAAA,EAAI,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EAC7C,EAAA,EAAI,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EAAU,EAAA,EAAI,MAAA;AAAA,EAAQ,IAAA,EAAM,MAAA;AAAA,EAClD,CAAA,EAAG,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EAAS,CAAA,EAAG,MAAA;AAAA,EAAQ,IAAA,EAAM,MAAA;AAAA,EAC7C,EAAA,EAAI,MAAA;AAAA,EAAQ,EAAA,EAAI,MAAA;AAAA,EAAQ,IAAA,EAAM,MAAA;AAAA,EAAQ,CAAA,EAAG,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EAC3D,CAAA,EAAG,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EAAU,GAAA,EAAK,SAAA;AAAA,EAAW,OAAA,EAAS,SAAA;AAAA,EACxD,CAAA,EAAG,SAAA;AAAA,EAAW,OAAA,EAAS,SAAA;AAAA,EAAW,EAAA,EAAI,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EACxD,EAAA,EAAI,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EAAU,EAAA,EAAI,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EACpD,CAAA,EAAG,SAAA;AAAA,EAAW,OAAA,EAAS,SAAA;AAAA,EAAW,EAAA,EAAI,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EACtD,GAAA,EAAK,SAAA;AAAA,EAAW,OAAA,EAAS,SAAA;AAAA,EAAW,SAAA,EAAW,SAAA;AAAA,EAC/C,CAAA,EAAG,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EAAU,CAAA,EAAG,KAAA;AAAA,EAAO,GAAA,EAAK,KAAA;AAAA,EAC9C,EAAA,EAAI,SAAA;AAAA,EAAW,OAAA,EAAS,SAAA;AAAA,EAAW,CAAA,EAAG,OAAA;AAAA,EAAS,EAAA,EAAI,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EAAS,IAAA,EAAM,MAAA;AAAA,EAClF,CAAA,EAAG,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EAAS,CAAA,EAAG,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EAAU,EAAA,EAAI,OAAA;AAAA,EAAS,KAAA,EAAO;AACjF,CAAA;AAEA,IAAM,YAAA,GAAe,wJAAA;AAErB,SAAS,SAAS,EAAE,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,SAAQ,EAAkB;AACvE,EAAA,MAAM,YAAA,GAAeJ,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,SAAA,GAAYA,OAAY,IAAI,CAAA;AAClC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIE,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAAqB,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,IAAI,CAAA;AAgB7C,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAuD,MAAM,CAAA;AACnG,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAI1E,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAqD,IAAI,CAAA;AAMvG,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAG5E,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,SAAS,EAAE,CAAA;AAK7D,EAAA,MAAM,cAAA,GAAiBF,OAAO,WAAW,CAAA;AACzC,EAAA,MAAM,mBAAA,GAAsBA,OAAO,gBAAgB,CAAA;AACnD,EAAAC,UAAU,MAAM;AAAE,IAAA,cAAA,CAAe,OAAA,GAAU,WAAA;AAAA,EAAa,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AACxE,EAAAA,UAAU,MAAM;AAAE,IAAA,mBAAA,CAAoB,OAAA,GAAU,gBAAA;AAAA,EAAkB,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAGvF,EAAA,MAAM,gBAAA,GAAmBD,OAA4B,IAAI,CAAA;AAGzD,EAAA,MAAM,eAAA,GAAkBA,OAA4B,IAAI,CAAA;AAExD,EAAA,MAAM,cAAA,GAAiBA,OAA4B,IAAI,CAAA;AAKvD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIE,SAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC1D,EAAA,MAAM,UAAA,GAAaF,OAAO,EAAE,CAAA;AAC5B,EAAA,MAAM,WAAA,GAAcA,OAAyB,IAAI,CAAA;AACjD,EAAA,MAAM,OAAA,GAAUA,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAaA,OAkCT,IAAI,CAAA;AAEd,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,MAAA,GAAc,IAAA;AAClB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,SAAA,CAAU,EAAE,CAAA;AAEZ,IAAA,CAAC,YAAY;AACX,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,OAAO,YAAY,CAAA;AACrC,QAAA,SAAA,GAAa,GAAA,CAAY,SAAA;AAAA,MAC3B,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,0CAA0C,CAAA;AACnD,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAA,IAAa,CAAC,YAAA,CAAa,OAAA,EAAS;AACxC,MAAA,IAAI;AAMF,QAAA,MAAM,IAAI,QAAc,CAAA,OAAA,KAAW;AACjC,UAAA,MAAM,WAAW,MAAM;AACrB,YAAA,MAAM,CAAA,GAAI,YAAA,CAAa,OAAA,EAAS,qBAAA,EAAsB;AACtD,YAAA,IAAI,KAAK,CAAA,CAAE,KAAA,GAAQ,KAAK,CAAA,CAAE,MAAA,GAAS,GAAG,OAAA,EAAQ;AAAA,uCACnB,QAAQ,CAAA;AAAA,UACrC,CAAA;AACA,UAAA,QAAA,EAAS;AAAA,QACX,CAAC,CAAA;AACD,QAAA,IAAI,SAAA,IAAa,CAAC,YAAA,CAAa,OAAA,EAAS;AAGxC,QAAA,IAAI,KAAA,GAAa,IAAA;AACjB,QAAA,IAAI;AAAE,UAAA,KAAA,GAAQ,MAAM;AAAA;AAAA,YAA0B;AAAA,WAAc;AAAA,QAAG,CAAA,CAAA,MAAQ;AAAA,QAAC;AACxE,QAAA,MAAM,UAAA,GAAa,OAAO,KAAA,IAAS,IAAA;AACnC,QAAA,MAAM,UAAA,GAAkB,EAAE,UAAA,EAAY,IAAA,EAAK;AAC3C,QAAA,IAAI,UAAA,EAAY,UAAA,CAAW,UAAA,GAAa,IAAI,WAAW,QAAQ,CAAA;AAC/D,QAAA,MAAA,GAAS,IAAI,SAAA,CAAU,YAAA,CAAa,OAAA,EAAS,UAAU,CAAA;AACvD,QAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAEpB,QAAA,MAAM,QAAA,GAAY,OAAO,MAAA,KAAW,WAAA,IAAgB,OAAe,4BAAA,IAC9D,iBAAA;AACL,QAAA,MAAM,MAAA,CAAO,KAAK,EAAE,GAAA,EAAK,OAAO,QAAA,EAAU,aAAA,EAAe,MAAM,CAAA;AAC/D,QAAA,IAAI,SAAA,EAAW;AAGf,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAc,MAAA,CAAO,SAAA,IAAY,IAAK,EAAC;AAC7C,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,YAAA,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,CAAA,MAAM;AAAA,cACvB,MAAM,CAAA,CAAE,IAAA;AAAA,cACR,WAAA,EAAa,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,IAAA;AAAA,cAChC,OAAO,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,GAAQ,KAAA,CAAA;AAAA,cAC/C,OAAA,EAAS;AAAA,cACT,CAAC,CAAA;AAAA,UACL;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAAC;AAGT,QAAA,MAAM,QAAQ,MAAM;AAClB,UAAA,IAAI;AACF,YAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,EAAS,qBAAA,EAAsB;AACzD,YAAA,IAAI,QAAQ,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AAC7C,cAAA,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,GAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,YAClE;AACA,YAAA,MAAM,MAAA,GAAS,OAAO,SAAA,IAAY;AAClC,YAAA,MAAM,MAAA,GAAS,OAAO,SAAA,IAAY;AAClC,YAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,cAAA,MAAA,CAAO,OAAA;AAAA,gBACL,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,gBAAG,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,gBAC7C,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,gBAAG,MAAA,CAAO,OAAO,MAAA,CAAO;AAAA,eAC/C;AAAA,YACF;AACA,YAAA,MAAA,CAAO,MAAA,IAAS;AAAA,UAClB,SAAS,GAAA,EAAK;AAEZ,YAAA,OAAA,CAAQ,IAAA,CAAK,8BAA8B,GAAG,CAAA;AAAA,UAChD;AAAA,QACF,CAAA;AACA,QAAA,KAAA,EAAM;AACN,QAAA,qBAAA,CAAsB,KAAK,CAAA;AAC3B,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB,SAAS,CAAA,EAAQ;AACf,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,CAAA,EAAG,WAAW,uBAAuB,CAAA;AAC9C,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,IAAI;AAAE,QAAA,MAAA,EAAQ,OAAA,IAAU;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AACpC,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAGR,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AAC1B,IAAA,MAAM,IAAI,UAAA,CAAW,MAAM,WAAA,CAAY,KAAK,GAAG,GAAI,CAAA;AACnD,IAAA,OAAO,MAAM,aAAa,CAAC,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAyDtB,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAM,CAAA,CAAE,UAAU,GAAA,GAAM,GAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAClE,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,OAAA,IAAW,KAAA,IAAS,CAAC,CAAA,EAAG;AAE5B,IAAA,MAAM,KAAA,GAAa,EAAE,QAAA,IAAW;AAChC,IAAA,MAAM,MAAA,GAAc,EAAE,SAAA,IAAY;AAClC,IAAA,MAAM,MAAA,GAAwC,EAAE,SAAA,IAAY;AAC5D,IAAA,IAAI,CAAC,SAAS,CAAC,MAAA,IAAU,CAAC,MAAA,IAAU,CAAC,aAAa,OAAA,EAAS;AAE3D,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,CAAQ,aAAA,IAAiB,OAAA,CAAQ,aAAA,CAAc,WAAA,CAAY,CAAA,CAAE,OAAO,CAAA;AACvF,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IACvB,CAAA;AAEA,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,QAAA,EAAS;AACT,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,IAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,0DAAA;AACxB,IAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,OAAO,CAAA;AAExC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,KAAK,CAAA;AACxE,IAAA,GAAA,CAAI,YAAA,CAAa,SAAS,uEAAuE,CAAA;AAIjG,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,MAAM,CAAA;AAC1E,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,QAAQ,CAAA;AAC9E,IAAA,MAAA,CAAO,YAAA,CAAa,MAAM,mBAAmB,CAAA;AAC7C,IAAA,MAAA,CAAO,YAAA,CAAa,WAAW,WAAW,CAAA;AAC1C,IAAA,MAAA,CAAO,YAAA,CAAa,QAAQ,GAAG,CAAA;AAC/B,IAAA,MAAA,CAAO,YAAA,CAAa,QAAQ,GAAG,CAAA;AAC/B,IAAA,MAAA,CAAO,YAAA,CAAa,eAAe,GAAG,CAAA;AACtC,IAAA,MAAA,CAAO,YAAA,CAAa,gBAAgB,GAAG,CAAA;AACvC,IAAA,MAAA,CAAO,YAAA,CAAa,UAAU,oBAAoB,CAAA;AAClD,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,MAAM,CAAA;AAC/E,IAAA,SAAA,CAAU,YAAA,CAAa,KAAK,uBAAuB,CAAA;AACnD,IAAA,SAAA,CAAU,YAAA,CAAa,QAAQ,SAAS,CAAA;AACxC,IAAA,MAAA,CAAO,YAAY,SAAS,CAAA;AAC5B,IAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AACvB,IAAA,GAAA,CAAI,YAAY,IAAI,CAAA;AACpB,IAAA,OAAA,CAAQ,YAAY,GAAG,CAAA;AAMvB,IAAA,MAAM,YAAY,MAAM;AACtB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,MAAM,CAAA;AACxE,MAAA,EAAA,CAAG,YAAA,CAAa,UAAU,SAAS,CAAA;AACnC,MAAA,EAAA,CAAG,YAAA,CAAa,gBAAgB,GAAG,CAAA;AACnC,MAAA,EAAA,CAAG,YAAA,CAAa,oBAAoB,KAAK,CAAA;AACzC,MAAA,EAAA,CAAG,YAAA,CAAa,WAAW,MAAM,CAAA;AACjC,MAAA,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AACnB,MAAA,GAAA,CAAI,YAAY,EAAE,CAAA;AAClB,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,YAAY,SAAA,EAAU;AAC5B,IAAA,MAAM,aAAa,SAAA,EAAU;AAK7B,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,MAAM,CAAA;AAC9E,IAAA,QAAA,CAAS,YAAA,CAAa,UAAU,SAAS,CAAA;AACzC,IAAA,QAAA,CAAS,YAAA,CAAa,gBAAgB,GAAG,CAAA;AACzC,IAAA,QAAA,CAAS,YAAA,CAAa,WAAW,MAAM,CAAA;AACvC,IAAA,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AACzB,IAAA,GAAA,CAAI,YAAY,QAAQ,CAAA;AACxB,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,MAAM,CAAA;AAC9E,IAAA,QAAA,CAAS,YAAA,CAAa,UAAU,SAAS,CAAA;AACzC,IAAA,QAAA,CAAS,YAAA,CAAa,gBAAgB,GAAG,CAAA;AACzC,IAAA,QAAA,CAAS,YAAA,CAAa,WAAW,MAAM,CAAA;AACvC,IAAA,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AACzB,IAAA,GAAA,CAAI,YAAY,QAAQ,CAAA;AAExB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,MAAM,CAAA;AAC5E,IAAA,MAAA,CAAO,YAAA,CAAa,UAAU,SAAS,CAAA;AACvC,IAAA,MAAA,CAAO,YAAA,CAAa,gBAAgB,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,YAAA,CAAa,kBAAkB,OAAO,CAAA;AAC7C,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU,MAAA;AACvB,IAAA,GAAA,CAAI,YAAY,MAAM,CAAA;AAKtB,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,MAAM,CAAA;AACjF,IAAA,WAAA,CAAY,YAAA,CAAa,UAAU,SAAS,CAAA;AAC5C,IAAA,WAAA,CAAY,YAAA,CAAa,gBAAgB,KAAK,CAAA;AAC9C,IAAA,WAAA,CAAY,YAAA,CAAa,kBAAkB,OAAO,CAAA;AAClD,IAAA,WAAA,CAAY,MAAM,OAAA,GAAU,MAAA;AAC5B,IAAA,GAAA,CAAI,YAAY,WAAW,CAAA;AAK3B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU,CAAA,kFAAA,CAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,4BAAA;AACd,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AACrD,IAAA,OAAA,CAAQ,YAAA,CAAa,SAAS,IAAI,CAAA;AAClC,IAAA,OAAA,CAAQ,YAAA,CAAa,UAAU,IAAI,CAAA;AACnC,IAAA,OAAA,CAAQ,YAAA,CAAa,WAAW,WAAW,CAAA;AAC3C,IAAA,OAAA,CAAQ,YAAA,CAAa,SAAS,gCAAgC,CAAA;AAC9D,IAAA,MAAA,CAAO,YAAY,OAAO,CAAA;AAC1B,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAiD;AACpE,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,GAAG,CAAA;AAC7C,MAAA,KAAA,CAAM,CAAC,CAAA;AACP,MAAA,CAAA,CAAE,MAAM,OAAA,GAAU,MAAA;AAClB,MAAA,OAAA,CAAQ,YAAY,CAAC,CAAA;AACrB,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,CAAC,CAAA,KAAM;AAC3C,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,MAAM,CAAA;AAChD,MAAA,CAAA,CAAE,YAAA,CAAa,KAAK,GAAG,CAAA;AAAI,MAAA,CAAA,CAAE,YAAA,CAAa,KAAK,GAAG,CAAA;AAClD,MAAA,CAAA,CAAE,YAAA,CAAa,SAAS,IAAI,CAAA;AAAG,MAAA,CAAA,CAAE,YAAA,CAAa,UAAU,IAAI,CAAA;AAC5D,MAAA,CAAA,CAAE,YAAA,CAAa,QAAQ,uBAAuB,CAAA;AAC9C,MAAA,CAAA,CAAE,YAAA,CAAa,UAAU,SAAS,CAAA;AAClC,MAAA,CAAA,CAAE,YAAA,CAAa,gBAAgB,KAAK,CAAA;AACpC,MAAA,CAAA,CAAE,YAAY,CAAC,CAAA;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,MAAM,qBAAA,GAAwB,WAAA,CAAY,CAAC,CAAA,KAAM;AAC/C,MAAA,MAAM,IAAA,GAAO,CAAC,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,KAAe;AAC/D,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,MAAM,CAAA;AACjD,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AAAG,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AACnE,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AAAG,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AACnE,QAAA,EAAA,CAAG,YAAA,CAAa,UAAU,SAAS,CAAA;AACnC,QAAA,EAAA,CAAG,YAAA,CAAa,gBAAgB,KAAK,CAAA;AACrC,QAAA,EAAA,CAAG,YAAA,CAAa,kBAAkB,OAAO,CAAA;AACzC,QAAA,OAAO,EAAA;AAAA,MACT,CAAA;AACA,MAAA,CAAA,CAAE,YAAY,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAE,CAAC,CAAA;AAChC,MAAA,CAAA,CAAE,YAAY,IAAA,CAAK,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IAClC,CAAC,CAAA;AAED,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,CAAA,KAAM;AACvC,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,SAAS,CAAA;AACtD,MAAA,IAAA,CAAK,YAAA,CAAa,UAAU,qBAAqB,CAAA;AACjD,MAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,uBAAuB,CAAA;AACjD,MAAA,IAAA,CAAK,YAAA,CAAa,UAAU,SAAS,CAAA;AACrC,MAAA,IAAA,CAAK,YAAA,CAAa,gBAAgB,KAAK,CAAA;AACvC,MAAA,IAAA,CAAK,YAAA,CAAa,mBAAmB,OAAO,CAAA;AAC5C,MAAA,CAAA,CAAE,YAAY,IAAI,CAAA;AAAA,IACpB,CAAC,CAAA;AAED,IAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,CAAC,CAAA,KAAM;AAC3C,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,SAAS,CAAA;AACtD,MAAA,IAAA,CAAK,YAAA,CAAa,UAAU,iBAAiB,CAAA;AAC7C,MAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,uBAAuB,CAAA;AACjD,MAAA,IAAA,CAAK,YAAA,CAAa,UAAU,SAAS,CAAA;AACrC,MAAA,IAAA,CAAK,YAAA,CAAa,gBAAgB,KAAK,CAAA;AACvC,MAAA,IAAA,CAAK,YAAA,CAAa,mBAAmB,OAAO,CAAA;AAC5C,MAAA,CAAA,CAAE,YAAY,IAAI,CAAA;AAAA,IACpB,CAAC,CAAA;AAED,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,CAAA,KAAM;AACvC,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,QAAQ,CAAA;AAClD,MAAA,CAAA,CAAE,YAAA,CAAa,MAAM,IAAI,CAAA;AAAG,MAAA,CAAA,CAAE,YAAA,CAAa,MAAM,IAAI,CAAA;AAAG,MAAA,CAAA,CAAE,YAAA,CAAa,KAAK,GAAG,CAAA;AAC/E,MAAA,CAAA,CAAE,YAAA,CAAa,QAAQ,uBAAuB,CAAA;AAC9C,MAAA,CAAA,CAAE,YAAA,CAAa,UAAU,SAAS,CAAA;AAClC,MAAA,CAAA,CAAE,YAAA,CAAa,gBAAgB,KAAK,CAAA;AACpC,MAAA,CAAA,CAAE,YAAY,CAAC,CAAA;AACf,MAAA,MAAM,IAAA,GAAO,CAAC,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,KAAe;AAC/D,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,MAAM,CAAA;AACjD,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AAAG,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AACnE,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AAAG,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AACnE,QAAA,EAAA,CAAG,YAAA,CAAa,UAAU,SAAS,CAAA;AACnC,QAAA,EAAA,CAAG,YAAA,CAAa,gBAAgB,KAAK,CAAA;AACrC,QAAA,EAAA,CAAG,YAAA,CAAa,kBAAkB,OAAO,CAAA;AACzC,QAAA,OAAO,EAAA;AAAA,MACT,CAAA;AACA,MAAA,CAAA,CAAE,YAAY,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,IAAI,CAAC,CAAA;AACxC,MAAA,CAAA,CAAE,YAAY,IAAA,CAAK,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,IAC1C,CAAC,CAAA;AAED,IAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAmB;AACvC,MAAA,iBAAA,CAAkB,KAAA,CAAM,OAAA,GAAU,IAAA,KAAS,UAAA,GAAa,EAAA,GAAK,MAAA;AAC7D,MAAA,qBAAA,CAAsB,KAAA,CAAM,OAAA,GAAU,IAAA,KAAS,cAAA,GAAiB,EAAA,GAAK,MAAA;AACrE,MAAA,aAAA,CAAc,KAAA,CAAM,OAAA,GAAU,IAAA,KAAS,MAAA,GAAS,EAAA,GAAK,MAAA;AACrD,MAAA,iBAAA,CAAkB,KAAA,CAAM,OAAA,GAAU,IAAA,KAAS,UAAA,GAAa,EAAA,GAAK,MAAA;AAC7D,MAAA,aAAA,CAAc,KAAA,CAAM,OAAA,GAAU,IAAA,KAAS,MAAA,GAAS,EAAA,GAAK,MAAA;AAAA,IACvD,CAAA;AACA,IAAA,OAAA,CAAQ,YAAY,MAAM,CAAA;AAE1B,IAAA,UAAA,CAAW,OAAA,GAAU;AAAA,MACnB,OAAO,EAAC;AAAA,MACR,cAAA,EAAgB,IAAA;AAAA,MAChB,OAAA;AAAA,MAAS,GAAA;AAAA,MAAK,IAAA,EAAM,MAAA;AAAA,MAAQ,SAAA,EAAW,WAAA;AAAA,MAAa,UAAA,EAAY,IAAA;AAAA,MAAM,OAAA,EAAS,SAAA;AAAA,MAC/E,QAAA,EAAU,UAAA;AAAA,MACV,QAAA;AAAA,MAAU,QAAA;AAAA,MACV,SAAS,EAAC;AAAA,MAAG,KAAA,EAAO,IAAA;AAAA,MAAM,IAAA,EAAM,MAAA;AAAA,MAChC,IAAA,EAAM,IAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAkBA,IAAA,MAAM,cACJ,MAAA,EAAQ,QAAA,EAAU,WAAA,IAAe,KAAA,EAAO,UAAU,WAAA,IAAe,IAAA;AACnE,IAAA,IAAI,KAAA,GAAQ,KAAA;AAWZ,IAAA,MAAM,WAAA,GAAc,CAAC,EAAA,EAAY,EAAA,KAAe;AAC9C,MAAA,IAAI,CAAC,WAAA,EAAa,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AACtC,MAAA,MAAM,EAAA,GAAK,IAAI,WAAA,CAAY,EAAA,EAAI,IAAI,CAAC,CAAA,CAAE,QAAQ,MAAM,CAAA;AACpD,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,WAAA,EAAa,CAAA,GAAI,MAAA,CAAO,YAAA;AACzC,MAAA,OAAO,EAAE,CAAA,EAAA,CAAI,EAAA,CAAG,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,CAAI,CAAC,EAAA,CAAG,CAAA,GAAI,CAAA,IAAK,IAAI,CAAA,EAAE;AAAA,IACzD,CAAA;AAUA,IAAA,MAAM,aAAA,GAAgB,GAAA;AACtB,IAAA,CAAC,MAAM;AACL,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,UAAA,CAAW,OAAA;AACtB,QAAA,IAAI,CAAC,EAAA,EAAI;AACT,QAAA,MAAM,QAAkB,EAAC;AACzB,QAAA,MAAM,SAAmB,EAAC;AAC1B,QAAA,IAAI,SAAA,GAAY,KAAA;AAGhB,QAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAuB;AAC7C,UAAA,MAAM,EAAA,GAAK,GAAG,UAAA,EAAY,kBAAA;AAC1B,UAAA,MAAM,EAAA,GAAK,GAAG,UAAA,EAAY,kBAAA;AAC1B,UAAA,IAAI,MAAM,EAAA,EAAI;AACZ,YAAA,MAAM,MAAkB,EAAC;AACzB,YAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,GAAG,KAAK,CAAA;AACrC,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,cAAA,GAAA,CAAI,IAAA,CAAK,CAAC,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA,EAAG,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA,EAAG,EAAA,CAAG,IAAA,CAAK,CAAC,GAAG,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA,EAAG,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA,EAAG,EAAA,CAAG,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AAAA,YACnF;AACA,YAAA,OAAO,GAAA;AAAA,UACT;AACA,UAAA,MAAM,EAAA,GAAK,GAAG,UAAA,EAAY,iBAAA;AAC1B,UAAA,IAAI,EAAA,EAAI;AACN,YAAA,MAAM,MAAkB,EAAC;AACzB,YAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,EAAA,CAAG,OAAO,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG,GAAG,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,CAAG,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AAChF,YAAA,OAAO,GAAA;AAAA,UACT;AACA,UAAA,OAAO,CAAC,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,QAC5B,CAAA;AACA,QAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,KAAa;AAC1B,UAAA,MAAM,KAAA,GAAQ,CAAC,CAAC,GAAA,EAAK,cAAA;AACrB,UAAA,MAAM,KAAA,GAAQ,CAAC,CAAC,GAAA,EAAK,QAAA;AACrB,UAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,EAAO;AACtB,UAAA,MAAM,IAAI,GAAA,CAAI,QAAA;AACd,UAAA,MAAM,GAAA,GAAM,GAAG,UAAA,EAAY,QAAA;AAC3B,UAAA,IAAI,CAAC,GAAA,EAAK;AACV,UAAA,MAAM,GAAA,GAAM,eAAe,CAAC,CAAA;AAC5B,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,MAAM,MAAM,CAAA,CAAE,KAAA;AACd,YAAA,MAAM,SAAA,GAAY,KAAK,KAAA,CAAA,CAAO,GAAA,GAAM,IAAI,KAAA,GAAQ,GAAA,CAAI,SAAS,CAAC,CAAA;AAC9D,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,cAAA,MAAM,KAAK,GAAA,GAAM,GAAA,CAAI,KAAK,CAAA,GAAI,CAAC,IAAI,CAAA,GAAI,CAAA;AACvC,cAAA,MAAM,EAAA,GAAK,MAAM,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AAC/C,cAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,EAAE,GAAG,EAAA,GAAK,GAAA,CAAI,KAAK,EAAE,CAAA;AACzC,cAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,EAAE,GAAG,EAAA,GAAK,GAAA,CAAI,KAAK,EAAE,CAAA;AACzC,cAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,EAAA,GAAK,EAAA,GAAK,EAAE,CAAA,EAAG;AACzC,cAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,gBAAA,IAAI,KAAA,CAAM,MAAA,IAAU,aAAA,GAAgB,CAAA,EAAG;AAAE,kBAAA,SAAA,GAAY,IAAA;AAAM,kBAAA;AAAA,gBAAQ;AACnE,gBAAA,MAAM,GAAA,GAAM,EAAE,CAAC,CAAA,GAAI,KAAK,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAC,GAAG,GAAA,GAAM,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA,GAAK,EAAE,CAAC,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA;AAC3E,gBAAA,MAAM,GAAA,GAAM,EAAE,CAAC,CAAA,GAAI,KAAK,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAC,GAAG,GAAA,GAAM,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA,GAAK,EAAE,CAAC,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA;AAC3E,gBAAA,IAAI,GAAA,KAAQ,GAAA,IAAO,GAAA,KAAQ,GAAA,EAAK;AAChC,gBAAA,KAAA,CAAM,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAAA,cAC/B;AAAA,YACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,OAAO,CAAA,EAAA,EAAK;AAClC,cAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,CAAC,GAAG,CAAA,GAAI,GAAA,CAAI,KAAK,CAAC,CAAA;AACrC,cAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,EAAG;AAC7B,cAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,gBAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA,GAAI,IAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,CAAC,GAAG,CAAA,CAAE,CAAC,IAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,cACpE;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAA;AACA,QAAA,IAAI,OAAO,KAAA,CAAM,eAAA,KAAoB,UAAA,EAAY,KAAA,CAAM,gBAAgB,KAAK,CAAA;AAAA,aACvE,KAAA,CAAM,SAAS,KAAK,CAAA;AACzB,QAAA,EAAA,CAAG,IAAA,GAAO,IAAI,YAAA,CAAa,KAAK,CAAA;AAChC,QAAA,EAAA,CAAG,KAAA,GAAQ,IAAI,YAAA,CAAa,MAAM,CAAA;AAClC,QAAA,IAAI,SAAA,EAAW;AAEb,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,sCAAA,EAAyC,aAAa,CAAA,iDAAA,CAA8C,CAAA;AAAA,QACnH;AACA,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX,CAAA,GAAG;AAMH,IAAA,MAAM,OAAA,GAAU,EAAA;AAQhB,IAAA,MAAM,iBAAA,GAAoB,CACxB,GAAA,EAAa,GAAA,EAAa,KAAa,GAAA,EACvC,GAAA,EAAa,GAAA,EAAa,GAAA,EAAa,GAAA,KACpC;AACH,MAAA,MAAM,KAAK,GAAA,GAAM,GAAA,KAAQ,MAAM,GAAA,CAAA,GAAA,CAAQ,GAAA,GAAM,QAAQ,GAAA,GAAM,GAAA,CAAA;AAC3D,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,MAAM,OAAO,IAAA;AAC/B,MAAA,MAAM,CAAA,GAAA,CAAA,CAAM,MAAM,GAAA,KAAQ,GAAA,GAAM,QAAQ,GAAA,GAAM,GAAA,KAAQ,MAAM,GAAA,CAAA,IAAQ,CAAA;AACpE,MAAA,MAAM,CAAA,GAAA,CAAA,CAAM,MAAM,GAAA,KAAQ,GAAA,GAAM,QAAQ,GAAA,GAAM,GAAA,KAAQ,MAAM,GAAA,CAAA,IAAQ,CAAA;AACpE,MAAA,MAAM,GAAA,GAAM,IAAA;AACZ,MAAA,IAAI,CAAA,GAAI,CAAC,GAAA,IAAO,CAAA,GAAI,CAAA,GAAI,GAAA,IAAO,CAAA,GAAI,CAAC,GAAA,IAAO,CAAA,GAAI,CAAA,GAAI,GAAA,EAAK,OAAO,IAAA;AAC/D,MAAA,OAAO,EAAE,EAAA,EAAI,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,GAAA,CAAA,EAAM,EAAA,EAAI,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,GAAA,CAAA,EAAM,CAAA,EAAE;AAAA,IACnE,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,CAAC,EAAA,EAAY,EAAA,KAAe;AAC3C,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,IAAK,CAAC,SAAS,CAAC,CAAA,CAAE,MAAM,OAAO,IAAA;AAIpC,MAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC3B,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC3B,MAAA,MAAM,GAAA,GAAM,GAAG,CAAA,GAAI,CAAA,CAAE,GAAG,GAAA,GAAM,EAAA,CAAG,IAAI,CAAA,CAAE,CAAA;AACvC,MAAA,MAAM,GAAA,GAAM,GAAG,CAAA,GAAI,CAAA,CAAE,GAAG,GAAA,GAAM,EAAA,CAAG,IAAI,CAAA,CAAE,CAAA;AACvC,MAAA,MAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA;AAC9B,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAGjB,MAAA,MAAM,GAAA,GAAA,CAAA,CAAQ,KAAK,CAAA,CAAE,CAAA,IAAK,OAAO,EAAA,GAAK,CAAA,CAAE,KAAK,GAAA,IAAO,GAAA;AACpD,MAAA,MAAM,GAAA,GAAA,CAAA,CAAQ,KAAK,CAAA,CAAE,CAAA,IAAK,OAAO,EAAA,GAAK,CAAA,CAAE,KAAK,GAAA,IAAO,GAAA;AACpD,MAAA,MAAM,KAAK,OAAA,IAAW,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,GAAG,CAAA,IAAK,CAAA,CAAA;AAC9C,MAAA,MAAM,KAAK,OAAA,IAAW,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,GAAG,CAAA,IAAK,CAAA,CAAA;AAC9C,MAAA,MAAM,IAAA,GAAO,GAAA,GAAM,EAAA,EAAI,IAAA,GAAO,GAAA,GAAM,IAAI,IAAA,GAAO,GAAA,GAAM,EAAA,EAAI,IAAA,GAAO,GAAA,GAAM,EAAA;AAEtE,MAAA,MAAM,KAAK,OAAA,GAAU,OAAA;AAKrB,MAAA,IAAI,MAAA,GAAsB,MAAM,GAAA,GAAM,EAAA;AACtC,MAAA,IAAI,OAAA,GAAuB,MAAM,IAAA,GAAO,EAAA;AACxC,MAAA,IAAI,QAAA,GAAwB,MAAM,KAAA,GAAQ,EAAA;AAC1C,MAAA,IAAI,KAAA,GAAqB,MAAM,EAAA,GAAK,EAAA;AACpC,MAAA,MAAM,OAAiH,EAAC;AAExH,MAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA,EAAG;AACvC,QAAA,MAAM,KAAK,IAAA,CAAK,CAAC,CAAA,EAAG,EAAA,GAAK,KAAK,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,GAAK,KAAK,CAAA,GAAI,CAAC,GAAG,EAAA,GAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AACvE,QAAA,IAAK,EAAA,GAAK,IAAA,IAAQ,EAAA,GAAK,IAAA,IAAU,KAAK,IAAA,IAAQ,EAAA,GAAK,IAAA,IAC9C,EAAA,GAAK,QAAQ,EAAA,GAAK,IAAA,IAAU,EAAA,GAAK,IAAA,IAAQ,KAAK,IAAA,EAAO;AAC1D,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,GAAA,GAAM,EAAA,GAAK,GAAA,GAAM,EAAA,EAAI,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,GAAA,GAAM,EAAA,GAAK,GAAA,GAAM,EAAA;AACpE,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,GAAA,GAAM,EAAA,GAAK,GAAA,GAAM,EAAA,EAAI,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,GAAA,GAAM,EAAA,GAAK,GAAA,GAAM,EAAA;AACpE,QAAA,IAAI,IAAA,GAAO,KAAA;AAEX,QAAA,IAAI,EAAA,GAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAC7B,QAAA,IAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AACxB,QAAA,IAAI,KAAK,EAAA,EAAI;AAAE,UAAA,IAAA,GAAO,IAAA;AAAM,UAAA,IAAI,KAAK,GAAA,EAAK;AAAE,YAAA,GAAA,GAAM,EAAA;AAAI,YAAA,MAAA,GAAS,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,MAAM,UAAA,EAAW;AAAA,UAAG;AAAA,QAAE;AACvG,QAAA,EAAA,GAAK,EAAA,GAAK,GAAA;AAAK,QAAA,EAAA,GAAK,EAAA,GAAK,GAAA;AACzB,QAAA,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACpB,QAAA,IAAI,KAAK,EAAA,EAAI;AAAE,UAAA,IAAA,GAAO,IAAA;AAAM,UAAA,IAAI,KAAK,GAAA,EAAK;AAAE,YAAA,GAAA,GAAM,EAAA;AAAI,YAAA,MAAA,GAAS,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,MAAM,UAAA,EAAW;AAAA,UAAG;AAAA,QAAE;AAEvG,QAAA,EAAA,GAAK,EAAA,GAAA,CAAM,MAAM,GAAA,IAAO,CAAA;AAAG,QAAA,EAAA,GAAK,EAAA,GAAA,CAAM,MAAM,GAAA,IAAO,CAAA;AACnD,QAAA,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACpB,QAAA,IAAI,KAAK,EAAA,EAAI;AAAE,UAAA,IAAA,GAAO,IAAA;AAAM,UAAA,IAAI,KAAK,IAAA,EAAM;AAAE,YAAA,IAAA,GAAO,EAAA;AAAI,YAAA,OAAA,GAAU,EAAE,EAAA,EAAA,CAAK,EAAA,GAAK,EAAA,IAAM,CAAA,EAAG,KAAK,EAAA,GAAK,EAAA,IAAM,CAAA,EAAG,IAAA,EAAM,UAAA,EAAW;AAAA,UAAG;AAAA,QAAE;AAEhI,QAAA,MAAM,GAAA,GAAM,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,GAAM,GAAA;AACnC,QAAA,MAAM,IAAA,GAAO,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA;AAC/B,QAAA,IAAI,OAAO,CAAA,EAAG;AACZ,UAAA,MAAM,MAAM,EAAA,GAAK,GAAA,IAAO,GAAA,GAAA,CAAO,EAAA,GAAK,OAAO,GAAA,IAAO,IAAA;AAClD,UAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG;AAClB,YAAA,EAAA,GAAK,EAAA,IAAM,MAAM,CAAA,GAAI,GAAA,CAAA;AAAM,YAAA,EAAA,GAAK,EAAA,IAAM,MAAM,CAAA,GAAI,GAAA,CAAA;AAChD,YAAA,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACpB,YAAA,IAAI,KAAK,EAAA,EAAI;AACX,cAAA,IAAA,GAAO,IAAA;AACP,cAAA,IAAI,KAAK,KAAA,EAAO;AAAE,gBAAA,KAAA,GAAQ,EAAA;AAAI,gBAAA,QAAA,GAAW,EAAE,EAAA,EAAI,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,EAAK,EAAA,EAAI,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,EAAK,IAAA,EAAM,MAAA,EAAO;AAAA,cAAG;AAAA,YAC7G;AAAA,UACF;AAAA,QACF;AACA,QAAA,IAAI,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,CAAA;AAAA,MAC5D;AAGA,MAAA,MAAM,QAAQ,CAAA,CAAE,KAAA;AAChB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,UAAA,MAAM,IAAI,KAAA,CAAM,CAAC,GAAG,CAAA,GAAI,KAAA,CAAM,IAAI,CAAC,CAAA;AACnC,UAAA,IAAI,IAAI,IAAA,IAAQ,CAAA,GAAI,QAAQ,CAAA,GAAI,IAAA,IAAQ,IAAI,IAAA,EAAM;AAClD,UAAA,MAAM,KAAK,EAAA,IAAM,CAAA,CAAE,CAAA,GAAI,GAAA,GAAM,IAAI,GAAA,GAAM,CAAA,CAAA;AACvC,UAAA,MAAM,KAAK,EAAA,IAAM,CAAA,CAAE,CAAA,GAAI,GAAA,GAAM,IAAI,GAAA,GAAM,CAAA,CAAA;AACvC,UAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC1B,UAAA,IAAI,KAAK,GAAA,EAAK;AAAE,YAAA,GAAA,GAAM,EAAA;AAAI,YAAA,MAAA,GAAS,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,MAAM,MAAA,EAAO;AAAA,UAAG;AAAA,QACrE;AAAA,MACF;AAKA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,QAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACxC,UAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,UAAA,MAAM,KAAK,iBAAA,CAAkB,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,KAAK,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,EAAE,GAAA,EAAK,CAAA,CAAE,KAAK,CAAA,CAAE,GAAA,EAAK,EAAE,GAAG,CAAA;AACnF,UAAA,IAAI,CAAC,EAAA,EAAI;AACT,UAAA,MAAM,KAAK,EAAA,GAAK,EAAA,CAAG,EAAA,EAAI,EAAA,GAAK,KAAK,EAAA,CAAG,EAAA;AACpC,UAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC1B,UAAA,IAAI,EAAA,IAAM,EAAA,IAAM,EAAA,IAAM,EAAA,EAAI;AAC1B,UAAA,EAAA,GAAK,EAAA;AACL,UAAA,KAAA,GAAQ,EAAE,IAAI,CAAA,CAAE,EAAA,GAAK,GAAG,CAAA,IAAK,CAAA,CAAE,KAAK,CAAA,CAAE,EAAA,CAAA,EAAK,IAAI,CAAA,CAAE,EAAA,GAAK,GAAG,CAAA,IAAK,CAAA,CAAE,KAAK,CAAA,CAAE,EAAA,CAAA,EAAK,MAAM,cAAA,EAAe;AAAA,QACnG;AAAA,MACF;AAOA,MAAA,MAAM,GAAA,GAAM,SAAS,MAAA,GAAU,EAAA,GAAK,MAAM,CAAA,GAAI,KAAA,GAAQ,SAAW,KAAA,IAAS,MAAA;AAC1E,MAAA,OAAO,OAAO,OAAA,IAAW,QAAA;AAAA,IAC3B,CAAA;AAGA,IAAA,MAAM,aAAa,MAAsB;AACvC,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,MAAA,EAAA,CAAG,MAAM,OAAA,GAAU,CAAA,6LAAA,CAAA;AACnB,MAAA,OAAA,CAAQ,YAAY,EAAE,CAAA;AACtB,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA,CAAE,KAAA;AACtB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAKvC,MAAA,EAAA,CAAG,MAAM,OAAA,GAAU,CAAA,kTAAA,CAAA;AACnB,MAAA,OAAA,CAAQ,YAAY,EAAE,CAAA;AACtB,MAAA,CAAA,CAAE,KAAA,GAAQ,EAAA;AACV,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,cAAA,GAAiB,CAAC,EAAA,EAAoB,CAAA,EAAW,CAAA,KAAc;AACnE,MAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC1B,MAAA,EAAA,CAAG,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAA,CAAA;AACtB,MAAA,EAAA,CAAG,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAA,CAAA;AAAA,IACvB,CAAA;AAOA,IAAA,MAAM,sBAAsB,MAAM;AAChC,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,KAAK,CAAC,CAAA,CAAE,kBAAkB,CAAA,CAAE,KAAA,CAAM,SAAS,CAAA,EAAG;AACnD,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACnB,MAAA,MAAM,MAAM,CAAA,CAAE,cAAA;AACd,MAAA,MAAM,QAAQ,mBAAA,CAAoB,OAAA;AAClC,MAAA,MAAM,OAAO,cAAA,CAAe,OAAA;AAC5B,MAAA,IAAI,KAAA,KAAU,QAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,KAAM,IAAA,KAAS,YAAA,IAAgB,IAAA,KAAS,UAAA,CAAA,EAAa;AAC9F,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,IAAK,CAAA,CAAE,IAAI,CAAA,GAAI,EAAA;AAChC,UAAA,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,EAAE,GAAG,CAAA,CAAE,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,EAAE;AAAA,QAC3D,CAAA,MAAO;AACL,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,IAAK,CAAA,CAAE,IAAI,CAAA,GAAI,EAAA;AAChC,UAAA,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,EAAE,GAAG,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAE;AAAA,QAC3D;AAAA,MACF,CAAA,MAAO;AACL,QAAA,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,EAAE,GAAG,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,CAAA,EAAE;AAAA,MACpC;AAAA,IACF,CAAA;AAOA,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,EAA8B,CAAA,KAAsE;AACvH,MAAA,MAAM,OAAO,cAAA,CAAe,OAAA;AAC5B,MAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,IAAA;AAC5B,MAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG,OAAO,YAAA;AACrB,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,IAAI,YAAA,GAAe,UAAA;AAAA,IACrE,CAAA;AAMA,IAAA,MAAM,qBAAqB,MAAM;AAC/B,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACnB,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACnB,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAG7B,MAAA,MAAM,UAAU,cAAA,CAAe,OAAA;AAC/B,MAAA,MAAM,QAAQ,mBAAA,CAAoB,OAAA;AAClC,MAAA,IAAI,UAAU,IAAA,IAAQ,MAAA,CAAO,SAAS,KAAK,CAAA,IAAK,YAAY,YAAA,EAAc;AAExE,QAAA,OAAO,EAAE,IAAA,EAAM,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAE,EAAG,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,GAAE,EAAE;AAAA,MAC5D;AACA,MAAA,IAAI,UAAU,IAAA,IAAQ,MAAA,CAAO,SAAS,KAAK,CAAA,IAAK,YAAY,UAAA,EAAY;AAEtE,QAAA,OAAO,EAAE,IAAA,EAAM,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAE,EAAG,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,GAAE,EAAE;AAAA,MAC5D;AACA,MAAA,IAAI,IAAA,KAAS,YAAA,EAAc,OAAO,EAAE,MAAM,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,GAAE,EAAE;AACpE,MAAA,IAAI,IAAA,KAAS,UAAA,EAAc,OAAO,EAAE,MAAM,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,GAAE,EAAE;AACpE,MAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE;AAAA,IAC1B,CAAA;AAEA,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,mBAAA,EAAoB;AACpB,MAAA,MAAM,UAAU,cAAA,CAAe,OAAA;AAC/B,MAAA,MAAM,QAAQ,mBAAA,CAAoB,OAAA;AAClC,MAAA,MAAM,WAAA,GAAc,UAAU,IAAA,IAAQ,MAAA,CAAO,SAAS,KAAK,CAAA,KAAM,OAAA,KAAY,YAAA,IAAgB,OAAA,KAAY,UAAA,CAAA;AAEzG,MAAA,IAAI,EAAE,OAAA,CAAQ,CAAC,GAAG,cAAA,CAAe,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,CAAA,EAAG,EAAE,KAAA,CAAM,CAAC,EAAE,CAAC,CAAA;AACzE,MAAA,IAAI,EAAE,OAAA,CAAQ,CAAC,GAAG,cAAA,CAAe,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,CAAA,EAAG,EAAE,KAAA,CAAM,CAAC,EAAE,CAAC,CAAA;AAIzE,MAAA,MAAM,WAAA,GAAc,CAAC,EAAA,EAA2B,GAAA,EAAiC,OAAA,KAAqB;AACpG,QAAA,IAAI,CAAC,EAAA,EAAI;AACT,QAAA,IAAI,CAAC,OAAA,IAAW,CAAA,CAAE,KAAA,CAAM,SAAS,CAAA,EAAG;AAAE,UAAA,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AAAQ,UAAA;AAAA,QAAQ;AACzE,QAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,WAAA,EAAa,CAAA,GAAI,MAAA,CAAO,YAAA;AACzC,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AACtC,QAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC/B,QAAA,MAAM,KAAA,GAAQ,YAAY,CAAA,CAAE,CAAA,GAAI,IAAI,EAAA,EAAI,CAAA,CAAE,CAAA,GAAI,GAAA,CAAI,EAAE,CAAA;AACpD,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAA,GAAI,EAAA,CAAG,CAAA,EAAG,KAAA,CAAM,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA,IAAK,CAAA;AAC5D,QAAA,MAAM,YAAY,UAAA,GAAa,KAAA;AAC/B,QAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,CAAE,CAAA,GAAI,GAAA,CAAI,EAAA,GAAK,SAAA,EAAW,CAAA,CAAE,CAAA,GAAI,GAAA,CAAI,EAAA,GAAK,SAAS,CAAA;AACzE,QAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,CAAE,CAAA,GAAI,GAAA,CAAI,EAAA,GAAK,SAAA,EAAW,CAAA,CAAE,CAAA,GAAI,GAAA,CAAI,EAAA,GAAK,SAAS,CAAA;AACzE,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAClC,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAClC,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAClC,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAClC,QAAA,EAAA,CAAG,MAAM,OAAA,GAAU,EAAA;AAAA,MACrB,CAAA;AACA,MAAA,IAAI,QAAQ,OAAA,KAAY,YAAA;AACxB,MAAA,IAAI,QAAQ,OAAA,KAAY,UAAA;AACxB,MAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,QAAA,IAAI,CAAA,CAAE,KAAA,CAAM,MAAA,IAAU,CAAA,EAAG;AACvB,UAAA,MAAM,CAAA,GAAI,YAAY,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA;AAC5C,UAAA,KAAA,GAAQ,CAAA,KAAM,YAAA;AACd,UAAA,KAAA,GAAQ,CAAA,KAAM,UAAA;AAAA,QAChB,CAAA,MAAO;AACL,UAAA,KAAA,GAAQ,IAAA;AACR,UAAA,KAAA,GAAQ,IAAA;AAAA,QACV;AAAA,MACF;AACA,MAAA,WAAA,CAAY,CAAA,CAAE,SAAS,EAAE,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,IAAK,KAAK,CAAA;AAC9C,MAAA,WAAA,CAAY,CAAA,CAAE,UAAU,EAAE,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,IAAK,KAAK,CAAA;AAE/C,MAAA,IAAI,CAAA,CAAE,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACxB,QAAA,MAAM,CAAA,GAAI,EAAE,KAAA,CAAM,CAAC,GAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AACnC,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC7B,QAAA,MAAM,OAAO,kBAAA,EAAmB;AAChC,QAAA,MAAM,KAAK,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAC/C,QAAA,MAAM,KAAK,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA,EAAG,IAAA,CAAK,GAAG,CAAC,CAAA;AAC3C,QAAA,CAAA,CAAE,KAAM,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AACvC,QAAA,CAAA,CAAE,KAAM,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AACvC,QAAA,CAAA,CAAE,KAAM,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AACvC,QAAA,CAAA,CAAE,KAAM,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AACvC,QAAA,CAAA,CAAE,IAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,yBAAyB,CAAA;AAC9D,QAAA,CAAA,CAAE,IAAA,CAAM,YAAA,CAAa,YAAA,EAAc,yBAAyB,CAAA;AAG5D,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA;AACnD,QAAA,CAAA,CAAE,IAAA,CAAM,KAAA,CAAM,OAAA,GAAU,OAAA,GAAU,MAAM,EAAA,GAAK,MAAA;AAG7C,QAAA,IAAI,WAAA,IAAe,EAAE,SAAA,EAAW;AAC9B,UAAA,MAAM,IAAI,IAAA,KAAS,YAAA,GAAe,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,KAAM,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AACxE,UAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC/B,UAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC/B,UAAA,CAAA,CAAE,UAAU,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAC3C,UAAA,CAAA,CAAE,UAAU,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAC3C,UAAA,CAAA,CAAE,UAAU,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAC3C,UAAA,CAAA,CAAE,UAAU,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAC3C,UAAA,CAAA,CAAE,SAAA,CAAU,YAAA,CAAa,cAAA,EAAgB,yBAAyB,CAAA;AAClE,UAAA,CAAA,CAAE,SAAA,CAAU,YAAA,CAAa,YAAA,EAAc,yBAAyB,CAAA;AAChE,UAAA,CAAA,CAAE,SAAA,CAAU,MAAM,OAAA,GAAU,EAAA;AAE5B,UAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,UAAA,MAAA,CAAO,WAAA,GAAc,qBAAA,CAAsB,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AAC1D,UAAA,MAAM,GAAA,GAAA,CAAO,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAC5B,UAAA,MAAM,GAAA,GAAA,CAAO,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAC5B,UAAA,MAAA,CAAO,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AAC1B,UAAA,MAAA,CAAO,KAAA,CAAM,GAAA,GAAO,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AAC1B,UAAA,MAAM,CAAA,GAAI,MAAA,CAAO,WAAA,EAAa,CAAA,GAAI,MAAA,CAAO,YAAA;AACzC,UAAA,MAAA,CAAO,KAAA,CAAM,OAAA,GAAW,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,KAAK,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,CAAA,GAAK,MAAA,GAAS,EAAA;AAAA,QAC/E,CAAA,MAAO;AACL,UAAA,IAAI,CAAA,CAAE,SAAA,EAAW,CAAA,CAAE,SAAA,CAAU,MAAM,OAAA,GAAU,MAAA;AAC7C,UAAA,IAAI,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,UAAA,CAAW,MAAM,OAAA,GAAU,MAAA;AAAA,QACjD;AAKA,QAAA,MAAM,OAAO,CAAA,CAAE,QAAA;AACf,QAAA,MAAM,OAAO,CAAA,CAAE,QAAA;AACf,QAAA,IAAI,CAAC,WAAA,IAAe,IAAA,KAAS,YAAA,IAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA,EAAM;AACvE,UAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC9B,UAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC9B,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,MAAM,OAAA,GAAU,EAAA;AACrB,UAAA,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AAAA,QACvB,CAAA,MAAA,IAAW,CAAC,WAAA,IAAe,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA,EAAM;AAC5E,UAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC9B,UAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC9B,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,MAAM,OAAA,GAAU,EAAA;AACrB,UAAA,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AAAA,QACvB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AACrB,UAAA,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AAAA,QACvB;AAEA,QAAA,IAAI,EAAE,KAAA,EAAO;AACX,UAAA,MAAM,EAAA,GAAA,CAAM,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAC3B,UAAA,MAAM,EAAA,GAAA,CAAM,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAC3B,UAAA,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AAC1B,UAAA,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AACzB,UAAA,MAAM,CAAA,GAAI,MAAA,CAAO,WAAA,EAAa,CAAA,GAAI,MAAA,CAAO,YAAA;AACzC,UAAA,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,OAAA,GAAW,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,CAAA,GAAK,MAAA,GAAS,EAAA;AAG1E,UAAA,IAAI,OAAA,IAAW,GAAA,EAAK,CAAA,CAAE,KAAA,CAAM,MAAM,OAAA,GAAU,MAAA;AAAA,QAC9C;AAAA,MACF,CAAA,MAAO;AACL,QAAA,CAAA,CAAE,IAAA,CAAM,MAAM,OAAA,GAAU,MAAA;AACxB,QAAA,IAAI,CAAA,CAAE,SAAA,EAAW,CAAA,CAAE,SAAA,CAAU,MAAM,OAAA,GAAU,MAAA;AAC7C,QAAA,IAAI,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,UAAA,CAAW,MAAM,OAAA,GAAU,MAAA;AAC/C,QAAA,IAAI,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AAC3C,QAAA,IAAI,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AAAA,MAC7C;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,mBAAmB,MAAM;AAC7B,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAA,CAAE,UAAA,EAAY,OAAO,CAAA,CAAE,UAAA;AAC3B,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,MAAA,EAAA,CAAG,MAAM,OAAA,GAAU,CAAA,kTAAA,CAAA;AACnB,MAAA,OAAA,CAAQ,YAAY,EAAE,CAAA;AACtB,MAAA,CAAA,CAAE,UAAA,GAAa,EAAA;AACf,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAGA,IAAA,MAAM,QAAA,GAAW,CAAA;AACjB,IAAA,MAAM,SAAA,GAAY,GAAA;AAClB,IAAA,IAAI,KAAA,GAAQ,GAAG,KAAA,GAAQ,CAAA,EAAG,WAAW,CAAA,EAAG,UAAA,GAAa,OAAO,QAAA,GAAW,KAAA;AACvE,IAAA,IAAI,QAAA,GAAwC,IAAA;AAE5C,IAAA,MAAM,iBAAA,GAAoB,CAAC,EAAA,KAAY;AACrC,MAAA,MAAM,IAAI,EAAA,EAAI,MAAA;AACd,MAAA,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,QAAA,EAAU,WAAW,CAAA,EAAG;AACpC,MAAA,KAAA,GAAQ,EAAE,WAAA,CAAY,CAAA;AACtB,MAAA,KAAA,GAAQ,EAAE,WAAA,CAAY,CAAA;AACtB,MAAA,QAAA,GAAW,YAAY,GAAA,EAAI;AAC3B,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,UAAA,GAAa,IAAA;AAAA,IACf,CAAA;AAEA,IAAA,MAAM,iBAAA,GAAoB,CAAC,EAAA,KAAqB;AAC9C,MAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,OAAA,GAAU,IAAA,CAAK,IAAA;AAC7B,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,OAAA,GAAU,IAAA,CAAK,GAAA;AAE7B,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAA,CAAK,EAAA,GAAK,UAAU,CAAA,GAAA,CAAK,EAAA,GAAK,UAAU,CAAA,GAAI,QAAA,GAAW,UAAU,QAAA,GAAW,IAAA;AAAA,MAC9E;AAGA,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,IAAA,EAAM;AACnB,MAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,QAAA,CAAA,CAAE,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AACvB,QAAA;AAAA,MACF;AACA,MAAA,QAAA,GAAW,QAAA,CAAS,IAAI,EAAE,CAAA;AAC1B,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,QAAA,CAAS,EAAA,EAAI,SAAS,EAAE,CAAA;AAC9C,QAAA,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AAC1B,QAAA,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AACzB,QAAA,CAAA,CAAE,IAAA,CAAK,MAAM,OAAA,GAAU,EAAA;AACvB,QAAA,YAAA,CAAa,SAAS,IAAI,CAAA;AAAA,MAC5B,CAAA,MAAO;AACL,QAAA,CAAA,CAAE,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AAAA,MACzB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,eAAA,GAAkB,CAAC,EAAA,KAAY;AACnC,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,UAAA,GAAa,KAAA;AACb,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,EAAI,GAAI,QAAA;AACpC,MAAA,IAAI,QAAA,IAAY,UAAU,SAAA,EAAW;AAGrC,MAAA,MAAM,GAAA,GAAM,IAAI,MAAA,EAAQ,QAAA;AACxB,MAAA,IAAI,CAAC,GAAA,EAAK;AAGV,MAAA,MAAM,SAAS,QAAA,GACX,EAAE,CAAA,EAAG,QAAA,CAAS,IAAI,CAAA,EAAG,QAAA,CAAS,EAAA,EAAG,GACjC,EAAE,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,EAAE;AACzB,MAAA,MAAA,CAAO,MAAM,CAAA;AAAA,IACf,CAAA;AAMA,IAAA,MAAM,iBAAiB,MAAM;AAC3B,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,KAAA,CAAM,WAAW,CAAA,EAAG;AAChC,MAAA,mBAAA,EAAoB;AACpB,MAAA,MAAM,CAAA,GAAI,EAAE,KAAA,CAAM,CAAC,GAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AACnC,MAAA,MAAM,UAAU,cAAA,CAAe,OAAA;AAC/B,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC7B,MAAA,MAAM,QAAQ,mBAAA,CAAoB,OAAA;AAClC,MAAA,MAAM,WAAA,GAAc,UAAU,IAAA,IAAQ,MAAA,CAAO,SAAS,KAAK,CAAA,KAAM,OAAA,KAAY,YAAA,IAAgB,OAAA,KAAY,UAAA,CAAA;AACzG,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,MAAA,GAAS,EAAA;AACb,MAAA,IAAI,IAAA;AAGJ,MAAA,IAAI,KAAA,GAA6C,IAAA;AACjD,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AACzD,MAAA,IAAI,WAAA,IAAe,YAAY,YAAA,EAAc;AAC3C,QAAA,IAAA,GAAO,GAAA;AACP,QAAA,MAAA,GAAS,SAAA;AACT,QAAA,KAAA,GAAQ,UAAA;AACR,QAAA,IAAA,GAAO,CAAA,UAAA,EAAQ,qBAAA,CAAsB,GAAG,CAAC,CAAA,wBAAA,EAAsB,sBAAsB,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAC,CAAA,CAAA;AAAA,MACvG,CAAA,MAAA,IAAW,WAAA,IAAe,OAAA,KAAY,UAAA,EAAY;AAChD,QAAA,IAAA,GAAO,GAAA;AACP,QAAA,MAAA,GAAS,SAAA;AACT,QAAA,KAAA,GAAQ,YAAA;AACR,QAAA,IAAA,GAAO,CAAA,UAAA,EAAQ,qBAAA,CAAsB,GAAG,CAAC,CAAA,wBAAA,EAAsB,sBAAsB,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAC,CAAA,CAAA;AAAA,MACvG,CAAA,MAAA,IAAW,SAAS,YAAA,EAAc;AAChC,QAAA,IAAA,GAAO,GAAA;AACP,QAAA,MAAA,GAAS,SAAA;AACT,QAAA,IAAA,GAAO,CAAA,mBAAA,EAAsB,qBAAA,CAAsB,GAAG,CAAC,CAAA,UAAA,CAAA;AAAA,MACzD,CAAA,MAAA,IAAW,SAAS,UAAA,EAAY;AAC9B,QAAA,IAAA,GAAO,GAAA;AACP,QAAA,MAAA,GAAS,SAAA;AACT,QAAA,IAAA,GAAO,CAAA,mBAAA,EAAsB,qBAAA,CAAsB,GAAG,CAAC,CAAA,UAAA,CAAA;AAAA,MACzD,CAAA,MAAO;AACL,QAAA,IAAA,GAAO,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACtC,QAAA,IAAA,GAAO,CAAA,WAAA,EAAc,qBAAA,CAAsB,IAAI,CAAC,CAAA,aAAA,EAAW,qBAAA,CAAsB,GAAG,CAAC,CAAA,aAAA,EAAW,qBAAA,CAAsB,GAAG,CAAC,CAAA,CAAA;AAAA,MAC5H;AAIA,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,QAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,QAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,QAAA,IAAI,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,MAAM,OAAA,GAAU,GAAA;AACrC,QAAA;AAAA,MACF;AACA,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,MAAM,QAAQ,WAAA,EAAY;AAC1B,MAAA,KAAA,CAAM,MAAM,OAAA,GAAU,GAAA;AACtB,MAAA,KAAA,CAAM,cAAc,CAAA,EAAG,qBAAA,CAAsB,IAAI,CAAC,GAAG,MAAM,CAAA,CAAA;AAAA,IAC7D,CAAA;AAIA,IAAA,gBAAA,CAAiB,UAAU,MAAM;AAC/B,MAAA,cAAA,EAAe;AACf,MAAA,aAAA,EAAc;AAAA,IAChB,CAAA;AAGA,IAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAA8C;AACpE,MAAA,CAAA,CAAE,IAAA,CAAM,MAAM,OAAA,GAAU,MAAA;AACxB,MAAA,IAAI,CAAA,CAAE,SAAA,EAAW,CAAA,CAAE,SAAA,CAAU,MAAM,OAAA,GAAU,MAAA;AAC7C,MAAA,IAAI,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,UAAA,CAAW,MAAM,OAAA,GAAU,MAAA;AAC/C,MAAA,IAAI,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AAC3C,MAAA,IAAI,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AAC3C,MAAA,IAAI,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,MAAM,OAAA,GAAU,GAAA;AACrC,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,IACzB,CAAA;AAEA,IAAA,MAAM,aAAa,MAAM;AACvB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,KAAA,MAAW,KAAK,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,aAAA,EAAe,YAAY,CAAC,CAAA;AACzD,MAAA,CAAA,CAAE,UAAU,EAAC;AACb,MAAA,CAAA,CAAE,QAAQ,EAAC;AACX,MAAA,CAAA,CAAE,cAAA,GAAiB,IAAA;AACnB,MAAA,IAAI,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,MAAM,OAAA,GAAU,MAAA;AACzC,MAAA,IAAI,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AAC3C,MAAA,cAAA,CAAe,CAAC,CAAA;AAAA,IAClB,CAAA;AACA,IAAA,eAAA,CAAgB,OAAA,GAAU,UAAA;AAG1B,IAAA,cAAA,CAAe,UAAU,MAAM;AAC7B,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,KAAA,CAAM,WAAW,CAAA,EAAG;AAChC,MAAA,CAAA,CAAE,MAAM,GAAA,EAAI;AACZ,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAI;AACxB,MAAA,CAAA,EAAG,aAAA,EAAe,YAAY,CAAC,CAAA;AAC/B,MAAA,CAAA,CAAE,cAAA,GAAiB,IAAA;AACnB,MAAA,cAAA,CAAe,CAAC,CAAA;AAChB,MAAA,aAAA,EAAc;AAAA,IAChB,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAgC;AAC9C,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,EAAG;AAGR,MAAA,IAAI,CAAA,CAAE,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,UAAA,EAAW;AAErC,MAAA,IAAI,CAAA,CAAE,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACxB,QAAA,CAAA,CAAE,KAAA,CAAM,KAAK,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA;AAC/B,QAAA,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,CAAA;AAAA,MAC7B,CAAA,MAAO;AAKL,QAAA,CAAA,CAAE,iBAAiB,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AACpC,QAAA,CAAA,CAAE,KAAA,CAAM,KAAK,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA;AAC/B,QAAA,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,CAAA;AAC3B,QAAA,cAAA,EAAe;AAAA,MACjB;AACA,MAAA,aAAA,EAAc;AAAA,IAChB,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KAAsB;AACvC,MAAA,IAAI,EAAA,CAAG,GAAA,KAAQ,QAAA,EAAU,iBAAA,CAAkB,KAAK,CAAA;AAAA,IAClD,CAAA;AAGA,IAAA,MAAA,CAAO,MAAM,MAAA,GAAS,WAAA;AACtB,IAAA,IAAI;AAAE,MAAA,CAAA,CAAE,SAAA,GAAY,eAAe,iBAAiB,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAC;AAChE,IAAA,IAAI;AAAE,MAAA,CAAA,CAAE,SAAA,GAAY,aAAa,eAAe,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAC;AAC5D,IAAA,IAAI;AAAE,MAAA,CAAA,CAAE,SAAA,GAAY,eAAe,aAAa,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAC;AAC5D,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,iBAAiB,CAAA;AACxD,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAE5C,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,MAAM,MAAA,GAAS,EAAA;AACtB,MAAA,IAAI;AAAE,QAAA,CAAA,CAAE,WAAA,GAAc,eAAe,iBAAiB,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAClE,MAAA,IAAI;AAAE,QAAA,CAAA,CAAE,WAAA,GAAc,aAAa,eAAe,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAC9D,MAAA,IAAI;AAAE,QAAA,CAAA,CAAE,WAAA,GAAc,eAAe,aAAa,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAC9D,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,iBAAiB,CAAA;AAC3D,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC/C,MAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,MAAA,QAAA,EAAS;AACT,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,IACzB,CAAA;AAAA,EASF,GAAG,CAAC,cAAA,EAAgB,OAAA,EAAS,KAAA,EAAO,SAAS,CAAC,CAAA;AAK9C,EAAAA,UAAU,MAAM;AACd,IAAA,gBAAA,CAAiB,OAAA,IAAU;AAAA,EAC7B,CAAA,EAAG,CAAC,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAElC,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAiB;AACpC,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AAC9B,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,IAAA,EAAM,OAAO,CAAA;AAC5B,MAAA,MAAM,IAAA,GAAO,CAAC,CAAA,CAAE,OAAA;AAChB,MAAA,IAAI;AAAE,QAAA,SAAA,CAAU,OAAA,EAAS,SAAA,GAAY,IAAA,EAAM,IAAI,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAC3D,MAAA,OAAO,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,IAAA,EAAK;AAAA,IAC/B,CAAC,CAAC,CAAA;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,OAAA,KAAqB;AACzC,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AAC9B,MAAA,IAAI,CAAA,CAAE,OAAA,KAAY,OAAA,EAAS,OAAO,CAAA;AAClC,MAAA,IAAI;AAAE,QAAA,SAAA,CAAU,OAAA,EAAS,SAAA,GAAY,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAChE,MAAA,OAAO,EAAE,GAAG,CAAA,EAAG,OAAA,EAAQ;AAAA,IACzB,CAAC,CAAC,CAAA;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,IAAA,CAAA,CAAE,KAAA,EAAM;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,MAAA,MAAM,MAAA,GAAS,GAAG,SAAA,IAAY;AAC9B,MAAA,MAAM,MAAA,GAAS,GAAG,SAAA,IAAY;AAC9B,MAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,QAAA,CAAA,CAAE,OAAA;AAAA,UACA,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,UAAG,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,UAC7C,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,UAAG,MAAA,CAAO,OAAO,MAAA,CAAO;AAAA,SAC/C;AAAA,MACF,CAAA,MAAO;AACL,QAAA,CAAA,EAAG,OAAA,IAAU;AAAA,MACf;AACA,MAAA,CAAA,EAAG,MAAA,IAAS;AAAA,IACd,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA;AAOA,EAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAAgB;AAClC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,EAAK,IAAK,UAAA,CAAW,OAAA;AACtC,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA,GAAc,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA;AAC7C,IAAA,MAAM,WAAW,MAAM;AAAE,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IAAM,CAAA;AACpD,IAAA,MAAM,YAAA,GAAe,CAAC,IAAA,EAA0B,IAAA,KAAiB;AAC/D,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,eAAA,CAAgB,OAAA,IAAU;AAC1B,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,EAAS;AAAA,IACX,CAAA;AAEA,IAAA,IAAI,uBAAA,CAAwB,IAAA,CAAK,GAAG,CAAA,EAAG;AACrC,MAAA,IAAI,cAAA,KAAmB,WAAA,KAAgB,YAAA,IAAgB,WAAA,KAAgB,UAAA,CAAA,EAAa;AAClF,QAAA,MAAM,CAAA,GAAI,WAAW,GAAG,CAAA;AACxB,QAAA,IAAI,CAAA,EAAG;AACL,UAAA,oBAAA,CAAqB,GAAG,CAAA;AACxB,UAAA,mBAAA,CAAoB,CAAC,CAAA;AACrB,UAAA,UAAA,CAAW,CAAA,MAAA,EAAI,WAAA,KAAgB,YAAA,GAAe,GAAA,GAAM,GAAG,CAAA,WAAA,EAAc,qBAAA,CAAsB,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA,kDAAA,CAA+C,CAAA;AAAA,QACxJ,CAAA,MAAO;AACL,UAAA,oBAAA,CAAqB,EAAE,CAAA;AACvB,UAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,UAAA,UAAA,CAAW,yBAAyB,CAAA;AAAA,QACtC;AAAA,MACF,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,gEAA2D,CAAA;AAAA,MACxE;AACA,MAAA;AAAA,IACF;AACA,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,IAAA;AAAA,MAAM,KAAK,MAAA;AAAA,MAAQ,KAAK,KAAA;AAAA,MAAO,KAAK,aAAA;AACvC,QAAA,YAAA,CAAa,SAAS,oEAA+D,CAAA;AACrF,QAAA;AAAA,MACF,KAAK,KAAA;AAAA,MAAO,KAAK,KAAA;AAAA,MAAO,KAAK,QAAA;AAAA,MAAU,KAAK,WAAA;AAC1C,QAAA,YAAA,CAAa,QAAQ,sGAAuF,CAAA;AAC5G,QAAA;AAAA;AAAA;AAAA,MAGF,KAAK,GAAA;AAAA,MAAK,KAAK,KAAA;AAAA,MAAO,KAAK,YAAA;AACzB,QAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,QAAA,cAAA,CAAe,YAAY,CAAA;AAC3B,QAAA,UAAA,CAAW,iDAAuC,CAAA;AAClD,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,GAAA;AAAA,MAAK,KAAK,KAAA;AAAA,MAAO,KAAK,UAAA;AACzB,QAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,QAAA,cAAA,CAAe,UAAU,CAAA;AACzB,QAAA,UAAA,CAAW,+CAAqC,CAAA;AAChD,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,IAAA;AAAA,MAAM,KAAK,MAAA;AACd,QAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,QAAA,cAAA,CAAe,MAAM,CAAA;AACrB,QAAA,UAAA,CAAW,2EAAsE,CAAA;AACjF,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,iBAAA,CAAkB,CAAC,cAAc,CAAA;AACjC,QAAA,UAAA,CAAW,cAAA,GAAiB,iBAAiB,qCAAgC,CAAA;AAC7E,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,GAAA;AAAA,MAAK,KAAK,MAAA;AACb,QAAA,cAAA,CAAe,OAAA,IAAU;AACzB,QAAA,UAAA,CAAW,oBAAoB,CAAA;AAC/B,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,GAAA;AAAA,MAAK,KAAK,IAAA;AAAA,MAAM,KAAK,MAAA;AAAA,MAAQ,KAAK,KAAA;AAAA,MAAO,KAAK,aAAA;AACjD,QAAA,eAAA,EAAgB;AAChB,QAAA,UAAA,CAAW,eAAe,CAAA;AAC1B,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,IAAA;AAAA,MAAM,KAAK,OAAA;AAAA,MAAS,KAAK,QAAA;AAC5B,QAAA,aAAA,CAAc,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AACrB,QAAA,UAAA,CAAW,sBAAsB,CAAA;AACjC,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,KAAA;AAAA,MAAO,KAAK,OAAA;AACf,QAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,QAAA,oBAAA,CAAqB,EAAE,CAAA;AACvB,QAAA,eAAA,CAAgB,OAAA,IAAU;AAC1B,QAAA,UAAA,CAAW,sBAAsB,CAAA;AACjC,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,GAAA;AAAA,MAAK,KAAK,MAAA;AACb,QAAA,UAAA,CAAW,YAAY,CAAA;AACvB,QAAA;AAAA,MACF,SAAS;AACP,QAAA,MAAM,OAAA,GAAU,kBAAkB,GAAG,CAAA;AACrC,QAAA,IAAI,OAAA,EAAS,UAAA,CAAW,CAAA,EAAG,OAAO,CAAA,iGAAA,CAA8F,CAAA;AAAA,aAC3H,UAAA,CAAW,CAAA,iBAAA,EAAoB,GAAA,CAAI,WAAA,EAAa,CAAA,8CAAA,CAA2C,CAAA;AAAA,MAClG;AAAA;AACF,EACF,CAAA;AAMA,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,EAAE,gBAAA,IAAoB,CAAA,CAAE,WAAW,CAAA,CAAE,OAAA,IAAW,EAAE,MAAA,EAAQ;AAC9D,MAAA,IAAI,EAAE,GAAA,CAAI,MAAA,KAAW,CAAA,IAAK,CAAA,CAAE,QAAQ,GAAA,EAAK;AACzC,MAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,MAAA,IAAI,CAAA,KAAM,EAAE,OAAA,KAAY,OAAA,IAAW,EAAE,OAAA,KAAY,UAAA,IAAc,EAAE,iBAAA,CAAA,EAAoB;AACrF,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,iBAAiB,CAAA;AAC9C,MAAA,IAAI,OAAA,IAAW,gBAAA,EAAiB,KAAM,OAAA,CAAQ,QAAQ,OAAA,EAAS;AAC/D,MAAA,WAAA,CAAY,SAAS,KAAA,EAAM;AAAA,IAC7B,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAOL,EAAA,MAAM,WAAA,GAAcD,OAAO,QAAQ,CAAA;AACnC,EAAA,MAAM,iBAAA,GAAoBA,OAAO,cAAc,CAAA;AAC/C,EAAAC,UAAU,MAAM;AAAE,IAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAAA,EAAU,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAC/D,EAAAA,UAAU,MAAM;AAAE,IAAA,iBAAA,CAAkB,OAAA,GAAU,cAAA;AAAA,EAAgB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AACjF,EAAAA,UAAU,MAAM;AACd,IAAA,OAAO,+BAA+B,MAAM;AAC1C,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,iBAAiB,CAAA;AAC9C,MAAA,IAAI,CAAC,OAAA,IAAW,gBAAA,OAAuB,OAAA,CAAQ,OAAA,CAAQ,SAAS,OAAO,KAAA;AACvE,MAAA,IAAI,YAAY,OAAA,EAAS;AACvB,QAAA,WAAA,CAAY,EAAE,CAAA;AACd,QAAA,UAAA,CAAW,UAAU,CAAA;AACrB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,QAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,QAAA,UAAA,CAAW,cAAc,CAAA;AACzB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,GAAA,GAAM,6FAAA;AACZ,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAe;AAC/B,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,MAAA;AAClC,IAAA,OAAO,MAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,WAAU,sBAAA,EAC3B,QAAA,EAAA;AAAA,oBAAAA,KAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,aAAA,CAAc,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,UACpC,SAAA,EAAW,GAAA,IAAO,UAAA,GAAa,cAAA,GAAiB,EAAA,CAAA;AAAA,UAChD,KAAA,EAAM,yBAAA;AAAA,UACN,QAAA,EAAU,OAAO,MAAA,KAAW,CAAA;AAAA,UAE5B,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,sMAAA,EAAuM,CAAA,EAAE,CAAA;AAAA,YAAM,SAAA;AAAA,YACjW,OAAO,MAAA,GAAS,CAAA,oBAAKD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EAAgB,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cAAE,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAAA,cAAO,GAAA;AAAA,cAAE,MAAA,CAAO,MAAA;AAAA,cAAO;AAAA,aAAA,EAAC;AAAA;AAAA;AAAA,OACvH;AAAA,sBACAC,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,YAAY,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA,EAAG,WAAW,GAAA,EAAK,KAAA,EAAM,iBAAA,EACjE,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,IAAA,EAAK,QAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAAE,sMAAA,EAAuM,GAAE,CAAA,EACrW,CAAA;AAAA,sBACAD,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,iBAAA,CAAkB,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,UACxC,SAAA,EAAW,GAAA,IAAO,cAAA,GAAiB,cAAA,GAAiB,EAAA,CAAA;AAAA,UACpD,KAAA,EAAO,iBAAiB,sBAAA,GAAyB,iFAAA;AAAA,UAEjD,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC9F,QAAA,EAAA;AAAA,8BAAAC,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,qEAAA,EAAsE,CAAA;AAAA,8BAC3HA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,kBAAA,EAAmB;AAAA,aAAA,EAC1E,CAAA;AAAA,YAAM;AAAA;AAAA;AAAA,OAER;AAAA,MACC,cAAA,oBACCD,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAF,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iGAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,cAAA,CAAe,MAAM,CAAA;AAAA,cACpC,SAAA,EAAW,CAAA,uBAAA,EAA0B,WAAA,KAAgB,MAAA,GAAS,6BAA6B,yCAAyC,CAAA,CAAA;AAAA,cACpI,KAAA,EAAM,uGAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,cAAA,CAAe,YAAY,CAAA;AAAA,cAC1C,SAAA,EAAW,CAAA,uBAAA,EAA0B,WAAA,KAAgB,YAAA,GAAe,6BAA6B,yCAAyC,CAAA,CAAA;AAAA,cAC1I,KAAA,EAAM,8FAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,cAAA,CAAe,UAAU,CAAA;AAAA,cACxC,SAAA,EAAW,CAAA,uBAAA,EAA0B,WAAA,KAAgB,UAAA,GAAa,6BAA6B,yCAAyC,CAAA,CAAA;AAAA,cACxI,KAAA,EAAM,0FAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,cAAA,CAAe,OAAO,CAAA;AAAA,cACrC,SAAA,EAAW,CAAA,uBAAA,EAA0B,WAAA,KAAgB,OAAA,GAAU,6BAA6B,yCAAyC,CAAA,CAAA;AAAA,cACrI,KAAA,EAAM,kFAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF,CAAA;AAAA,QAAA,CAME,WAAA,KAAgB,gBAAgB,WAAA,KAAgB,UAAA,qBAChDD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,SAAA;AAAA,cACV,IAAA,EAAK,KAAA;AAAA,cACL,KAAA,EAAO,iBAAA;AAAA,cACP,WAAA,EAAa,WAAA,KAAgB,YAAA,GAAe,aAAA,GAAW,aAAA;AAAA,cACvD,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,MAAM,GAAA,GAAM,EAAE,MAAA,CAAO,KAAA;AACrB,gBAAA,oBAAA,CAAqB,GAAG,CAAA;AACxB,gBAAA,IAAI,GAAA,CAAI,IAAA,EAAK,KAAM,EAAA,sBAAwB,IAAI,CAAA;AAAA,qBAC1C;AACH,kBAAA,MAAM,CAAA,GAAI,WAAW,GAAG,CAAA;AACxB,kBAAA,mBAAA,CAAoB,OAAO,QAAA,CAAS,CAAC,KAAK,CAAA,KAAM,CAAA,GAAI,IAAI,IAAI,CAAA;AAAA,gBAC9D;AAAA,cACF,CAAA;AAAA,cACA,SAAA,EAAU,wIAAA;AAAA,cACV,KAAA,EAAM;AAAA;AAAA,WACR;AAAA,UACC,gBAAA,KAAqB,wBACpBA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAS,MAAM;AAAE,gBAAA,mBAAA,CAAoB,IAAI,CAAA;AAAG,gBAAA,oBAAA,CAAqB,EAAE,CAAA;AAAA,cAAG,CAAA;AAAA,cACtE,SAAA,EAAU,oDAAA;AAAA,cACV,KAAA,EAAM,sBAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EAEJ;AAAA,OAAA,EAEJ,CAAA;AAAA,MAED,cAAA,IAAkB,eAAA,KAAoB,IAAA,oBACrCD,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,+HAAA;AAAA,UACV,OACE,eAAA,KAAoB,YAAA,GAAe,CAAA,2DAAA,EAAyD,WAAA,KAAgB,SAAS,qCAAA,GAAmC,EAAE,CAAA,CAAA,GACxJ,eAAA,KAAoB,aAAa,CAAA,yDAAA,EAAuD,WAAA,KAAgB,MAAA,GAAS,qCAAA,GAAmC,EAAE,CAAA,CAAA,GACtJ,sDAAA;AAAA,UAGH,QAAA,EAAA;AAAA,YAAA,qBAAA,CAAsB,eAAe,CAAA;AAAA,YACrC,eAAA,KAAoB,YAAA,GAAe,SAAA,GAChC,eAAA,KAAoB,aAAa,SAAA,GACjC;AAAA;AAAA;AAAA,OACN;AAAA,sBAEFC,IAAC,QAAA,EAAA,EAAO,OAAA,EAAS,iBAAiB,SAAA,EAAW,GAAA,EAAK,KAAA,EAAM,qBAAA,EAAsB,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,sBACjFD,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,UAAA,IAAc,qBAAA,EAAuB,WAAW,GAAA,EAC/D,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,0GAAA,EAA2G,CAAA,EAAE,CAAA;AAAA,QAAM;AAAA,OAAA,EAE/Q,CAAA;AAAA,MACC,2BACCD,IAAAA,CAAC,YAAO,OAAA,EAAS,OAAA,EAAS,WAAW,GAAA,EACnC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,wPAAA,EAAyP,CAAA,EAAE,CAAA;AAAA,QAAM;AAAA,OAAA,EAE7Z;AAAA,KAAA,EAEJ,CAAA;AAAA,oBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAIb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAO,EAAG,CAAA;AAAA,MAEjE,UAAA,IAAc,OAAO,MAAA,GAAS,CAAA,oBAC7BD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0IAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mFAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BAClDD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,YAAO,OAAA,EAAS,MAAM,aAAa,IAAI,CAAA,EAAG,SAAA,EAAU,uDAAA,EAAwD,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,4BAChHA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAa,KAAK,CAAA,EAAG,SAAA,EAAU,uDAAA,EAAwD,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,4BAClHA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA,EAAG,SAAA,EAAU,uDAAA,EAAwD,KAAA,EAAM,OAAA,EAAQ,QAAA,EAAA,MAAA,EAAC;AAAA,WAAA,EAChI;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACZ,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,qBACVD,IAAAA,CAAC,OAAA,EAAA,EAAmB,SAAA,EAAU,oEAAA,EAC5B,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,SAAS,CAAA,CAAE,OAAA;AAAA,cACX,QAAA,EAAU,MAAM,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA;AAAA,cAClC,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,iEAAA;AAAA,cACV,OAAO,EAAE,UAAA,EAAY,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA;AAAE;AAAA,WACzC;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,KAAA,EAAO,CAAA,CAAE,WAAA,EAAc,QAAA,EAAA,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,IAAA,EAAK;AAAA,SAAA,EAAA,EAX9E,CAAA,CAAE,IAYd,CACD,CAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,MAGD,QAAA,IAAY,CAAC,OAAA,IAAW,CAAC,yBACxBD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uKAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,mIAAA,EAAoI,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAExS,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACjCD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,8FAAA,EAA+F,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAEnQ,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACjCA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,wBAClBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACjCD,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,UAAA,OAAA;AAAA,0BAAKC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA0B,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,UAAO,KAAA;AAAA,0BAAGA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA0B,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,UAAO;AAAA,SAAA,EAAW;AAAA,OAAA,EAClI,CAAA;AAAA,MAGD,2BACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uFAAsF,QAAA,EAAA,uBAAA,EAAgB,CAAA;AAAA,MAEtH,yBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAA2F,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EAEpH,CAAA;AAAA,oBAKAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACZ,QAAA,EAAA;AAAA,MAAA,OAAA,oBACCC,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0DAAA,EAA2D,KAAA,EAAO,SAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,sBAErGD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+DAAA,EAAgE,QAAA,EAAA,GAAA,EAAI,CAAA;AAAA,wBACpFA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,WAAA;AAAA,YACL,KAAA,EAAO,QAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC3C,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,cAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,cACrB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC7B,gBAAA,IAAI,QAAA,EAAU;AAGZ,kBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,kBAAA,WAAA,CAAY,EAAE,CAAA;AACd,kBAAA,UAAA,CAAW,UAAU,CAAA;AAAA,gBACvB,CAAA,MAAO;AACL,kBAAC,CAAA,CAAE,OAA4B,IAAA,EAAK;AAAA,gBACtC;AAAA,cACF;AAAA,YACF,CAAA;AAAA,YACA,WAAA,EAAY,yDAAA;AAAA,YACZ,UAAA,EAAY,KAAA;AAAA,YACZ,YAAA,EAAa,KAAA;AAAA,YACb,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAaA,IAAM,iBAAA,GAAoB,4DAAA;AAU1B,SAAS,SAAA,CAAU,IAAA,EAAW,KAAA,GAAQ,CAAA,EAAa;AACjD,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,IAAA,CAAK,KAAA,IAAQ,IAAK,CAAA;AAAA,IACtB,MAAM,IAAA,CAAK,OAAA,IAAU,KAAM,KAAA,KAAU,IAAI,MAAA,GAAS,MAAA,CAAA;AAAA,IAClD,UAAA,EAAY,CAAC,CAAC,IAAA,CAAK,UAAA,IAAa;AAAA,IAChC,WAAA,EAAa,IAAA,CAAK,cAAA,IAAiB,IAAK,EAAC;AAAA,IACzC,QAAA,EAAA,CAAW,IAAA,CAAK,aAAA,IAAgB,IAAK,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,SAAA,CAAU,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAC;AAAA,GAClF;AACF;AAGA,SAAS,cAAA,CAAe,MAAgB,GAAA,EAAkB;AACxD,EAAA,GAAA,CAAI,GAAA,CAAI,KAAK,EAAE,CAAA;AACf,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,EAAU,cAAA,CAAe,GAAG,GAAG,CAAA;AACtD;AAGA,SAAS,QAAA,CAAS,IAAS,GAAA,EAAa;AACtC,EAAA,MAAM,CAAA,GAAI,oBAAA,CAAqB,IAAA,CAAK,GAAG,CAAA;AACvC,EAAA,MAAM,IAAI,CAAA,GAAI,QAAA,CAAS,EAAE,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AACnC,EAAA,OAAO,IAAI,EAAA,CAAG,QAAA,CAAU,CAAA,IAAK,EAAA,GAAM,KAAO,CAAA,IAAK,CAAA,GAAK,GAAA,EAAM,CAAA,GAAI,GAAI,CAAA;AACpE;AASA,SAAS,sBAAsB,EAAA,EAAoB;AAGjD,EAAA,IAAI,EAAA,IAAM,KAAM,OAAO,CAAA,EAAA,CAAI,KAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAChD,EAAA,OAAO,CAAA,EAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AACzB;AAEA,SAAS,UAAU,EAAE,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,SAAQ,EAAmB;AACzE,EAAA,MAAM,YAAA,GAAeJ,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,SAAA,GAAYA,OAAY,IAAI,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQA,OAAY,IAAI,CAAA;AAC9B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIE,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,IAAI,CAAA;AAG7C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAA0B,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA,CAAkC,EAAE,CAAA;AACpE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,IAAIA,QAAAA,iBAAsB,IAAI,KAAK,CAAA;AAG3D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,SAAS,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,SAAS,CAAA;AACpD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAS,CAAC,CAAA;AAGpD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AAItD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,KAAK,CAAA;AAGpD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAA0B,GAAG,CAAA;AACnE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAS,GAAG,CAAA;AAC1D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,CAAC,CAAA;AASlD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAA2B,OAAO,CAAA;AACxE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC1E,EAAA,MAAM,UAAA,GAAaF,OAOT,IAAI,CAAA;AAKd,EAAA,MAAM,UAAA,GAAaA,OAMT,IAAI,CAAA;AAGd,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,MAAA,GAAc,IAAA;AAClB,IAAA,IAAI,cAAA,GAAwC,IAAA;AAC5C,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,SAAA,iBAAU,IAAI,KAAK,CAAA;AAEnB,IAAA,CAAC,YAAY;AACX,MAAA,IAAI,EAAA;AACJ,MAAA,IAAI;AACF,QAAA,EAAA,GAAK,MAAM,OAAO,kBAAkB,CAAA;AAAA,MACtC,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,kFAAkF,CAAA;AAC3F,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AACA,QAAA;AAAA,MACF;AACA,MAAA,KAAA,CAAM,OAAA,GAAU,EAAA;AAChB,MAAA,IAAI,SAAA,IAAa,CAAC,YAAA,CAAa,OAAA,EAAS;AAIxC,MAAA,MAAM,IAAI,QAAc,CAAA,OAAA,KAAW;AACjC,QAAA,MAAM,WAAW,MAAM;AACrB,UAAA,MAAM,CAAA,GAAI,YAAA,CAAa,OAAA,EAAS,qBAAA,EAAsB;AACtD,UAAA,IAAI,KAAK,CAAA,CAAE,KAAA,GAAQ,KAAK,CAAA,CAAE,MAAA,GAAS,GAAG,OAAA,EAAQ;AAAA,qCACnB,QAAQ,CAAA;AAAA,QACrC,CAAA;AACA,QAAA,QAAA,EAAS;AAAA,MACX,CAAC,CAAA;AACD,MAAA,IAAI,SAAA,IAAa,CAAC,YAAA,CAAa,OAAA,EAAS;AAExC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAY,OAAO,MAAA,KAAW,WAAA,IAAgB,OAAe,4BAAA,IAC9D,iBAAA;AACL,QAAA,EAAA,CAAG,yBAAyB,QAAQ,CAAA;AAKpC,QAAA,6BAAA,EAA8B;AAE9B,QAAA,MAAA,GAAS,IAAI,EAAA,CAAG,cAAA,CAAe,YAAA,CAAa,OAAA,EAAS;AAAA,UACnD,iBAAiB,IAAI,EAAA,CAAG,UAAU,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAAA,UACpD,cAAc,IAAI,EAAA,CAAG,QAAA,CAAS,GAAA,EAAK,KAAK,GAAG,CAAA;AAAA,UAC3C,YAAA,EAAc,IAAI,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,IAAI,EAAA,CAAG,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,UACnE,eAAe,MAAM;AACnB,YAAA,IAAI,SAAA,EAAW;AACf,YAAA,IAAI;AACF,cAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,IAAW;AAChC,cAAA,MAAM,IAAA,GAAO,OAAO,WAAA,IAAc;AAClC,cAAA,IAAI,IAAA,EAAM;AACR,gBAAA,MAAM,CAAA,GAAI,UAAU,IAAI,CAAA;AACxB,gBAAA,OAAA,CAAQ,CAAC,CAAA;AAET,gBAAA,MAAM,YAAqC,EAAE,CAAC,CAAA,CAAE,EAAE,GAAG,IAAA,EAAK;AAC1D,gBAAA,KAAA,MAAW,KAAK,CAAA,CAAE,QAAA,EAAU,SAAA,CAAU,CAAA,CAAE,EAAE,CAAA,GAAI,IAAA;AAC9C,gBAAA,WAAA,CAAY,SAAS,CAAA;AAAA,cACvB;AAAA,YACF,SAAS,GAAA,EAAK;AAEZ,cAAA,OAAA,CAAQ,IAAA,CAAK,yCAAyC,GAAG,CAAA;AAAA,YAC3D;AACA,YAAA,UAAA,CAAW,KAAK,CAAA;AAAA,UAClB,CAAA;AAAA,UACA,mBAAmB,MAAM;AACvB,YAAA,IAAI,CAAC,SAAA,EAAW;AACd,cAAA,QAAA,CAAS,0BAA0B,CAAA;AACnC,cAAA,UAAA,CAAW,KAAK,CAAA;AAAA,YAClB;AAAA,UACF;AAAA,SACD,CAAA;AACD,QAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAEpB,QAAA,MAAM,SAAA,GAAY,IAAI,EAAA,CAAG,SAAA,CAAU,UAAU,EAAA,CAAG,UAAA,CAAW,KAAK,GAAG,CAAA;AACnE,QAAA,MAAA,CAAO,uBAAA,CAAwB,CAAC,SAAS,CAAC,CAAA;AAO1C,QAAA,IAAI,YAAA,CAAa,OAAA,IAAW,OAAO,cAAA,KAAmB,WAAA,EAAa;AACjE,UAAA,cAAA,GAAiB,IAAI,eAAe,MAAM;AACxC,YAAA,IAAI;AACF,cAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,cAAA,IAAI,CAAA,EAAG,MAAA,EAAoB,CAAA,CAAE,MAAA,EAAO;AAAA,mBAAA,IAC3B,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAQ,CAAA,CAAE,OAAO,MAAA,EAAO;AAC5C,cAAA,CAAA,EAAG,QAAQ,MAAA,IAAS;AAAA,YACtB,CAAA,CAAA,MAAQ;AAAA,YAAC;AAAA,UACX,CAAC,CAAA;AACD,UAAA,cAAA,CAAe,OAAA,CAAQ,aAAa,OAAO,CAAA;AAAA,QAC7C;AAAA,MACF,SAAS,CAAA,EAAQ;AACf,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,CAAA,EAAG,WAAW,0BAA0B,CAAA;AACjD,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,IAAI;AAAE,QAAA,cAAA,EAAgB,UAAA,EAAW;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAC7C,MAAA,IAAI;AAAE,QAAA,MAAA,EAAQ,OAAA,IAAU;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AACpC,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,QAAQ,CAAC,CAAA;AAKlB,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,GAAG,MAAA,EAAQ;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAc;AAC3B,QAAA,IAAI,IAAA,CAAK,UAAU,eAAA,EAAiB;AACpC,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,QAAA,EAAU,oBAAA,IAAwB,IAAA,CAAK,QAAA;AACvD,QAAA,MAAM,MAAA,GAA6B,EAAA,EAAI,EAAA,EAAI,MAAA,IAAU,EAAA,EAAI,MAAA;AACzD,QAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,UAAA,IAAA,CAAK,OAAA,GAAU,CAAC,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAAA,QACnC;AAAA,MACF,CAAA;AACA,MAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,uBAAA,GAA0B,KAAK,CAAA;AACnD,MAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,cAAA,GAAiB,KAAK,CAAA;AAC1C,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,SAAS,GAAA,EAAK;AAEZ,MAAA,OAAA,CAAQ,IAAA,CAAK,sCAAsC,GAAG,CAAA;AAAA,IACxD;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAI,CAAC,CAAA;AAGjB,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,CAAA,EAAG,MAAA,EAAQ;AACvB,IAAA,IAAI;AACF,MAAA,CAAA,CAAE,MAAA,CAAO,eAAA,CAAgB,IAAI,EAAA,CAAG,YAAA,CAAa,SAAA,EAAW,QAAA,CAAS,EAAA,EAAI,SAAS,CAAA,EAAG,aAAa,CAAC,CAAA;AAS/F,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAA,EAAG;AACL,QAAA,MAAM,cAAqB,EAAC;AAC5B,QAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,cAAA,GAAiB,CAAC,IAAA,KAAc;AAClD,UAAA,IAAI,IAAA,CAAK,QAAA,EAAU,eAAA,EAAiB,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,QAC3D,CAAC,CAAA;AACD,QAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,UAAA,CAAA,CAAE,MAAA,EAAQ,OAAO,CAAC,CAAA;AAClB,UAAA,CAAA,CAAE,UAAU,OAAA,IAAU;AACtB,UAAA,CAAA,CAAE,UAAU,OAAA,IAAU;AAAA,QACxB;AACA,QAAA,MAAM,QAAQ,CAAA,CAAE,KAAA;AAChB,QAAA,MAAM,YAAA,GAAe,CAAC,GAAA,KAAa;AACjC,UAAA,IAAI,CAAC,GAAA,IAAO,CAAA,CAAE,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AACtC,UAAA,CAAA,CAAE,aAAA,CAAc,GAAA,CAAI,GAAA,EAAK,EAAE,cAAA,EAAgB,IAAI,cAAA,EAAgB,WAAA,EAAa,GAAA,CAAI,WAAA,EAAa,CAAA;AAC7F,UAAA,GAAA,CAAI,cAAA,GAAiB,CAAC,KAAK,CAAA;AAC3B,UAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,UAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAAA,QACpB,CAAA;AACA,QAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,cAAA,GAAiB,CAAC,IAAA,KAAc;AAClD,UAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,UAAA,IAAI,KAAA,CAAM,QAAQ,GAAG,CAAA,aAAc,CAAA,IAAK,GAAA,eAAkB,CAAC,CAAA;AAAA,4BACzC,GAAG,CAAA;AAAA,QACvB,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA,EAAG,CAAC,SAAA,EAAW,SAAA,EAAW,aAAa,CAAC,CAAA;AAGxC,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,CAAA,EAAG,MAAA,EAAQ;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,EAAA,EAAI,OAAO,CAAA;AAC9B,MAAA,CAAA,CAAE,MAAA,CAAO,kBAAA,CAAmB,IAAI,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAC,CAAA;AAChE,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAcZ,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAA,IAAU,OAAA,EAAS;AAE3B,IAAA,MAAM,QAAA,GAAW,EAAE,MAAA,CAAO,QAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,KAAA;AACvB,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,KAAA,EAAO;AAGzB,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,CAAA,CAAE,aAAA,CAAc,SAAQ,EAAG;AACnD,QAAA,GAAA,CAAI,iBAAiB,IAAA,CAAK,cAAA;AAC1B,QAAA,GAAA,CAAI,cAAc,IAAA,CAAK,WAAA;AACvB,QAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAAA,MACpB;AACA,MAAA,KAAA,MAAW,MAAA,IAAU,EAAE,OAAA,EAAS;AAC9B,QAAA,MAAA,CAAO,MAAA,EAAQ,OAAO,MAAM,CAAA;AAE5B,QAAA,MAAA,CAAO,UAAU,OAAA,IAAU;AAAA,MAC7B;AACA,MAAA,IAAI,EAAE,OAAA,EAAS;AACb,QAAA,KAAA,CAAM,MAAA,CAAO,EAAE,OAAO,CAAA;AACtB,QAAA,CAAA,CAAE,OAAA,CAAQ,UAAU,OAAA,IAAU;AAC9B,QAAA,CAAA,CAAE,OAAA,CAAQ,UAAU,OAAA,IAAU;AAAA,MAChC;AACA,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IACvB;AAEA,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,QAAA,CAAS,oBAAA,GAAuB,KAAA;AAChC,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,cAAA,GAAiB,MAAM,IAAI,CAAA;AACjD,IAAA,IAAI,CAAC,IAAA,EAAM;AAGX,IAAA,MAAM,UAAiB,EAAC;AACxB,IAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,eAAA,GAAkB,CAAC,IAAA,KAAc;AACnD,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,eAAA,EAAiB,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IACxD,CAAC,CAAA;AACD,IAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,MAAA,QAAA,CAAS,oBAAA,GAAuB,KAAA;AAChC,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAClB,MAAA;AAAA,IACF;AAIA,IAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,IAAA,MAAM,OAAO,MAAA,CAAO,WAAA;AACpB,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,EAAU,WAAA;AAClC,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,EAAU,WAAA;AAClC,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,EAAU,UAAA,EAAY,QAAA,EAAU,WAAA;AAC1D,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,YAAY,CAAC,QAAA,IAAY,CAAC,UAAA,EAAY;AAGlD,MAAA,OAAA,CAAQ,KAAK,uEAAuE,CAAA;AAAA,IACtF;AAGA,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,QAAA,GAAW,CAAA,EAAG,UAAA,GAAa,CAAA;AAChD,IAAA,MAAM,iBAAA,GAAoB,KAAK,mBAAA,GAAsB,GAAA;AACrD,IAAA,MAAM,sBAAA,GAAyB,MAAM,sBAAA,GAAyB,IAAA;AAC9D,IAAA,MAAM,gBAAA,GAAmB,IAAA;AAMzB,IAAA,IAAI,UAAA,GAAa,IAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,SAAS,UAAA,IAAa;AACjC,MAAA,MAAM,KAAA,GAAQ,IAAI,oBAAA,IAAuB;AACzC,MAAA,UAAA,GAAa,OAAO,OAAA,KAAY,KAAA;AAIhC,MAAA,QAAA,CAAS,gBAAA,GAAmB,IAAA;AAE5B,MAAA,OAAA,CAAQ,IAAA,CAAK,qCAAA,EAAuC,UAAA,EAAY,WAAA,EAAa,QAAQ,MAAM,CAAA;AAAA,IAC7F,CAAA,CAAA,MAAQ;AAAA,IAAC;AAOT,IAAA,QAAA,CAAS,oBAAA,GAAuB,IAAA;AAYhC,IAAA,MAAM,KAAA,GAAa;AAAA,MACjB,QAAQ,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC5B,QAAA,EAAU;AAAA,KACZ;AACA,IAAA,KAAA,CAAM,KAAA,GAAQ,SAAS,UAAA,GAAsB;AAC3C,MAAA,MAAM,CAAA,GAAS;AAAA,QACb,MAAA,EAAQ,EAAE,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAE;AAAA,QAC/D,UAAU,IAAA,CAAK;AAAA,OACjB;AACA,MAAA,CAAA,CAAE,KAAA,GAAQ,UAAA;AACV,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,UAAiB,EAAC;AACxB,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoD;AAE9E,IAAA,MAAM,eAAA,GAAkB,CAAC,GAAA,KAAa;AACpC,MAAA,IAAI,CAAC,GAAA,IAAO,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AACpC,MAAA,aAAA,CAAc,GAAA,CAAI,KAAK,EAAE,cAAA,EAAgB,IAAI,cAAA,EAAgB,WAAA,EAAa,GAAA,CAAI,WAAA,EAAa,CAAA;AAC3F,MAAA,GAAA,CAAI,cAAA,GAAiB,CAAC,KAAK,CAAA;AAC3B,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAAA,IACpB,CAAA;AAEA,IAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,MAAA,IAAI,KAAA,CAAM,QAAQ,GAAG,CAAA,aAAc,CAAA,IAAK,GAAA,kBAAqB,CAAC,CAAA;AAAA,2BACzC,GAAG,CAAA;AASxB,MAAA,MAAMK,aAAY,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA;AAChD,MAAA,IAAI,IAAA,IAAQ,UAAA,IAAcA,UAAAA,EAAW,KAAA,EAAO;AAC1C,QAAA,MAAM,WAAA,GAAc,CAAC,IAAA,EAAc,EAAA,KAAe;AAChD,UAAA,MAAM,CAAA,GAASA,WAAU,KAAA,EAAM;AAC/B,UAAA,CAAA,CAAE,UAAA,GAAa,KAAA;AACf,UAAA,CAAA,CAAE,SAAA,GAAY,KAAA;AACd,UAAA,CAAA,CAAE,UAAA,GAAa,KAAA;AACf,UAAA,CAAA,CAAE,YAAA,GAAe,IAAA;AACjB,UAAA,CAAA,CAAE,WAAA,GAAc,iBAAA;AAChB,UAAA,CAAA,CAAE,WAAA,GAAc,EAAA;AAChB,UAAA,CAAA,CAAE,YAAA,GAAe,EAAA;AACjB,UAAA,CAAA,CAAE,YAAA,GAAe,EAAA;AACjB,UAAA,CAAA,CAAE,IAAA,GAAO,IAAA;AACT,UAAA,CAAA,CAAE,WAAA,GAAc,KAAA;AAChB,UAAA,CAAA,CAAE,cAAA,GAAiB,CAAC,KAAK,CAAA;AACzB,UAAA,CAAA,CAAE,WAAA,GAAc,IAAA;AAChB,UAAA,CAAA,CAAE,WAAA,GAAc,IAAA;AAChB,UAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,IAAA,CAAK,UAAU,CAAC,CAAA;AACxC,UAAA,MAAA,CAAO,gBAAA,GAAmB,KAAA;AAC1B,UAAA,MAAA,CAAO,WAAA,GAAc,CAAA;AACrB,UAAA,MAAA,CAAO,SAAS,eAAA,GAAkB,IAAA;AAClC,UAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,UAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,QACrB,CAAA;AACA,QAAA,WAAA,CAAY,UAAU,sBAAsB,CAAA;AAC5C,QAAA,WAAA,CAAY,WAAW,sBAAsB,CAAA;AAAA,MAC/C;AAAA,IACF;AAGA,IAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,cAAA,GAAiB,CAAC,IAAA,KAAc;AAClD,MAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,MAAA,IAAI,KAAA,CAAM,QAAQ,GAAG,CAAA,aAAc,CAAA,IAAK,GAAA,kBAAqB,CAAC,CAAA;AAAA,2BACzC,GAAG,CAAA;AAAA,IAC1B,CAAC,CAAA;AAOD,IAAA,IAAI,OAAA,GAAe,IAAA;AACnB,IAAA,MAAM,SAAA,GAAa,QAAQ,CAAC,CAAA,EAAG,aAAa,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAE,QAAQ,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,QAAA,CAAA;AACrH,IAAA,IAAI,UAAA,IAAc,IAAA,IAAQ,QAAA,IAAY,UAAA,IAAc,WAAW,KAAA,EAAO;AACpE,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA;AACjC,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,CAAC,CAAA,GAAI,CAAA;AAC1C,MAAA,MAAM,OAAO,OAAA,GAAU,CAAA;AAEvB,MAAA,MAAM,OAAA,GAAe,IAAI,QAAA,EAAS;AAClC,MAAA,MAAM,SAAA,GAAY,IAAI,YAAA,CAAa;AAAA,QACjC,CAAC,IAAA;AAAA,QAAM,CAAC,IAAA;AAAA,QAAM,CAAA;AAAA,QACb,IAAA;AAAA,QAAM,CAAC,IAAA;AAAA,QAAM,CAAA;AAAA,QACb,IAAA;AAAA,QAAO,IAAA;AAAA,QAAM,CAAA;AAAA,QACd,CAAC,IAAA;AAAA,QAAO,IAAA;AAAA,QAAM;AAAA,OACf,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa;AAAA,QAC/B,CAAA;AAAA,QAAG,CAAA;AAAA,QAAG,CAAA;AAAA,QAAI,CAAA;AAAA,QAAG,CAAA;AAAA,QAAG,CAAA;AAAA,QAAI,CAAA;AAAA,QAAG,CAAA;AAAA,QAAG,CAAA;AAAA,QAAI,CAAA;AAAA,QAAG,CAAA;AAAA,QAAG;AAAA,OACrC,CAAA;AACD,MAAA,OAAA,CAAQ,aAAa,UAAA,EAAY,IAAI,UAAA,CAAW,SAAA,EAAW,CAAC,CAAC,CAAA;AAC7D,MAAA,OAAA,CAAQ,aAAa,QAAA,EAAU,IAAI,UAAA,CAAW,OAAA,EAAS,CAAC,CAAC,CAAA;AACzD,MAAA,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAEnC,MAAA,MAAM,MAAA,GAAc,UAAU,KAAA,EAAM;AAOpC,MAAA,MAAM,cAAA,GAAkB,SAAA,CAAU,KAAA,EAAO,MAAA,IAAS,IAAK,QAAA;AACvD,MAAA,MAAA,CAAO,QAAA,EAAU,SAAS,cAAc,CAAA;AACxC,MAAA,IAAI,mBAAA,IAAuB,MAAA,EAAQ,MAAA,CAAO,iBAAA,GAAoB,IAAA;AAC9D,MAAA,MAAA,CAAO,IAAA,GAAO,UAAA;AACd,MAAA,MAAA,CAAO,WAAA,GAAc,KAAA;AACrB,MAAA,MAAA,CAAO,OAAA,GAAU,CAAA;AACjB,MAAA,MAAA,CAAO,YAAA,GAAe,IAAA;AACtB,MAAA,MAAA,CAAO,UAAA,GAAa,CAAA;AACpB,MAAA,MAAA,CAAO,WAAA,GAAc,mBAAA;AACrB,MAAA,MAAA,CAAO,WAAA,GAAc,gBAAA;AACrB,MAAA,MAAA,CAAO,YAAA,GAAe,gBAAA;AACtB,MAAA,MAAA,CAAO,YAAA,GAAe,gBAAA;AAEtB,MAAA,MAAA,CAAO,iBAAiB,EAAC;AAGzB,MAAA,MAAA,CAAO,aAAA,GAAgB,IAAA;AACvB,MAAA,MAAA,CAAO,mBAAA,GAAsB,EAAA;AAC7B,MAAA,MAAA,CAAO,kBAAA,GAAqB,EAAA;AAC5B,MAAA,MAAA,CAAO,WAAA,GAAc,IAAA;AAErB,MAAA,OAAA,GAAU,IAAI,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AAClC,MAAA,OAAA,CAAQ,WAAA,GAAc,CAAA;AACtB,MAAA,OAAA,CAAQ,SAAS,eAAA,GAAkB,IAAA;AACnC,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB;AAEA,IAAA,UAAA,CAAW,UAAU,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,eAAe,IAAA,EAAK;AAEpE,IAAA,OAAA,CAAQ,KAAK,8BAAA,EAAgC,OAAA,CAAQ,QAAQ,OAAA,EAAS,CAAC,CAAC,OAAO,CAAA;AAC/E,IAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,EACpB,CAAA,EAAG,CAAC,cAAA,EAAgB,OAAA,EAAS,IAAI,CAAC,CAAA;AAGlC,EAAAL,UAAU,MAAM;AACd,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAA,IAAU,CAAC,CAAA,IAAK,CAAC,cAAA,EAAgB;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,MAAA,MAAM,UAAU,WAAA,KAAgB,GAAA,GAAM,CAAA,GAAI,WAAA,KAAgB,MAAM,CAAA,GAAI,CAAA;AACpE,MAAA,MAAM,GAAA,GAAM,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,CAAE,OAAO,CAAA;AACxD,MAAA,MAAM,GAAA,GAAM,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,CAAE,OAAO,CAAA;AACxD,MAAA,MAAM,CAAA,GAAI,GAAA,GAAA,CAAO,GAAA,GAAM,GAAA,IAAO,eAAA;AAM9B,MAAA,MAAM,MAAA,GAAK,YAAA,GAAe,IAAA,CAAK,EAAA,GAAM,GAAA;AACrC,MAAA,MAAM,SAAA,GAAO,KAAK,GAAA,CAAI,MAAC,GAAG,SAAA,GAAO,IAAA,CAAK,IAAI,MAAC,CAAA;AAC3C,MAAA,MAAM,IAAA,GAAO,cAAc,CAAA,CAAA,GAAK,CAAA;AAChC,MAAA,IAAI,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA;AASzB,MAAA,IAAI,gBAAgB,GAAA,EAAU;AAAE,QAAA,EAAA,GAAK,IAAA,GAAO,SAAA;AAAM,QAAA,EAAA,GAAK,IAAA,GAAO,SAAA;AAAA,MAAM,CAAA,MAAA,IAC3D,gBAAgB,GAAA,EAAK;AAAE,QAAA,EAAA,GAAK,IAAA,GAAO,SAAA;AAAM,QAAA,EAAA,GAAK,IAAA,GAAO,SAAA;AAAA,MAAM,CAAA,MACtC;AAAE,QAAA,EAAA,GAAK,IAAA,GAAO,SAAA;AAAM,QAAA,EAAA,GAAK,IAAA,GAAO,SAAA;AAAA,MAAM;AAMpE,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AAAA,QAC/B,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AAAA,QAC/B,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,IAAK;AAAA,OACjC;AACA,MAAA,MAAM,EAAA,GAAK,WAAA,KAAgB,GAAA,GAAM,CAAA,GAAI,MAAA,CAAO,CAAA;AAC5C,MAAA,MAAM,EAAA,GAAK,WAAA,KAAgB,GAAA,GAAM,CAAA,GAAI,MAAA,CAAO,CAAA;AAC5C,MAAA,MAAM,EAAA,GAAK,WAAA,KAAgB,GAAA,GAAM,CAAA,GAAI,MAAA,CAAO,CAAA;AAE5C,MAAA,CAAA,CAAE,KAAA,CAAM,OAAO,CAAA,GAAI,EAAA;AACnB,MAAA,CAAA,CAAE,KAAA,CAAM,OAAO,CAAA,GAAI,EAAA;AACnB,MAAA,CAAA,CAAE,KAAA,CAAM,OAAO,CAAA,GAAI,EAAA;AAGnB,MAAA,CAAA,CAAE,MAAM,QAAA,GAAW,EAAE,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,CAAA;AAI9C,MAAA,IAAI,EAAE,OAAA,EAAS;AACb,QAAA,MAAM,KAAK,MAAA,CAAO,CAAA,EAAG,KAAK,MAAA,CAAO,CAAA,EAAG,KAAK,MAAA,CAAO,CAAA;AAEhD,QAAA,MAAM,IAAA,GAAO,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,EAAE,KAAA,CAAM,QAAA;AACnD,QAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,IAAA;AACrB,QAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,IAAA;AACrB,QAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,IAAA;AACrB,QAAA,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AACjC,QAAA,CAAA,CAAE,QAAQ,MAAA,GAAS,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAAA,MAC9C;AAEA,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,SAAS,GAAA,EAAK;AAEZ,MAAA,OAAA,CAAQ,IAAA,CAAK,mCAAmC,GAAG,CAAA;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,cAAA,EAAgB,aAAa,WAAA,EAAa,eAAA,EAAiB,YAAY,CAAC,CAAA;AAqB5E,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAA,IAAU,OAAA,IAAW,CAAC,aAAa,OAAA,EAAS;AAEpD,IAAA,MAAM,QAAA,GAAW,EAAE,MAAA,CAAO,QAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,KAAA;AAMvB,IAAA,MAAM,SAAwC,QAAA,EAAU,UAAA;AACxD,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,KAAA,IAAS,CAAC,MAAA,EAAQ;AAIpC,IAAA,IAAI,UAAA,GAAkB,IAAA;AACtB,IAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,eAAA,GAAkB,CAAC,CAAA,KAAW;AAChD,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,CAAA,CAAE,QAAA,EAAU,mBAAmB,CAAC,CAAA,CAAE,QAAA,EAAU,eAAA,EAAiB,UAAA,GAAa,CAAA;AAAA,IAChG,CAAC,CAAA;AACD,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,WAAA,GAAc,WAAW,QAAA,CAAS,WAAA;AACxC,IAAA,MAAM,WAAW,UAAA,CAAW,WAAA;AAC5B,IAAA,MAAM,YAAA,GAAA,CAAgB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,GAAI,UAAA,CAAW,QAAA,CAAS,CAAC,CAAA,GAAI,UAAA,CAAW,QAAA,GAAW,WAAA;AAC1G,IAAA,MAAM,YAAA,GAAe,WAAW,QAAA,CAAS,WAAA;AACzC,IAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,QAAA,CAAS,UAAA,EAAY,QAAA,EAAU,WAAA;AACjE,IAAA,IAAI,CAAC,eAAe,CAAC,QAAA,IAAY,CAAC,YAAA,IAAgB,CAAC,YAAA,IAAgB,CAAC,cAAA,EAAgB;AAKpF,IAAA,IAAI,gBAAA,GAAwB,IAAA;AAC5B,IAAA,IAAI,qBAAA,GAA6B,IAAA;AACjC,IAAA,KAAA,CAAM,QAAA,CAAS,CAAC,GAAA,KAAa;AAC3B,MAAA,IAAI,oBAAoB,qBAAA,EAAuB;AAC/C,MAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AAC1B,MAAA,gBAAA,GAAmB,GAAA,CAAI,WAAA;AACvB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,IAAI,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,GAAI,GAAA,CAAI,QAAA;AAChE,MAAA,IAAI,GAAA,EAAK,WAAA,EAAa,qBAAA,GAAwB,GAAA,CAAI,WAAA;AAAA,IACpD,CAAC,CAAA;AAGD,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,CAAA,CAAE,KAAA,KAAU,IAAA,EAAM,oBAAA,CAAqB,EAAE,KAAK,CAAA;AAClD,MAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,QAAA,KAAA,CAAM,OAAO,CAAC,CAAA;AACd,QAAA,CAAA,CAAE,UAAU,OAAA,IAAU;AACtB,QAAA,CAAA,CAAE,UAAU,OAAA,IAAU;AAAA,MACxB;AACA,MAAA,IAAI,EAAE,IAAA,EAAM;AACV,QAAA,KAAA,CAAM,MAAA,CAAO,EAAE,IAAI,CAAA;AACnB,QAAA,CAAA,CAAE,IAAA,CAAK,UAAU,OAAA,IAAU;AAC3B,QAAA,CAAA,CAAE,IAAA,CAAK,UAAU,OAAA,IAAU;AAAA,MAC7B;AACA,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA,CAAM,aAAA,IAAiB,KAAA,CAAM,aAAA,CAAc,WAAA,CAAY,CAAA,CAAE,KAAK,CAAA;AAC/E,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,CAAA;AAEA,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,QAAA,EAAS;AACT,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA;AAAA,IACF;AAGA,IAAA,UAAA,CAAW,UAAU,EAAE,MAAA,EAAQ,EAAC,EAAG,SAAS,EAAC,EAAG,OAAA,EAAS,IAAI,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAK;AAMlG,IAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,IAAA,MAAM,gBAAA,GAAmB,EAAA,EAAI,gBAAA,EAAkB,QAAA,IAAY,CAAA;AAI3D,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,cAAA,GAAiB,MAAM,IAAI,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,OACT,IAAA,CAAK,IAAA;AAAA,MAAA,CACF,KAAK,GAAA,CAAI,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,KAAM,KAC5B,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAA,CAC5B,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,KAAM;AAAA,KAC/B,GACA,GAAA;AACJ,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,MAAO,GAAG,CAAA;AAE/C,IAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAe;AAEjC,MAAA,MAAM,SAAA,GAAY,IAAI,UAAA,GAAa,EAAA;AACnC,MAAA,MAAM,YAAsB,EAAC;AAC7B,MAAA,MAAM,UAAoB,EAAC;AAC3B,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,IAAM,UAAA,EAAY,EAAA,EAAA,EAAM;AACvC,QAAA,MAAMM,KAAI,EAAA,GAAK,UAAA;AACf,QAAA,MAAM,GAAA,GAAMA,KAAI,IAAA,CAAK,EAAA;AACrB,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,IAAM,SAAA,EAAW,EAAA,EAAA,EAAM;AACtC,UAAA,MAAM,IAAI,EAAA,GAAK,SAAA;AACf,UAAA,MAAM,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,CAAA;AAC5B,UAAA,SAAA,CAAU,IAAA;AAAA,YACR,eAAe,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,YAC7C,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAAA,YAC3B,eAAe,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,KAAK;AAAA,WAC/C;AAAA,QACF;AAAA,MACF;AACA,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,UAAA,EAAY,EAAA,EAAA,EAAM;AACtC,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,SAAA,EAAW,EAAA,EAAA,EAAM;AACrC,UAAA,MAAM,CAAA,GAAI,EAAA,IAAM,SAAA,GAAY,CAAA,CAAA,GAAK,EAAA;AACjC,UAAA,MAAM,CAAA,GAAI,IAAI,SAAA,GAAY,CAAA;AAC1B,UAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAAA,QAC3C;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAI,YAAA,EAAa;AAC9B,MAAA,IAAA,CAAK,YAAA,CAAa,YAAY,IAAI,cAAA,CAAe,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG,CAAC,CAAC,CAAA;AAChF,MAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AACrB,MAAA,IAAA,CAAK,oBAAA,IAAuB;AAC5B,MAAA,MAAM,GAAA,GAAW,IAAI,YAAA,EAAa;AAClC,MAAA,GAAA,CAAI,KAAA,EAAO,SAAS,QAAQ,CAAA;AAC5B,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,UAAA,GAAa,KAAA;AACjB,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,MAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AACd,MAAA,MAAM,IAAA,GAAY,IAAI,QAAA,CAAS,IAAA,EAAM,GAAG,CAAA;AACxC,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,KAAK,CAAA;AACxB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,SAAS,eAAA,GAAkB,IAAA;AAChC,MAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAcA,IAAA,MAAM,kBAAA,GAAqB,CAAC,IAAA,EAAW,GAAA,KAAyB;AAC9D,MAAA,MAAM,OAAO,IAAA,EAAM,QAAA;AACnB,MAAA,MAAM,OAAA,GAAU,MAAM,UAAA,EAAY,QAAA;AAClC,MAAA,IAAI,CAAC,QAAQ,CAAC,OAAA,IAAW,CAAC,GAAA,EAAK,IAAA,EAAM,QAAQ,OAAO,IAAA;AACpD,MAAA,MAAM,YAA+B,OAAA,CAAQ,KAAA;AAC7C,MAAA,MAAM,OAAA,GAAoC,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,MAAM,KAAA,GAAQ,IAAA;AAG1E,MAAA,MAAM,UAAA,GAAa,IAAI,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA;AACxE,MAAA,IAAA,CAAK,eAAe,UAAU,CAAA;AAC9B,MAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,MAAA;AAEpB,MAAA,MAAM,MAAA,GAAS,EAAE,EAAA,CAAG,CAAA,GAAI,UAAA,CAAW,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,UAAA,CAAW,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,UAAA,CAAW,CAAA,CAAA;AAI/E,MAAA,IAAA,CAAK,kBAAA,IAAqB;AAC1B,MAAA,MAAM,KAAK,IAAA,CAAK,WAAA;AAChB,MAAA,MAAMC,KAAAA,GAAO,EAAA,GACT,IAAA,CAAK,IAAA,CAAA,CAAM,EAAA,CAAG,IAAI,CAAA,GAAI,EAAA,CAAG,GAAA,CAAI,CAAA,KAAM,CAAA,GAAA,CAAK,EAAA,CAAG,IAAI,CAAA,GAAI,EAAA,CAAG,GAAA,CAAI,CAAA,KAAM,CAAA,GAAA,CAAK,EAAA,CAAG,GAAA,CAAI,CAAA,GAAI,EAAA,CAAG,GAAA,CAAI,CAAA,KAAM,CAAC,CAAA,GAC9F,GAAA;AACJ,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAIA,KAAAA,GAAO,MAAO,IAAK,CAAA;AAC9C,MAAA,MAAM,UAAA,GAAa,MAAA;AAEnB,MAAA,MAAM,WAAW,OAAA,GAAU,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,QAAQ,KAAA,GAAQ,CAAA;AAChE,MAAA,MAAM,UAAoB,EAAC;AAK3B,MAAA,MAAM,IAAA,GAAO,IAAI,WAAA,EAAY;AAE7B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,QAAA,MAAM,KAAK,OAAA,GAAU,OAAA,CAAQ,CAAA,GAAI,CAAC,IAAQ,CAAA,GAAI,CAAA;AAC9C,QAAA,MAAM,EAAA,GAAK,UAAU,OAAA,CAAQ,CAAA,GAAI,IAAI,CAAC,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAClD,QAAA,MAAM,EAAA,GAAK,UAAU,OAAA,CAAQ,CAAA,GAAI,IAAI,CAAC,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAClD,QAAA,MAAM,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,CAAC,GAAO,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,IAAI,CAAC,CAAA;AACvF,QAAA,MAAM,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,CAAC,GAAO,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,IAAI,CAAC,CAAA;AACvF,QAAA,MAAM,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,CAAC,GAAO,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,IAAI,CAAC,CAAA;AAEvF,QAAA,MAAM,KAAK,EAAA,GAAK,EAAA,EAAI,KAAK,EAAA,GAAK,EAAA,EAAI,KAAK,EAAA,GAAK,EAAA;AAC5C,QAAA,MAAM,KAAK,EAAA,GAAK,EAAA,EAAI,KAAK,EAAA,GAAK,EAAA,EAAI,KAAK,EAAA,GAAK,EAAA;AAC5C,QAAA,IAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AACxB,QAAA,IAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AACxB,QAAA,IAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AACxB,QAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAClD,QAAA,IAAI,SAAS,CAAA,EAAG;AAChB,QAAA,EAAA,IAAM,IAAA;AAAM,QAAA,EAAA,IAAM,IAAA;AAAM,QAAA,EAAA,IAAM,IAAA;AAG9B,QAAA,MAAM,IAAA,GAAO,KAAK,EAAA,CAAG,CAAA,GAAI,KAAK,EAAA,CAAG,CAAA,GAAI,KAAK,EAAA,CAAG,CAAA;AAC7C,QAAA,IAAI,OAAO,UAAA,EAAY;AAGvB,QAAA,MAAM,GAAA,GAAA,CAAO,EAAA,GAAK,EAAA,GAAK,EAAA,IAAM,CAAA,EAAG,GAAA,GAAA,CAAO,EAAA,GAAK,EAAA,GAAK,EAAA,IAAM,CAAA,EAAG,GAAA,GAAA,CAAO,EAAA,GAAK,KAAK,EAAA,IAAM,CAAA;AACjF,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,CAAA,GAAI,GAAA,GAAM,EAAA,CAAG,CAAA,GAAI,GAAA,GAAM,EAAA,CAAG,CAAA,GAAI,GAAA,GAAM,MAAM,CAAA;AACnE,QAAA,IAAI,OAAO,SAAA,EAAW;AAGtB,QAAA,KAAA,MAAW,CAAC,KAAK,GAAA,EAAK,GAAG,KAAK,CAAC,CAAC,IAAI,EAAA,EAAI,EAAE,GAAG,CAAC,EAAA,EAAI,IAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAC,CAAA,EAAG;AACxE,UAAA,IAAA,CAAK,GAAA,GAAM,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AACxB,UAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AACxB,UAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,QACrC;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEjC,MAAA,MAAM,KAAA,GAAQ,IAAI,YAAA,EAAa;AAC/B,MAAA,KAAA,CAAM,YAAA,CAAa,YAAY,IAAI,cAAA,CAAe,IAAI,YAAA,CAAa,OAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AAC/E,MAAA,KAAA,CAAM,oBAAA,IAAuB;AAE7B,MAAA,MAAM,IAAA,GAAY,IAAI,YAAA,EAAa;AACnC,MAAA,IAAA,CAAK,KAAA,EAAO,SAAS,QAAQ,CAAA;AAC7B,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,MAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAIlB,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA,IAAA,CAAK,mBAAA,GAAsB,EAAA;AAC3B,MAAA,IAAA,CAAK,kBAAA,GAAqB,EAAA;AAE1B,MAAA,MAAM,SAAA,GAAiB,IAAI,QAAA,CAAS,KAAA,EAAO,IAAI,CAAA;AAC/C,MAAA,SAAA,CAAU,WAAA,GAAc,IAAA;AACxB,MAAA,SAAA,CAAU,SAAS,eAAA,GAAkB,IAAA;AACrC,MAAA,KAAA,CAAM,IAAI,SAAS,CAAA;AACnB,MAAA,OAAO,SAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,CAAC,CAAA,EAAQ,CAAA,KAAW;AACnC,MAAA,MAAM,IAAA,GAAO,IAAI,YAAA,EAAa;AAC9B,MAAA,IAAA,CAAK,YAAA,CAAa,YAAY,IAAI,cAAA,CAAe,IAAI,YAAA,CAAa,CAAC,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAKrG,MAAA,MAAM,WAAW,gBAAA,IAAoB,QAAA;AACrC,MAAA,MAAM,cAAc,qBAAA,IAAyB,YAAA;AAC7C,MAAA,MAAM,GAAA,GAAW,IAAI,WAAA,CAAY,EAAE,OAAO,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAC3H,MAAA,MAAM,IAAA,GAAY,IAAI,QAAA,CAAS,IAAA,EAAM,GAAG,CAAA;AACxC,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,SAAS,eAAA,GAAkB,IAAA;AAChC,MAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA,CAAE,KAAA;AACtB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,MAAA,EAAA,CAAG,MAAM,QAAA,GAAW,UAAA;AAGpB,MAAA,EAAA,CAAG,MAAM,IAAA,GAAO,SAAA;AAChB,MAAA,EAAA,CAAG,MAAM,GAAA,GAAM,SAAA;AACf,MAAA,EAAA,CAAG,MAAM,SAAA,GAAY,uBAAA;AACrB,MAAA,EAAA,CAAG,MAAM,OAAA,GAAU,SAAA;AACnB,MAAA,EAAA,CAAG,MAAM,QAAA,GAAW,MAAA;AACpB,MAAA,EAAA,CAAG,MAAM,UAAA,GAAa,KAAA;AACtB,MAAA,EAAA,CAAG,MAAM,UAAA,GAAa,sCAAA;AACtB,MAAA,EAAA,CAAG,MAAM,UAAA,GAAa,yBAAA;AACtB,MAAA,EAAA,CAAG,MAAM,KAAA,GAAQ,MAAA;AACjB,MAAA,EAAA,CAAG,MAAM,YAAA,GAAe,KAAA;AACxB,MAAA,EAAA,CAAG,MAAM,aAAA,GAAgB,MAAA;AACzB,MAAA,EAAA,CAAG,MAAM,UAAA,GAAa,QAAA;AACtB,MAAA,EAAA,CAAG,MAAM,SAAA,GAAY,4BAAA;AACrB,MAAA,EAAA,CAAG,MAAM,MAAA,GAAS,GAAA;AAClB,MAAA,YAAA,CAAa,OAAA,CAAS,YAAY,EAAE,CAAA;AACpC,MAAA,CAAA,CAAE,KAAA,GAAQ,EAAA;AACV,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,KAAK,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA,IAAK,CAAC,EAAE,KAAA,EAAO;AAE3C,MAAA,MAAM,MAAA,GAAS,EAAE,MAAA,CAAO,MAAA;AACxB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,CAAC,GAAG,CAAA,GAAI,CAAA,CAAE,OAAO,CAAC,CAAA;AACrC,MAAA,MAAM,MAAM,IAAI,WAAA,CAAA,CAAa,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA,EAAA,CAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA,EAAA,CAAI,EAAE,CAAA,GAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAE7E,MAAA,MAAM,SAAA,GAAY,IAAI,KAAA,EAAM;AAC5B,MAAA,SAAA,CAAU,UAAU,MAAM,CAAA;AAC1B,MAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,MAAA,MAAM,CAAA,GAAA,CAAM,SAAA,CAAU,CAAA,GAAI,CAAA,IAAK,IAAK,IAAA,CAAK,KAAA;AACzC,MAAA,MAAM,KAAM,CAAC,SAAA,CAAU,CAAA,GAAI,CAAA,IAAK,IAAK,IAAA,CAAK,MAAA;AAC1C,MAAA,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AACzB,MAAA,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AAKxB,MAAA,MAAM,SAAA,GAAY,IAAI,CAAA,IAAK,CAAA,GAAI,KAAK,CAAA,GAAI,IAAA,CAAK,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,MAAA;AAC/D,MAAA,CAAA,CAAE,MAAM,KAAA,CAAM,OAAA,GAAW,UAAU,CAAA,GAAI,CAAA,IAAK,YAAa,GAAA,GAAM,GAAA;AAAA,IACjE,CAAA;AAKA,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,WAAA,EAAY;AACZ,MAAA,CAAA,CAAE,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AAAA,IACtC,CAAA;AACA,IAAA,UAAA,CAAW,OAAA,CAAQ,KAAA,GAAQ,qBAAA,CAAsB,IAAI,CAAA;AASrD,IAAA,MAAM,QAAA,GAAW,CAAA;AACjB,IAAA,MAAM,SAAA,GAAY,GAAA;AAClB,IAAA,IAAI,KAAA,GAAQ,GAAG,KAAA,GAAQ,CAAA,EAAG,WAAW,CAAA,EAAG,QAAA,GAAW,OAAO,UAAA,GAAa,KAAA;AAMvE,IAAA,MAAM,kBAAA,GAAqB,CAAC,GAAA,KAAyD;AACnF,MAAA,MAAM,EAAA,GAAK,KAAK,IAAA,EAAM,MAAA;AACtB,MAAA,MAAM,MAAM,GAAA,EAAK,MAAA;AACjB,MAAA,IAAI,CAAC,EAAA,IAAM,CAAC,GAAA,EAAK,OAAO,IAAA;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,CAAY,EAAA,CAAG,GAAG,EAAA,CAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAG9C,QAAA,KAAA,CAAM,kBAAA,GAAqB,IAAI,WAAW,CAAA;AAC1C,QAAA,OAAO,EAAE,GAAG,KAAA,CAAM,CAAA,EAAG,GAAG,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,CAAA,EAAE;AAAA,MAC9C,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,EAAE,GAAG,EAAA,CAAG,CAAA,EAAG,GAAG,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAE;AAAA,MACrC;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,EAAA,KAAqB;AAG1C,MAAA,IAAI,CAAC,CAAA,CAAE,MAAA,CAAO,MAAA,EAAQ;AACtB,MAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,CAAA,EAAG,EAAA,CAAG,OAAA,GAAU,IAAA,CAAK,IAAA;AAAA,QACrB,CAAA,EAAG,EAAA,CAAG,OAAA,GAAU,IAAA,CAAK;AAAA,OACvB;AACA,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,CAAO,6BAAA,GAAgC,kBAAkB,WAAW,CAAA;AAClF,MAAA,IAAI,CAAC,GAAA,EAAK;AAEV,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA;AACnE,MAAA,MAAM,MAAA,GAAS,mBAAmB,GAAG,CAAA;AAGrC,MAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACzB,QAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,UAAA,KAAA,CAAM,OAAO,CAAC,CAAA;AACd,UAAA,CAAA,CAAE,UAAU,OAAA,IAAU;AACtB,UAAA,CAAA,CAAE,UAAU,OAAA,IAAU;AAAA,QACxB;AACA,QAAA,IAAI,EAAE,IAAA,EAAM;AACV,UAAA,KAAA,CAAM,MAAA,CAAO,EAAE,IAAI,CAAA;AACnB,UAAA,CAAA,CAAE,IAAA,CAAK,UAAU,OAAA,IAAU;AAC3B,UAAA,CAAA,CAAE,IAAA,CAAK,UAAU,OAAA,IAAU;AAAA,QAC7B;AACA,QAAA,IAAI,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,MAAM,OAAA,GAAU,GAAA;AACrC,QAAA,CAAA,CAAE,SAAS,EAAC;AAAG,QAAA,CAAA,CAAE,UAAU,EAAC;AAAG,QAAA,CAAA,CAAE,IAAA,GAAO,IAAA;AACxC,QAAA,CAAA,CAAE,UAAU,EAAC;AACb,QAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,MACzB;AAEA,MAAA,CAAA,CAAE,MAAA,CAAO,KAAK,KAAK,CAAA;AACnB,MAAA,CAAA,CAAE,OAAA,CAAQ,KAAK,MAAM,CAAA;AAMrB,MAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,QAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,GAAA,CAAI,MAAA,EAAQ,GAAG,CAAA;AACpD,QAAA,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,SAAA,IAAa,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,MAC/C,CAAA,MAAO;AACL,QAAA,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,MAClC;AAEA,MAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACzB,QAAA,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA;AACpB,QAAA,IAAI,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA;AAElB,QAAA,IAAI,IAAA;AACJ,QAAA,IAAI,MAAA,GAAS,EAAA;AAEb,QAAA,IAAI,gBAAgB,MAAA,EAAQ;AAS1B,UAAA,MAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,QAAQ,CAAC,CAAA;AACxC,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,KAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AAC9E,YAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,GAAA,EAAK,EAAA,GAAK,KAAK,CAAA,GAAI,GAAA,EAAK,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,GAAA;AAC1D,YAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAKnD,YAAA,MAAM,IAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACtC,YAAA,MAAM,UAAA,GAAa,IAAI,WAAA,CAAY,CAAA,CAAE,IAAI,EAAA,GAAK,IAAA,EAAM,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,IAAA,EAAM,CAAA,CAAE,CAAA,GAAI,KAAK,IAAI,CAAA;AAGpF,YAAA,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,GAAI,UAAA;AACd,YAAA,CAAA,GAAI,UAAA;AACJ,YAAA,IAAA,GAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AACpB,YAAA,MAAA,GAAS,SAAA;AAAA,UACX,CAAA,MAAO;AACL,YAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AACnD,YAAA,IAAA,GAAO,KAAK,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAAA,UAC9C;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AACnD,UAAA,IAAA,GAAO,KAAK,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAAA,QAC9C;AAEA,QAAA,CAAA,CAAE,IAAA,GAAO,QAAA,CAAS,CAAA,EAAG,CAAC,CAAA;AACtB,QAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,QAAA,MAAM,QAAQ,WAAA,EAAY;AAC1B,QAAA,KAAA,CAAM,cAAc,CAAA,EAAG,qBAAA,CAAsB,IAAI,CAAC,GAAG,MAAM,CAAA,CAAA;AAAA,MAC7D;AAEA,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,EAAA,KAAqB;AAG1C,MAAA,IAAI,EAAA,CAAG,WAAW,CAAA,EAAG;AACrB,MAAA,KAAA,GAAQ,EAAA,CAAG,OAAA;AACX,MAAA,KAAA,GAAQ,EAAA,CAAG,OAAA;AACX,MAAA,QAAA,GAAW,YAAY,GAAA,EAAI;AAC3B,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,UAAA,GAAa,IAAA;AAAA,IAEf,CAAA;AACA,IAAA,MAAM,aAAA,GAAgB,CAAC,EAAA,KAAqB;AAC1C,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,MAAM,KAAK,EAAA,CAAG,OAAA,GAAU,KAAA,EAAO,EAAA,GAAK,GAAG,OAAA,GAAU,KAAA;AACjD,MAAA,IAAI,KAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,QAAA,GAAW,UAAU,QAAA,GAAW,IAAA;AAAA,IAC1D,CAAA;AACA,IAAA,MAAM,WAAA,GAAc,CAAC,EAAA,KAAqB;AACxC,MAAA,IAAI,EAAA,CAAG,MAAA,KAAW,CAAA,IAAK,CAAC,UAAA,EAAY;AACpC,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,EAAI,GAAI,QAAA;AACpC,MAAA,MAAM,QAAA,GAAW,CAAC,QAAA,IAAY,OAAA,GAAU,SAAA;AACxC,MAAA,UAAA,GAAa,KAAA;AACb,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,aAAA,CAAc,EAAE,CAAA;AAAA,IAClB,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KAAsB;AACvC,MAAA,IAAI,EAAA,CAAG,GAAA,KAAQ,QAAA,EAAU,iBAAA,CAAkB,KAAK,CAAA;AAAA,IAClD,CAAA;AAEA,IAAA,MAAA,CAAO,MAAM,MAAA,GAAS,WAAA;AAGtB,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACpD,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACpD,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAChD,IAAA,MAAA,CAAO,gBAAA,CAAiB,iBAAiB,WAAW,CAAA;AACpD,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAE5C,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,MAAM,MAAA,GAAS,EAAA;AACtB,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACnD,MAAA,MAAA,CAAO,mBAAA,CAAoB,iBAAiB,WAAW,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC/C,MAAA,QAAA,EAAS;AACT,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,IACzB,CAAA;AAAA,EACF,GAAG,CAAC,cAAA,EAAgB,WAAA,EAAa,OAAA,EAAS,IAAI,CAAC,CAAA;AAG/C,EAAAP,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AAC1B,IAAA,MAAM,IAAI,UAAA,CAAW,MAAM,WAAA,CAAY,KAAK,GAAG,GAAI,CAAA;AACnD,IAAA,OAAO,MAAM,aAAa,CAAC,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAEtB,EAAA,MAAM,iBAAA,GAAoB,CAAC,IAAA,KAAmB;AAC5C,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,IAAA,cAAA,CAAe,MAAM,GAAG,CAAA;AACxB,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ;AAChB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AAEzB,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,GAAG,CAAA,CAAE,IAAA,CAAK,CAAA,EAAA,KAAM,CAAC,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA;AACpD,MAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,QAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAAA,aACtB,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,MACrB;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,EAAA,KAAe;AACrC,IAAA,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,CAAC,EAAE,GAAG,CAAC,IAAA,CAAK,EAAE,CAAA,EAAE,CAAE,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAmB;AAGlC,IAAA,SAAA,EAAU;AAEL,EACP,CAAA;AAEA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,MAAA,MAAM,MAAA,GAAS,CAAA,EAAG,MAAA,EAAQ,iBAAA,GAAoB,MAAM,IAAI,CAAA;AACxD,MAAA,IAAI,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,iBAAA,CAAkB,QAAQ,IAAI,CAAA;AACnD,MAAA,CAAA,EAAG,QAAQ,MAAA,IAAS;AAAA,IACtB,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA;AAIA,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,CAAA,EAAG,UAAU,OAAA,EAAS;AAClC,IAAA,IAAI;AACF,MAAA,CAAA,CAAE,MAAA,CAAO,kBAAkB,WAAA,GAAc,EAAA,CAAG,eAAe,WAAA,GAAc,EAAA,CAAG,eAAe,YAAY,CAAA;AAAA,IACzG,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA,EAAG,CAAC,WAAA,EAAa,OAAO,CAAC,CAAA;AAGzB,EAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,KAA6C;AACpE,IAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,CAAA,EAAG,MAAA,EAAQ;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,CAAO,iBAAA,GAAoB,MAAM,IAAI,CAAA;AACtD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AACjB,MAAA,MAAM,CAAA,GAAI,OAAO,MAAA,IAAU,CAAA;AAC3B,MAAA,MAAM,OAAO,CAAA,GAAI,CAAA;AACjB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,IAAK,CAAA,EAAG,EAAA,GAAK,EAAE,CAAA,IAAK,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA,IAAK,CAAA;AAChD,MAAA,IAAI,GAAA,EAAU,EAAA;AACd,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,KAAA;AAAS,UAAA,GAAA,GAAM,IAAI,EAAA,CAAG,OAAA,CAAQ,EAAA,EAAI,EAAA,EAAI,KAAK,IAAI,CAAA;AAAG,UAAA,EAAA,GAAK,IAAI,EAAA,CAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,UAAA;AAAA,QACrF,KAAK,OAAA;AAAS,UAAA,GAAA,GAAM,IAAI,EAAA,CAAG,OAAA,CAAQ,EAAA,EAAI,EAAA,GAAK,MAAM,EAAE,CAAA;AAAG,UAAA,EAAA,GAAK,IAAI,EAAA,CAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,UAAA;AAAA,QACrF,KAAK,MAAA;AAAS,UAAA,GAAA,GAAM,IAAI,EAAA,CAAG,OAAA,CAAQ,EAAA,GAAK,IAAA,EAAM,IAAI,EAAE,CAAA;AAAG,UAAA,EAAA,GAAK,IAAI,EAAA,CAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,UAAA;AAAA,QACrF,KAAK,KAAA;AAAA,QACL,SAAS;AACP,UAAA,MAAM,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAC5B,UAAA,GAAA,GAAM,IAAI,GAAG,OAAA,CAAQ,EAAA,GAAK,GAAG,EAAA,GAAK,CAAA,EAAG,KAAK,CAAC,CAAA;AAC3C,UAAA,EAAA,GAAK,IAAI,EAAA,CAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3B,UAAA;AAAA,QACF;AAAA;AAEF,MAAA,MAAM,SAAS,IAAI,EAAA,CAAG,OAAA,CAAQ,EAAA,EAAI,IAAI,EAAE,CAAA;AACxC,MAAA,MAAM,MAAM,IAAI,EAAA,CAAG,OAAO,GAAA,EAAK,MAAA,EAAQ,IAAI,EAAE,CAAA;AAC7C,MAAA,CAAA,CAAE,MAAA,CAAO,UAAU,GAAG,CAAA;AACtB,MAAA,CAAA,CAAE,MAAA,CAAO,+BAA+B,MAAM,CAAA;AAC9C,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,MAAA,MAAM,IAAA,GAAO,GAAG,MAAA,EAAQ,aAAA,QAAqB,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AACxE,MAAA,MAAM,OAAA,GAAU,GAAG,MAAA,EAAQ,iBAAA,GAAoB,KAAK,KAAA,EAAO,IAAA,CAAK,QAAQ,KAAK,CAAA;AAC7E,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,OAAA;AACT,MAAA,CAAA,CAAE,WAAW,CAAA,EAAG,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAC,CAAA,aAAA,CAAA;AAChD,MAAA,CAAA,CAAE,KAAA,EAAM;AAAA,IACV,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,UAAA,CAAW,SAAS,CAAA;AACpB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,YAAA,CAAa,SAAS,CAAA;AACtB,IAAA,gBAAA,CAAiB,CAAC,CAAA;AAClB,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,cAAA,CAAe,GAAG,CAAA;AAClB,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,kBAAA,CAAmB,GAAG,CAAA;AACtB,IAAA,eAAA,CAAgB,CAAC,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,IAAA,CAAA,CAAE,KAAA,EAAM;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,GAAA,GAAA,CAAO,SAAS,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI,IAAK,IAAI,WAAA,EAAY;AAG1D,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,EAAgB,KAAA,GAAQ,CAAA,KAAuB;AACrE,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA,KAAM,KAAA;AACzC,IAAA,MAAM,SAAA,GAAY,CAAC,MAAA,CAAO,GAAA,CAAI,KAAK,EAAE,CAAA;AACrC,IAAA,uBACEE,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,sGAAA;AAAA,UACV,OAAO,EAAE,WAAA,EAAa,GAAG,KAAA,GAAQ,EAAA,GAAK,CAAC,CAAA,EAAA,CAAA,EAAK;AAAA,UAE3C,QAAA,EAAA;AAAA,YAAA,WAAA,mBACCC,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,cAAA,CAAe,IAAA,CAAK,EAAE,CAAA;AAAA,gBACrC,SAAA,EAAU,qFAAA;AAAA,gBACV,KAAA,EAAO,aAAa,UAAA,GAAa,QAAA;AAAA,gBAEjC,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,MAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAC1F,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAAG,UAAA,GAAa,6BAAA,GAAgC,2BAAA,EAA6B,CAAA,EAClI;AAAA;AAAA,aACF,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAmC,CAAA,EACrD,CAAA;AAAA,4BAEFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,gBAAA,EAAmB,SAAA,GAAY,EAAA,GAAK,YAAY,CAAA,CAAA,EAAI,KAAA,EAAO,IAAA,CAAK,IAAA,EAAO,eAAK,IAAA,EAAK,CAAA;AAAA,4BAClGA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,OAAA,CAAY,CAAA;AAAA,gBAC3B,SAAA,EAAU,yGAAA;AAAA,gBACV,KAAA,EAAM,aAAA;AAAA,gBAEN,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAc,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC9F,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,uJAAA,EAAwJ,CAAA,EAC/M;AAAA;AAAA,aACF;AAAA,4BACAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAAA,gBACrC,SAAA,EAAU,oDAAA;AAAA,gBACV,KAAA,EAAO,YAAY,MAAA,GAAS,MAAA;AAAA,gBAE3B,QAAA,EAAA,SAAA,mBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC9F,QAAA,EAAA;AAAA,kCAAAC,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,wLAAA,EAAyL,CAAA;AAAA,kCAC9OA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,kCAAA,EAAmC;AAAA,iBAAA,EAC1F,CAAA,mBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EAAc,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,gBAAe,WAAA,EAAa,GAAA,EAC9F,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,uUAAA,EAAwU,CAAA,EAC/X;AAAA;AAAA;AAEJ;AAAA;AAAA,OACF;AAAA,MACC,UAAA,IAAc,WAAA,oBACbA,GAAAA,CAAC,SAAK,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,cAAA,CAAe,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAC,CAAA,EAAE;AAAA,KAAA,EAAA,EAhDrD,KAAK,EAkDf,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,iIAAA;AACb,EAAA,MAAM,UAAA,GAAa,qFAAA;AAInB,EAAA,MAAM,QAAA,GAAW,kIAAA;AACjB,EAAA,MAAM,cAAA,GAAiB,sFAAA;AACvB,EAAA,MAAM,OAAA,GAAU,2BAAA;AAEhB,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,aAAA,EACjD,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC1F,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,uJAAA,EAAwJ,GAC/M,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,EAAS,CAAA;AAAA,sBACzBA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,MAAM,eAAA,CAAgB,KAAK,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,kBACpE,QAAA,kBAAAA,GAAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EAA4B,iBAAG,CAAA,EACjD,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,MAAM,eAAA,CAAgB,KAAK,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,YACpE,QAAA,kBAAAA,GAAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EAA4B,iBAAG,CAAA,EACjD,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,MAAM,eAAA,CAAgB,OAAO,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,cACtE,QAAA,kBAAAA,GAAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EAA4B,iBAAG,CAAA,EACjD,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,MAAM,eAAA,CAAgB,MAAM,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,aACrE,QAAA,kBAAAA,GAAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EAA4B,iBAAG,CAAA,EACjD,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,cAAA,CAAe,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,UACrC,SAAA,EAAW,cAAc,cAAA,GAAiB,QAAA;AAAA,UAC1C,KAAA,EAAO,cAAc,6BAAA,GAAgC,4BAAA;AAAA,UAErD,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6CAAA,EAA+C,QAAA,EAAA,WAAA,GAAc,gBAAgB,cAAA,EAAe;AAAA;AAAA,OAC9G;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,EAAS,CAAA;AAAA,sBACzBA,IAAC,QAAA,EAAA,EAAO,OAAA,EAAS,gBAAgB,SAAA,EAAW,IAAA,EAAM,OAAM,sBAAA,EACtD,QAAA,kBAAAD,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,IAAA,EAAK,MAAA,EAAO,SAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC1F,QAAA,EAAA;AAAA,wBAAAC,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,mWAAA,EAAoW,CAAA;AAAA,wBACzZA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,gFAAA,EAAiF;AAAA,OAAA,EACxI,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,YAAY,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA,EAAG,WAAW,IAAA,EAAM,KAAA,EAAM,iBAAA,EAClE,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,QAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC1F,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAAE,sMAAA,EAAuM,GAC9P,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,iBAAA,CAAkB,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,UACxC,SAAA,EAAW,iBAAiB,UAAA,GAAa,IAAA;AAAA,UACzC,KAAA,EAAO,iBAAiB,sBAAA,GAAyB,uDAAA;AAAA,UAGjD,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC1F,QAAA,EAAA;AAAA,4BAAAC,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,qEAAA,EAAsE,CAAA;AAAA,4BAC3HA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,kBAAA,EAAmB;AAAA,WAAA,EAC1E;AAAA;AAAA,OACF;AAAA,MACC,cAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,cAAA,CAAe,OAAO,CAAA;AAAA,YACrC,SAAA,EAAW,CAAA,iDAAA,EAAoD,WAAA,KAAgB,OAAA,GAAU,6BAA6B,yCAAyC,CAAA,CAAA;AAAA,YAC/J,KAAA,EAAM,uEAAA;AAAA,YACP,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,cAAA,CAAe,MAAM,CAAA;AAAA,YACpC,SAAA,EAAW,CAAA,iDAAA,EAAoD,WAAA,KAAgB,MAAA,GAAS,6BAA6B,yCAAyC,CAAA,CAAA;AAAA,YAC9J,KAAA,EAAM,uFAAA;AAAA,YACP,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF,CAAA;AAAA,MAED,cAAA,IAAkB,eAAA,KAAoB,IAAA,oBACrCD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+HAAA,EAAgI,KAAA,EAAO,WAAA,KAAgB,MAAA,GAAS,wDAAA,GAA2D,sDAAA,EACvO,QAAA,EAAA;AAAA,QAAA,qBAAA,CAAsB,eAAe,CAAA;AAAA,QAAG,WAAA,KAAgB,SAAS,SAAA,GAAO;AAAA,OAAA,EAC3E,CAAA;AAAA,sBAEFC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,EAAS,CAAA;AAAA,sBACzBA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,cAAc,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA,EAAG,WAAW,UAAA,GAAa,UAAA,GAAa,MAAM,KAAA,EAAM,qBAAA,EAC9F,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC1F,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAAE,8CAAA,EAA+C,GACtG,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA,EAAG,SAAA,EAAW,YAAA,GAAe,UAAA,GAAa,IAAA,EAAM,KAAA,EAAM,sBAAA,EAClG,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC1F,QAAA,EAAA;AAAA,wBAAAC,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,w9BAAA,EAAy9B,CAAA;AAAA,wBAC9gCA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,kCAAA,EAAmC;AAAA,OAAA,EAC1F,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,cAAc,qBAAA,EAAuB,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,wBAAA,EAC3E,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,KAC1F,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,0GAAA,EAA2G,GAClK,CAAA,EACF,CAAA;AAAA,MACC,OAAA,oBACCA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,OAAA,EAAS,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,OAAA,EAC/C,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,KAC1F,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,wPAAA,EAAyP,GAChT,CAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA0B,KAAA,EAAO,EAAE,UAAA,EAAY,SAAQ,EACpE,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAO,EAAG,CAAA;AAAA,MAGjE,UAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yIAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mFAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BAClDA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA,EAAG,SAAA,EAAU,uDAAA,EAAwD,KAAA,EAAM,OAAA,EAAQ,QAAA,EAAA,MAAA,EAAC;AAAA,SAAA,EAChI,CAAA;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,iBAAO,cAAA,CAAe,IAAI,CAAA,mBACzBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAA8C,QAAA,EAAA,OAAA,GAAU,qBAAA,GAAmB,0BAAyB,CAAA,EAEvH,CAAA;AAAA,QACC,IAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EACZ,QAAA,EAAA,MAAA,CAAO,IAAA,KAAS,CAAA,GAAI,aAAA,GAAgB,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,OAAA,CAAA,EACrD;AAAA,OAAA,EAEJ,CAAA;AAAA,MAGD,QAAA,IAAY,CAAC,OAAA,IAAW,CAAC,yBACxBD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uKAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,wBACpBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACjCA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,yBAAA,EAAuB,CAAA;AAAA,wBAC7BA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACjCA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,gBAAA,EAAc;AAAA,OAAA,EACtB,CAAA;AAAA,MAGD,OAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oGAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EAAqC,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,CAAA,EACrH,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,YAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,aAAA,EAAc,KAAA,EAAM,CAAA;AAAA,0BACnDA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B,eAAc,OAAA,EAAQ;AAAA,SAAA,EAC3D,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,wBAAA,EAAiB,CAAA;AAAA,QACtB,GAAA,KAAQ,KAAA,IAAS,GAAA,KAAQ,MAAA,mBAASA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,wDAAA,EAAsD,CAAA,GAAU;AAAA,OAAA,EACjJ,CAAA;AAAA,MAED,yBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uGAAuG,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAI7H,YAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0IAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mFAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,0BACzDA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA,EAAG,SAAA,EAAU,uDAAA,EAAwD,KAAA,EAAM,OAAA,EAAQ,QAAA,EAAA,MAAA,EAAC;AAAA,SAAA,EAClI,CAAA;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,4BACtBA,GAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,OAAA,EAAQ,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA,KAAM,WAAW,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,EAAG,WAAU,kDAAA,EAAmD;AAAA,WAAA,EAChJ,CAAA;AAAA,0BACAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,4BAChBA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,YAAA,CAAa,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,gBACnC,IAAA,EAAK,QAAA;AAAA,gBACL,cAAA,EAAc,SAAA;AAAA,gBACd,SAAA,EAAW,CAAA,kFAAA,EAAqF,SAAA,GAAY,aAAA,GAAgB,aAAa,CAAA,CAAA;AAAA,gBAEzI,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,6EAA6E,SAAA,GAAY,oBAAA,GAAuB,iBAAiB,CAAA,CAAA,EAAI;AAAA;AAAA;AACxJ,WAAA,EACF,CAAA;AAAA,0BACAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,4BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,SAAA,GAAY,EAAA,GAAK,cAAc,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,4BAC1DA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,OAAA;AAAA,gBACL,KAAA,EAAO,SAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC5C,UAAU,CAAC,SAAA;AAAA,gBACX,SAAA,EAAU;AAAA;AAAA;AACZ,WAAA,EACF,CAAA;AAAA,0BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,SAAA,GAAY,KAAK,gCAAA,EAC/B,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,8BACpBD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA;AAAA,gBAAA,aAAA;AAAA,gBAAc;AAAA,eAAA,EAAC;AAAA,aAAA,EAC/D,CAAA;AAAA,4BACAC,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,OAAA;AAAA,gBACL,GAAA,EAAK,CAAA;AAAA,gBACL,GAAA,EAAK,EAAA;AAAA,gBACL,IAAA,EAAM,CAAA;AAAA,gBACN,KAAA,EAAO,aAAA;AAAA,gBACP,QAAA,EAAU,CAAC,CAAA,KAAM,gBAAA,CAAiB,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,gBACxD,SAAA,EAAU;AAAA;AAAA;AACZ,WAAA,EACF,CAAA;AAAA,0BAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,8BAC1CA,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,MAAM,iBAAA,CAAkB,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,kBACxC,IAAA,EAAK,QAAA;AAAA,kBACL,cAAA,EAAc,cAAA;AAAA,kBACd,SAAA,EAAW,CAAA,kFAAA,EAAqF,cAAA,GAAiB,aAAA,GAAgB,aAAa,CAAA,CAAA;AAAA,kBAE9I,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,6EAA6E,cAAA,GAAiB,oBAAA,GAAuB,iBAAiB,CAAA,CAAA,EAAI;AAAA;AAAA;AAC7J,aAAA,EACF,CAAA;AAAA,4BAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,cAAA,GAAiB,mBAAmB,+CAAA,EAKlD,QAAA,EAAA;AAAA,8BAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,kCACXD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA;AAAA,oBAAA,YAAA;AAAA,oBAAa;AAAA,mBAAA,EAAC;AAAA,iBAAA,EAC9D,CAAA;AAAA,gCACAC,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,OAAA;AAAA,oBACL,GAAA,EAAK,CAAA;AAAA,oBACL,GAAA,EAAK,GAAA;AAAA,oBACL,IAAA,EAAM,CAAA;AAAA,oBACN,KAAA,EAAO,YAAA;AAAA,oBACP,QAAA,EAAU,CAAC,CAAA,KAAM,eAAA,CAAgB,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,oBACvD,SAAA,EAAU;AAAA;AAAA;AACZ,eAAA,EACF,CAAA;AAAA,8BAEAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,kCACVA,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAS,MAAM,cAAA,CAAe,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,sBACrC,SAAA,EAAU,mGAAA;AAAA,sBACV,KAAA,EAAM,wBAAA;AAAA,sBAEL,wBAAc,gBAAA,GAAc;AAAA;AAAA;AAC/B,iBAAA,EACF,CAAA;AAAA,gCACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACX,QAAA,EAAA,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,CAAY,GAAA,CAAI,CAAA,EAAA,qBAC9BA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBAEC,OAAA,EAAS,MAAM,cAAA,CAAe,EAAE,CAAA;AAAA,oBAChC,SAAA,EAAW,CAAA,uCAAA,EAA0C,WAAA,KAAgB,EAAA,GAAK,2BAA2B,6CAA6C,CAAA,CAAA;AAAA,oBAEjJ,aAAG,WAAA;AAAY,mBAAA;AAAA,kBAJX;AAAA,iBAMR,CAAA,EACH;AAAA,eAAA,EACF,CAAA;AAAA,8BAEAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,kCACdD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAK,KAAA,CAAM,kBAAkB,GAAG,CAAA;AAAA,oBAAE;AAAA,mBAAA,EAAC;AAAA,iBAAA,EACnF,CAAA;AAAA,gCACAC,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,OAAA;AAAA,oBACL,GAAA,EAAK,CAAA;AAAA,oBACL,GAAA,EAAK,CAAA;AAAA,oBACL,IAAA,EAAM,IAAA;AAAA,oBACN,KAAA,EAAO,eAAA;AAAA,oBACP,QAAA,EAAU,CAAC,CAAA,KAAM,kBAAA,CAAmB,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,oBAC1D,SAAA,EAAU;AAAA;AAAA;AACZ,eAAA,EACF;AAAA,aAAA,EAEF;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,kBAAA;AAAA,YACT,SAAA,EAAU,iGAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA,SAED,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AASA,SAAS,WAAW,EAAE,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,SAAQ,EAAoB;AAC3E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIF,SAAS,CAAC,CAAA;AAClC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,KAAK,CAAA;AACxC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,YAAA,GAAeF,OAA6B,IAAI,CAAA;AAUtD,EAAA,MAAM,wBAAwB,YAAY;AAExC,IAAA,IAAI,IAAI,UAAA,CAAW,OAAO,KAAK,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACtD,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,MAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,MAAA,CAAA,CAAE,KAAA,EAAM;AACR,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,OAAO,IAAA,KAAsB;AAC5C,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA;AACjC,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AACjD,MAAA,OAAO,IAAI,IAAA,EAAK;AAAA,IAClB,CAAA;AACA,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,MAAM,QAAA,CAAS,EAAE,WAAA,EAAa,WAAW,CAAA;AAAA,MAClD,CAAA,CAAA,MAAQ;AAGN,QAAA,IAAA,GAAO,MAAM,QAAA,CAAS,EAAE,WAAA,EAAa,QAAQ,CAAA;AAAA,MAC/C;AACA,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACxC,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,OAAA;AACT,MAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,MAAA,CAAA,CAAE,KAAA,EAAM;AAER,MAAA,UAAA,CAAW,MAAM,GAAA,CAAI,eAAA,CAAgB,OAAO,GAAG,GAAI,CAAA;AAAA,IACrD,CAAA,CAAA,MAAQ;AACN,MAAA,aAAA,CAAM,MAAM,iDAA4C,CAAA;AAAA,IAC1D;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,6FAAA;AAEZ,EAAA,uBACEG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,YAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,CAAC,UAAA,oBACAA,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,YAAO,OAAA,EAAS,MAAM,QAAQ,CAAA,CAAA,KAAK,IAAA,CAAK,IAAI,GAAA,EAAK,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,IAAQ,GAAG,CAAA,GAAI,GAAG,CAAC,CAAA,EAAG,SAAA,EAAW,KAAK,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACzGD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,UAAE;AAAA,SAAA,EAAC,CAAA;AAAA,wBACvFC,IAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAA,CAAA,KAAK,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAA,CAAO,CAAA,GAAI,QAAQ,GAAG,CAAA,GAAI,GAAG,CAAC,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,wBACvGA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,QAAQ,CAAC,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,wBACtDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,wBAC3CD,IAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAA,CAAc,IAAI,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK,KAAA,EAAM,qBAAA,EAChE,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,gKAAA,EAAiK,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAErU;AAAA,OAAA,EACF,CAAA;AAAA,MAED,UAAA,oBACCD,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAF,IAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK,KAAA,EAAM,gBAAA,EACjE,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,6BAAA,EAA8B,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAElM,CAAA;AAAA,wBACAD,IAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAa,OAAA,EAAS,IAAA,EAAK,EAAG,SAAA,EAAW,GAAA,EAC9D,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,+cAAA,EAAgd,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAEpnB,CAAA;AAAA,wBACAD,IAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAa,OAAA,EAAS,IAAA,EAAK,EAAG,SAAA,EAAW,GAAA,EAC9D,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,0GAAA,EAA2G,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAE/Q;AAAA,OAAA,EACF,CAAA;AAAA,sBAEFD,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,UAAA,IAAc,qBAAA,EAAuB,WAAW,GAAA,EAC/D,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,0GAAA,EAA2G,CAAA,EAAE,CAAA;AAAA,QAAM;AAAA,OAAA,EAE/Q,CAAA;AAAA,MACC,2BACCD,IAAAA,CAAC,YAAO,OAAA,EAAS,OAAA,EAAS,WAAW,GAAA,EACnC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,wPAAA,EAAyP,CAAA,EAAE,CAAA;AAAA,QAAM;AAAA,OAAA,EAE7Z;AAAA,KAAA,EAEJ,CAAA;AAAA,IACC,UAAA,mBACCA,GAAAA,CAAC,sBAAA,EAAA,EAAe,KAAK,YAAA,EAAc,GAAA,EAAK,GAAA,EAAK,QAAA,EAAoB,CAAA,mBAEjEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACZ,QAAA,EAAA,KAAA,mBACCA,GAAAA,CAAC,SAAI,SAAA,EAAU,sBAAA,EAAuB,QAAA,EAAA,uBAAA,EAAqB,CAAA,mBAE3DA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,GAAA;AAAA,QACL,GAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,QAC5B,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,CAAA,EAAK,eAAA,EAAiB,eAAA,EAAiB,UAAA,EAAY,sBAAA,EAAuB;AAAA,QAC3G,SAAA,EAAU;AAAA;AAAA,KACZ,EAEJ;AAAA,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-CML7B3S4.js","sourcesContent":["/**\n * Image annotator — opens an image with vector-style annotations layered\n * over it. Each annotation is a real, editable object: select to drag /\n * resize, recolor / restyle from the toolbar, Delete to remove. Zoom\n * scales the editing surface; the underlying image-pixel coordinate\n * system is preserved so saved exports always render at full resolution.\n *\n * Architecture:\n * - <canvas> bottom layer: original image + any committed mosaic\n * regions (mosaic edits real pixels)\n * - <svg> top layer: shapes / arrows / text / freehand. State-\n * driven, every annotation is interactive.\n * - viewBox locked to image-pixel coords so the SVG hit-tests and\n * coordinates are unaffected by the display zoom level.\n *\n * Tools: select (default), draw (freehand), rect, circle, arrow, mosaic,\n * text, crop.\n *\n * Save / Copy buttons live on the OUTER Preview toolbar (alongside Open).\n * The annotator exposes them via `useImperativeHandle` on a forwardRef —\n * see ImageAnnotatorHandle.\n */\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport toast from '../shell/toast';\n\ntype Tool = 'select' | 'draw' | 'rect' | 'circle' | 'arrow' | 'mosaic' | 'text' | 'crop';\ntype Corner = 'nw' | 'ne' | 'se' | 'sw' | 'start' | 'end';\n\ntype RectAnno = { id: string; type: 'rect'; x: number; y: number; w: number; h: number; color: string; stroke: number; radius: number };\ntype CircleAnno = { id: string; type: 'circle'; x: number; y: number; w: number; h: number; color: string; stroke: number };\ntype ArrowAnno = { id: string; type: 'arrow'; x1: number; y1: number; x2: number; y2: number; color: string; stroke: number };\ntype MosaicAnno = { id: string; type: 'mosaic'; x: number; y: number; w: number; h: number };\ntype DrawAnno = { id: string; type: 'draw'; points: { x: number; y: number }[]; color: string; stroke: number };\ntype TextAnno = { id: string; type: 'text'; x: number; y: number; text: string; color: string; size: number; font: string; bold: boolean; italic: boolean; underline: boolean };\ntype Annotation = RectAnno | CircleAnno | ArrowAnno | MosaicAnno | DrawAnno | TextAnno;\n\nconst COLORS = ['#ef4444', '#f97316', '#eab308', '#22c55e', '#3b82f6', '#8b5cf6', '#000000', '#ffffff'];\nconst FONTS = [\n { id: 'system', label: 'System', css: '-apple-system, system-ui, sans-serif' },\n { id: 'serif', label: 'Serif', css: 'Georgia, \"Times New Roman\", serif' },\n { id: 'mono', label: 'Mono', css: 'ui-monospace, \"SF Mono\", Menlo, monospace' },\n { id: 'cursive',label: 'Cursive', css: '\"Brush Script MT\", \"Comic Sans MS\", cursive' },\n];\nconst STROKE_DEFAULT = 4;\nconst TEXT_SIZE_DEFAULT = 24;\nconst RECT_RADIUS_DEFAULT = 12;\nconst MOSAIC_BLOCK = 12;\nconst ZOOM_MIN = 0.25;\nconst ZOOM_MAX = 4;\nconst ZOOM_STEP = 0.25;\n\nconst newId = () => Math.random().toString(36).slice(2, 9);\n\nexport interface ImageAnnotatorHandle {\n copy: () => Promise<void>;\n save: () => Promise<void>;\n}\n\nexport interface ImageAnnotatorProps {\n src: string;\n filename: string;\n /** Standalone-mode: when provided, an Apply pill is rendered in the\n * annotator's toolbar that composites the current canvas + SVG into a PNG\n * blob and hands it back. Used by callers like the bug-report dialog that\n * embed the annotator outside the Preview app and want the result. */\n onApply?: (blob: Blob) => void;\n /** Standalone-mode companion to `onApply` — Cancel pill that lets the\n * consumer dismiss the annotator without applying. */\n onCancel?: () => void;\n}\n\nconst ImageAnnotator = forwardRef<ImageAnnotatorHandle, ImageAnnotatorProps>(function ImageAnnotator(\n { src, filename, onApply, onCancel }, ref,\n) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n const imageRef = useRef<HTMLImageElement | null>(null);\n\n const [tool, setTool] = useState<Tool>('select');\n const [color, setColor] = useState(COLORS[0]);\n const [stroke, setStroke] = useState(STROKE_DEFAULT);\n const [textSize, setTextSize] = useState(TEXT_SIZE_DEFAULT);\n const [textFont, setTextFont] = useState(FONTS[0].id);\n const [textBold, setTextBold] = useState(true);\n const [textItalic, setTextItalic] = useState(false);\n const [textUnderline, setTextUnderline] = useState(false);\n const [rectRadius, setRectRadius] = useState(RECT_RADIUS_DEFAULT);\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [imageSize, setImageSize] = useState<{ w: number; h: number } | null>(null);\n const [fitSize, setFitSize] = useState<{ w: number; h: number } | null>(null);\n const [zoom, setZoom] = useState(1);\n\n const [preview, setPreview] = useState<Annotation | null>(null);\n const [pendingText, setPendingText] = useState<{ x: number; y: number; value: string; editingId?: string } | null>(null);\n const [pendingCrop, setPendingCrop] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\n\n const dragRef = useRef<\n | { kind: 'draw'; start: { x: number; y: number } }\n | { kind: 'pen'; points: { x: number; y: number }[] }\n | { kind: 'move'; id: string; start: { x: number; y: number }; original: Annotation }\n | { kind: 'resize'; id: string; corner: Corner; start: { x: number; y: number }; original: Annotation }\n | { kind: 'crop'; start: { x: number; y: number } }\n | null\n >(null);\n const [isDragging, setIsDragging] = useState(false);\n\n const displaySize = useMemo(() => {\n if (!fitSize) return null;\n return { w: fitSize.w * zoom, h: fitSize.h * zoom };\n }, [fitSize, zoom]);\n const scale = displaySize && imageSize ? displaySize.w / imageSize.w : 1;\n\n // ── selected annotation ────────────────────────────────────────────────────\n const selected = useMemo(\n () => annotations.find(a => a.id === selectedId) ?? null,\n [annotations, selectedId],\n );\n\n // When user picks a tool, sync the toolbar inputs to that tool's defaults\n // for new shapes (without affecting selected annotations).\n useEffect(() => {\n if (tool === 'select' && selected) {\n // Reflect the selected annotation in the toolbar.\n if ('color' in selected) setColor(selected.color);\n if ('stroke' in selected) setStroke(selected.stroke);\n if (selected.type === 'rect') setRectRadius(selected.radius);\n if (selected.type === 'text') {\n setTextSize(selected.size);\n setTextFont(selected.font);\n setTextBold(selected.bold);\n setTextItalic(selected.italic);\n setTextUnderline(selected.underline);\n }\n }\n }, [selectedId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ── load image ────────────────────────────────────────────────────────────\n useEffect(() => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n imageRef.current = img;\n setImageSize({ w: img.naturalWidth, h: img.naturalHeight });\n setAnnotations([]);\n setSelectedId(null);\n };\n img.onerror = () => toast.error('Failed to load image');\n img.src = src;\n }, [src]);\n\n // Compute fit-to-area display size (independent of zoom).\n useEffect(() => {\n if (!imageSize) return;\n const update = () => {\n const wrap = wrapRef.current;\n if (!wrap) return;\n const r = wrap.getBoundingClientRect();\n const availW = Math.max(0, r.width - 32);\n const availH = Math.max(0, r.height - 32);\n if (availW === 0 || availH === 0) return;\n const ratio = imageSize.w / imageSize.h;\n let w = imageSize.w, h = imageSize.h;\n if (w > availW) { w = availW; h = w / ratio; }\n if (h > availH) { h = availH; w = h * ratio; }\n setFitSize({ w, h });\n };\n update();\n const ro = new ResizeObserver(update);\n if (wrapRef.current) ro.observe(wrapRef.current);\n return () => ro.disconnect();\n }, [imageSize]);\n\n // Render canvas: image + mosaic regions baked in. fitSize in deps so we\n // re-render the moment the canvas mounts (it only mounts when displaySize\n // is computed).\n const mosaicAnnos = useMemo(\n () => annotations.filter(a => a.type === 'mosaic') as MosaicAnno[],\n [annotations],\n );\n useEffect(() => {\n const img = imageRef.current;\n const c = canvasRef.current;\n if (!img || !c || !imageSize) return;\n c.width = imageSize.w;\n c.height = imageSize.h;\n const ctx = c.getContext('2d')!;\n ctx.drawImage(img, 0, 0);\n for (const m of mosaicAnnos) applyMosaic(ctx, m);\n }, [imageSize, mosaicAnnos, fitSize]);\n\n // ── coord helpers ─────────────────────────────────────────────────────────\n const evToImage = (e: { clientX: number; clientY: number }): { x: number; y: number } => {\n const svg = svgRef.current;\n if (!svg) return { x: 0, y: 0 };\n const pt = svg.createSVGPoint();\n pt.x = e.clientX; pt.y = e.clientY;\n const ctm = svg.getScreenCTM();\n if (!ctm) return { x: 0, y: 0 };\n const t = pt.matrixTransform(ctm.inverse());\n return { x: t.x, y: t.y };\n };\n\n // ── drag (window-level) ───────────────────────────────────────────────────\n const beginDrag = (drag: NonNullable<typeof dragRef.current>) => {\n dragRef.current = drag;\n setIsDragging(true);\n };\n\n useEffect(() => {\n if (!isDragging) return;\n const onMove = (ev: PointerEvent) => {\n const drag = dragRef.current;\n if (!drag) return;\n const p = evToImage(ev);\n if (drag.kind === 'draw') {\n setPreview(makeShape(tool, drag.start, p, color, stroke, rectRadius));\n } else if (drag.kind === 'pen') {\n // Append point if it moved enough to matter.\n const last = drag.points[drag.points.length - 1];\n if (Math.abs(p.x - last.x) > 1 || Math.abs(p.y - last.y) > 1) {\n drag.points.push(p);\n setPreview({ id: '', type: 'draw', points: drag.points.slice(), color, stroke });\n }\n } else if (drag.kind === 'crop') {\n setPendingCrop(normalizeRect(drag.start, p));\n } else if (drag.kind === 'move') {\n const dx = p.x - drag.start.x;\n const dy = p.y - drag.start.y;\n setAnnotations(prev => prev.map(a => a.id === drag.id ? translate(drag.original, dx, dy) : a));\n } else if (drag.kind === 'resize') {\n setAnnotations(prev => prev.map(a => a.id === drag.id ? resize(drag.original, drag.corner, p) : a));\n }\n };\n const onUp = () => {\n const drag = dragRef.current;\n dragRef.current = null;\n setIsDragging(false);\n if (drag?.kind === 'draw') {\n setPreview(p => {\n if (!p || isTrivial(p)) return null;\n const anno: Annotation = { ...p, id: newId() } as Annotation;\n setAnnotations(prev => [...prev, anno]);\n setSelectedId(anno.id);\n setTool('select');\n return null;\n });\n } else if (drag?.kind === 'pen') {\n if (drag.points.length < 2) { setPreview(null); return; }\n const anno: DrawAnno = { id: newId(), type: 'draw', points: drag.points, color, stroke };\n setAnnotations(prev => [...prev, anno]);\n setSelectedId(anno.id);\n setTool('select');\n setPreview(null);\n }\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n return () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n };\n }, [isDragging, tool, color, stroke, rectRadius]);\n\n const handleAnnoPointerDown = (e: React.PointerEvent<SVGElement>, anno: Annotation) => {\n if (tool !== 'select') return;\n e.stopPropagation();\n setSelectedId(anno.id);\n beginDrag({ kind: 'move', id: anno.id, start: evToImage(e), original: anno });\n };\n\n const handleHandlePointerDown = (e: React.PointerEvent<SVGElement>, anno: Annotation, corner: Corner) => {\n e.stopPropagation();\n beginDrag({ kind: 'resize', id: anno.id, corner, start: evToImage(e), original: anno });\n };\n\n const handleSvgPointerDown = (e: React.PointerEvent<SVGSVGElement>) => {\n if (tool === 'select') {\n setSelectedId(null);\n return;\n }\n if (tool === 'text') {\n const p = evToImage(e);\n setPendingText({ x: p.x, y: p.y, value: '' });\n return;\n }\n const start = evToImage(e);\n if (tool === 'crop') {\n beginDrag({ kind: 'crop', start });\n return;\n }\n if (tool === 'draw') {\n // 'draw' (the registry) means freehand pen here.\n beginDrag({ kind: 'pen', points: [start] });\n setPreview({ id: '', type: 'draw', points: [start], color, stroke });\n return;\n }\n setPreview(makeShape(tool, start, start, color, stroke, rectRadius));\n beginDrag({ kind: 'draw', start });\n };\n\n const handleAnnoDoubleClick = (anno: Annotation) => {\n if (anno.type !== 'text') return;\n setPendingText({ x: anno.x, y: anno.y, value: anno.text, editingId: anno.id });\n };\n\n // Keyboard shortcuts:\n // Delete / Backspace — removes the selected annotation\n // Escape — deselect\n // Cmd/Ctrl-Z — undo last annotation\n useEffect(() => {\n const onKey = (ev: KeyboardEvent) => {\n if (document.activeElement && /^(INPUT|TEXTAREA)$/.test(document.activeElement.tagName)) return;\n if ((ev.metaKey || ev.ctrlKey) && (ev.key === 'z' || ev.key === 'Z') && !ev.shiftKey) {\n ev.preventDefault();\n setAnnotations(prev => prev.slice(0, -1));\n setSelectedId(null);\n return;\n }\n if (!selectedId) return;\n if (ev.key === 'Delete' || ev.key === 'Backspace') {\n ev.preventDefault();\n setAnnotations(prev => prev.filter(a => a.id !== selectedId));\n setSelectedId(null);\n } else if (ev.key === 'Escape') {\n setSelectedId(null);\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [selectedId]);\n\n // ── live edits to selected annotation ──────────────────────────────────────\n // Helpers that mutate the selected annotation if there is one, else just\n // change the toolbar default for the next new shape.\n const setColorAndApply = (c: string) => {\n setColor(c);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a => {\n if (a.id !== selectedId) return a;\n if (a.type === 'mosaic') return a;\n return { ...a, color: c } as Annotation;\n }));\n };\n const setStrokeAndApply = (s: number) => {\n setStroke(s);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a => {\n if (a.id !== selectedId) return a;\n if (a.type === 'rect' || a.type === 'circle' || a.type === 'arrow' || a.type === 'draw') {\n return { ...a, stroke: s } as Annotation;\n }\n return a;\n }));\n };\n const setRectRadiusAndApply = (r: number) => {\n setRectRadius(r);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a =>\n (a.id === selectedId && a.type === 'rect') ? { ...a, radius: r } : a,\n ));\n };\n const setTextSizeAndApply = (s: number) => {\n setTextSize(s);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a =>\n (a.id === selectedId && a.type === 'text') ? { ...a, size: s } : a,\n ));\n };\n const setTextFontAndApply = (f: string) => {\n setTextFont(f);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a =>\n (a.id === selectedId && a.type === 'text') ? { ...a, font: f } : a,\n ));\n };\n const toggleTextStyleAndApply = (which: 'bold' | 'italic' | 'underline') => {\n const next = !{ bold: textBold, italic: textItalic, underline: textUnderline }[which];\n if (which === 'bold') setTextBold(next);\n if (which === 'italic') setTextItalic(next);\n if (which === 'underline') setTextUnderline(next);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a =>\n (a.id === selectedId && a.type === 'text') ? { ...a, [which]: next } : a,\n ));\n };\n\n // ── text input ─────────────────────────────────────────────────────────────\n const commitText = () => {\n if (!pendingText) return;\n const value = pendingText.value;\n if (!value.trim()) {\n if (pendingText.editingId) {\n setAnnotations(prev => prev.filter(a => a.id !== pendingText.editingId));\n }\n setPendingText(null);\n return;\n }\n if (pendingText.editingId) {\n setAnnotations(prev => prev.map(a =>\n a.id === pendingText.editingId && a.type === 'text'\n ? { ...a, text: value }\n : a,\n ));\n } else {\n const anno: TextAnno = {\n id: newId(),\n type: 'text',\n x: pendingText.x,\n y: pendingText.y,\n text: value,\n color,\n size: textSize,\n font: textFont,\n bold: textBold,\n italic: textItalic,\n underline: textUnderline,\n };\n setAnnotations(prev => [...prev, anno]);\n setSelectedId(anno.id);\n setTool('select');\n }\n setPendingText(null);\n };\n\n // ── crop ───────────────────────────────────────────────────────────────────\n const applyCrop = () => {\n if (!pendingCrop || !imageRef.current || !imageSize) return;\n const r = pendingCrop;\n const tmp = document.createElement('canvas');\n tmp.width = Math.round(r.w);\n tmp.height = Math.round(r.h);\n const tctx = tmp.getContext('2d')!;\n const sourceCanvas = document.createElement('canvas');\n sourceCanvas.width = imageSize.w;\n sourceCanvas.height = imageSize.h;\n const sctx = sourceCanvas.getContext('2d')!;\n sctx.drawImage(imageRef.current, 0, 0);\n for (const m of mosaicAnnos) applyMosaic(sctx, m);\n tctx.drawImage(sourceCanvas, r.x, r.y, r.w, r.h, 0, 0, r.w, r.h);\n const newImg = new Image();\n newImg.onload = () => {\n imageRef.current = newImg;\n setImageSize({ w: newImg.naturalWidth, h: newImg.naturalHeight });\n setAnnotations(prev =>\n prev\n .filter(a => a.type !== 'mosaic')\n .map(a => translate(a, -r.x, -r.y))\n .filter(a => withinBounds(a, newImg.naturalWidth, newImg.naturalHeight)),\n );\n setPendingCrop(null);\n };\n newImg.src = tmp.toDataURL('image/png');\n };\n const cancelCrop = () => setPendingCrop(null);\n\n const undoLast = () => {\n setAnnotations(prev => prev.slice(0, -1));\n setSelectedId(null);\n };\n\n // ── export (Save / Copy via outer toolbar through useImperativeHandle) ────\n const compositeToCanvas = async (): Promise<HTMLCanvasElement | null> => {\n const c = canvasRef.current;\n const svg = svgRef.current;\n if (!c || !svg || !imageSize) return null;\n const out = document.createElement('canvas');\n out.width = imageSize.w;\n out.height = imageSize.h;\n const octx = out.getContext('2d')!;\n octx.drawImage(c, 0, 0);\n const clone = svg.cloneNode(true) as SVGSVGElement;\n clone.querySelectorAll('[data-chrome]').forEach(n => n.remove());\n const xml = new XMLSerializer().serializeToString(clone);\n const svgBlob = new Blob([xml], { type: 'image/svg+xml;charset=utf-8' });\n const svgUrl = URL.createObjectURL(svgBlob);\n const svgImg = new Image();\n await new Promise<void>(resolve => {\n svgImg.onload = () => resolve();\n svgImg.onerror = () => resolve();\n svgImg.src = svgUrl;\n });\n octx.drawImage(svgImg, 0, 0, imageSize.w, imageSize.h);\n URL.revokeObjectURL(svgUrl);\n return out;\n };\n\n useImperativeHandle(ref, () => ({\n save: async () => {\n const out = await compositeToCanvas();\n if (!out) return;\n out.toBlob(blob => {\n if (!blob) { toast.error('Failed to export'); return; }\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n const base = filename.replace(/\\.[^.]+$/, '');\n a.download = `${base}-annotated.png`;\n a.click();\n URL.revokeObjectURL(url);\n }, 'image/png');\n },\n copy: async () => {\n if (!('clipboard' in navigator) || typeof ClipboardItem === 'undefined') {\n toast.error('Clipboard images not supported in this browser');\n return;\n }\n const out = await compositeToCanvas();\n if (!out) return;\n out.toBlob(async blob => {\n if (!blob) { toast.error('Failed to copy'); return; }\n try {\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);\n toast.success('Copied to clipboard');\n } catch {\n toast.error('Copy failed (clipboard permission?)');\n }\n }, 'image/png');\n },\n }), [imageSize, filename]);\n\n // ── tool definitions ──────────────────────────────────────────────────────\n const tools: { id: Tool; label: string; icon: JSX.Element }[] = useMemo(() => [\n { id: 'select', label: 'Select / Move', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 3l7 17 2-7 7-2L5 3z\" /></svg> },\n { id: 'draw', label: 'Pen / Draw', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487z\" /></svg> },\n { id: 'rect', label: 'Rectangle', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><rect x=\"4\" y=\"6\" width=\"16\" height=\"12\" rx=\"3\" /></svg> },\n { id: 'circle', label: 'Ellipse', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><ellipse cx=\"12\" cy=\"12\" rx=\"8\" ry=\"6\" /></svg> },\n { id: 'arrow', label: 'Arrow', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 19L19 5m0 0h-7m7 0v7\" /></svg> },\n { id: 'mosaic', label: 'Mosaic', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z\" /></svg> },\n { id: 'text', label: 'Text', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 6h16M12 6v14M9 20h6\" /></svg> },\n { id: 'crop', label: 'Crop', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 2v15a1 1 0 001 1h15M2 6h15a1 1 0 011 1v15\" /></svg> },\n ], []);\n\n const btnClass = (active: boolean) =>\n `p-1.5 rounded transition-colors ${active ? 'bg-blue-500 text-white' : 'text-gray-700 hover:bg-gray-200'}`;\n\n // Decide which secondary controls to show based on current context\n // (selected annotation type takes priority over the chosen tool).\n const ctxType = selected?.type ?? (tool === 'select' ? null : tool);\n const showStrokeControl = ctxType === 'rect' || ctxType === 'circle' || ctxType === 'arrow' || ctxType === 'draw';\n const showRectRadius = ctxType === 'rect';\n const showTextControls = ctxType === 'text';\n\n return (\n <div className=\"flex flex-col h-full bg-gray-100\">\n {/* Tool bar */}\n <div className=\"flex items-center gap-1.5 px-3 py-2 border-b border-gray-200 bg-white shrink-0 flex-wrap text-[12px]\">\n {tools.map(t => (\n <button\n key={t.id}\n onClick={() => { setTool(t.id); setSelectedId(null); }}\n title={t.label}\n className={btnClass(tool === t.id)}\n >\n {t.icon}\n </button>\n ))}\n\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n\n {/* Color picker — always visible */}\n <div className=\"flex items-center gap-1\">\n {COLORS.map(c => (\n <button\n key={c}\n onClick={() => setColorAndApply(c)}\n title={c}\n className={`h-5 w-5 rounded-full border ${color === c ? 'ring-2 ring-blue-500 ring-offset-1' : 'border-gray-300'}`}\n style={{ background: c }}\n />\n ))}\n </div>\n\n {showStrokeControl && (\n <>\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n <label className=\"flex items-center gap-1.5 text-gray-600\">\n <span>Weight</span>\n <input type=\"range\" min={1} max={20} step={1} value={stroke} onChange={(e) => setStrokeAndApply(Number(e.target.value))} className=\"w-16 accent-blue-500\" />\n <span className=\"tabular-nums w-5 text-right\">{stroke}</span>\n </label>\n </>\n )}\n\n {showRectRadius && (\n <>\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n <label className=\"flex items-center gap-1.5 text-gray-600\">\n <span>Radius</span>\n <input type=\"range\" min={0} max={48} step={1} value={rectRadius} onChange={(e) => setRectRadiusAndApply(Number(e.target.value))} className=\"w-16 accent-blue-500\" />\n <span className=\"tabular-nums w-6 text-right\">{rectRadius}</span>\n </label>\n </>\n )}\n\n {showTextControls && (\n <>\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n <select value={textFont} onChange={(e) => setTextFontAndApply(e.target.value)} className=\"text-xs border border-gray-300 rounded px-1 py-0.5 bg-white\">\n {FONTS.map(f => <option key={f.id} value={f.id}>{f.label}</option>)}\n </select>\n <button onClick={() => toggleTextStyleAndApply('bold')} className={btnClass(textBold)} title=\"Bold\"><span className=\"font-bold\">B</span></button>\n <button onClick={() => toggleTextStyleAndApply('italic')} className={btnClass(textItalic)} title=\"Italic\"><span className=\"italic\">I</span></button>\n <button onClick={() => toggleTextStyleAndApply('underline')} className={btnClass(textUnderline)} title=\"Underline\"><span className=\"underline\">U</span></button>\n <label className=\"flex items-center gap-1.5 text-gray-600\">\n <span>Size</span>\n <input type=\"range\" min={10} max={96} step={1} value={textSize} onChange={(e) => setTextSizeAndApply(Number(e.target.value))} className=\"w-16 accent-blue-500\" />\n <span className=\"tabular-nums w-7 text-right\">{textSize}</span>\n </label>\n </>\n )}\n\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n\n {/* Zoom */}\n <button onClick={() => setZoom(z => Math.max(ZOOM_MIN, Math.round((z - ZOOM_STEP) * 100) / 100))} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-700\" title=\"Zoom out\">−</button>\n <span className=\"text-gray-600 tabular-nums w-10 text-center\">{Math.round(zoom * 100)}%</span>\n <button onClick={() => setZoom(z => Math.min(ZOOM_MAX, Math.round((z + ZOOM_STEP) * 100) / 100))} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-700\" title=\"Zoom in\">+</button>\n <button onClick={() => setZoom(1)} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-700\" title=\"Fit to area\">Fit</button>\n\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n\n <button onClick={undoLast} disabled={annotations.length === 0} className=\"px-2 py-1 rounded hover:bg-gray-200 disabled:opacity-30 text-gray-700\">Undo</button>\n\n <div className=\"ml-auto flex items-center gap-2\">\n {pendingCrop && (\n <>\n <button onClick={applyCrop} className=\"px-2 py-1 rounded bg-blue-500 text-white hover:bg-blue-600\">Apply Crop</button>\n <button onClick={cancelCrop} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-700\">Cancel</button>\n </>\n )}\n {onApply && !pendingCrop && (\n <>\n {onCancel && (\n <button onClick={onCancel} className=\"px-3 py-1 rounded hover:bg-gray-200 text-gray-700 text-xs font-medium\">Cancel</button>\n )}\n <button\n onClick={async () => {\n const out = await compositeToCanvas();\n if (!out) { toast.error('Failed to export'); return; }\n out.toBlob(blob => {\n if (!blob) { toast.error('Failed to export'); return; }\n onApply(blob);\n }, 'image/png');\n }}\n className=\"px-3 py-1 rounded bg-blue-500 text-white hover:bg-blue-600 text-xs font-medium\"\n >\n Apply\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Canvas + SVG layered surface */}\n <div ref={wrapRef} className=\"flex-1 overflow-auto bg-gray-200 flex items-center justify-center p-4 relative\">\n {displaySize && imageSize && (\n <div\n className=\"relative shadow-lg rounded overflow-hidden bg-white shrink-0\"\n style={{ width: displaySize.w, height: displaySize.h }}\n >\n <canvas ref={canvasRef} style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', display: 'block' }} />\n <svg\n ref={svgRef}\n viewBox={`0 0 ${imageSize.w} ${imageSize.h}`}\n preserveAspectRatio=\"none\"\n style={{\n position: 'absolute', inset: 0, width: '100%', height: '100%',\n touchAction: 'none',\n cursor: tool === 'select' ? 'default' : tool === 'text' ? 'text' : 'crosshair',\n }}\n onPointerDown={handleSvgPointerDown}\n >\n {annotations.map(a => (\n <AnnotationView\n key={a.id}\n anno={a}\n selected={selectedId === a.id}\n zoom={zoom}\n onPointerDown={(e) => handleAnnoPointerDown(e, a)}\n onDoubleClick={() => handleAnnoDoubleClick(a)}\n onHandlePointerDown={(e, corner) => handleHandlePointerDown(e, a, corner)}\n />\n ))}\n {preview && <AnnotationView anno={{ ...preview, id: '__preview' } as Annotation} preview />}\n {pendingCrop && <CropOverlay rect={pendingCrop} imageSize={imageSize} />}\n </svg>\n\n {pendingText && (\n <PendingTextEditor\n pendingText={pendingText}\n color={color}\n size={textSize}\n font={FONTS.find(f => f.id === textFont)?.css ?? FONTS[0].css}\n bold={textBold}\n italic={textItalic}\n underline={textUnderline}\n scale={scale}\n onChange={(value) => setPendingText({ ...pendingText, value })}\n onCommit={commitText}\n onCancel={() => setPendingText(null)}\n />\n )}\n </div>\n )}\n </div>\n\n {/* Hint footer */}\n <div className=\"px-3 py-1.5 border-t border-gray-200 bg-white text-[11px] text-gray-500 shrink-0\">\n {tool === 'select'\n ? (selectedId ? 'Drag to move. Drag a corner to resize. Delete / Backspace removes. Click outside to deselect.' : 'Tap a shape to select. Double-click text to edit.')\n : tool === 'text'\n ? 'Click to drop a text label.'\n : tool === 'crop'\n ? 'Drag a rectangle to set the crop region.'\n : tool === 'draw'\n ? 'Drag to draw freehand.'\n : 'Drag on the image to draw.'}\n </div>\n </div>\n );\n});\n\nexport default ImageAnnotator;\n\n// ── annotation rendering ─────────────────────────────────────────────────────\n\ninterface AnnoViewProps {\n anno: Annotation;\n selected?: boolean;\n preview?: boolean;\n zoom?: number;\n onPointerDown?: (e: React.PointerEvent<SVGElement>) => void;\n onDoubleClick?: () => void;\n onHandlePointerDown?: (e: React.PointerEvent<SVGElement>, corner: Corner) => void;\n}\n\nfunction AnnotationView({ anno, selected, preview, zoom = 1, onPointerDown, onDoubleClick, onHandlePointerDown }: AnnoViewProps) {\n const dim = boundingBox(anno);\n const interactive: any = onPointerDown\n ? { onPointerDown, pointerEvents: 'all', style: { cursor: 'move' } }\n : {};\n const dblc: any = onDoubleClick ? { onDoubleClick } : {};\n\n let body: JSX.Element;\n if (anno.type === 'rect') {\n body = (\n <rect\n x={anno.x} y={anno.y} width={anno.w} height={anno.h}\n rx={anno.radius} ry={anno.radius}\n fill=\"none\" stroke={anno.color} strokeWidth={anno.stroke}\n strokeLinecap=\"round\" strokeLinejoin=\"round\"\n {...interactive}\n />\n );\n } else if (anno.type === 'circle') {\n body = (\n <ellipse\n cx={anno.x + anno.w / 2} cy={anno.y + anno.h / 2}\n rx={anno.w / 2} ry={anno.h / 2}\n fill=\"none\" stroke={anno.color} strokeWidth={anno.stroke}\n {...interactive}\n />\n );\n } else if (anno.type === 'arrow') {\n body = <ArrowShape anno={anno} interactive={interactive} />;\n } else if (anno.type === 'draw') {\n body = (\n <path\n d={pointsToPath(anno.points)}\n fill=\"none\" stroke={anno.color} strokeWidth={anno.stroke}\n strokeLinecap=\"round\" strokeLinejoin=\"round\"\n {...interactive}\n />\n );\n } else if (anno.type === 'mosaic') {\n body = (\n <rect\n x={anno.x} y={anno.y} width={anno.w} height={anno.h}\n fill=\"rgba(0,0,0,0.001)\"\n stroke={selected ? '#3b82f6' : 'none'}\n strokeWidth={selected ? 2 : 0}\n strokeDasharray={selected ? '6,4' : undefined}\n {...interactive}\n />\n );\n } else {\n // text\n const font = FONTS.find(f => f.id === anno.font)?.css ?? FONTS[0].css;\n body = (\n <text\n x={anno.x} y={anno.y + anno.size}\n fill={anno.color}\n fontSize={anno.size}\n fontWeight={anno.bold ? 700 : 400}\n fontStyle={anno.italic ? 'italic' : 'normal'}\n textDecoration={anno.underline ? 'underline' : undefined}\n fontFamily={font}\n style={{ userSelect: 'none' }}\n {...interactive}\n {...dblc}\n >\n {anno.text.split('\\n').map((line, i) => (\n <tspan key={i} x={anno.x} dy={i === 0 ? 0 : anno.size * 1.2}>{line}</tspan>\n ))}\n </text>\n );\n }\n\n return (\n <g>\n {body}\n {selected && !preview && (\n <>\n <rect\n data-chrome=\"selection\"\n x={dim.x - 4} y={dim.y - 4}\n width={dim.w + 8} height={dim.h + 8}\n fill=\"none\" stroke=\"#3b82f6\" strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom},${4 / zoom}`}\n pointerEvents=\"none\"\n />\n {onHandlePointerDown && <ResizeHandles anno={anno} zoom={zoom} onHandlePointerDown={onHandlePointerDown} />}\n </>\n )}\n </g>\n );\n}\n\nfunction ResizeHandles({\n anno, zoom, onHandlePointerDown,\n}: {\n anno: Annotation;\n zoom: number;\n onHandlePointerDown: (e: React.PointerEvent<SVGElement>, corner: Corner) => void;\n}) {\n const r = 6 / zoom;\n const sw = 1.5 / zoom;\n const handleProps = (cursor: string) => ({\n fill: '#fff',\n stroke: '#3b82f6',\n strokeWidth: sw,\n pointerEvents: 'all' as const,\n style: { cursor } as React.CSSProperties,\n 'data-chrome': 'handle',\n });\n\n if (anno.type === 'arrow') {\n return (\n <>\n <circle cx={anno.x1} cy={anno.y1} r={r} {...handleProps('grab')} onPointerDown={(e) => onHandlePointerDown(e, 'start')} />\n <circle cx={anno.x2} cy={anno.y2} r={r} {...handleProps('grab')} onPointerDown={(e) => onHandlePointerDown(e, 'end')} />\n </>\n );\n }\n if (anno.type === 'text' || anno.type === 'draw') {\n return null;\n }\n const x = anno.x, y = anno.y, w = anno.w, h = anno.h;\n return (\n <>\n <circle cx={x} cy={y} r={r} {...handleProps('nwse-resize')} onPointerDown={(e) => onHandlePointerDown(e, 'nw')} />\n <circle cx={x + w} cy={y} r={r} {...handleProps('nesw-resize')} onPointerDown={(e) => onHandlePointerDown(e, 'ne')} />\n <circle cx={x + w} cy={y + h} r={r} {...handleProps('nwse-resize')} onPointerDown={(e) => onHandlePointerDown(e, 'se')} />\n <circle cx={x} cy={y + h} r={r} {...handleProps('nesw-resize')} onPointerDown={(e) => onHandlePointerDown(e, 'sw')} />\n </>\n );\n}\n\nfunction ArrowShape({ anno, interactive }: { anno: ArrowAnno; interactive: any }) {\n const headLen = Math.max(12, anno.stroke * 4);\n const angle = Math.atan2(anno.y2 - anno.y1, anno.x2 - anno.x1);\n const a1 = angle + Math.PI - Math.PI / 7;\n const a2 = angle + Math.PI + Math.PI / 7;\n const head = `M${anno.x2},${anno.y2} L${anno.x2 + headLen * Math.cos(a1)},${anno.y2 + headLen * Math.sin(a1)} L${anno.x2 + headLen * Math.cos(a2)},${anno.y2 + headLen * Math.sin(a2)} Z`;\n return (\n <g {...interactive}>\n <line\n x1={anno.x1} y1={anno.y1} x2={anno.x2} y2={anno.y2}\n stroke={anno.color} strokeWidth={anno.stroke} strokeLinecap=\"round\"\n />\n <path d={head} fill={anno.color} />\n </g>\n );\n}\n\nfunction CropOverlay({ rect, imageSize }: { rect: { x: number; y: number; w: number; h: number }; imageSize: { w: number; h: number } }) {\n return (\n <g pointerEvents=\"none\">\n <path\n d={`M0,0 H${imageSize.w} V${imageSize.h} H0 Z M${rect.x},${rect.y} V${rect.y + rect.h} H${rect.x + rect.w} V${rect.y} Z`}\n fill=\"rgba(0,0,0,0.45)\"\n fillRule=\"evenodd\"\n />\n <rect\n x={rect.x} y={rect.y} width={rect.w} height={rect.h}\n fill=\"none\" stroke=\"#fff\" strokeWidth={2} strokeDasharray=\"8,6\"\n />\n </g>\n );\n}\n\nfunction PendingTextEditor({\n pendingText, color, size, font, bold, italic, underline, scale, onChange, onCommit, onCancel,\n}: {\n pendingText: { x: number; y: number; value: string; editingId?: string };\n color: string;\n size: number;\n font: string;\n bold: boolean;\n italic: boolean;\n underline: boolean;\n scale: number;\n onChange: (value: string) => void;\n onCommit: () => void;\n onCancel: () => void;\n}) {\n const ref = useRef<HTMLTextAreaElement>(null);\n useEffect(() => {\n const id = requestAnimationFrame(() => {\n ref.current?.focus();\n ref.current?.select?.();\n });\n return () => cancelAnimationFrame(id);\n }, []);\n return (\n <div\n style={{\n position: 'absolute',\n left: `${pendingText.x * scale}px`,\n top: `${pendingText.y * scale}px`,\n transform: 'translateY(-2px)',\n zIndex: 5,\n }}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <textarea\n ref={ref}\n value={pendingText.value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onCommit}\n onKeyDown={(e) => {\n if (e.key === 'Escape') { e.preventDefault(); onCancel(); }\n else if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); onCommit(); }\n }}\n placeholder=\"Type then Enter…\"\n rows={1}\n className=\"bg-white/95 border border-blue-400 rounded px-1 py-0.5 outline-none resize-none shadow-md\"\n style={{\n color,\n fontSize: `${size * scale}px`,\n fontFamily: font,\n fontWeight: bold ? 700 : 400,\n fontStyle: italic ? 'italic' : 'normal',\n textDecoration: underline ? 'underline' : undefined,\n minWidth: 80,\n }}\n />\n </div>\n );\n}\n\n// ── helpers ──────────────────────────────────────────────────────────────────\n\nfunction makeShape(\n tool: Tool,\n start: { x: number; y: number },\n end: { x: number; y: number },\n color: string,\n stroke: number,\n rectRadius: number,\n): Annotation | null {\n if (tool === 'rect') {\n const r = normalizeRect(start, end);\n return { id: '', type: 'rect', x: r.x, y: r.y, w: r.w, h: r.h, color, stroke, radius: rectRadius };\n }\n if (tool === 'circle') {\n const r = normalizeRect(start, end);\n return { id: '', type: 'circle', x: r.x, y: r.y, w: r.w, h: r.h, color, stroke };\n }\n if (tool === 'arrow') {\n return { id: '', type: 'arrow', x1: start.x, y1: start.y, x2: end.x, y2: end.y, color, stroke };\n }\n if (tool === 'mosaic') {\n const r = normalizeRect(start, end);\n return { id: '', type: 'mosaic', x: r.x, y: r.y, w: r.w, h: r.h };\n }\n return null;\n}\n\nfunction isTrivial(a: Annotation): boolean {\n if (a.type === 'arrow') return Math.abs(a.x2 - a.x1) < 4 && Math.abs(a.y2 - a.y1) < 4;\n if (a.type === 'draw') return a.points.length < 2;\n if ('w' in a && 'h' in a) return a.w < 4 || a.h < 4;\n return false;\n}\n\nfunction translate(a: Annotation, dx: number, dy: number): Annotation {\n if (a.type === 'arrow') return { ...a, x1: a.x1 + dx, y1: a.y1 + dy, x2: a.x2 + dx, y2: a.y2 + dy };\n if (a.type === 'draw') return { ...a, points: a.points.map(p => ({ x: p.x + dx, y: p.y + dy })) };\n if (a.type === 'text') return { ...a, x: a.x + dx, y: a.y + dy };\n return { ...a, x: a.x + dx, y: a.y + dy } as Annotation;\n}\n\nfunction resize(\n original: Annotation,\n corner: Corner,\n p: { x: number; y: number },\n): Annotation {\n if (original.type === 'arrow') {\n if (corner === 'start') return { ...original, x1: p.x, y1: p.y };\n if (corner === 'end') return { ...original, x2: p.x, y2: p.y };\n return original;\n }\n if (original.type === 'text' || original.type === 'draw') return original;\n const left = original.x;\n const right = original.x + original.w;\n const top = original.y;\n const bottom = original.y + original.h;\n let x1 = left, y1 = top, x2 = right, y2 = bottom;\n if (corner === 'nw') { x1 = p.x; y1 = p.y; }\n if (corner === 'ne') { x2 = p.x; y1 = p.y; }\n if (corner === 'se') { x2 = p.x; y2 = p.y; }\n if (corner === 'sw') { x1 = p.x; y2 = p.y; }\n const r = normalizeRect({ x: x1, y: y1 }, { x: x2, y: y2 });\n return { ...original, x: r.x, y: r.y, w: r.w, h: r.h } as Annotation;\n}\n\nfunction boundingBox(a: Annotation): { x: number; y: number; w: number; h: number } {\n if (a.type === 'arrow') {\n const x = Math.min(a.x1, a.x2);\n const y = Math.min(a.y1, a.y2);\n return { x, y, w: Math.abs(a.x2 - a.x1), h: Math.abs(a.y2 - a.y1) };\n }\n if (a.type === 'draw') {\n if (a.points.length === 0) return { x: 0, y: 0, w: 0, h: 0 };\n let minX = a.points[0].x, maxX = a.points[0].x, minY = a.points[0].y, maxY = a.points[0].y;\n for (const p of a.points) {\n if (p.x < minX) minX = p.x; if (p.x > maxX) maxX = p.x;\n if (p.y < minY) minY = p.y; if (p.y > maxY) maxY = p.y;\n }\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY };\n }\n if (a.type === 'text') {\n const lines = a.text.split('\\n');\n const longest = lines.reduce((m, l) => Math.max(m, l.length), 0);\n return { x: a.x, y: a.y, w: longest * a.size * 0.55, h: lines.length * a.size * 1.2 };\n }\n return { x: a.x, y: a.y, w: a.w, h: a.h };\n}\n\nfunction normalizeRect(a: { x: number; y: number }, b: { x: number; y: number }) {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const w = Math.abs(a.x - b.x);\n const h = Math.abs(a.y - b.y);\n return { x, y, w, h };\n}\n\nfunction withinBounds(a: Annotation, w: number, h: number): boolean {\n const bb = boundingBox(a);\n return bb.x + bb.w > 0 && bb.y + bb.h > 0 && bb.x < w && bb.y < h;\n}\n\nfunction pointsToPath(points: { x: number; y: number }[]): string {\n if (points.length === 0) return '';\n let d = `M ${points[0].x} ${points[0].y}`;\n for (let i = 1; i < points.length; i++) d += ` L ${points[i].x} ${points[i].y}`;\n return d;\n}\n\nfunction applyMosaic(\n ctx: CanvasRenderingContext2D,\n rect: { x: number; y: number; w: number; h: number },\n) {\n const x = Math.round(Math.max(0, rect.x));\n const y = Math.round(Math.max(0, rect.y));\n const w = Math.round(Math.min(ctx.canvas.width - x, rect.w));\n const h = Math.round(Math.min(ctx.canvas.height - y, rect.h));\n if (w < 2 || h < 2) return;\n const data = ctx.getImageData(x, y, w, h);\n const block = MOSAIC_BLOCK;\n for (let by = 0; by < h; by += block) {\n for (let bx = 0; bx < w; bx += block) {\n let r = 0, g = 0, b = 0, a = 0, n = 0;\n const blockW = Math.min(block, w - bx);\n const blockH = Math.min(block, h - by);\n for (let yy = 0; yy < blockH; yy++) {\n for (let xx = 0; xx < blockW; xx++) {\n const i = ((by + yy) * w + (bx + xx)) * 4;\n r += data.data[i]; g += data.data[i + 1]; b += data.data[i + 2]; a += data.data[i + 3];\n n++;\n }\n }\n r = Math.round(r / n); g = Math.round(g / n); b = Math.round(b / n); a = Math.round(a / n);\n for (let yy = 0; yy < blockH; yy++) {\n for (let xx = 0; xx < blockW; xx++) {\n const i = ((by + yy) * w + (bx + xx)) * 4;\n data.data[i] = r; data.data[i + 1] = g; data.data[i + 2] = b; data.data[i + 3] = a;\n }\n }\n }\n }\n ctx.putImageData(data, x, y);\n}\n","/**\n * Preview — windowed PDF viewer app.\n *\n * Consumers stage a PDF via `setPdfPreview({ url, filename, ... })` and then\n * call `openPage('/preview')`. The next Preview window to mount drains the\n * staged data — each window owns its own content, so opening a second Preview\n * never disturbs the first. To swap content in an *already-open* window (e.g.\n * a converting placeholder being replaced by the resolved file), keep the\n * handle returned by `setPdfPreview` and call `.update(next)` on it.\n */\nimport { useState, useEffect, useRef, createContext, useContext } from 'react';\nimport { createPortal } from 'react-dom';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport toast from '../shell/toast';\nimport { WindowTitle, getActiveModalId, registerModalEscapeInterceptor } from '../shell/Modal';\nimport AboutApp from './_about';\nimport ImageAnnotator, { type ImageAnnotatorHandle } from './ImageAnnotator';\n\n/** Slot at the right end of the outer Preview toolbar — each format panel\n * portals its own action buttons (page nav, zoom, layers, download, etc.)\n * here so we render a single toolbar row instead of two stacked. */\nconst ToolbarSlotContext = createContext<HTMLElement | null>(null);\nfunction PanelActions({ children }: { children: React.ReactNode }) {\n const slot = useContext(ToolbarSlotContext);\n return slot ? createPortal(children, slot) : null;\n}\n\n// online-3d-viewer pulls three@0.176, where WebGLRenderer's stencil context\n// attribute defaults to FALSE. Without a stencil buffer the capped section\n// view's mask test always reads zero and the cap never renders. Patch the\n// canvas getContext call once so the WebGL context is created with stencil\n// enabled. Always force stencil:true on webgl context requests — three.js\n// passes stencil:false explicitly when it isn't user-specified, so a\n// \"preserve if already set\" check would skip the path that needs us most.\nlet _stencilContextPatched = false;\nfunction ensureStencilContextAttribute() {\n if (_stencilContextPatched) return;\n if (typeof HTMLCanvasElement === 'undefined') return;\n _stencilContextPatched = true;\n const orig = HTMLCanvasElement.prototype.getContext;\n HTMLCanvasElement.prototype.getContext = function patchedGetContext(\n this: HTMLCanvasElement,\n type: string,\n attrs?: any,\n ) {\n if (type === 'webgl' || type === 'webgl2' || type === 'experimental-webgl') {\n // Force stencil regardless of what the caller asked for.\n attrs = { ...(attrs || {}), stencil: true };\n }\n return (orig as any).call(this, type, attrs);\n } as any;\n // eslint-disable-next-line no-console\n console.info('[Preview] section: canvas getContext patched (force stencil=true)');\n}\n\nconst TITLE_DISPLAY_MAX = 24;\nfunction truncateForTitle(s: string) {\n return s.length > TITLE_DISPLAY_MAX ? `${s.slice(0, TITLE_DISPLAY_MAX - 1)}…` : s;\n}\n\n// Default the worker to the matching unpkg build (mirrors the consumer's\n// installed npm version exactly). Consumers can override by setting\n// pdfjsLib.GlobalWorkerOptions.workerSrc themselves before opening the\n// Preview window.\nif (typeof window !== 'undefined' && !pdfjsLib.GlobalWorkerOptions.workerSrc) {\n pdfjsLib.GlobalWorkerOptions.workerSrc =\n `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/build/pdf.worker.min.mjs`;\n}\n\nexport interface PdfPreviewData {\n /** Object URL or remote URL of the PDF. Blob URLs are revoked when the window unmounts.\n * Leave blank when staging a `converting: true` placeholder; call `handle.update({...})`\n * on the handle returned by `setPdfPreview` once conversion finishes. */\n url?: string;\n /** Display name (and download filename). */\n filename: string;\n /** Renderer to use. Defaults to `'pdf'`. `'dxf'` requires the consumer to\n * have `dxf-viewer` installed (it's an optional peer dep). `'image'`\n * renders an `<img>` for raster screenshots / photos. `'3d'` covers\n * STEP / STL / OBJ / GLTF / 3MF / IGES via the optional\n * `online-3d-viewer` peer dep. */\n kind?: 'pdf' | 'dxf' | 'image' | '3d';\n /** Optional download handler — replaces the built-in \"save URL as filename\" if supplied. */\n onDownload?: () => void;\n /** Optional email handler — only shown when supplied. */\n onEmail?: () => void;\n /** Show a progress placeholder while the consumer fetches/converts the file. */\n converting?: boolean;\n /** Headline shown on the converting placeholder (e.g. \"CONVERTING DWG FILE\"). */\n convertingMessage?: string;\n}\n\nconst EVENT_NAME = 'react-os-shell:pdf-preview-update';\n\n/** Handle returned by `setPdfPreview`. Holds the identity of the staged\n * payload so a later `.update()` only targets the window that picked it up\n * (not every open Preview, which would clobber unrelated windows). */\nexport interface PdfPreviewHandle {\n /** Replace the data shown in the window that consumed this staging.\n * No-op if no window ever consumed it, or if that window has been closed. */\n update(next: PdfPreviewData): void;\n}\n\ninterface PendingStage {\n token: number;\n data: PdfPreviewData;\n}\n\nlet pending: PendingStage | null = null;\nlet nextToken = 0;\n\n/** Stage a PDF for the next Preview window mount. The returned handle's\n * `update()` method swaps content in *that* specific window only — use it\n * to replace a `converting: true` placeholder with the resolved file. */\nexport function setPdfPreview(data: PdfPreviewData): PdfPreviewHandle {\n const token = ++nextToken;\n pending = { token, data };\n return {\n update(next: PdfPreviewData) {\n if (typeof window === 'undefined') return;\n window.dispatchEvent(new CustomEvent(EVENT_NAME, { detail: { token, data: next } }));\n },\n };\n}\n\nexport default function Preview() {\n // One-shot drain: this instance claims whatever was staged and stores the\n // token so it can recognise later `.update()` calls aimed at it. The render\n // phase only PEEKS — under React 18 concurrent rendering a render pass can\n // be discarded and replayed (the first mount of this lazy component\n // suspends on its chunk), and a destructive read here would let the\n // discarded pass swallow the payload, leaving the committed window empty.\n // The stage is cleared in the mount effect below (commit phase) instead.\n const consumedRef = useRef<PendingStage | null | undefined>(undefined);\n if (consumedRef.current === undefined) {\n consumedRef.current = pending;\n }\n useEffect(() => {\n // Claim the stage for real once mounted. The identity check keeps a\n // payload staged *after* our render-phase peek (e.g. a second preview\n // opened in quick succession) available for the window it belongs to.\n if (consumedRef.current !== null && pending === consumedRef.current) {\n pending = null;\n }\n }, []);\n const [data, setData] = useState<PdfPreviewData | null>(consumedRef.current?.data ?? null);\n\n // Only respond to update events whose token matches our claim.\n useEffect(() => {\n const myToken = consumedRef.current?.token;\n if (myToken == null) return;\n const handler = (e: Event) => {\n const detail = (e as CustomEvent<PendingStage>).detail;\n if (!detail || detail.token !== myToken) return;\n setData(prev => {\n if (prev?.url && prev.url !== detail.data.url && prev.url.startsWith('blob:')) {\n URL.revokeObjectURL(prev.url);\n }\n return detail.data;\n });\n };\n window.addEventListener(EVENT_NAME, handler);\n return () => window.removeEventListener(EVENT_NAME, handler);\n }, []);\n\n // Revoke blob URL on unmount.\n useEffect(() => () => {\n if (data?.url?.startsWith('blob:')) URL.revokeObjectURL(data.url);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Window title reflects whatever is loaded — same pattern Spreadsheets uses.\n const titleName = data?.filename ? truncateForTitle(data.filename) : 'Untitled';\n\n const fileRef = useRef<HTMLInputElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n // Slot element for panel-portaled action buttons. Use state (not ref) so the\n // first render that mounts the slot triggers a re-render in panel children.\n const [toolbarSlotEl, setToolbarSlotEl] = useState<HTMLDivElement | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n // Drag-enter/leave fire on every child the cursor crosses, so a single\n // boolean flickers. Track depth with a counter — overlay shows on first\n // enter, clears only when the counter unwinds back to zero.\n const dragDepthRef = useRef(0);\n const handlePick = () => fileRef.current?.click();\n const resetDrag = () => {\n dragDepthRef.current = 0;\n setIsDragging(false);\n };\n // Only the frontmost (active) Preview window should accept drags. With\n // multiple Previews open this prevents the overlay flashing on every\n // window the cursor crosses, and matches the user's expectation that\n // they activate a window first by clicking it.\n const isActiveWindow = (el: HTMLElement) => {\n const myModal = el.closest('[data-modal-id]') as HTMLElement | null;\n if (!myModal) return true; // outside any modal — be permissive\n return getActiveModalId() === myModal.dataset.modalId;\n };\n // If the drag ends outside our component (e.g. dropped onto desktop trash),\n // we never receive `drop` or our outer `dragleave`. Listen on window so\n // any end of any drag clears the overlay. Also wire ESC as an escape hatch.\n useEffect(() => {\n const onWindowDragEnd = () => resetDrag();\n const onWindowDrop = () => resetDrag();\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') resetDrag();\n };\n window.addEventListener('dragend', onWindowDragEnd);\n window.addEventListener('drop', onWindowDrop);\n window.addEventListener('keydown', onKey);\n return () => {\n window.removeEventListener('dragend', onWindowDragEnd);\n window.removeEventListener('drop', onWindowDrop);\n window.removeEventListener('keydown', onKey);\n };\n }, []);\n const ingestFile = (file: File) => {\n const ext = (file.name.split('.').pop() || '').toLowerCase();\n const kind: 'pdf' | 'image' | 'dxf' | '3d' | undefined =\n ext === 'pdf' ? 'pdf'\n : ext === 'dxf' ? 'dxf'\n : ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'avif', 'bmp'].includes(ext) ? 'image'\n : ['stp', 'step', 'stl', 'obj', 'gltf', 'glb', '3mf', 'iges', 'igs', 'ply', 'fbx'].includes(ext) ? '3d'\n : undefined;\n if (!kind) {\n if (ext === 'dwg') toast.error('DWG files need server-side conversion. Convert to PDF or DXF first.');\n else toast.error(`Unsupported file type: .${ext || 'unknown'}`);\n return;\n }\n const url = URL.createObjectURL(file);\n // Local-only update: setPdfPreview stages content for the *next* window\n // to mount — calling it from inside an open window would overwrite that\n // slot and steal the payload from whoever opens next.\n setData(prev => {\n if (prev?.url?.startsWith('blob:') && prev.url !== url) {\n URL.revokeObjectURL(prev.url);\n }\n return { url, filename: file.name, kind };\n });\n };\n const handleFile = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) ingestFile(file);\n if (fileRef.current) fileRef.current.value = '';\n };\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n resetDrag();\n const file = e.dataTransfer.files?.[0];\n if (file) ingestFile(file);\n };\n\n const Toolbar = (\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0\">\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".pdf,.dxf,.jpg,.jpeg,.png,.gif,.webp,.svg,.avif,.bmp,.stp,.step,.stl,.obj,.gltf,.glb,.3mf,.iges,.igs,.ply,.fbx\"\n onChange={handleFile}\n className=\"hidden\"\n />\n <button\n onClick={handlePick}\n className=\"text-xs text-gray-700 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors flex items-center gap-1\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 9.776c.112-.017.227-.026.344-.026h15.812c.117 0 .232.009.344.026m-16.5 0a2.25 2.25 0 00-1.883 2.542l.857 6a2.25 2.25 0 002.227 1.932H19.05a2.25 2.25 0 002.227-1.932l.857-6a2.25 2.25 0 00-1.883-2.542m-16.5 0V6A2.25 2.25 0 016 3.75h3.879a1.5 1.5 0 011.06.44l2.122 2.12a1.5 1.5 0 001.06.44H18A2.25 2.25 0 0120.25 9v.776\" />\n </svg>\n Open\n </button>\n <span className=\"text-[10px] text-gray-400 ml-1\">PDF · DXF · 3D · Images</span>\n {data?.filename && (\n <>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <span className=\"text-xs font-medium text-gray-700 truncate max-w-[200px]\" title={data.filename}>{data.filename}</span>\n </>\n )}\n {/* Panel-specific actions (page nav, zoom, layers, download, …) get\n * portaled into this slot by whichever panel is active. */}\n <div ref={setToolbarSlotEl} className=\"ml-auto flex items-center gap-1 text-xs\" />\n </div>\n );\n\n let body: React.ReactNode;\n if (!data) {\n body = (\n <div className=\"flex flex-1 flex-col items-center justify-center text-gray-500 text-sm gap-3 p-8 text-center\">\n <svg className=\"h-12 w-12 text-gray-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" />\n </svg>\n <p className=\"font-medium text-gray-700\">Drop a file here, or click <button onClick={handlePick} className=\"text-blue-600 hover:underline\">Open</button>.</p>\n <div className=\"text-xs text-gray-500 max-w-sm\">\n <p className=\"font-semibold uppercase tracking-wide text-[10px] text-gray-400 mb-1\">Supported formats</p>\n <ul className=\"space-y-0.5\">\n <li><span className=\"font-mono text-gray-700\">.pdf</span> — multi-page document viewer</li>\n <li><span className=\"font-mono text-gray-700\">.dxf</span> — vector CAD drawings (optional <span className=\"font-mono\">dxf-viewer</span> peer dep)</li>\n <li><span className=\"font-mono text-gray-700\">.stp .step .stl .obj .gltf .glb .3mf .iges</span> — 3D models (optional <span className=\"font-mono\">online-3d-viewer</span> peer dep)</li>\n <li><span className=\"font-mono text-gray-700\">.jpg .jpeg .png .gif .webp .svg .avif .bmp</span> — raster images</li>\n </ul>\n <p className=\"mt-2 text-[11px] text-gray-400 italic\">DWG files need to be converted to PDF or DXF first (server-side).</p>\n </div>\n </div>\n );\n } else if (data.converting || !data.url) {\n body = <ConvertingPanel filename={data.filename} message={data.convertingMessage} />;\n } else if (data.kind === 'dxf') {\n body = <DxfPanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n } else if (data.kind === '3d') {\n body = <StepPanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n } else if (data.kind === 'image') {\n body = <ImagePanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n } else {\n body = <PdfPanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n }\n\n return (\n <div\n className=\"relative flex flex-col h-full\"\n ref={rootRef}\n onDragEnter={(e) => {\n // Only count drags that actually carry files — ignore stray drags\n // (e.g. text selections) so we don't flash the overlay.\n if (!e.dataTransfer?.types?.includes?.('Files')) return;\n // And only the active (frontmost) Preview window responds.\n if (!isActiveWindow(e.currentTarget as HTMLElement)) return;\n e.preventDefault();\n dragDepthRef.current++;\n if (!isDragging) setIsDragging(true);\n }}\n onDragOver={(e) => {\n if (!e.dataTransfer?.types?.includes?.('Files')) return;\n if (!isActiveWindow(e.currentTarget as HTMLElement)) return;\n e.preventDefault();\n }}\n onDragLeave={() => {\n if (dragDepthRef.current > 0) dragDepthRef.current--;\n if (dragDepthRef.current === 0) setIsDragging(false);\n }}\n onDrop={(e) => {\n if (!isActiveWindow(e.currentTarget as HTMLElement)) {\n resetDrag();\n return;\n }\n handleDrop(e);\n }}\n >\n <WindowTitle title={`${titleName} - Preview`} />\n <AboutApp app=\"preview\" />\n {Toolbar}\n <ToolbarSlotContext.Provider value={toolbarSlotEl}>\n <div className=\"flex-1 min-h-0\">{body}</div>\n </ToolbarSlotContext.Provider>\n {isDragging && (\n <div className=\"absolute inset-0 bg-blue-500/15 border-4 border-dashed border-blue-500 pointer-events-none flex items-center justify-center z-20\">\n <div className=\"px-4 py-2 rounded-md bg-blue-600 text-white text-sm font-medium shadow-lg\">\n Drop to open\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction ConvertingPanel({ filename, message }: { filename: string; message?: string }) {\n return (\n <div className=\"flex flex-col items-center justify-center h-full bg-gray-100 gap-4 px-8\">\n <div className=\"flex flex-col items-center gap-3\">\n <svg className=\"h-12 w-12 text-blue-500 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.2\" />\n <path d=\"M22 12a10 10 0 0 1-10 10\" strokeLinecap=\"round\" />\n </svg>\n <div className=\"text-base font-semibold tracking-wide text-gray-700 uppercase\">{message || 'Converting file'}</div>\n <div className=\"text-xs text-gray-400 truncate max-w-md\">{filename}</div>\n </div>\n <div className=\"w-72 h-1.5 rounded-full bg-gray-200 overflow-hidden\">\n <div className=\"h-full w-1/3 bg-blue-500 rounded-full animate-pulse\" style={{ animation: 'preview-bar 1.4s ease-in-out infinite' }} />\n </div>\n <style>{`@keyframes preview-bar { 0% { transform: translateX(-110%); } 100% { transform: translateX(310%); } }`}</style>\n </div>\n );\n}\n\ninterface PdfPanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\nconst ZOOM_PRESETS = [50, 75, 100, 125, 150, 200, 300, 400];\n\n// Trimmed copy of pdf.js's text-layer rules (pdf_viewer.css), under our own\n// class name so a consumer that loads the full viewer CSS doesn't\n// double-apply. The layer is a sheet of transparent spans positioned over\n// the canvas glyphs — that's what makes the rendered page selectable. Span\n// positions are % of page size; font-size derives from\n// --total-scale-factor, which the render effect sets to the viewport scale.\n// The .endOfContent sentinel plus the .selecting toggle keep a\n// drag-selection alive between lines and past the last line (same trick as\n// pdf.js's own TextLayerBuilder).\nconst TEXT_LAYER_CSS = `\n.preview-pdf-textlayer {\n position: absolute;\n inset: 0;\n overflow: clip;\n line-height: 1;\n text-align: initial;\n text-size-adjust: none;\n forced-color-adjust: none;\n transform-origin: 0 0;\n caret-color: CanvasText;\n --min-font-size: 1;\n --text-scale-factor: calc(var(--total-scale-factor, 1) * var(--min-font-size));\n --min-font-size-inv: calc(1 / var(--min-font-size));\n}\n.preview-pdf-textlayer :is(span, br) {\n color: transparent;\n position: absolute;\n white-space: pre;\n cursor: text;\n transform-origin: 0% 0%;\n}\n.preview-pdf-textlayer > :not(.markedContent),\n.preview-pdf-textlayer .markedContent span:not(.markedContent) {\n z-index: 1;\n --font-height: 0;\n font-size: calc(var(--text-scale-factor) * var(--font-height));\n --scale-x: 1;\n --rotate: 0deg;\n transform: rotate(var(--rotate)) scaleX(var(--scale-x)) scale(var(--min-font-size-inv));\n}\n.preview-pdf-textlayer .markedContent {\n display: contents;\n}\n.preview-pdf-textlayer span[role=\"img\"] {\n user-select: none;\n cursor: default;\n}\n.preview-pdf-textlayer ::selection {\n background: rgba(0, 80, 255, 0.25);\n}\n.preview-pdf-textlayer br::selection {\n background: transparent;\n}\n.preview-pdf-textlayer .endOfContent {\n display: block;\n position: absolute;\n inset: 100% 0 0;\n z-index: 0;\n cursor: default;\n user-select: none;\n}\n.preview-pdf-textlayer.selecting .endOfContent {\n top: 0;\n}\n`;\n\nfunction PdfPanel({ url, filename, onDownload, onEmail }: PdfPanelProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const textLayerRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [pdf, setPdf] = useState<pdfjsLib.PDFDocumentProxy | null>(null);\n const [page, setPage] = useState(1);\n const [totalPages, setTotalPages] = useState(0);\n const [scale, setScale] = useState(1);\n // Fit mode is the default — scale stays auto-tracking the container width\n // until the user picks a manual zoom (− / + / dropdown). Re-armed by the\n // Fit toolbar button.\n const [fitMode, setFitMode] = useState(true);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n pdfjsLib.getDocument(url).promise.then(doc => {\n if (cancelled) return;\n setPdf(doc);\n setTotalPages(doc.numPages);\n setLoading(false);\n }).catch(() => {\n if (!cancelled) { toast.error('Failed to load PDF'); setLoading(false); }\n });\n return () => { cancelled = true; };\n }, [url]);\n\n // Auto-fit: re-compute scale from container width whenever fit mode is on,\n // the document changes, the page changes, or the container resizes. Window\n // resize and Modal drag-resize both trigger ResizeObserver. Manual zoom\n // turns this off until the user clicks Fit again.\n useEffect(() => {\n if (!pdf || !fitMode || !containerRef.current) return;\n const fit = () => {\n if (!containerRef.current) return;\n pdf.getPage(page).then(p => {\n const containerW = containerRef.current?.clientWidth || 800;\n const viewport = p.getViewport({ scale: 1 });\n const next = Math.min(Math.max((containerW - 40) / viewport.width, 0.3), 4);\n setScale(prev => (Math.abs(prev - next) < 0.005 ? prev : next));\n });\n };\n fit();\n const ro = new ResizeObserver(fit);\n ro.observe(containerRef.current);\n return () => ro.disconnect();\n }, [pdf, page, fitMode]);\n\n useEffect(() => {\n if (!pdf || !canvasRef.current) return;\n let cancelled = false;\n let task: { cancel: () => void; promise: Promise<void> } | null = null;\n let textLayer: pdfjsLib.TextLayer | null = null;\n pdf.getPage(page).then(p => {\n if (cancelled || !canvasRef.current) return;\n const viewport = p.getViewport({ scale });\n const canvas = canvasRef.current;\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n // Lock the displayed (CSS) size to the viewport. pdf.js stamps inline\n // style.width/height on render and inline values stick across re-renders\n // even when canvas.width shrinks — without this, zoom changes only\n // affect resolution, not visible size.\n canvas.style.width = `${viewport.width}px`;\n canvas.style.height = `${viewport.height}px`;\n const ctx = canvas.getContext('2d')!;\n task = p.render({ canvas, canvasContext: ctx, viewport });\n task.promise.catch(() => {});\n // Selectable text layer — transparent spans over the canvas glyphs.\n // Rebuilt per page/zoom render; pdf.js reads --total-scale-factor for\n // span font-size and the container's own width/height.\n const textEl = textLayerRef.current;\n if (textEl) {\n textEl.replaceChildren();\n textEl.style.setProperty('--total-scale-factor', String(viewport.scale));\n textLayer = new pdfjsLib.TextLayer({\n textContentSource: p.streamTextContent(),\n container: textEl,\n viewport,\n });\n textLayer.render().then(() => {\n if (cancelled) return;\n const end = document.createElement('div');\n end.className = 'endOfContent';\n textEl.append(end);\n }).catch(() => {});\n }\n });\n return () => {\n cancelled = true;\n task?.cancel();\n textLayer?.cancel();\n };\n }, [pdf, page, scale]);\n\n // End a selection drag wherever the pointer is released — the .selecting\n // class is added on pointerdown in the layer itself (see JSX below).\n useEffect(() => {\n const up = () => textLayerRef.current?.classList.remove('selecting');\n window.addEventListener('pointerup', up);\n return () => window.removeEventListener('pointerup', up);\n }, []);\n\n const handlePrint = () => {\n if (!pdf) return;\n const win = window.open('', '_blank');\n if (!win) { toast.error('Allow popups to print'); return; }\n const promises: Promise<string>[] = [];\n for (let i = 1; i <= totalPages; i++) {\n promises.push(pdf.getPage(i).then(p => {\n const vp = p.getViewport({ scale: 2 });\n const c = document.createElement('canvas');\n c.width = vp.width; c.height = vp.height;\n return p.render({ canvas: c, canvasContext: c.getContext('2d')!, viewport: vp }).promise.then(() => c.toDataURL());\n }));\n }\n Promise.all(promises).then(images => {\n win.document.write(`<html><head><title>${filename}</title><style>@media print{body{margin:0}img{width:100%;page-break-after:always}}</style></head><body>`);\n win.document.write(images.map(src => `<img src=\"${src}\"/>`).join(''));\n win.document.write('</body></html>');\n win.document.close();\n setTimeout(() => { win.print(); win.close(); }, 300);\n });\n };\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n // Re-arm fit mode. The auto-fit effect picks the new scale on its next\n // tick once `fitMode` flips to true.\n const fitWidth = () => setFitMode(true);\n\n // Wheel and keyboard page navigation. Only takes the wheel event when\n // the container is at the top/bottom edge — otherwise normal scroll\n // moves through a tall page first, matching native PDF readers.\n const onWheelPage = (e: React.WheelEvent<HTMLDivElement>) => {\n if (!pdf) return;\n if (e.ctrlKey || e.metaKey) return; // browser-zoom shortcut, leave alone\n const el = containerRef.current;\n if (!el) return;\n const atTop = el.scrollTop <= 0;\n const atBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - 1;\n if (e.deltaY > 0 && atBottom && page < totalPages) {\n e.preventDefault();\n setPage(p => Math.min(totalPages, p + 1));\n // Land at the top of the next page so wheel-down keeps reading\n // forward. requestAnimationFrame so the canvas has a tick to\n // resize before we scroll.\n requestAnimationFrame(() => { if (containerRef.current) containerRef.current.scrollTop = 0; });\n } else if (e.deltaY < 0 && atTop && page > 1) {\n e.preventDefault();\n setPage(p => Math.max(1, p - 1));\n requestAnimationFrame(() => {\n if (containerRef.current) containerRef.current.scrollTop = containerRef.current.scrollHeight;\n });\n }\n };\n const onKeyPage = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!pdf) return;\n // Ignore keyboard nav when an input/textarea has focus.\n const tag = (document.activeElement?.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea' || (document.activeElement as HTMLElement)?.isContentEditable) return;\n if (e.key === 'PageDown' || e.key === 'ArrowRight') {\n if (page < totalPages) { e.preventDefault(); setPage(p => Math.min(totalPages, p + 1)); }\n } else if (e.key === 'PageUp' || e.key === 'ArrowLeft') {\n if (page > 1) { e.preventDefault(); setPage(p => Math.max(1, p - 1)); }\n } else if (e.key === 'Home') {\n e.preventDefault(); setPage(1);\n } else if (e.key === 'End') {\n e.preventDefault(); setPage(totalPages);\n }\n };\n\n const btn = 'px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1';\n\n return (\n <div className=\"flex flex-col h-full\">\n <PanelActions>\n <button onClick={() => setPage(p => Math.max(1, p - 1))} disabled={page <= 1} className=\"px-1 py-1 rounded hover:bg-gray-200 disabled:opacity-30 text-gray-600\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 19.5L8.25 12l7.5-7.5\" /></svg>\n </button>\n <span className=\"text-gray-600 font-medium tabular-nums\">{page} / {totalPages}</span>\n <button onClick={() => setPage(p => Math.min(totalPages, p + 1))} disabled={page >= totalPages} className=\"px-1 py-1 rounded hover:bg-gray-200 disabled:opacity-30 text-gray-600\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" /></svg>\n </button>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <button\n onClick={() => { setFitMode(false); setScale(s => Math.max(0.3, Math.round((s - 0.25) * 100) / 100)); }}\n className={btn}\n >−</button>\n <select\n value={fitMode ? 'fit' : (ZOOM_PRESETS.includes(Math.round(scale * 100)) ? Math.round(scale * 100) : 'custom')}\n onChange={e => {\n const v = e.target.value;\n if (v === 'fit') { setFitMode(true); return; }\n if (v !== 'custom') { setFitMode(false); setScale(Number(v) / 100); }\n }}\n className=\"bg-transparent hover:bg-gray-200 rounded px-1 py-1 text-gray-600 tabular-nums cursor-pointer focus:outline-none focus:ring-1 focus:ring-blue-400\"\n title=\"Zoom\"\n >\n <option value=\"fit\">Fit</option>\n {!fitMode && !ZOOM_PRESETS.includes(Math.round(scale * 100)) && (\n <option value=\"custom\">{Math.round(scale * 100)}%</option>\n )}\n {ZOOM_PRESETS.map(p => <option key={p} value={p}>{p}%</option>)}\n </select>\n <button\n onClick={() => { setFitMode(false); setScale(s => Math.min(4, Math.round((s + 0.25) * 100) / 100)); }}\n className={btn}\n >+</button>\n <button\n onClick={fitWidth}\n className={btn + (fitMode ? ' bg-gray-200 text-gray-900' : '')}\n title=\"Fit page width — auto-tracks the window size until you zoom manually\"\n >Fit</button>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <button onClick={handlePrint} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.72 13.829c-.24.03-.48.062-.72.096m.72-.096a42.415 42.415 0 0110.56 0m-10.56 0L6.34 18m10.94-4.171c.24.03.48.062.72.096m-.72-.096L17.66 18m0 0l.229 2.523a1.125 1.125 0 01-1.12 1.227H7.231c-.662 0-1.18-.568-1.12-1.227L6.34 18m11.318 0h1.091A2.25 2.25 0 0021 15.75V9.456c0-1.081-.768-2.015-1.837-2.175a48.055 48.055 0 00-1.913-.247M6.34 18H5.25A2.25 2.25 0 013 15.75V9.456c0-1.081.768-2.015 1.837-2.175a48.041 48.041 0 011.913-.247m10.5 0a48.536 48.536 0 00-10.5 0m10.5 0V3.375c0-.621-.504-1.125-1.125-1.125h-8.25c-.621 0-1.125.504-1.125 1.125v3.659M18 10.5h.008v.008H18V10.5zm-3 0h.008v.008H15V10.5z\" /></svg>\n Print\n </button>\n <button onClick={onDownload ?? handleDefaultDownload} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Download\n </button>\n {onEmail && (\n <button onClick={onEmail} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n Email\n </button>\n )}\n </PanelActions>\n\n <div\n ref={containerRef}\n className=\"flex-1 overflow-auto bg-gray-100 outline-none\"\n // tabIndex makes the scroll container itself focusable so PageUp /\n // PageDown / Arrow keys are captured even when no inner element\n // has focus (e.g. right after the panel mounts). Wheel handler\n // page-flips when the user reaches the top/bottom of a long page.\n tabIndex={0}\n onWheel={onWheelPage}\n onKeyDown={onKeyPage}\n >\n {loading ? (\n <div className=\"flex items-center justify-center h-full text-gray-400 text-sm\">Loading PDF...</div>\n ) : (\n <div className=\"min-h-full flex items-center justify-center p-4\">\n <style>{TEXT_LAYER_CSS}</style>\n <div className=\"relative shadow-lg rounded\">\n <canvas ref={canvasRef} className=\"block rounded\" />\n <div\n ref={textLayerRef}\n className=\"preview-pdf-textlayer\"\n onPointerDown={e => e.currentTarget.classList.add('selecting')}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\ninterface DxfPanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\n// Default font set covering Latin + CJK glyphs, served from jsdelivr's mirror\n// of the dxf-viewer example assets. Without these, any TEXT/MTEXT entities in\n// the drawing render as empty boxes. Consumers can override by setting\n// `window.__REACT_OS_SHELL_DXF_FONTS__` to a different array of TTF/OTF URLs.\nconst DEFAULT_DXF_FONTS: string[] = [\n 'https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/Roboto-LightItalic.ttf',\n 'https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/NotoSansDisplay-SemiCondensedLightItalic.ttf',\n 'https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/NanumGothic-Regular.ttf',\n];\n\ninterface DxfLayer {\n name: string;\n displayName?: string;\n color?: number;\n visible: boolean;\n}\n\n/** AutoCAD drawing/editing commands we recognise (so the muscle-memory\n * user gets a helpful \"viewer is read-only\" echo instead of a generic\n * unknown-command error). Alias → canonical name. */\nconst DXF_EDIT_COMMANDS: Record<string, string> = {\n l: 'LINE', line: 'LINE', pl: 'PLINE', pline: 'PLINE',\n ex: 'EXTEND', extend: 'EXTEND', tr: 'TRIM', trim: 'TRIM',\n e: 'ERASE', erase: 'ERASE', m: 'MOVE', move: 'MOVE',\n co: 'COPY', cp: 'COPY', copy: 'COPY', o: 'OFFSET', offset: 'OFFSET',\n f: 'FILLET', fillet: 'FILLET', cha: 'CHAMFER', chamfer: 'CHAMFER',\n x: 'EXPLODE', explode: 'EXPLODE', mi: 'MIRROR', mirror: 'MIRROR',\n ro: 'ROTATE', rotate: 'ROTATE', sc: 'SCALE', scale: 'SCALE',\n s: 'STRETCH', stretch: 'STRETCH', ar: 'ARRAY', array: 'ARRAY',\n rec: 'RECTANG', rectang: 'RECTANG', rectangle: 'RECTANG',\n c: 'CIRCLE', circle: 'CIRCLE', a: 'ARC', arc: 'ARC',\n el: 'ELLIPSE', ellipse: 'ELLIPSE', t: 'MTEXT', mt: 'MTEXT', mtext: 'MTEXT', text: 'TEXT',\n b: 'BLOCK', block: 'BLOCK', i: 'INSERT', insert: 'INSERT', ha: 'HATCH', hatch: 'HATCH',\n};\n\nconst DXF_CMD_HELP = 'Commands: DI distance · DIM/DLI linear dim · H / V force axis · <number> lock Δ · U undo pick · Z fit · LA layers · Esc exit';\n\nfunction DxfPanel({ url, filename, onDownload, onEmail }: DxfPanelProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<any>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [layers, setLayers] = useState<DxfLayer[]>([]);\n const [showLayers, setShowLayers] = useState(false);\n const [showHint, setShowHint] = useState(true);\n\n // Measurement tool — DXF (2D) edition.\n //\n // Four modes (pill next to the Measure button, or typed commands):\n // - Auto: AutoCAD DIMLINEAR — measures ΔX or ΔY, whichever delta is\n // larger between the two picks.\n // - H / V: force the axis (DIMLINEAR Horizontal / Vertical).\n // - Point: straight-line (Euclidean) distance, AutoCAD DIST.\n //\n // All visuals (markers, line, distance label, snap indicator) are HTML/\n // SVG overlays positioned via camera projection — fixed pixel size, so\n // they don't grow into giant orange blobs when the user zooms in.\n // Snapping (endpoint / node / midpoint / intersection / nearest-on-line)\n // is computed in screen space against a cached list of every line\n // segment and point in the scene (built once per measure session).\n const [measureEnabled, setMeasureEnabled] = useState(false);\n const [measureMode, setMeasureMode] = useState<'point' | 'horizontal' | 'vertical' | 'auto'>('auto');\n const [measureDistance, setMeasureDistance] = useState<number | null>(null);\n /** Axis the current measurement actually resolved to — differs from\n * measureMode when mode is 'auto' (DIMLINEAR picks the dominant axis).\n * Drives the toolbar chip arrow/tooltip. */\n const [measureResolved, setMeasureResolved] = useState<'point' | 'horizontal' | 'vertical' | null>(null);\n /** When set in H or V mode, the second pick's X (H) or Y (V) snaps to\n * the first pick's coord + this value, sign-matched to whichever side\n * of A the user clicked on. The displayed measurement then becomes\n * the perpendicular distance (Δy in H, Δx in V) — useful for \"feature\n * is 30mm horizontal from A; how far is it vertically?\" workflows. */\n const [measureFixedDist, setMeasureFixedDist] = useState<number | null>(null);\n /** Raw text in the fixed-distance input — kept separate so partial\n * edits (e.g. just \"-\") don't clobber the parsed value with NaN. */\n const [measureFixedInput, setMeasureFixedInput] = useState('');\n // Refs that mirror the React state so the main measure effect can read\n // the current values without rebuilding when the user switches mode or\n // changes the fixed distance — picks are preserved across these\n // changes.\n const measureModeRef = useRef(measureMode);\n const measureFixedDistRef = useRef(measureFixedDist);\n useEffect(() => { measureModeRef.current = measureMode; }, [measureMode]);\n useEffect(() => { measureFixedDistRef.current = measureFixedDist; }, [measureFixedDist]);\n /** Exposed by the measure effect so other effects can ask it to redraw\n * using the current refs (e.g. after mode / fixed-distance change). */\n const measureRedrawRef = useRef<(() => void) | null>(null);\n /** Exposed by the measure effect — clears the current picks/markers so a\n * typed command (DI, DIM, …) starts a fresh measurement. */\n const measureResetRef = useRef<(() => void) | null>(null);\n /** Exposed by the measure effect — removes the last pick (command U). */\n const measureUndoRef = useRef<(() => void) | null>(null);\n\n // AutoCAD-style command bar (bottom of the panel). Typing anywhere on\n // the drawing routes keystrokes into the input; Enter/Space executes,\n // Enter on an empty line repeats the last command, Esc cancels.\n const [cmdValue, setCmdValue] = useState('');\n const [cmdEcho, setCmdEcho] = useState<string | null>(null);\n const lastCmdRef = useRef('');\n const cmdInputRef = useRef<HTMLInputElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const measureRef = useRef<{\n /** Effective scene points used for the measurement, at most two.\n * In a fixed-distance scenario, picks[1] is the *locked* position\n * (axis-snapped to A + fixed), not the raw click. */\n picks: { x: number; y: number }[];\n /** Raw second-pick click position, kept separately so we can\n * re-derive picks[1] when measureFixedDist changes without\n * forcing the user to re-pick. */\n rawSecondClick: { x: number; y: number } | null;\n /** Imperative DOM nodes — recreated on each enable. */\n overlay: HTMLDivElement | null;\n svg: SVGSVGElement | null;\n /** Main dim line (B-leg in fixed-distance mode). */\n line: SVGLineElement | null;\n /** Fixed-axis leg (A → R) shown only when measureFixedDist is set. */\n fixedLine: SVGLineElement | null;\n /** Label for the fixed-axis leg. */\n fixedLabel: HTMLDivElement | null;\n /** Dashed extension of the dim-axis through the first pick. */\n refLine: SVGLineElement | null;\n /** AutoCAD-style extension lines from each pick to the dim line. */\n extLineA: SVGLineElement | null;\n extLineB: SVGLineElement | null;\n /** Second dashed ref line — vertical axis, used by V and Auto modes. */\n refLineV: SVGLineElement | null;\n markers: HTMLDivElement[];\n label: HTMLDivElement | null;\n snap: HTMLDivElement | null;\n /** Cached scene-space segment endpoints, flat [ax,ay,bx,by,…] — built\n * once per measure session; used for snap detection on pointer move.\n * Instance transforms (INSERT blocks) are baked in at build time. */\n segs: Float64Array | null;\n /** Cached POINT-entity coords, flat [x,y,…] — node snap targets. */\n nodes: Float64Array | null;\n } | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n let viewer: any = null;\n setLoading(true);\n setError(null);\n setLayers([]);\n\n (async () => {\n let DxfViewer: any;\n try {\n const mod = await import('dxf-viewer');\n DxfViewer = (mod as any).DxfViewer;\n } catch (e) {\n if (!cancelled) {\n setError('dxf-viewer is not installed in this app.');\n setLoading(false);\n }\n return;\n }\n if (cancelled || !containerRef.current) return;\n try {\n // dxf-viewer reads container dimensions in its constructor (with\n // autoResize:true, those become the canvas size). If the Modal is\n // still settling we may be measured as 0×0, breaking aspect math\n // and the WebGL viewport. Wait until the container has a real\n // bounding box before constructing the viewer.\n await new Promise<void>(resolve => {\n const tryStart = () => {\n const r = containerRef.current?.getBoundingClientRect();\n if (r && r.width > 4 && r.height > 4) resolve();\n else requestAnimationFrame(tryStart);\n };\n tryStart();\n });\n if (cancelled || !containerRef.current) return;\n\n // clearColor must be a THREE.Color (Library calls .getHex()).\n let three: any = null;\n try { three = await import(/* @vite-ignore */ 'three' as any); } catch {}\n const ClearColor = three?.Color ?? null;\n const viewerOpts: any = { autoResize: true };\n if (ClearColor) viewerOpts.clearColor = new ClearColor(0xffffff);\n viewer = new DxfViewer(containerRef.current, viewerOpts);\n viewerRef.current = viewer;\n\n const fontUrls = (typeof window !== 'undefined' && (window as any).__REACT_OS_SHELL_DXF_FONTS__)\n || DEFAULT_DXF_FONTS;\n await viewer.Load({ url, fonts: fontUrls, workerFactory: null });\n if (cancelled) return;\n\n // Snapshot layer list — used to render the toggle panel.\n try {\n const list: any[] = viewer.GetLayers?.() ?? [];\n if (Array.isArray(list)) {\n setLayers(list.map(l => ({\n name: l.name,\n displayName: l.displayName ?? l.name,\n color: typeof l.color === 'number' ? l.color : undefined,\n visible: true,\n })));\n }\n } catch {}\n\n // Force-fit using the actual loaded bounds and refresh canvas size.\n const refit = () => {\n try {\n const rect = containerRef.current?.getBoundingClientRect();\n if (rect && rect.width > 0 && rect.height > 0) {\n viewer.SetSize?.(Math.round(rect.width), Math.round(rect.height));\n }\n const bounds = viewer.GetBounds?.();\n const origin = viewer.GetOrigin?.();\n if (bounds && origin) {\n viewer.FitView(\n bounds.minX - origin.x, bounds.maxX - origin.x,\n bounds.minY - origin.y, bounds.maxY - origin.y,\n );\n }\n viewer.Render?.();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] DXF refit failed', err);\n }\n };\n refit();\n requestAnimationFrame(refit);\n setLoading(false);\n } catch (e: any) {\n if (!cancelled) {\n setError(e?.message || 'Failed to render DXF.');\n setLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n try { viewer?.Destroy?.(); } catch {}\n viewerRef.current = null;\n };\n }, [url]);\n\n // Auto-hide the usage hint after a few seconds.\n useEffect(() => {\n if (!showHint || loading) return;\n const t = setTimeout(() => setShowHint(false), 5000);\n return () => clearTimeout(t);\n }, [showHint, loading]);\n\n // ──────────────────────────────────────────────────────────────────────\n // Measurement tool — DXF (2D) edition.\n //\n // All visuals (markers, line, label, extension lines, snap indicator)\n // are HTML / SVG overlays positioned via camera projection — they stay\n // constant size in pixels regardless of zoom, so they never balloon\n // into giant orange blobs as the user zooms in.\n //\n // Snapping is computed in *screen space* against a cached list of every\n // line segment and POINT entity in the dxf-viewer scene. The cache walk\n // must mirror dxf-viewer's GPU data layout exactly: positions are\n // TWO-component (x,y) buffer attributes, long polylines are *indexed*\n // (vertex pairs come from the index buffer), and INSERT block geometry\n // is *instanced* — the per-insert 2×3 affine lives in\n // instanceTransform0/1 (FULL) or instanceTransform (POINT translation)\n // attributes and is applied in the vertex shader, never in matrixWorld.\n // So the builder reads via BufferAttribute.getX/getY, follows the index\n // buffer when present, and bakes every instance transform into the\n // cached world-space coords.\n //\n // Snap priority is AutoCAD-flavoured: a real geometric point beats\n // \"somewhere along a line\" even when the line passes closer to the\n // cursor — intersection/endpoint/node (closest wins, ties to\n // intersection) > midpoint > nearest-on-line, all within an 18 px\n // tolerance. Without the tiering, the projection of the cursor onto a\n // hovered segment is always nearer than the segment's endpoint, which\n // made endpoint snapping nearly impossible.\n //\n // Four modes via an Auto | H | V | Point pill next to Measure (also\n // reachable from the command bar: DIM/DLI, H, V, DI):\n // - Auto: AutoCAD DIMLINEAR — measures along the dominant axis of\n // the two picks (|Δx| ≥ |Δy| → horizontal, else vertical).\n // - H: distance along the X axis (|Δx|). Dim line drawn through\n // pick A horizontally, ending at pick B's projected X.\n // - V: distance along the Y axis (|Δy|). Dim line drawn through\n // pick A vertically, ending at pick B's projected Y.\n // - Point: straight-line (Euclidean) distance between two picks.\n //\n // All dimensions render AutoCAD DIMLINEAR-style — arrow heads at both\n // ends, plus an extension line dropping from the second pick to the\n // dim line in H/V mode.\n //\n // H/V also accept a *fixed-distance* input. When set, the second pick's\n // X (in H) or Y (in V) snaps to the first pick's coord plus that value\n // (signed by which side of A the user clicked), and the displayed\n // measurement becomes the *perpendicular* component — i.e. \"this\n // feature is 30mm horizontally from A; how far is it vertically?\". The\n // chain dim renders both legs: a fixed-value leg from A → R, and the\n // perpendicular measurement leg from R → B.\n //\n // Switching mode or editing the fixed distance preserves the two picks\n // — the overlay just re-renders. The main setup effect therefore\n // intentionally does not depend on measureMode / measureFixedDist; a\n // smaller effect calls measureRedrawRef.current() on those changes.\n // ──────────────────────────────────────────────────────────────────────\n const layersKey = layers.map(l => (l.visible ? '1' : '0')).join('');\n useEffect(() => {\n const v = viewerRef.current;\n if (loading || error || !v) return;\n\n const scene: any = v.GetScene?.();\n const camera: any = v.GetCamera?.();\n const canvas: HTMLCanvasElement | undefined = v.GetCanvas?.();\n if (!scene || !camera || !canvas || !containerRef.current) return;\n\n const teardown = () => {\n const s = measureRef.current;\n if (!s) return;\n if (s.overlay && s.overlay.parentElement) s.overlay.parentElement.removeChild(s.overlay);\n measureRef.current = null;\n };\n\n if (!measureEnabled) {\n teardown();\n setMeasureDistance(null);\n setMeasureResolved(null);\n return;\n }\n\n // ── HTML overlay scaffold ──────────────────────────────────────\n const overlay = document.createElement('div');\n overlay.style.cssText = 'position:absolute;inset:0;pointer-events:none;z-index:5;';\n containerRef.current.appendChild(overlay);\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('style', 'position:absolute;inset:0;width:100%;height:100%;pointer-events:none;');\n // AutoCAD-style arrowhead, applied to the dim line via marker-start /\n // marker-end. orient=\"auto-start-reverse\" makes the same marker point\n // outward at *both* ends, so one definition covers both arrows.\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n const marker = document.createElementNS('http://www.w3.org/2000/svg', 'marker');\n marker.setAttribute('id', 'dxf-measure-arrow');\n marker.setAttribute('viewBox', '0 0 10 10');\n marker.setAttribute('refX', '9');\n marker.setAttribute('refY', '5');\n marker.setAttribute('markerWidth', '6');\n marker.setAttribute('markerHeight', '6');\n marker.setAttribute('orient', 'auto-start-reverse');\n const arrowPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n arrowPath.setAttribute('d', 'M 0 0 L 10 5 L 0 10 z');\n arrowPath.setAttribute('fill', '#ff8800');\n marker.appendChild(arrowPath);\n defs.appendChild(marker);\n svg.appendChild(defs);\n overlay.appendChild(svg);\n\n // Dashed extension of the dim-axis through the first pick. Drawn first\n // so the solid dim line renders on top. Two of them — horizontal and\n // vertical — Auto mode shows both until the second pick resolves the\n // axis, H/V show their own.\n const mkRefLine = () => {\n const el = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n el.setAttribute('stroke', '#ff8800');\n el.setAttribute('stroke-width', '1');\n el.setAttribute('stroke-dasharray', '6,4');\n el.setAttribute('opacity', '0.55');\n el.style.display = 'none';\n svg.appendChild(el);\n return el;\n };\n const refLineEl = mkRefLine();\n const refLineVEl = mkRefLine();\n\n // AutoCAD-style extension lines — thin solid lines from each pick to\n // the dim line. Drawn before the dim line so the dim line + arrows\n // render on top.\n const extLineA = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n extLineA.setAttribute('stroke', '#ff8800');\n extLineA.setAttribute('stroke-width', '1');\n extLineA.setAttribute('opacity', '0.85');\n extLineA.style.display = 'none';\n svg.appendChild(extLineA);\n const extLineB = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n extLineB.setAttribute('stroke', '#ff8800');\n extLineB.setAttribute('stroke-width', '1');\n extLineB.setAttribute('opacity', '0.85');\n extLineB.style.display = 'none';\n svg.appendChild(extLineB);\n\n const lineEl = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n lineEl.setAttribute('stroke', '#ff8800');\n lineEl.setAttribute('stroke-width', '1.5');\n lineEl.setAttribute('stroke-linecap', 'round');\n lineEl.style.display = 'none';\n svg.appendChild(lineEl);\n\n // Second dim line — only used in fixed-distance mode, drawing the\n // A→R \"locked\" segment. Visually identical to lineEl so they read as\n // one continuous AutoCAD chain dim.\n const fixedLineEl = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n fixedLineEl.setAttribute('stroke', '#ff8800');\n fixedLineEl.setAttribute('stroke-width', '1.5');\n fixedLineEl.setAttribute('stroke-linecap', 'round');\n fixedLineEl.style.display = 'none';\n svg.appendChild(fixedLineEl);\n\n // AutoCAD-style snap indicator — one container, three glyphs swapped\n // by setSnapGlyph() based on what was matched: square for endpoint,\n // X for intersection, bowtie/hourglass for nearest-on-line.\n const snapEl = document.createElement('div');\n snapEl.style.cssText = `position:absolute;transform:translate(-50%,-50%);pointer-events:none;display:none;`;\n const SVGNS = 'http://www.w3.org/2000/svg';\n const snapSvg = document.createElementNS(SVGNS, 'svg');\n snapSvg.setAttribute('width', '22');\n snapSvg.setAttribute('height', '22');\n snapSvg.setAttribute('viewBox', '0 0 22 22');\n snapSvg.setAttribute('style', 'overflow:visible;display:block');\n snapEl.appendChild(snapSvg);\n const mkSnapGlyph = (build: (g: SVGGElement) => void): SVGGElement => {\n const g = document.createElementNS(SVGNS, 'g');\n build(g);\n g.style.display = 'none';\n snapSvg.appendChild(g);\n return g;\n };\n // Endpoint — hollow square (filled white, orange stroke)\n const snapGlyphEndpoint = mkSnapGlyph((g) => {\n const r = document.createElementNS(SVGNS, 'rect');\n r.setAttribute('x', '4'); r.setAttribute('y', '4');\n r.setAttribute('width', '14'); r.setAttribute('height', '14');\n r.setAttribute('fill', 'rgba(255,255,255,0.9)');\n r.setAttribute('stroke', '#ff8800');\n r.setAttribute('stroke-width', '1.8');\n g.appendChild(r);\n });\n // Intersection — X (two crossing diagonals)\n const snapGlyphIntersection = mkSnapGlyph((g) => {\n const mkLn = (x1: number, y1: number, x2: number, y2: number) => {\n const ln = document.createElementNS(SVGNS, 'line');\n ln.setAttribute('x1', String(x1)); ln.setAttribute('y1', String(y1));\n ln.setAttribute('x2', String(x2)); ln.setAttribute('y2', String(y2));\n ln.setAttribute('stroke', '#ff8800');\n ln.setAttribute('stroke-width', '2.2');\n ln.setAttribute('stroke-linecap', 'round');\n return ln;\n };\n g.appendChild(mkLn(4, 4, 18, 18));\n g.appendChild(mkLn(18, 4, 4, 18));\n });\n // Line (\"nearest\") — bowtie / hourglass\n const snapGlyphLine = mkSnapGlyph((g) => {\n const poly = document.createElementNS(SVGNS, 'polygon');\n poly.setAttribute('points', '4,4 18,4 4,18 18,18');\n poly.setAttribute('fill', 'rgba(255,255,255,0.9)');\n poly.setAttribute('stroke', '#ff8800');\n poly.setAttribute('stroke-width', '1.8');\n poly.setAttribute('stroke-linejoin', 'round');\n g.appendChild(poly);\n });\n // Midpoint — triangle\n const snapGlyphMidpoint = mkSnapGlyph((g) => {\n const poly = document.createElementNS(SVGNS, 'polygon');\n poly.setAttribute('points', '11,3 19,18 3,18');\n poly.setAttribute('fill', 'rgba(255,255,255,0.9)');\n poly.setAttribute('stroke', '#ff8800');\n poly.setAttribute('stroke-width', '1.8');\n poly.setAttribute('stroke-linejoin', 'round');\n g.appendChild(poly);\n });\n // Node (POINT entity) — circle with an X through it\n const snapGlyphNode = mkSnapGlyph((g) => {\n const c = document.createElementNS(SVGNS, 'circle');\n c.setAttribute('cx', '11'); c.setAttribute('cy', '11'); c.setAttribute('r', '7');\n c.setAttribute('fill', 'rgba(255,255,255,0.9)');\n c.setAttribute('stroke', '#ff8800');\n c.setAttribute('stroke-width', '1.8');\n g.appendChild(c);\n const mkLn = (x1: number, y1: number, x2: number, y2: number) => {\n const ln = document.createElementNS(SVGNS, 'line');\n ln.setAttribute('x1', String(x1)); ln.setAttribute('y1', String(y1));\n ln.setAttribute('x2', String(x2)); ln.setAttribute('y2', String(y2));\n ln.setAttribute('stroke', '#ff8800');\n ln.setAttribute('stroke-width', '1.6');\n ln.setAttribute('stroke-linecap', 'round');\n return ln;\n };\n g.appendChild(mkLn(6.5, 6.5, 15.5, 15.5));\n g.appendChild(mkLn(15.5, 6.5, 6.5, 15.5));\n });\n type SnapType = 'endpoint' | 'intersection' | 'line' | 'midpoint' | 'node';\n const setSnapGlyph = (type: SnapType) => {\n snapGlyphEndpoint.style.display = type === 'endpoint' ? '' : 'none';\n snapGlyphIntersection.style.display = type === 'intersection' ? '' : 'none';\n snapGlyphLine.style.display = type === 'line' ? '' : 'none';\n snapGlyphMidpoint.style.display = type === 'midpoint' ? '' : 'none';\n snapGlyphNode.style.display = type === 'node' ? '' : 'none';\n };\n overlay.appendChild(snapEl);\n\n measureRef.current = {\n picks: [],\n rawSecondClick: null,\n overlay, svg, line: lineEl, fixedLine: fixedLineEl, fixedLabel: null, refLine: refLineEl,\n refLineV: refLineVEl,\n extLineA, extLineB,\n markers: [], label: null, snap: snapEl,\n segs: null,\n nodes: null,\n };\n\n // ── THREE.Vector3 for projection math — plucked from the scene ─\n //\n // We need THREE.Vector3 to project/unproject through the camera, but\n // we must NOT `import('three')`. Under a consumer that installs\n // dxf-viewer without a top-level `three` (e.g. pnpm strict\n // node_modules, where `three` is only a transitive dep of\n // dxf-viewer), the bare import is left external and rejects at\n // runtime — THREE stays null, pxFromScene returns its {0,0} fallback,\n // and the whole measure overlay collapses to a zero-length segment at\n // the origin (EFFICIENT BG#00184). Instead pluck the Vector3\n // constructor from dxf-viewer's own scene/camera (both Object3D-\n // derived, so `.position` is guaranteed to be a Vector3 from the\n // bundled THREE). project/unproject only read camera.projectionMatrix\n // / matrixWorldInverse, so a cross-instance Vector3 is safe here —\n // unlike the 3D Raycaster instanceof case, which is why that path\n // routes through OV's own picking instead.\n const Vector3Ctor: any =\n camera?.position?.constructor ?? scene?.position?.constructor ?? null;\n let ready = false;\n\n // Unproject canvas (CSS) px → scene coords (matches dxf-viewer's\n // private _CanvasToSceneCoord).\n const sceneFromPx = (cx: number, cy: number) => {\n if (!Vector3Ctor) return null;\n const w = canvas.clientWidth, h = canvas.clientHeight;\n const v3 = new Vector3Ctor(cx * 2 / w - 1, -cy * 2 / h + 1, 1).unproject(camera);\n return { x: v3.x, y: v3.y };\n };\n // Project scene coords → canvas (CSS) px.\n const pxFromScene = (sx: number, sy: number) => {\n if (!Vector3Ctor) return { x: 0, y: 0 };\n const v3 = new Vector3Ctor(sx, sy, 0).project(camera);\n const w = canvas.clientWidth, h = canvas.clientHeight;\n return { x: (v3.x + 1) / 2 * w, y: (-v3.y + 1) / 2 * h };\n };\n\n // Build the snap cache. The walk must match dxf-viewer's GPU layout —\n // see the block comment above: 2-component positions read via getX/getY\n // (NOT raw array triplets), index buffer followed for INDEXED_LINES, and\n // per-instance INSERT transforms baked in (they live in instance\n // attributes and are applied in the vertex shader, so matrixWorld is\n // always identity). traverseVisible skips layers hidden before the\n // measure session started. No THREE needed here — every read goes\n // through the BufferAttribute's own getX/getY accessors.\n const MAX_SNAP_SEGS = 400_000;\n (() => {\n try {\n const st = measureRef.current;\n if (!st) return;\n const segXY: number[] = [];\n const nodeXY: number[] = [];\n let truncated = false;\n // Per-instance 2×3 affines [m00, m01, tx, m10, m11, ty] for a\n // geometry; a single identity when the geometry isn't instanced.\n const instanceXforms = (g: any): number[][] => {\n const t0 = g?.attributes?.instanceTransform0;\n const t1 = g?.attributes?.instanceTransform1;\n if (t0 && t1) {\n const out: number[][] = [];\n const n = Math.min(t0.count, t1.count);\n for (let k = 0; k < n; k++) {\n out.push([t0.getX(k), t0.getY(k), t0.getZ(k), t1.getX(k), t1.getY(k), t1.getZ(k)]);\n }\n return out;\n }\n const tp = g?.attributes?.instanceTransform;\n if (tp) {\n const out: number[][] = [];\n for (let k = 0; k < tp.count; k++) out.push([1, 0, tp.getX(k), 0, 1, tp.getY(k)]);\n return out;\n }\n return [[1, 0, 0, 0, 1, 0]];\n };\n const visit = (obj: any) => {\n const isSeg = !!obj?.isLineSegments;\n const isPts = !!obj?.isPoints;\n if (!isSeg && !isPts) return;\n const g = obj.geometry;\n const pos = g?.attributes?.position;\n if (!pos) return;\n const xfs = instanceXforms(g);\n if (isSeg) {\n const idx = g.index;\n const pairCount = Math.floor((idx ? idx.count : pos.count) / 2);\n for (let p = 0; p < pairCount; p++) {\n const ia = idx ? idx.getX(2 * p) : 2 * p;\n const ib = idx ? idx.getX(2 * p + 1) : 2 * p + 1;\n const ax = pos.getX(ia), ay = pos.getY(ia);\n const bx = pos.getX(ib), by = pos.getY(ib);\n if (!Number.isFinite(ax + ay + bx + by)) continue;\n for (const m of xfs) {\n if (segXY.length >= MAX_SNAP_SEGS * 4) { truncated = true; return; }\n const tax = m[0] * ax + m[1] * ay + m[2], tay = m[3] * ax + m[4] * ay + m[5];\n const tbx = m[0] * bx + m[1] * by + m[2], tby = m[3] * bx + m[4] * by + m[5];\n if (tax === tbx && tay === tby) continue; // degenerate\n segXY.push(tax, tay, tbx, tby);\n }\n }\n } else {\n for (let i = 0; i < pos.count; i++) {\n const x = pos.getX(i), y = pos.getY(i);\n if (!Number.isFinite(x + y)) continue;\n for (const m of xfs) {\n nodeXY.push(m[0] * x + m[1] * y + m[2], m[3] * x + m[4] * y + m[5]);\n }\n }\n }\n };\n if (typeof scene.traverseVisible === 'function') scene.traverseVisible(visit);\n else scene.traverse(visit);\n st.segs = new Float64Array(segXY);\n st.nodes = new Float64Array(nodeXY);\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`[Preview] DXF snap cache truncated at ${MAX_SNAP_SEGS} segments — snapping may miss some geometry.`);\n }\n ready = true;\n } catch {}\n })();\n\n // ── Snap detection in screen space ────────────────────────────\n // Tolerance in CSS px from the cursor to a candidate snap target.\n // 18 px is wide enough to feel \"sticky\" without overlapping nearby\n // unrelated features on dense drawings.\n const SNAP_PX = 18;\n // Screen-space segment ↔ segment intersection. Operates directly on\n // the projected endpoints (which dxf-viewer's orthographic camera\n // turns into a linear scene→screen map), so the returned point is\n // already in pixel coords — no extra pxFromScene needed in the hot\n // pairwise loop. Returns the screen-space crossing AND the\n // parametric t along segment A, which we use to recover the\n // scene-space intersection by linear interp on A's scene endpoints.\n const segSegIntersectPx = (\n apx: number, apy: number, bpx: number, bpy: number,\n cpx: number, cpy: number, dpx: number, dpy: number,\n ) => {\n const d = (bpx - apx) * (dpy - cpy) - (bpy - apy) * (dpx - cpx);\n if (Math.abs(d) < 1e-9) return null;\n const t = ((cpx - apx) * (dpy - cpy) - (cpy - apy) * (dpx - cpx)) / d;\n const u = ((cpx - apx) * (bpy - apy) - (cpy - apy) * (bpx - apx)) / d;\n const eps = 1e-4;\n if (t < -eps || t > 1 + eps || u < -eps || u > 1 + eps) return null;\n return { px: apx + t * (bpx - apx), py: apy + t * (bpy - apy), t };\n };\n\n const findSnap = (cx: number, cy: number) => {\n const s = measureRef.current;\n if (!s || !ready || !s.segs) return null;\n // Scene→px affine, derived once per call from three probe points —\n // exact for dxf-viewer's orthographic camera, and far cheaper than\n // a Vector3.project per endpoint per mousemove.\n const o = pxFromScene(0, 0);\n const ex = pxFromScene(1, 0);\n const ey = pxFromScene(0, 1);\n const mxx = ex.x - o.x, mxy = ex.y - o.y;\n const myx = ey.x - o.x, myy = ey.y - o.y;\n const det = mxx * myy - myx * mxy;\n if (!det) return null;\n // Cursor in scene coords (inverse affine) + per-axis scene-space\n // tolerance — a cheap bbox cull before any projection math.\n const csx = ((cx - o.x) * myy - (cy - o.y) * myx) / det;\n const csy = ((cy - o.y) * mxx - (cx - o.x) * mxy) / det;\n const rx = SNAP_PX / (Math.hypot(mxx, mxy) || 1);\n const ry = SNAP_PX / (Math.hypot(myx, myy) || 1);\n const minX = csx - rx, maxX = csx + rx, minY = csy - ry, maxY = csy + ry;\n\n const T2 = SNAP_PX * SNAP_PX;\n type Snap = { sx: number; sy: number; type: 'endpoint' | 'node' | 'midpoint' | 'line' | 'intersection' };\n // Tiered bests — see the block comment up top for the priority\n // rationale (endpoint must be reachable while hovering its own\n // segment, so \"nearest-on-line\" lives in a lower tier).\n let bestPt: Snap | null = null, dPt = T2; // endpoint + node\n let bestMid: Snap | null = null, dMid = T2; // midpoint\n let bestLine: Snap | null = null, dLine = T2; // nearest-on-line\n let bestX: Snap | null = null, dX = T2; // intersection\n const cand: { ax: number; ay: number; bx: number; by: number; apx: number; apy: number; bpx: number; bpy: number }[] = [];\n\n const segs = s.segs;\n for (let i = 0; i < segs.length; i += 4) {\n const ax = segs[i], ay = segs[i + 1], bx = segs[i + 2], by = segs[i + 3];\n if ((ax < minX && bx < minX) || (ax > maxX && bx > maxX) ||\n (ay < minY && by < minY) || (ay > maxY && by > maxY)) continue;\n const apx = o.x + mxx * ax + myx * ay, apy = o.y + mxy * ax + myy * ay;\n const bpx = o.x + mxx * bx + myx * by, bpy = o.y + mxy * bx + myy * by;\n let near = false;\n // Endpoints\n let dx = cx - apx, dy = cy - apy;\n let d2 = dx * dx + dy * dy;\n if (d2 < T2) { near = true; if (d2 < dPt) { dPt = d2; bestPt = { sx: ax, sy: ay, type: 'endpoint' }; } }\n dx = cx - bpx; dy = cy - bpy;\n d2 = dx * dx + dy * dy;\n if (d2 < T2) { near = true; if (d2 < dPt) { dPt = d2; bestPt = { sx: bx, sy: by, type: 'endpoint' }; } }\n // Midpoint\n dx = cx - (apx + bpx) / 2; dy = cy - (apy + bpy) / 2;\n d2 = dx * dx + dy * dy;\n if (d2 < T2) { near = true; if (d2 < dMid) { dMid = d2; bestMid = { sx: (ax + bx) / 2, sy: (ay + by) / 2, type: 'midpoint' }; } }\n // Nearest point on segment (in screen space).\n const sdx = bpx - apx, sdy = bpy - apy;\n const len2 = sdx * sdx + sdy * sdy;\n if (len2 > 0) {\n const t = ((cx - apx) * sdx + (cy - apy) * sdy) / len2;\n if (t > 0 && t < 1) {\n dx = cx - (apx + t * sdx); dy = cy - (apy + t * sdy);\n d2 = dx * dx + dy * dy;\n if (d2 < T2) {\n near = true;\n if (d2 < dLine) { dLine = d2; bestLine = { sx: ax + t * (bx - ax), sy: ay + t * (by - ay), type: 'line' }; }\n }\n }\n }\n if (near) cand.push({ ax, ay, bx, by, apx, apy, bpx, bpy });\n }\n\n // POINT entities — node snaps, same tier as endpoints.\n const nodes = s.nodes;\n if (nodes) {\n for (let i = 0; i < nodes.length; i += 2) {\n const x = nodes[i], y = nodes[i + 1];\n if (x < minX || x > maxX || y < minY || y > maxY) continue;\n const dx = cx - (o.x + mxx * x + myx * y);\n const dy = cy - (o.y + mxy * x + myy * y);\n const d2 = dx * dx + dy * dy;\n if (d2 < dPt) { dPt = d2; bestPt = { sx: x, sy: y, type: 'node' }; }\n }\n }\n\n // Pairwise intersections among the near segments — checked entirely\n // in screen space; the scene-space crossing is recovered by linear\n // interp on segment A (exact for the orthographic camera).\n for (let i = 0; i < cand.length; i++) {\n const A = cand[i];\n for (let j = i + 1; j < cand.length; j++) {\n const B = cand[j];\n const ix = segSegIntersectPx(A.apx, A.apy, A.bpx, A.bpy, B.apx, B.apy, B.bpx, B.bpy);\n if (!ix) continue;\n const dx = cx - ix.px, dy = cy - ix.py;\n const d2 = dx * dx + dy * dy;\n if (d2 >= T2 || d2 >= dX) continue;\n dX = d2;\n bestX = { sx: A.ax + ix.t * (A.bx - A.ax), sy: A.ay + ix.t * (A.by - A.ay), type: 'intersection' };\n }\n }\n\n // Priority: intersection and endpoint/node co-rank, then midpoint,\n // then nearest-on-line. Where two segments share a corner the\n // \"intersection\" lands on the endpoint itself — prefer the endpoint\n // glyph there (AutoCAD shows the square at corners), so the\n // intersection only wins when it's clearly closer (> 1 px² margin).\n const top = bestX && bestPt ? (dX < dPt - 1 ? bestX : bestPt) : (bestX ?? bestPt);\n return top ?? bestMid ?? bestLine;\n };\n\n // ── Marker / label / line rendering (HTML/SVG, fixed-pixel) ──\n const makeMarker = (): HTMLDivElement => {\n const el = document.createElement('div');\n el.style.cssText = `position:absolute;width:10px;height:10px;border-radius:50%;background:#ff8800;border:2px solid #fff;box-shadow:0 0 0 1px rgba(0,0,0,0.25);transform:translate(-50%,-50%);pointer-events:none;`;\n overlay.appendChild(el);\n return el;\n };\n const ensureLabel = () => {\n const s = measureRef.current!;\n if (s.label) return s.label;\n const el = document.createElement('div');\n // Park the label off-screen on creation so it never flashes at (0,0)\n // — callers always set left/top before showing it, but the browser\n // would otherwise lay it out at the overlay's top-left corner the\n // first frame after appendChild.\n el.style.cssText = `position:absolute;left:-9999px;top:-9999px;transform:translate(-50%,-50%);padding:2px 6px;font-size:11px;font-weight:600;font-family:system-ui,-apple-system,sans-serif;background:rgba(255,136,0,0.95);color:#fff;border-radius:4px;white-space:nowrap;box-shadow:0 1px 4px rgba(0,0,0,0.25);pointer-events:none;`;\n overlay.appendChild(el);\n s.label = el;\n return el;\n };\n\n const positionMarker = (el: HTMLDivElement, x: number, y: number) => {\n const p = pxFromScene(x, y);\n el.style.left = `${p.x}px`;\n el.style.top = `${p.y}px`;\n };\n\n // Resolve picks[1] from the raw click + active fixedDist. In a\n // fixed-distance H/V scenario the X (or Y) is snapped to A's coord +\n // fixedDist, sign-matched to which side of A the user clicked, so\n // the marker visually sits at the *locked* position even though the\n // click landed elsewhere. Mutates s.picks[1] in place.\n const reconcileLockedPick = () => {\n const s = measureRef.current;\n if (!s || !s.rawSecondClick || s.picks.length < 2) return;\n const a = s.picks[0];\n const raw = s.rawSecondClick;\n const fixed = measureFixedDistRef.current;\n const mode = measureModeRef.current;\n if (fixed !== null && Number.isFinite(fixed) && (mode === 'horizontal' || mode === 'vertical')) {\n if (mode === 'horizontal') {\n const sign = raw.x >= a.x ? 1 : -1;\n s.picks[1] = { x: a.x + sign * Math.abs(fixed), y: raw.y };\n } else {\n const sign = raw.y >= a.y ? 1 : -1;\n s.picks[1] = { x: raw.x, y: a.y + sign * Math.abs(fixed) };\n }\n } else {\n s.picks[1] = { x: raw.x, y: raw.y };\n }\n };\n\n // Resolve the effective measure mode. 'auto' (AutoCAD DIMLINEAR)\n // measures along the dominant axis of the two picks; everything else\n // passes through. With fewer than two picks auto defaults to\n // horizontal — callers that care about the unresolved state (ref\n // lines) check the raw mode themselves.\n const resolveMode = (a?: { x: number; y: number }, b?: { x: number; y: number }): 'point' | 'horizontal' | 'vertical' => {\n const mode = measureModeRef.current;\n if (mode !== 'auto') return mode;\n if (!a || !b) return 'horizontal';\n return Math.abs(b.x - a.x) >= Math.abs(b.y - a.y) ? 'horizontal' : 'vertical';\n };\n\n // Endpoints of the *main* dim line (always rendered when picks=2).\n // In fixed mode this is the leg from R to B (perpendicular to the\n // fixed axis). Without a fixed distance it's the regular H / V / Point\n // line.\n const computeMainDimEnds = () => {\n const s = measureRef.current!;\n const a = s.picks[0];\n const b = s.picks[1];\n const mode = resolveMode(a, b);\n // Fixed distances only apply in *explicit* H/V — a value left over\n // from H mode must not activate when the user switches to Auto.\n const rawMode = measureModeRef.current;\n const fixed = measureFixedDistRef.current;\n if (fixed !== null && Number.isFinite(fixed) && rawMode === 'horizontal') {\n // Fixed H: main leg is vertical at b.x, from a.y to b.y.\n return { from: { x: b.x, y: a.y }, to: { x: b.x, y: b.y } };\n }\n if (fixed !== null && Number.isFinite(fixed) && rawMode === 'vertical') {\n // Fixed V: main leg is horizontal at b.y, from a.x to b.x.\n return { from: { x: a.x, y: b.y }, to: { x: b.x, y: b.y } };\n }\n if (mode === 'horizontal') return { from: a, to: { x: b.x, y: a.y } };\n if (mode === 'vertical') return { from: a, to: { x: a.x, y: b.y } };\n return { from: a, to: b };\n };\n\n const updateOverlay = () => {\n const s = measureRef.current;\n if (!s) return;\n reconcileLockedPick();\n const rawMode = measureModeRef.current;\n const fixed = measureFixedDistRef.current;\n const fixedActive = fixed !== null && Number.isFinite(fixed) && (rawMode === 'horizontal' || rawMode === 'vertical');\n // Markers\n if (s.markers[0]) positionMarker(s.markers[0], s.picks[0].x, s.picks[0].y);\n if (s.markers[1]) positionMarker(s.markers[1], s.picks[1].x, s.picks[1].y);\n // Reference-axis preview — dashed line(s) across the canvas through\n // the first pick. H/V show their own axis; Auto shows both until\n // the second pick resolves which one the dimension follows.\n const drawRefLine = (el: SVGLineElement | null, dir: { dx: number; dy: number }, visible: boolean) => {\n if (!el) return;\n if (!visible || s.picks.length < 1) { el.style.display = 'none'; return; }\n const a = s.picks[0];\n const w = canvas.clientWidth, h = canvas.clientHeight;\n const screenSpan = Math.hypot(w, h) * 4;\n const ap = pxFromScene(a.x, a.y);\n const probe = pxFromScene(a.x + dir.dx, a.y + dir.dy);\n const pxLen = Math.hypot(probe.x - ap.x, probe.y - ap.y) || 1;\n const sceneStep = screenSpan / pxLen;\n const p0 = pxFromScene(a.x - dir.dx * sceneStep, a.y - dir.dy * sceneStep);\n const p1 = pxFromScene(a.x + dir.dx * sceneStep, a.y + dir.dy * sceneStep);\n el.setAttribute('x1', String(p0.x));\n el.setAttribute('y1', String(p0.y));\n el.setAttribute('x2', String(p1.x));\n el.setAttribute('y2', String(p1.y));\n el.style.display = '';\n };\n let showH = rawMode === 'horizontal';\n let showV = rawMode === 'vertical';\n if (rawMode === 'auto') {\n if (s.picks.length >= 2) {\n const r = resolveMode(s.picks[0], s.picks[1]);\n showH = r === 'horizontal';\n showV = r === 'vertical';\n } else {\n showH = true;\n showV = true;\n }\n }\n drawRefLine(s.refLine, { dx: 1, dy: 0 }, showH);\n drawRefLine(s.refLineV, { dx: 0, dy: 1 }, showV);\n // Dim line + chain dim (if fixed) + extension lines + label\n if (s.picks.length === 2) {\n const a = s.picks[0], b = s.picks[1];\n const mode = resolveMode(a, b);\n const ends = computeMainDimEnds();\n const fp = pxFromScene(ends.from.x, ends.from.y);\n const tp = pxFromScene(ends.to.x, ends.to.y);\n s.line!.setAttribute('x1', String(fp.x));\n s.line!.setAttribute('y1', String(fp.y));\n s.line!.setAttribute('x2', String(tp.x));\n s.line!.setAttribute('y2', String(tp.y));\n s.line!.setAttribute('marker-start', 'url(#dxf-measure-arrow)');\n s.line!.setAttribute('marker-end', 'url(#dxf-measure-arrow)');\n // Hide the main dim line if it's degenerate (zero-length leg —\n // happens e.g. when picks are collinear in fixed-distance mode).\n const mainLen = Math.hypot(tp.x - fp.x, tp.y - fp.y);\n s.line!.style.display = mainLen > 0.5 ? '' : 'none';\n\n // Fixed-axis leg (A → R) — only in fixed mode.\n if (fixedActive && s.fixedLine) {\n const r = mode === 'horizontal' ? { x: b.x, y: a.y } : { x: a.x, y: b.y };\n const ap = pxFromScene(a.x, a.y);\n const rp = pxFromScene(r.x, r.y);\n s.fixedLine.setAttribute('x1', String(ap.x));\n s.fixedLine.setAttribute('y1', String(ap.y));\n s.fixedLine.setAttribute('x2', String(rp.x));\n s.fixedLine.setAttribute('y2', String(rp.y));\n s.fixedLine.setAttribute('marker-start', 'url(#dxf-measure-arrow)');\n s.fixedLine.setAttribute('marker-end', 'url(#dxf-measure-arrow)');\n s.fixedLine.style.display = '';\n // Fixed-leg label — show the user's entered fixed value.\n const fLabel = ensureFixedLabel();\n fLabel.textContent = formatMeasureDistance(Math.abs(fixed));\n const fcx = (ap.x + rp.x) / 2;\n const fcy = (ap.y + rp.y) / 2;\n fLabel.style.left = `${fcx}px`;\n fLabel.style.top = `${fcy}px`;\n const w = canvas.clientWidth, h = canvas.clientHeight;\n fLabel.style.display = (fcx < 0 || fcy < 0 || fcx > w || fcy > h) ? 'none' : '';\n } else {\n if (s.fixedLine) s.fixedLine.style.display = 'none';\n if (s.fixedLabel) s.fixedLabel.style.display = 'none';\n }\n\n // Extension line — drops from second pick to the dim line in\n // free H/V (non-fixed) mode. In fixed mode the chain dim already\n // visually closes the loop, so no extension is needed.\n const extA = s.extLineA!;\n const extB = s.extLineB!;\n if (!fixedActive && mode === 'horizontal' && Math.abs(b.y - a.y) > 1e-9) {\n const p = pxFromScene(b.x, a.y);\n const q = pxFromScene(b.x, b.y);\n extB.setAttribute('x1', String(p.x));\n extB.setAttribute('y1', String(p.y));\n extB.setAttribute('x2', String(q.x));\n extB.setAttribute('y2', String(q.y));\n extB.style.display = '';\n extA.style.display = 'none';\n } else if (!fixedActive && mode === 'vertical' && Math.abs(b.x - a.x) > 1e-9) {\n const p = pxFromScene(a.x, b.y);\n const q = pxFromScene(b.x, b.y);\n extB.setAttribute('x1', String(p.x));\n extB.setAttribute('y1', String(p.y));\n extB.setAttribute('x2', String(q.x));\n extB.setAttribute('y2', String(q.y));\n extB.style.display = '';\n extA.style.display = 'none';\n } else {\n extA.style.display = 'none';\n extB.style.display = 'none';\n }\n // Main-leg label — at the midpoint of the main dim line.\n if (s.label) {\n const cx = (fp.x + tp.x) / 2;\n const cy = (fp.y + tp.y) / 2;\n s.label.style.left = `${cx}px`;\n s.label.style.top = `${cy}px`;\n const w = canvas.clientWidth, h = canvas.clientHeight;\n s.label.style.display = (cx < 0 || cy < 0 || cx > w || cy > h) ? 'none' : '';\n // Hide the main label too when the leg is degenerate (no\n // perpendicular distance to display, so nothing meaningful).\n if (mainLen <= 0.5) s.label.style.display = 'none';\n }\n } else {\n s.line!.style.display = 'none';\n if (s.fixedLine) s.fixedLine.style.display = 'none';\n if (s.fixedLabel) s.fixedLabel.style.display = 'none';\n if (s.extLineA) s.extLineA.style.display = 'none';\n if (s.extLineB) s.extLineB.style.display = 'none';\n }\n };\n\n const ensureFixedLabel = () => {\n const s = measureRef.current!;\n if (s.fixedLabel) return s.fixedLabel;\n const el = document.createElement('div');\n el.style.cssText = `position:absolute;left:-9999px;top:-9999px;transform:translate(-50%,-50%);padding:2px 6px;font-size:11px;font-weight:600;font-family:system-ui,-apple-system,sans-serif;background:rgba(255,136,0,0.75);color:#fff;border-radius:4px;white-space:nowrap;box-shadow:0 1px 4px rgba(0,0,0,0.25);pointer-events:none;`;\n overlay.appendChild(el);\n s.fixedLabel = el;\n return el;\n };\n\n // ── Click-vs-drag + snap on hover ─────────────────────────────\n const DRAG_TOL = 4;\n const DRAG_TIME = 350;\n let downX = 0, downY = 0, downTime = 0, downActive = false, dragging = false;\n let lastSnap: ReturnType<typeof findSnap> = null;\n\n const handlePointerDown = (ev: any) => {\n const d = ev?.detail;\n if (!d || d.domEvent?.button !== 0) return;\n downX = d.canvasCoord.x;\n downY = d.canvasCoord.y;\n downTime = performance.now();\n dragging = false;\n downActive = true;\n };\n\n const handlePointerMove = (ev: PointerEvent) => {\n const rect = canvas.getBoundingClientRect();\n const cx = ev.clientX - rect.left;\n const cy = ev.clientY - rect.top;\n // Drag detection (only matters when a button is down).\n if (downActive) {\n if ((cx - downX) ** 2 + (cy - downY) ** 2 > DRAG_TOL * DRAG_TOL) dragging = true;\n }\n // Snap indicator update — only when the user isn't actively\n // dragging (avoid flicker mid-pan).\n const s = measureRef.current;\n if (!s || !s.snap) return;\n if (downActive && dragging) {\n s.snap.style.display = 'none';\n return;\n }\n lastSnap = findSnap(cx, cy);\n if (lastSnap) {\n const p = pxFromScene(lastSnap.sx, lastSnap.sy);\n s.snap.style.left = `${p.x}px`;\n s.snap.style.top = `${p.y}px`;\n s.snap.style.display = '';\n setSnapGlyph(lastSnap.type);\n } else {\n s.snap.style.display = 'none';\n }\n };\n\n const handlePointerUp = (ev: any) => {\n if (!downActive) return;\n downActive = false;\n const elapsed = performance.now() - downTime;\n if (dragging || elapsed > DRAG_TIME) return;\n // Use the snapped position if we have one, otherwise the raw\n // pointer position from dxf-viewer's event.\n const raw = ev?.detail?.position;\n if (!raw) return;\n // Prefer the snapped position when one is available, otherwise the\n // raw pointer position from dxf-viewer's event.\n const picked = lastSnap\n ? { x: lastSnap.sx, y: lastSnap.sy }\n : { x: raw.x, y: raw.y };\n doPick(picked);\n };\n\n // Recompute the distance label from the current picks + active mode.\n // In fixed-distance mode the reported value is the *perpendicular*\n // component (Δy for H, Δx for V) — the fixed value itself shows on\n // the other dim leg's label.\n const recomputeLabel = () => {\n const s = measureRef.current;\n if (!s || s.picks.length !== 2) return;\n reconcileLockedPick();\n const a = s.picks[0], b = s.picks[1];\n const rawMode = measureModeRef.current;\n const mode = resolveMode(a, b);\n const fixed = measureFixedDistRef.current;\n const fixedActive = fixed !== null && Number.isFinite(fixed) && (rawMode === 'horizontal' || rawMode === 'vertical');\n let dist: number;\n let suffix = '';\n let echo: string;\n // Axis the *displayed* value follows — flips to the perpendicular\n // axis in fixed-distance mode (the chip arrow/tooltip track this).\n let shown: 'point' | 'horizontal' | 'vertical' = mode;\n const adx = Math.abs(b.x - a.x), ady = Math.abs(b.y - a.y);\n if (fixedActive && rawMode === 'horizontal') {\n dist = ady;\n suffix = ' ↕';\n shown = 'vertical';\n echo = `ΔY = ${formatMeasureDistance(ady)} with ΔX locked to ${formatMeasureDistance(Math.abs(fixed))}`;\n } else if (fixedActive && rawMode === 'vertical') {\n dist = adx;\n suffix = ' ↔';\n shown = 'horizontal';\n echo = `ΔX = ${formatMeasureDistance(adx)} with ΔY locked to ${formatMeasureDistance(Math.abs(fixed))}`;\n } else if (mode === 'horizontal') {\n dist = adx;\n suffix = ' ↔';\n echo = `Linear dimension = ${formatMeasureDistance(adx)} (ΔX)`;\n } else if (mode === 'vertical') {\n dist = ady;\n suffix = ' ↕';\n echo = `Linear dimension = ${formatMeasureDistance(ady)} (ΔY)`;\n } else {\n dist = Math.hypot(b.x - a.x, b.y - a.y);\n echo = `Distance = ${formatMeasureDistance(dist)} ΔX = ${formatMeasureDistance(adx)} ΔY = ${formatMeasureDistance(ady)}`;\n }\n // A non-finite distance means a corrupt pick slipped through (it\n // shouldn't — the snap cache filters non-finite coords). Show\n // nothing rather than a \"NaN mm\" label.\n if (!Number.isFinite(dist)) {\n setMeasureDistance(null);\n setMeasureResolved(null);\n if (s.label) s.label.style.opacity = '0';\n return;\n }\n setMeasureDistance(dist);\n setMeasureResolved(shown);\n setCmdEcho(echo);\n const label = ensureLabel();\n label.style.opacity = '1';\n label.textContent = `${formatMeasureDistance(dist)}${suffix}`;\n };\n\n // Expose for the mode / fixed-distance change effect — calling this\n // redraws the overlay using whatever the refs currently hold.\n measureRedrawRef.current = () => {\n recomputeLabel();\n updateOverlay();\n };\n\n // Hide every dim visual that only makes sense with two picks.\n const hideDimVisuals = (s: NonNullable<typeof measureRef.current>) => {\n s.line!.style.display = 'none';\n if (s.fixedLine) s.fixedLine.style.display = 'none';\n if (s.fixedLabel) s.fixedLabel.style.display = 'none';\n if (s.extLineA) s.extLineA.style.display = 'none';\n if (s.extLineB) s.extLineB.style.display = 'none';\n if (s.label) s.label.style.opacity = '0';\n setMeasureDistance(null);\n setMeasureResolved(null);\n };\n\n const resetPicks = () => {\n const s = measureRef.current;\n if (!s) return;\n for (const m of s.markers) m.parentElement?.removeChild(m);\n s.markers = [];\n s.picks = [];\n s.rawSecondClick = null;\n if (s.refLine) s.refLine.style.display = 'none';\n if (s.refLineV) s.refLineV.style.display = 'none';\n hideDimVisuals(s);\n };\n measureResetRef.current = resetPicks;\n\n // Command U — drop the most recent pick, keep the other (if any).\n measureUndoRef.current = () => {\n const s = measureRef.current;\n if (!s || s.picks.length === 0) return;\n s.picks.pop();\n const m = s.markers.pop();\n m?.parentElement?.removeChild(m);\n s.rawSecondClick = null;\n hideDimVisuals(s);\n updateOverlay();\n };\n\n const doPick = (p: { x: number; y: number }) => {\n const s = measureRef.current;\n if (!s) return;\n\n // Third click → start fresh.\n if (s.picks.length === 2) resetPicks();\n\n if (s.picks.length === 0) {\n s.picks.push({ x: p.x, y: p.y });\n s.markers.push(makeMarker());\n } else {\n // Second pick — remember the raw click so we can re-lock if the\n // user later edits the fixed-distance input; reconcileLockedPick\n // (called by recomputeLabel / updateOverlay) writes the effective\n // position into picks[1].\n s.rawSecondClick = { x: p.x, y: p.y };\n s.picks.push({ x: p.x, y: p.y });\n s.markers.push(makeMarker());\n recomputeLabel();\n }\n updateOverlay();\n };\n\n const onKeyDown = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') setMeasureEnabled(false);\n };\n\n // ── Wire it up ────────────────────────────────────────────────\n canvas.style.cursor = 'crosshair';\n try { v.Subscribe?.('pointerdown', handlePointerDown); } catch {}\n try { v.Subscribe?.('pointerup', handlePointerUp); } catch {}\n try { v.Subscribe?.('viewChanged', updateOverlay); } catch {}\n canvas.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('keydown', onKeyDown);\n\n return () => {\n canvas.style.cursor = '';\n try { v.Unsubscribe?.('pointerdown', handlePointerDown); } catch {}\n try { v.Unsubscribe?.('pointerup', handlePointerUp); } catch {}\n try { v.Unsubscribe?.('viewChanged', updateOverlay); } catch {}\n canvas.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('keydown', onKeyDown);\n measureRedrawRef.current = null;\n measureResetRef.current = null;\n measureUndoRef.current = null;\n teardown();\n setMeasureDistance(null);\n setMeasureResolved(null);\n };\n // NOTE: measureMode / measureFixedDist intentionally *not* in deps —\n // switching mode or editing the fixed distance preserves picks and\n // just triggers a redraw via the separate effect below. Layer\n // visibility *is* a dep (via layersKey): toggling a layer rebuilds the\n // snap cache so hidden geometry stops attracting the cursor — at the\n // cost of resetting in-progress picks, which a layer change\n // invalidates anyway.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [measureEnabled, loading, error, layersKey]);\n\n // Redraw the measurement overlay when mode or fixed-distance changes,\n // using the picks that are already in measureRef. The main measure\n // effect exposes `measureRedrawRef.current` for this.\n useEffect(() => {\n measureRedrawRef.current?.();\n }, [measureMode, measureFixedDist]);\n\n const toggleLayer = (name: string) => {\n setLayers(prev => prev.map(l => {\n if (l.name !== name) return l;\n const next = !l.visible;\n try { viewerRef.current?.ShowLayer?.(name, next); } catch {}\n return { ...l, visible: next };\n }));\n };\n\n const setAllLayers = (visible: boolean) => {\n setLayers(prev => prev.map(l => {\n if (l.visible === visible) return l;\n try { viewerRef.current?.ShowLayer?.(l.name, visible); } catch {}\n return { ...l, visible };\n }));\n };\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n const handleResetView = () => {\n try {\n const v = viewerRef.current;\n const bounds = v?.GetBounds?.();\n const origin = v?.GetOrigin?.();\n if (bounds && origin) {\n v.FitView(\n bounds.minX - origin.x, bounds.maxX - origin.x,\n bounds.minY - origin.y, bounds.maxY - origin.y,\n );\n } else {\n v?.FitView?.();\n }\n v?.Render?.();\n } catch {}\n };\n\n // ── AutoCAD-style command bar ───────────────────────────────────────\n // Space and Enter both execute (AutoCAD treats space as enter); Enter\n // on an empty line repeats the last command; Esc clears, then exits\n // the measure tool. Typing anywhere over the drawing routes the\n // keystroke into the input — see the keydown effect below.\n const runCommand = (raw: string) => {\n const exec = raw.trim() || lastCmdRef.current;\n setCmdValue('');\n if (!exec) return;\n const cmd = exec.toLowerCase().split(/\\s+/)[0];\n const remember = () => { lastCmdRef.current = exec; };\n const startMeasure = (mode: typeof measureMode, echo: string) => {\n setMeasureEnabled(true);\n setMeasureMode(mode);\n measureResetRef.current?.();\n setCmdEcho(echo);\n remember();\n };\n // Bare number → lock the axis-aligned Δ of the second pick (H/V).\n if (/^-?(\\d+\\.?\\d*|\\.\\d+)$/.test(cmd)) {\n if (measureEnabled && (measureMode === 'horizontal' || measureMode === 'vertical')) {\n const n = parseFloat(cmd);\n if (n) {\n setMeasureFixedInput(cmd);\n setMeasureFixedDist(n);\n setCmdEcho(`Δ${measureMode === 'horizontal' ? 'X' : 'Y'} locked to ${formatMeasureDistance(Math.abs(n))} — the label shows the perpendicular distance`);\n } else {\n setMeasureFixedInput('');\n setMeasureFixedDist(null);\n setCmdEcho('Fixed distance cleared.');\n }\n } else {\n setCmdEcho('Fixed distances apply in H or V mode — type H or V first.');\n }\n return;\n }\n switch (cmd) {\n case 'di': case 'dist': case 'mea': case 'measuregeom':\n startMeasure('point', 'DIST — click two points; straight-line distance (Esc to exit)');\n break;\n case 'dim': case 'dli': case 'dimlin': case 'dimlinear':\n startMeasure('auto', 'DIMLINEAR — click two points; measures ΔX or ΔY, whichever is larger (H / V to force)');\n break;\n // H / V / AUTO switch the axis without dropping existing picks —\n // same as clicking the pill.\n case 'h': case 'hor': case 'horizontal':\n setMeasureEnabled(true);\n setMeasureMode('horizontal');\n setCmdEcho('Horizontal — ΔX between the two picks');\n remember();\n break;\n case 'v': case 'ver': case 'vertical':\n setMeasureEnabled(true);\n setMeasureMode('vertical');\n setCmdEcho('Vertical — ΔY between the two picks');\n remember();\n break;\n case 'au': case 'auto':\n setMeasureEnabled(true);\n setMeasureMode('auto');\n setCmdEcho('Auto (DIMLINEAR) — measures along the dominant axis of the two picks');\n remember();\n break;\n case 'measure':\n setMeasureEnabled(!measureEnabled);\n setCmdEcho(measureEnabled ? 'Measure off.' : 'Measure on — click two points.');\n remember();\n break;\n case 'u': case 'undo':\n measureUndoRef.current?.();\n setCmdEcho('Last pick removed.');\n remember();\n break;\n case 'z': case 'ze': case 'zoom': case 'fit': case 'zoomextents':\n handleResetView();\n setCmdEcho('Zoom extents.');\n remember();\n break;\n case 'la': case 'layer': case 'layers':\n setShowLayers(s => !s);\n setCmdEcho('Layer panel toggled.');\n remember();\n break;\n case 'off': case 'clear':\n setMeasureFixedDist(null);\n setMeasureFixedInput('');\n measureResetRef.current?.();\n setCmdEcho('Measurement cleared.');\n remember();\n break;\n case '?': case 'help':\n setCmdEcho(DXF_CMD_HELP);\n break;\n default: {\n const editCmd = DXF_EDIT_COMMANDS[cmd];\n if (editCmd) setCmdEcho(`${editCmd} is a drawing command — Preview is a read-only viewer. Measuring: DI, DIM, H, V (? for help)`);\n else setCmdEcho(`Unknown command \"${cmd.toUpperCase()}\" — try DI, DIM, H, V, Z, LA (? for help)`);\n }\n }\n };\n\n // AutoCAD keyboard feel: any printable key typed while this panel's\n // window is active (and no other field is focused) lands in the\n // command input. Focusing during keydown is enough — the browser\n // delivers the character to the newly focused input.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.defaultPrevented || e.metaKey || e.ctrlKey || e.altKey) return;\n if (e.key.length !== 1 || e.key === ' ') return;\n const t = e.target as HTMLElement | null;\n if (t && (t.tagName === 'INPUT' || t.tagName === 'TEXTAREA' || t.isContentEditable)) return;\n const root = rootRef.current;\n if (!root) return;\n const myModal = root.closest('[data-modal-id]') as HTMLElement | null;\n if (myModal && getActiveModalId() !== myModal.dataset.modalId) return;\n cmdInputRef.current?.focus();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, []);\n\n // AutoCAD Esc cascade. The shell closes the topmost window on Escape\n // (capture phase, so neither the command input nor a window-level\n // listener can get there first) — intercept it while there's something\n // to cancel: command-input text first, then the measure tool. A further\n // Esc falls through and closes the window as usual.\n const cmdValueRef = useRef(cmdValue);\n const measureEnabledRef = useRef(measureEnabled);\n useEffect(() => { cmdValueRef.current = cmdValue; }, [cmdValue]);\n useEffect(() => { measureEnabledRef.current = measureEnabled; }, [measureEnabled]);\n useEffect(() => {\n return registerModalEscapeInterceptor(() => {\n const root = rootRef.current;\n if (!root) return false;\n const myModal = root.closest('[data-modal-id]') as HTMLElement | null;\n if (!myModal || getActiveModalId() !== myModal.dataset.modalId) return false;\n if (cmdValueRef.current) {\n setCmdValue('');\n setCmdEcho('*Cancel*');\n return true;\n }\n if (measureEnabledRef.current) {\n setMeasureEnabled(false);\n setCmdEcho('Measure off.');\n return true;\n }\n return false;\n });\n }, []);\n\n const btn = 'px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1';\n const colorHex = (n?: number) => {\n if (typeof n !== 'number') return '#999';\n return '#' + n.toString(16).padStart(6, '0');\n };\n\n return (\n <div ref={rootRef} className=\"flex flex-col h-full\">\n <PanelActions>\n <button\n onClick={() => setShowLayers(s => !s)}\n className={btn + (showLayers ? ' bg-gray-200' : '')}\n title=\"Toggle layer visibility\"\n disabled={layers.length === 0}\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.429 9.75L2.25 12l4.179 2.25m0-4.5l5.571 3 5.571-3m-11.142 0L2.25 7.5 12 2.25l9.75 5.25-4.179 2.25m0 0L21.75 12l-4.179 2.25m0 0l4.179 2.25L12 21.75 2.25 16.5l4.179-2.25m11.142 0l-5.571 3-5.571-3\" /></svg>\n Layers {layers.length > 0 && <span className=\"text-gray-400\">({layers.filter(l => l.visible).length}/{layers.length})</span>}\n </button>\n <button onClick={() => setShowHint(s => !s)} className={btn} title=\"How to navigate\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z\" /></svg>\n </button>\n <button\n onClick={() => setMeasureEnabled(m => !m)}\n className={btn + (measureEnabled ? ' bg-gray-200' : '')}\n title={measureEnabled ? 'Stop measuring (Esc)' : 'Measure distance — click two points on the drawing, or type DI / DIM below'}\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 14.25l6-6 6 6 4.5-4.5M9.75 8.25v3M12.75 11.25v3M15.75 14.25v3\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 18.75h19.5\" />\n </svg>\n Measure\n </button>\n {measureEnabled && (\n <>\n <div className=\"flex items-stretch h-7 rounded border border-gray-200 overflow-hidden text-[11px] font-semibold\">\n <button\n onClick={() => setMeasureMode('auto')}\n className={`px-2 transition-colors ${measureMode === 'auto' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Auto — AutoCAD DIMLINEAR: measures ΔX or ΔY, whichever is larger between the two picks\"\n >\n Auto\n </button>\n <button\n onClick={() => setMeasureMode('horizontal')}\n className={`px-2 transition-colors ${measureMode === 'horizontal' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Horizontal — distance along the X axis between two picks (AutoCAD DIMLINEAR horizontal)\"\n >\n H\n </button>\n <button\n onClick={() => setMeasureMode('vertical')}\n className={`px-2 transition-colors ${measureMode === 'vertical' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Vertical — distance along the Y axis between two picks (AutoCAD DIMLINEAR vertical)\"\n >\n V\n </button>\n <button\n onClick={() => setMeasureMode('point')}\n className={`px-2 transition-colors ${measureMode === 'point' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Point — straight-line (Euclidean) distance between two picks (AutoCAD DIST)\"\n >\n Point\n </button>\n </div>\n {/* Fixed-distance input — locks the second pick's axis-aligned\n coord to (first pick's coord ± entered value). The\n displayed measurement becomes the perpendicular distance.\n Only useful in H or V mode. Sign of the offset follows\n whichever side of the first pick the user clicks on. */}\n {(measureMode === 'horizontal' || measureMode === 'vertical') && (\n <div className=\"flex items-center gap-1\">\n <input\n type=\"number\"\n inputMode=\"decimal\"\n step=\"any\"\n value={measureFixedInput}\n placeholder={measureMode === 'horizontal' ? 'fix Δx' : 'fix Δy'}\n onChange={(e) => {\n const raw = e.target.value;\n setMeasureFixedInput(raw);\n if (raw.trim() === '') setMeasureFixedDist(null);\n else {\n const n = parseFloat(raw);\n setMeasureFixedDist(Number.isFinite(n) && n !== 0 ? n : null);\n }\n }}\n className=\"h-7 w-20 px-1.5 text-[11px] font-mono rounded border border-gray-200 bg-white text-gray-700 focus:outline-none focus:border-orange-400\"\n title=\"Lock the second pick's axis coord to first pick + this value (mm). The reported measurement becomes the perpendicular distance.\"\n />\n {measureFixedDist !== null && (\n <button\n onClick={() => { setMeasureFixedDist(null); setMeasureFixedInput(''); }}\n className=\"text-gray-400 hover:text-gray-600 text-[11px] px-1\"\n title=\"Clear fixed distance\"\n >\n ×\n </button>\n )}\n </div>\n )}\n </>\n )}\n {measureEnabled && measureDistance !== null && (\n <div\n className=\"px-2 py-1 text-[11px] font-mono font-semibold text-orange-600 bg-orange-50 border border-orange-200 rounded whitespace-nowrap\"\n title={\n measureResolved === 'horizontal' ? `Horizontal distance (Δx) between the two picked points${measureMode === 'auto' ? ' — Auto resolved to the X axis' : ''}`\n : measureResolved === 'vertical' ? `Vertical distance (Δy) between the two picked points${measureMode === 'auto' ? ' — Auto resolved to the Y axis' : ''}`\n : 'Straight-line distance between the two picked points'\n }\n >\n {formatMeasureDistance(measureDistance)}\n {measureResolved === 'horizontal' ? ' ↔'\n : measureResolved === 'vertical' ? ' ↕'\n : ''}\n </div>\n )}\n <button onClick={handleResetView} className={btn} title=\"Fit drawing to view\">Fit</button>\n <button onClick={onDownload ?? handleDefaultDownload} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Download\n </button>\n {onEmail && (\n <button onClick={onEmail} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n Email\n </button>\n )}\n </PanelActions>\n <div className=\"relative flex-1 bg-white min-h-0\">\n {/* dxf-viewer overrides container's `position` to `relative` in its\n * constructor, which kills any `inset: 0` sizing. Use explicit\n * width/height: 100% so the container always fills its flex parent. */}\n <div ref={containerRef} style={{ width: '100%', height: '100%' }} />\n\n {showLayers && layers.length > 0 && (\n <div className=\"absolute top-2 right-2 w-64 max-h-[70%] flex flex-col bg-white/95 backdrop-blur border border-gray-200 rounded-md shadow-xl z-10 text-xs\">\n <div className=\"flex items-center justify-between px-2 py-1.5 border-b border-gray-200 bg-gray-50\">\n <span className=\"font-medium text-gray-700\">Layers</span>\n <div className=\"flex items-center gap-1\">\n <button onClick={() => setAllLayers(true)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\">All</button>\n <button onClick={() => setAllLayers(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\">None</button>\n <button onClick={() => setShowLayers(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\" title=\"Close\">×</button>\n </div>\n </div>\n <div className=\"overflow-y-auto py-1\">\n {layers.map(l => (\n <label key={l.name} className=\"flex items-center gap-2 px-2 py-1 hover:bg-gray-100 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={l.visible}\n onChange={() => toggleLayer(l.name)}\n className=\"h-3.5 w-3.5\"\n />\n <span\n className=\"inline-block h-3 w-3 rounded-sm border border-gray-300 shrink-0\"\n style={{ background: colorHex(l.color) }}\n />\n <span className=\"truncate text-gray-700\" title={l.displayName}>{l.displayName || l.name}</span>\n </label>\n ))}\n </div>\n </div>\n )}\n\n {showHint && !loading && !error && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 bg-gray-900/85 text-white text-[11px] px-3 py-1.5 rounded-full shadow-lg flex items-center gap-3 z-10 pointer-events-none\">\n <span className=\"flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5M7.188 2.239l.777 2.897M5.136 7.965l-2.898-.777M13.95 4.05l-2.122 2.122m-5.657 5.656l-2.12 2.122\" /></svg>\n Drag to pan\n </span>\n <span className=\"text-white/40\">•</span>\n <span className=\"flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607zM10.5 7.5v6m3-3h-6\" /></svg>\n Scroll to zoom\n </span>\n <span className=\"text-white/40\">•</span>\n <span>Fit to reset</span>\n <span className=\"text-white/40\">•</span>\n <span>Type <span className=\"font-mono font-semibold\">DI</span> / <span className=\"font-mono font-semibold\">DIM</span> to measure</span>\n </div>\n )}\n\n {loading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-white/80 text-sm text-gray-500\">Loading drawing…</div>\n )}\n {error && (\n <div className=\"absolute inset-0 flex items-center justify-center text-sm text-red-600 px-6 text-center\">{error}</div>\n )}\n </div>\n\n {/* AutoCAD-style command bar. Typing over the drawing focuses the\n * input automatically; Enter/Space runs, Enter on empty repeats,\n * Esc cancels the input then the measure tool. */}\n <div className=\"shrink-0 border-t border-gray-200 bg-gray-50\">\n {cmdEcho && (\n <div className=\"px-2.5 pt-1 text-[11px] font-mono text-gray-500 truncate\" title={cmdEcho}>{cmdEcho}</div>\n )}\n <div className=\"flex items-center gap-1.5 px-2.5 h-7\">\n <span className=\"text-[11px] font-mono font-semibold text-gray-400 select-none\">></span>\n <input\n ref={cmdInputRef}\n value={cmdValue}\n onChange={(e) => setCmdValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n runCommand(cmdValue);\n } else if (e.key === 'Escape') {\n if (cmdValue) {\n // Esc with text: cancel the input only — don't let the\n // window-level handler kill the measure tool too.\n e.stopPropagation();\n setCmdValue('');\n setCmdEcho('*Cancel*');\n } else {\n (e.target as HTMLInputElement).blur();\n }\n }\n }}\n placeholder=\"Type a command — DI, DIM, H, V, Z, LA (? for help)\"\n spellCheck={false}\n autoComplete=\"off\"\n className=\"flex-1 min-w-0 bg-transparent text-[11px] font-mono text-gray-700 focus:outline-none placeholder:text-gray-300\"\n />\n </div>\n </div>\n </div>\n );\n}\n\ninterface StepPanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\n// online-3d-viewer expects an \"external libs\" base URL where it can find the\n// occt-import-js WASM (for STEP/IGES) plus draco/rhino3dm/web-ifc decoders.\n// jsdelivr mirrors the npm package at this path; consumers can override via\n// `window.__REACT_OS_SHELL_O3DV_LIBS__` to self-host (e.g. air-gapped).\nconst DEFAULT_O3DV_LIBS = 'https://cdn.jsdelivr.net/npm/online-3d-viewer@0.18.0/libs/';\n\ninterface TreeNode {\n id: number;\n name: string;\n isMeshNode: boolean;\n meshIndices: number[];\n children: TreeNode[];\n}\n\nfunction buildTree(node: any, depth = 0): TreeNode {\n return {\n id: node.GetId?.() ?? 0,\n name: node.GetName?.() || (depth === 0 ? 'Root' : 'Node'),\n isMeshNode: !!node.IsMeshNode?.(),\n meshIndices: node.GetMeshIndices?.() ?? [],\n children: (node.GetChildNodes?.() ?? []).map((c: any) => buildTree(c, depth + 1)),\n };\n}\n\n// Collect every nodeId in the subtree rooted at `node` (inclusive).\nfunction collectNodeIds(node: TreeNode, out: Set<number>) {\n out.add(node.id);\n for (const c of node.children) collectNodeIds(c, out);\n}\n\n// Hex string (\"#rrggbb\") → RGBColor instance.\nfunction hexToRgb(OV: any, hex: string) {\n const m = /^#?([0-9a-f]{6})$/i.exec(hex);\n const n = m ? parseInt(m[1], 16) : 0;\n return new OV.RGBColor((n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff);\n}\nfunction rgbToHex(c: { r?: number; g?: number; b?: number }) {\n const r = (c.r ?? 0) | 0, g = (c.g ?? 0) | 0, b = (c.b ?? 0) | 0;\n return '#' + [r, g, b].map(v => v.toString(16).padStart(2, '0')).join('');\n}\n\n/** Format a 3D-space distance for the measurement label. STEP files are\n * conventionally in millimetres, so we surface mm with a sensible\n * precision and switch to metres for >= 1000 mm. */\nfunction formatMeasureDistance(mm: number): string {\n // Two decimals to match AutoCAD's dimension readout (e.g. 18.56 mm) —\n // one decimal loses real precision on machined parts.\n if (mm >= 1000) return `${(mm / 1000).toFixed(3)} m`;\n return `${mm.toFixed(2)} mm`;\n}\n\nfunction StepPanel({ url, filename, onDownload, onEmail }: StepPanelProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<any>(null);\n const ovRef = useRef<any>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [showHint, setShowHint] = useState(true);\n\n // Mesh tree + per-node visibility (true = visible).\n const [tree, setTree] = useState<TreeNode | null>(null);\n const [expanded, setExpanded] = useState<Record<number, boolean>>({});\n const [hidden, setHidden] = useState<Set<number>>(new Set());\n\n // Right-panel display settings.\n const [bgColor, setBgColor] = useState('#f5f6f8');\n const [showEdges, setShowEdges] = useState(true);\n const [edgeColor, setEdgeColor] = useState('#000000');\n const [edgeThreshold, setEdgeThreshold] = useState(1);\n\n // Floating panel visibility — default closed so the viewport is unobstructed.\n const [showMeshes, setShowMeshes] = useState(false);\n const [showSettings, setShowSettings] = useState(false);\n // Camera projection — orthographic by default. CAD users expect ortho\n // when first opening a STEP file; perspective is one click away via\n // the toolbar toggle.\n const [perspective, setPerspective] = useState(false);\n\n // Section view (capped clipping plane).\n const [sectionEnabled, setSectionEnabled] = useState(false);\n const [sectionAxis, setSectionAxis] = useState<'x' | 'y' | 'z'>('x');\n const [sectionFlip, setSectionFlip] = useState(false);\n const [sectionPosition, setSectionPosition] = useState(0.5); // 0–1 within bbox\n const [sectionAngle, setSectionAngle] = useState(0); // degrees, 0–180 — rotates the cut plane around a perpendicular axis\n\n // Measurement tool — point picker. Two modes:\n // - 'point': click two points on the model → straight-line distance.\n // - 'perp': click two surfaces → perpendicular gap between the two\n // face planes (the typical CAD \"wall thickness\" measurement).\n // Clicked points + visual artefacts (markers, line, label) live in the\n // ref so the user can orbit the camera between picks without losing\n // anything.\n const [measureEnabled, setMeasureEnabled] = useState(false);\n const [measureMode, setMeasureMode] = useState<'point' | 'perp'>('point');\n const [measureDistance, setMeasureDistance] = useState<number | null>(null);\n const measureRef = useRef<{\n points: any[]; // THREE.Vector3[] — at most 2\n normals: ({ x: number; y: number; z: number } | null)[]; // surface normal at each pick (null if pick missed a face)\n markers: any[]; // small spheres at each point\n line: any | null; // line connecting them\n label: HTMLDivElement | null;\n rafId: number | null; // requestAnimationFrame for label-follows-camera\n } | null>(null);\n\n // Persistent section state — stencil helpers, cap mesh, original material\n // settings — held in a ref so we can mutate the plane in place on slider\n // tick instead of rebuilding every helper mesh.\n const sectionRef = useRef<{\n plane: any;\n capMesh: any;\n helpers: any[];\n materialState: Map<any, { clippingPlanes: any; clipShadows: any }>;\n bbox: any;\n } | null>(null);\n\n // Load model.\n useEffect(() => {\n let cancelled = false;\n let viewer: any = null;\n let resizeObserver: ResizeObserver | null = null;\n setLoading(true);\n setError(null);\n setTree(null);\n setExpanded({});\n setHidden(new Set());\n\n (async () => {\n let OV: any;\n try {\n OV = await import('online-3d-viewer');\n } catch {\n if (!cancelled) {\n setError('online-3d-viewer is not installed in this app. Add it to enable 3D file viewing.');\n setLoading(false);\n }\n return;\n }\n ovRef.current = OV;\n if (cancelled || !containerRef.current) return;\n\n // Wait for container to have a real layout before constructing the\n // viewer — same dance as the DXF panel.\n await new Promise<void>(resolve => {\n const tryStart = () => {\n const r = containerRef.current?.getBoundingClientRect();\n if (r && r.width > 4 && r.height > 4) resolve();\n else requestAnimationFrame(tryStart);\n };\n tryStart();\n });\n if (cancelled || !containerRef.current) return;\n\n try {\n const libsBase = (typeof window !== 'undefined' && (window as any).__REACT_OS_SHELL_O3DV_LIBS__)\n || DEFAULT_O3DV_LIBS;\n OV.SetExternalLibLocation?.(libsBase);\n\n // Must run before EmbeddedViewer creates its canvas so the WebGL\n // context is granted a stencil buffer (needed by the section\n // view's capping technique).\n ensureStencilContextAttribute();\n\n viewer = new OV.EmbeddedViewer(containerRef.current, {\n backgroundColor: new OV.RGBAColor(245, 246, 248, 255),\n defaultColor: new OV.RGBColor(180, 188, 200),\n edgeSettings: new OV.EdgeSettings(true, new OV.RGBColor(0, 0, 0), 1),\n onModelLoaded: () => {\n if (cancelled) return;\n try {\n const model = viewer.GetModel?.();\n const root = model?.GetRootNode?.();\n if (root) {\n const t = buildTree(root);\n setTree(t);\n // Expand top two levels by default.\n const expandIds: Record<number, boolean> = { [t.id]: true };\n for (const c of t.children) expandIds[c.id] = true;\n setExpanded(expandIds);\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] mesh tree extraction failed', err);\n }\n setLoading(false);\n },\n onModelLoadFailed: () => {\n if (!cancelled) {\n setError('Failed to load 3D model.');\n setLoading(false);\n }\n },\n });\n viewerRef.current = viewer;\n\n const inputFile = new OV.InputFile(filename, OV.FileSource.Url, url);\n viewer.LoadModelFromInputFiles([inputFile]);\n\n // Re-size the WebGL canvas whenever the container's box changes —\n // window resize, Modal drag-resize, taskbar repositioning, etc.\n // The OV EmbeddedViewer ships its own `Resize()` that auto-detects\n // the container size; we feature-detect the underlying inner\n // viewer too in case OV's wrapper API changes.\n if (containerRef.current && typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(() => {\n try {\n const v = viewerRef.current as any;\n if (v?.Resize) v.Resize();\n else if (v?.viewer?.Resize) v.viewer.Resize();\n v?.viewer?.Render?.();\n } catch {}\n });\n resizeObserver.observe(containerRef.current);\n }\n } catch (e: any) {\n if (!cancelled) {\n setError(e?.message || 'Failed to load 3D model.');\n setLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n try { resizeObserver?.disconnect(); } catch {}\n try { viewer?.Destroy?.(); } catch {}\n viewerRef.current = null;\n };\n }, [url, filename]);\n\n // Apply per-node visibility by walking the THREE scene's mesh userData. The\n // engine's public `SetMeshesVisibility` is global-only, so we go one level\n // deeper to flip individual `mesh.visible` flags.\n useEffect(() => {\n const v = viewerRef.current;\n if (!v?.viewer) return;\n try {\n const visit = (mesh: any) => {\n if (mesh.userData?.__sectionHelper) return;\n const ud = mesh.userData?.originalMeshInstance ?? mesh.userData;\n const nodeId: number | undefined = ud?.id?.nodeId ?? ud?.nodeId;\n if (typeof nodeId === 'number') {\n mesh.visible = !hidden.has(nodeId);\n }\n };\n v.viewer.mainModel?.EnumerateMeshesAndLines?.(visit);\n v.viewer.mainModel?.EnumerateEdges?.(visit);\n v.viewer.Render?.();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] visibility update failed', err);\n }\n }, [hidden, tree]);\n\n // Apply edge settings.\n useEffect(() => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer) return;\n try {\n v.viewer.SetEdgeSettings(new OV.EdgeSettings(showEdges, hexToRgb(OV, edgeColor), edgeThreshold));\n\n // OV's GenerateEdgeModel walks every mesh in mainModel — including\n // the stencil helpers we add as children of the originals when\n // section view is on. That produces duplicate edge LineSegments\n // (one per helper, on top of the originals) and the new\n // LineBasicMaterials don't carry our clipping plane, so the edges\n // render past the cut. Strip the helper-derived edges and reapply\n // clipping to what's left.\n const s = sectionRef.current;\n if (s) {\n const helperEdges: any[] = [];\n v.viewer.mainModel?.EnumerateEdges?.((edge: any) => {\n if (edge.userData?.__sectionHelper) helperEdges.push(edge);\n });\n for (const e of helperEdges) {\n e.parent?.remove(e);\n e.geometry?.dispose?.();\n e.material?.dispose?.();\n }\n const plane = s.plane;\n const applyMatClip = (mat: any) => {\n if (!mat || s.materialState.has(mat)) return;\n s.materialState.set(mat, { clippingPlanes: mat.clippingPlanes, clipShadows: mat.clipShadows });\n mat.clippingPlanes = [plane];\n mat.clipShadows = true;\n mat.needsUpdate = true;\n };\n v.viewer.mainModel?.EnumerateEdges?.((edge: any) => {\n const mat = edge.material;\n if (Array.isArray(mat)) for (const m of mat) applyMatClip(m);\n else applyMatClip(mat);\n });\n }\n\n v.viewer.Render?.();\n } catch {}\n }, [showEdges, edgeColor, edgeThreshold]);\n\n // Apply background color.\n useEffect(() => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer) return;\n try {\n const c = hexToRgb(OV, bgColor);\n v.viewer.SetBackgroundColor(new OV.RGBAColor(c.r, c.g, c.b, 255));\n v.viewer.Render?.();\n } catch {}\n }, [bgColor]);\n\n // Section view — set / tear down on enable.\n //\n // Capped clipping using the standard three.js stencil technique. The\n // tricky bit is that we can't `import('three')` — it resolves to a\n // different three instance than the one online-3d-viewer bundles\n // (transitive duplicate), which breaks instanceof checks against the\n // renderer's THREE. Workaround: pluck constructors (Mesh, BufferGeometry,\n // BufferAttribute, MeshPhongMaterial) from a sample mesh in the loaded\n // scene — those are guaranteed to be from the renderer's THREE. The\n // stencil/side constants are universal numeric values, so we hardcode\n // them. The plane itself stays duck-typed — three's WebGLClipping just\n // calls `.copy()` on it (reads .normal.x/y/z and .constant).\n useEffect(() => {\n const v = viewerRef.current;\n if (!v?.viewer || loading) return;\n\n const renderer = v.viewer.renderer;\n const scene = v.viewer.scene;\n if (!renderer || !scene) return;\n\n // Tear down any previous state.\n if (sectionRef.current) {\n const s = sectionRef.current;\n for (const [mat, prev] of s.materialState.entries()) {\n mat.clippingPlanes = prev.clippingPlanes;\n mat.clipShadows = prev.clipShadows;\n mat.needsUpdate = true;\n }\n for (const helper of s.helpers) {\n helper.parent?.remove(helper);\n // Don't dispose helper.geometry — it's shared with the original mesh.\n helper.material?.dispose?.();\n }\n if (s.capMesh) {\n scene.remove(s.capMesh);\n s.capMesh.geometry?.dispose?.();\n s.capMesh.material?.dispose?.();\n }\n sectionRef.current = null;\n }\n\n if (!sectionEnabled) {\n renderer.localClippingEnabled = false;\n v.viewer.Render?.();\n return;\n }\n\n const bbox = v.viewer.GetBoundingBox?.(() => true);\n if (!bbox) return;\n\n // Snapshot the mesh list — never traverse-and-mutate.\n const targets: any[] = [];\n v.viewer.mainModel?.EnumerateMeshes?.((mesh: any) => {\n if (!mesh.userData?.__sectionHelper) targets.push(mesh);\n });\n if (!targets.length) {\n renderer.localClippingEnabled = false;\n v.viewer.Render?.();\n return;\n }\n\n // Pluck THREE constructors from a sample mesh (these come from the\n // renderer's THREE, so the renderer recognizes the resulting objects).\n const sample = targets[0];\n const Mesh = sample.constructor;\n const Material = sample.material?.constructor; // MeshPhongMaterial\n const Geometry = sample.geometry?.constructor;\n const BufferAttr = sample.geometry?.attributes?.position?.constructor;\n if (!Mesh || !Material || !Geometry || !BufferAttr) {\n // Fallback to plain clipping if we can't pluck constructors.\n // eslint-disable-next-line no-console\n console.warn('[Preview] section: missing THREE constructors, falling back to no cap');\n }\n\n // Universal three.js / WebGL constants.\n const FrontSide = 0, BackSide = 1, DoubleSide = 2;\n const AlwaysStencilFunc = 519, NotEqualStencilFunc = 517;\n const IncrementWrapStencilOp = 7682, DecrementWrapStencilOp = 7683;\n const ReplaceStencilOp = 7681;\n\n // Verify the WebGL context actually has a stencil buffer — without one\n // every stencil op is a no-op, the cap stays at ref 0 forever, and the\n // cut reads as a hollow shell. If we can't get one, log and skip the\n // cap (clipping still works, just without fill).\n let hasStencil = true;\n try {\n const gl = renderer.getContext?.();\n const attrs = gl?.getContextAttributes?.();\n hasStencil = attrs?.stencil !== false;\n // Force the renderer to clear stencil between frames; without this\n // the helper writes accumulate (or never start at 0) and the cap\n // mask drifts.\n renderer.autoClearStencil = true;\n // eslint-disable-next-line no-console\n console.info('[Preview] section: stencil buffer =', hasStencil, 'targets =', targets.length);\n } catch {}\n\n // Enable local clipping BEFORE we modify material clippingPlanes so the\n // shaders pick up the clipping path on first compile. Setting this\n // afterwards still works (with material.needsUpdate), but doing it\n // early avoids one wasted recompile and is closer to three.js's\n // documented usage pattern.\n renderer.localClippingEnabled = true;\n\n // Duck-typed plane. three.js's WebGLClipping calls `_plane.copy(this)`\n // — that just reads `.normal.x/y/z` and `.constant`, so a plain object\n // works. BUT `Material.copy()` deep-clones a source material's\n // clippingPlanes via `srcPlanes[i].clone()`, so our plane needs a\n // `.clone()` method or material cloning crashes with\n // `t[s].clone is not a function`. The clone returned here is a fresh\n // object with the same shape (so a clone-of-the-clone also works);\n // we always overwrite the cloned material's clippingPlanes back to\n // the shared plane reference afterwards, so this isn't load-bearing\n // for the actual rendering — it just has to not throw.\n const plane: any = {\n normal: { x: 0, y: 0, z: -1 },\n constant: 0,\n };\n plane.clone = function planeClone(this: any) {\n const c: any = {\n normal: { x: this.normal.x, y: this.normal.y, z: this.normal.z },\n constant: this.constant,\n };\n c.clone = planeClone;\n return c;\n };\n const helpers: any[] = [];\n const materialState = new Map<any, { clippingPlanes: any; clipShadows: any }>();\n\n const applyToMaterial = (mat: any) => {\n if (!mat || materialState.has(mat)) return;\n materialState.set(mat, { clippingPlanes: mat.clippingPlanes, clipShadows: mat.clipShadows });\n mat.clippingPlanes = [plane];\n mat.clipShadows = true;\n mat.needsUpdate = true;\n };\n\n for (const mesh of targets) {\n const mat = mesh.material;\n if (Array.isArray(mat)) for (const m of mat) applyToMaterial(m);\n else applyToMaterial(mat);\n\n // Stencil-only helpers per mesh: back-faces increment the stencil,\n // front-faces decrement. Where the running count is non-zero on the\n // cap plane, we're inside the solid → cap renders.\n //\n // We clone the source material rather than `new Material()` so the\n // shader compiles with the same uniform/attribute setup as the\n // existing scene (avoids subtle \"shader fails silently\" cases).\n const sourceMat = Array.isArray(mat) ? mat[0] : mat;\n if (Mesh && hasStencil && sourceMat?.clone) {\n const makeStencil = (side: number, op: number) => {\n const m: any = sourceMat.clone();\n m.depthWrite = false;\n m.depthTest = false;\n m.colorWrite = false;\n m.stencilWrite = true;\n m.stencilFunc = AlwaysStencilFunc;\n m.stencilFail = op;\n m.stencilZFail = op;\n m.stencilZPass = op;\n m.side = side;\n m.transparent = false;\n m.clippingPlanes = [plane];\n m.clipShadows = true;\n m.needsUpdate = true;\n const helper = new Mesh(mesh.geometry, m);\n helper.matrixAutoUpdate = false;\n helper.renderOrder = 1;\n helper.userData.__sectionHelper = true;\n mesh.add(helper);\n helpers.push(helper);\n };\n makeStencil(BackSide, IncrementWrapStencilOp);\n makeStencil(FrontSide, DecrementWrapStencilOp);\n }\n }\n\n // Edges — clip them too so the cut isn't framed by a stale outline.\n v.viewer.mainModel?.EnumerateEdges?.((edge: any) => {\n const mat = edge.material;\n if (Array.isArray(mat)) for (const m of mat) applyToMaterial(m);\n else applyToMaterial(mat);\n });\n\n // Cap quad — sized to the bbox diagonal × 2 so it always covers the cut,\n // built as a manual BufferGeometry quad (4 verts, 2 tris). We clone\n // the source material (same shader as the rest of the scene) instead\n // of `new Material()` so the cap actually receives lighting consistent\n // with the model.\n let capMesh: any = null;\n const sourceMat = (targets[0]?.material && (Array.isArray(targets[0].material) ? targets[0].material[0] : targets[0].material)) as any;\n if (hasStencil && Mesh && Geometry && BufferAttr && sourceMat?.clone) {\n const dx = bbox.max.x - bbox.min.x;\n const dy = bbox.max.y - bbox.min.y;\n const dz = bbox.max.z - bbox.min.z;\n const capSize = Math.max(dx, dy, dz, 1) * 2;\n const half = capSize / 2;\n\n const capGeom: any = new Geometry();\n const positions = new Float32Array([\n -half, -half, 0,\n half, -half, 0,\n half, half, 0,\n -half, half, 0,\n ]);\n const normals = new Float32Array([\n 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1,\n ]);\n capGeom.setAttribute('position', new BufferAttr(positions, 3));\n capGeom.setAttribute('normal', new BufferAttr(normals, 3));\n capGeom.setIndex([0, 1, 2, 0, 2, 3]);\n\n const capMat: any = sourceMat.clone();\n // Match the body's main color — the cap should look like a slice of\n // the same material, not a contrasting fill. The cloned material\n // already carries the source color; we just keep it. Add a low-\n // intensity emissive of the same color so the cap is still visible\n // even on faces facing away from any scene light, without changing\n // its hue.\n const sourceColorHex = (sourceMat.color?.getHex?.() ?? 0xb4bcc8) as number;\n capMat.emissive?.setHex?.(sourceColorHex);\n if ('emissiveIntensity' in capMat) capMat.emissiveIntensity = 0.25;\n capMat.side = DoubleSide;\n capMat.transparent = false;\n capMat.opacity = 1;\n capMat.stencilWrite = true;\n capMat.stencilRef = 0;\n capMat.stencilFunc = NotEqualStencilFunc;\n capMat.stencilFail = ReplaceStencilOp;\n capMat.stencilZFail = ReplaceStencilOp;\n capMat.stencilZPass = ReplaceStencilOp;\n // Don't clip the cap itself by the same plane.\n capMat.clippingPlanes = [];\n // Push the cap a hair toward the camera so it wins z-fights with\n // any model fragments that happen to sit exactly at the plane.\n capMat.polygonOffset = true;\n capMat.polygonOffsetFactor = -1;\n capMat.polygonOffsetUnits = -1;\n capMat.needsUpdate = true;\n\n capMesh = new Mesh(capGeom, capMat);\n capMesh.renderOrder = 2;\n capMesh.userData.__sectionHelper = true;\n scene.add(capMesh);\n }\n\n sectionRef.current = { plane, capMesh, helpers, materialState, bbox };\n // eslint-disable-next-line no-console\n console.info('[Preview] section: helpers =', helpers.length, 'cap =', !!capMesh);\n v.viewer.Render?.();\n }, [sectionEnabled, loading, tree]);\n\n // Section view — update plane orientation/position on axis/flip/angle/slider change.\n useEffect(() => {\n const v = viewerRef.current;\n const s = sectionRef.current;\n if (!v?.viewer || !s || !sectionEnabled) return;\n try {\n const bbox = s.bbox;\n const axisIdx = sectionAxis === 'x' ? 0 : sectionAxis === 'y' ? 1 : 2;\n const min = [bbox.min.x, bbox.min.y, bbox.min.z][axisIdx];\n const max = [bbox.max.x, bbox.max.y, bbox.max.z][axisIdx];\n const t = min + (max - min) * sectionPosition;\n\n // Cut-plane normal = chosen axis rotated through `sectionAngle` around a\n // perpendicular reference axis. At θ=0 every axis matches the original\n // axis-aligned behaviour; sweeping 0 → 360 spins the plane once around\n // the model. `sectionFlip` continues to negate the whole normal.\n const θ = (sectionAngle * Math.PI) / 180;\n const cosθ = Math.cos(θ), sinθ = Math.sin(θ);\n const sign = sectionFlip ? -1 : 1;\n let nx = 0, ny = 0, nz = 0;\n // Each axis rotates around the NEXT axis cyclically (X→Y, Y→Z, Z→X)\n // so all three options sweep in genuinely different planes:\n // X → rotates around Y, sweeping in the X-Z plane\n // Y → rotates around Z, sweeping in the Y-X plane\n // Z → rotates around X, sweeping in the Z-Y plane\n // Earlier attempts kept two axes in the same Y-Z plane (just swapped\n // sin/cos), which collapsed two of the three options to a 90° offset\n // of each other.\n if (sectionAxis === 'x') { nx = sign * cosθ; nz = sign * sinθ; }\n else if (sectionAxis === 'y') { ny = sign * cosθ; nx = sign * sinθ; }\n else { nz = sign * cosθ; ny = sign * sinθ; }\n\n // The plane passes through point P on the chosen-axis line at\n // `sectionPosition` of the bbox extent; the other two coordinates use\n // the bbox centre so the plane stays anchored within the model when it\n // rotates.\n const center = {\n x: (bbox.min.x + bbox.max.x) / 2,\n y: (bbox.min.y + bbox.max.y) / 2,\n z: (bbox.min.z + bbox.max.z) / 2,\n };\n const Px = sectionAxis === 'x' ? t : center.x;\n const Py = sectionAxis === 'y' ? t : center.y;\n const Pz = sectionAxis === 'z' ? t : center.z;\n\n s.plane.normal.x = nx;\n s.plane.normal.y = ny;\n s.plane.normal.z = nz;\n // three.js clips fragments where (normal · p) + constant < 0; the plane\n // equation we want is normal · p = normal · P, so constant = -(normal·P).\n s.plane.constant = -(nx * Px + ny * Py + nz * Pz);\n\n // Re-position the cap mesh on the plane and orient it so its visible\n // face points along the plane normal.\n if (s.capMesh) {\n const cx = center.x, cy = center.y, cz = center.z;\n // Distance from bbox center to plane along the normal.\n const dist = nx * cx + ny * cy + nz * cz + s.plane.constant;\n const px = cx - nx * dist;\n const py = cy - ny * dist;\n const pz = cz - nz * dist;\n s.capMesh.position.set(px, py, pz);\n s.capMesh.lookAt?.(px + nx, py + ny, pz + nz);\n }\n\n v.viewer.Render?.();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] section update failed', err);\n }\n }, [sectionEnabled, sectionAxis, sectionFlip, sectionPosition, sectionAngle]);\n\n // ──────────────────────────────────────────────────────────────────────\n // Measurement tool\n //\n // Click two points on the model; we raycast from the camera, drop a small\n // sphere marker at each hit, draw a line between them, and overlay an\n // HTML distance label that re-projects every animation frame so it\n // tracks as the user orbits the camera. A third click clears and starts\n // a fresh measurement. ESC or toggling the toolbar button off cleans up\n // all visuals.\n //\n // THREE constructors are plucked from a sample mesh in the loaded scene\n // (same trick the section view uses) so we share the renderer's THREE\n // instance. For raycasting we go through OV's own\n // `viewer.GetMeshIntersectionUnderMouse` rather than constructing our\n // own `THREE.Raycaster` from `import('three')` — the top-level `three`\n // hoisted in node_modules is a different version than the one OV\n // bundles, and a Raycaster from one bundle silently fails to intersect\n // meshes from the other.\n // ──────────────────────────────────────────────────────────────────────\n useEffect(() => {\n const v = viewerRef.current;\n if (!v?.viewer || loading || !containerRef.current) return;\n\n const renderer = v.viewer.renderer;\n const scene = v.viewer.scene;\n // NB: don't cache `v.viewer.camera` here. SetProjectionMode (orthographic\n // toggle, called from the projection-default effect right after load)\n // rebuilds the THREE camera and replaces v.viewer.camera with a fresh\n // instance. A captured reference goes stale and the raycaster picks\n // ghost positions. We re-read v.viewer.camera inside doMeasurePick.\n const canvas: HTMLCanvasElement | undefined = renderer?.domElement;\n if (!renderer || !scene || !canvas) return;\n\n // Snapshot a sample mesh to pluck THREE constructors that share the\n // renderer's THREE instance.\n let sampleMesh: any = null;\n v.viewer.mainModel?.EnumerateMeshes?.((m: any) => {\n if (!sampleMesh && !m.userData?.__sectionHelper && !m.userData?.__measureHelper) sampleMesh = m;\n });\n if (!sampleMesh) return;\n\n const Vector3Ctor = sampleMesh.position.constructor;\n const MeshCtor = sampleMesh.constructor;\n const MaterialCtor = (Array.isArray(sampleMesh.material) ? sampleMesh.material[0] : sampleMesh.material)?.constructor;\n const GeometryCtor = sampleMesh.geometry.constructor;\n const BufferAttrCtor = sampleMesh.geometry.attributes?.position?.constructor;\n if (!Vector3Ctor || !MeshCtor || !MaterialCtor || !GeometryCtor || !BufferAttrCtor) return;\n\n // OV renders edges as THREE.LineSegments; pluck its constructor + a\n // line material from the scene so our measurement line uses the same\n // bundled THREE that built the rest of the scene.\n let LineSegmentsCtor: any = null;\n let LineBasicMaterialCtor: any = null;\n scene.traverse((obj: any) => {\n if (LineSegmentsCtor && LineBasicMaterialCtor) return;\n if (!obj?.isLineSegments) return;\n LineSegmentsCtor = obj.constructor;\n const mat = Array.isArray(obj.material) ? obj.material[0] : obj.material;\n if (mat?.constructor) LineBasicMaterialCtor = mat.constructor;\n });\n\n // Tear-down helper, used both on toggle-off and on next-mount cleanup.\n const teardown = () => {\n const s = measureRef.current;\n if (!s) return;\n if (s.rafId !== null) cancelAnimationFrame(s.rafId);\n for (const m of s.markers) {\n scene.remove(m);\n m.geometry?.dispose?.();\n m.material?.dispose?.();\n }\n if (s.line) {\n scene.remove(s.line);\n s.line.geometry?.dispose?.();\n s.line.material?.dispose?.();\n }\n if (s.label && s.label.parentElement) s.label.parentElement.removeChild(s.label);\n measureRef.current = null;\n v.viewer.Render?.();\n };\n\n if (!measureEnabled) {\n teardown();\n setMeasureDistance(null);\n return;\n }\n\n // Initial state for this session.\n measureRef.current = { points: [], normals: [], markers: [], line: null, label: null, rafId: null };\n\n // OV exposes `IntersectionMode.MeshOnly` and a viewer-level\n // `GetMeshIntersectionUnderMouse(mode, {x,y})` that runs the raycast\n // through its bundled THREE — which is what we want, since the loaded\n // model meshes were instantiated from that same bundle.\n const OV = ovRef.current;\n const intersectionMode = OV?.IntersectionMode?.MeshOnly ?? 1;\n\n // Modest sphere size — scales with the model's bbox so it stays\n // visible on tiny and huge models alike.\n const bbox = v.viewer.GetBoundingBox?.(() => true);\n const diag = bbox\n ? Math.sqrt(\n (bbox.max.x - bbox.min.x) ** 2 +\n (bbox.max.y - bbox.min.y) ** 2 +\n (bbox.max.z - bbox.min.z) ** 2,\n )\n : 100;\n const markerRadius = Math.max(diag * 0.005, 0.2);\n\n const makeMarker = (point: any) => {\n // Build a tiny sphere from a 12×8 lat-long mesh — cheap, no helper geom.\n const widthSegs = 16, heightSegs = 12;\n const positions: number[] = [];\n const indices: number[] = [];\n for (let iy = 0; iy <= heightSegs; iy++) {\n const v = iy / heightSegs;\n const phi = v * Math.PI;\n for (let ix = 0; ix <= widthSegs; ix++) {\n const u = ix / widthSegs;\n const theta = u * Math.PI * 2;\n positions.push(\n markerRadius * Math.sin(phi) * Math.cos(theta),\n markerRadius * Math.cos(phi),\n markerRadius * Math.sin(phi) * Math.sin(theta),\n );\n }\n }\n for (let iy = 0; iy < heightSegs; iy++) {\n for (let ix = 0; ix < widthSegs; ix++) {\n const a = iy * (widthSegs + 1) + ix;\n const b = a + widthSegs + 1;\n indices.push(a, b, a + 1, b, b + 1, a + 1);\n }\n }\n const geom = new GeometryCtor();\n geom.setAttribute('position', new BufferAttrCtor(new Float32Array(positions), 3));\n geom.setIndex(indices);\n geom.computeVertexNormals?.();\n const mat: any = new MaterialCtor();\n mat.color?.setHex?.(0xff8800);\n mat.depthTest = false;\n mat.depthWrite = false;\n mat.transparent = true;\n mat.opacity = 0.95;\n const mesh: any = new MeshCtor(geom, mat);\n mesh.position.copy(point);\n mesh.renderOrder = 9999;\n mesh.userData.__measureHelper = true;\n scene.add(mesh);\n return mesh;\n };\n\n // Build a translucent overlay covering every triangle in the picked\n // mesh that's coplanar with the picked face — i.e. the entire flat\n // surface the user clicked. Used in ⊥ mode so the user sees which\n // surface they selected rather than a single point.\n //\n // Two triangles count as part of the same face when:\n // 1. their normals point the same way within ~1.8°, AND\n // 2. their centroids lie within a small band of the picked plane.\n //\n // Returns null for curved surfaces or mis-fitted picks; the caller\n // falls back to the sphere marker so the user always gets *some*\n // visual feedback.\n const buildFaceHighlight = (mesh: any, hit: any): any | null => {\n const geom = mesh?.geometry;\n const posAttr = geom?.attributes?.position;\n if (!geom || !posAttr || !hit?.face?.normal) return null;\n const positions: ArrayLike<number> = posAttr.array;\n const indices: ArrayLike<number> | null = geom.index ? geom.index.array : null;\n\n // Local-space hit data.\n const localPoint = new Vector3Ctor(hit.point.x, hit.point.y, hit.point.z);\n mesh.worldToLocal?.(localPoint);\n const ln = hit.face.normal;\n // Plane equation in local space: ln · X + planeC = 0 (passes through localPoint).\n const planeC = -(ln.x * localPoint.x + ln.y * localPoint.y + ln.z * localPoint.z);\n\n // Tolerance scales with the bbox so tiny parts and huge parts both\n // pick up the same face cleanly.\n geom.computeBoundingBox?.();\n const bb = geom.boundingBox;\n const diag = bb\n ? Math.sqrt((bb.max.x - bb.min.x) ** 2 + (bb.max.y - bb.min.y) ** 2 + (bb.max.z - bb.min.z) ** 2)\n : 100;\n const PLANE_TOL = Math.max(diag * 0.001, 0.005);\n const NORMAL_TOL = 0.9995; // ~1.8°\n\n const triCount = indices ? indices.length / 3 : posAttr.count / 3;\n const matched: number[] = [];\n\n // Bake the world transform into the highlight geometry so we can\n // attach it to the scene directly with no parent-tracking — it\n // stays in place even if the source mesh is later transformed.\n const tmpV = new Vector3Ctor();\n\n for (let t = 0; t < triCount; t++) {\n const ia = indices ? indices[t * 3] : t * 3;\n const ib = indices ? indices[t * 3 + 1] : t * 3 + 1;\n const ic = indices ? indices[t * 3 + 2] : t * 3 + 2;\n const ax = positions[ia * 3], ay = positions[ia * 3 + 1], az = positions[ia * 3 + 2];\n const bx = positions[ib * 3], by = positions[ib * 3 + 1], bz = positions[ib * 3 + 2];\n const cx = positions[ic * 3], cy = positions[ic * 3 + 1], cz = positions[ic * 3 + 2];\n\n const ux = bx - ax, uy = by - ay, uz = bz - az;\n const vx = cx - ax, vy = cy - ay, vz = cz - az;\n let nx = uy * vz - uz * vy;\n let ny = uz * vx - ux * vz;\n let nz = ux * vy - uy * vx;\n const nlen = Math.sqrt(nx * nx + ny * ny + nz * nz);\n if (nlen === 0) continue;\n nx /= nlen; ny /= nlen; nz /= nlen;\n\n // Triangle's normal must align with the picked face normal (front side).\n const ndot = nx * ln.x + ny * ln.y + nz * ln.z;\n if (ndot < NORMAL_TOL) continue;\n\n // Triangle centroid must lie on the picked plane.\n const ccx = (ax + bx + cx) / 3, ccy = (ay + by + cy) / 3, ccz = (az + bz + cz) / 3;\n const dist = Math.abs(ln.x * ccx + ln.y * ccy + ln.z * ccz + planeC);\n if (dist > PLANE_TOL) continue;\n\n // Push all three vertices in world space.\n for (const [vx_, vy_, vz_] of [[ax, ay, az], [bx, by, bz], [cx, cy, cz]]) {\n tmpV.set?.(vx_, vy_, vz_);\n mesh.localToWorld?.(tmpV);\n matched.push(tmpV.x, tmpV.y, tmpV.z);\n }\n }\n\n if (matched.length === 0) return null;\n\n const hgeom = new GeometryCtor();\n hgeom.setAttribute('position', new BufferAttrCtor(new Float32Array(matched), 3));\n hgeom.computeVertexNormals?.();\n\n const hmat: any = new MaterialCtor();\n hmat.color?.setHex?.(0xff8800);\n hmat.transparent = true;\n hmat.opacity = 0.45;\n hmat.depthWrite = false;\n // Pull the overlay slightly toward the camera so it doesn't z-fight\n // with the source surface. Negative offset = closer to viewer in\n // depth.\n hmat.polygonOffset = true;\n hmat.polygonOffsetFactor = -2;\n hmat.polygonOffsetUnits = -2;\n // Render after the model so the see-through colour blends on top.\n const highlight: any = new MeshCtor(hgeom, hmat);\n highlight.renderOrder = 9998;\n highlight.userData.__measureHelper = true;\n scene.add(highlight);\n return highlight;\n };\n\n const drawLine = (a: any, b: any) => {\n const geom = new GeometryCtor();\n geom.setAttribute('position', new BufferAttrCtor(new Float32Array([a.x, a.y, a.z, b.x, b.y, b.z]), 3));\n // LineSegments draws one segment per pair of vertices — with two\n // points that's exactly the line we want. Falls back to the mesh\n // constructor if no edge meshes happened to be in the scene\n // (extremely unlikely for STEP files, which always have edges).\n const LineCtor = LineSegmentsCtor ?? MeshCtor;\n const LineMatCtor = LineBasicMaterialCtor ?? MaterialCtor;\n const mat: any = new LineMatCtor({ color: 0xff8800, depthTest: false, depthWrite: false, transparent: true, opacity: 0.95 });\n const line: any = new LineCtor(geom, mat);\n line.renderOrder = 9998;\n line.userData.__measureHelper = true;\n scene.add(line);\n return line;\n };\n\n const ensureLabel = () => {\n const s = measureRef.current!;\n if (s.label) return s.label;\n const el = document.createElement('div');\n el.style.position = 'absolute';\n // Park off-screen on creation so the label never flashes at (0,0)\n // before updateLabel() positions it.\n el.style.left = '-9999px';\n el.style.top = '-9999px';\n el.style.transform = 'translate(-50%, -50%)';\n el.style.padding = '2px 6px';\n el.style.fontSize = '11px';\n el.style.fontWeight = '600';\n el.style.fontFamily = 'system-ui, -apple-system, sans-serif';\n el.style.background = 'rgba(255, 136, 0, 0.95)';\n el.style.color = '#fff';\n el.style.borderRadius = '4px';\n el.style.pointerEvents = 'none';\n el.style.whiteSpace = 'nowrap';\n el.style.boxShadow = '0 1px 4px rgba(0,0,0,0.25)';\n el.style.zIndex = '5';\n containerRef.current!.appendChild(el);\n s.label = el;\n return el;\n };\n\n const updateLabel = () => {\n const s = measureRef.current;\n if (!s || s.points.length < 2 || !s.label) return;\n // Read camera fresh — see comment in doMeasurePick.\n const camera = v.viewer.camera;\n if (!camera) return;\n const a = s.points[0], b = s.points[1];\n const mid = new Vector3Ctor((a.x + b.x) / 2, (a.y + b.y) / 2, (a.z + b.z) / 2);\n // Project midpoint to screen.\n const projected = mid.clone();\n projected.project?.(camera);\n const rect = canvas.getBoundingClientRect();\n const x = ((projected.x + 1) / 2) * rect.width;\n const y = ((-projected.y + 1) / 2) * rect.height;\n s.label.style.left = `${x}px`;\n s.label.style.top = `${y}px`;\n // Hide if behind the camera (z > 1) OR if the midpoint projects\n // outside the canvas — otherwise transform:translate(-50%,-50%)\n // leaves the label's right edge stuck at the top-left corner\n // showing \"…mm\" after the user orbits the measurement off-screen.\n const offScreen = x < 0 || y < 0 || x > rect.width || y > rect.height;\n s.label.style.opacity = (projected.z > 1 || offScreen) ? '0' : '1';\n };\n\n // Continuous re-projection so the label tracks orbit/pan/zoom — RAF is\n // cheap when the only work is one Vector3.project() and two style\n // assignments.\n const tick = () => {\n const s = measureRef.current;\n if (!s) return;\n updateLabel();\n s.rafId = requestAnimationFrame(tick);\n };\n measureRef.current.rafId = requestAnimationFrame(tick);\n\n // ── Click-vs-drag gating ──\n // We can't simply `stopPropagation()` on pointerdown — that would\n // block OV's orbit controls and pin the camera. Instead, we track\n // each pointer gesture: only treat it as a measurement pick when\n // the pointer barely moved (≤ DRAG_TOL px) between down and up\n // *and* the press was short. Anything longer is a camera drag and\n // we hand it off to OV unmodified.\n const DRAG_TOL = 4; // px of cumulative movement that still counts as a click\n const DRAG_TIME = 350; // ms; longer presses count as a drag even if pointer stayed still\n let downX = 0, downY = 0, downTime = 0, dragging = false, downActive = false;\n\n // Compute the world-space normal at the picked surface. Useful for\n // surface-to-surface distance: if the user picks two roughly-parallel\n // faces, we report the perpendicular distance instead of the raw\n // point-to-point distance.\n const worldNormalFromHit = (hit: any): { x: number; y: number; z: number } | null => {\n const fn = hit?.face?.normal;\n const obj = hit?.object;\n if (!fn || !obj) return null;\n try {\n const local = new Vector3Ctor(fn.x, fn.y, fn.z);\n // `transformDirection` is on three's Vector3 — applies the\n // upper-3x3 of `matrixWorld` and re-normalises.\n local.transformDirection?.(obj.matrixWorld);\n return { x: local.x, y: local.y, z: local.z };\n } catch {\n return { x: fn.x, y: fn.y, z: fn.z };\n }\n };\n\n const doMeasurePick = (ev: PointerEvent) => {\n // Read camera fresh — SetProjectionMode rebuilds it under the hood,\n // see the comment near the start of this effect.\n if (!v.viewer.camera) return;\n const rect = canvas.getBoundingClientRect();\n const mouseCoords = {\n x: ev.clientX - rect.left,\n y: ev.clientY - rect.top,\n };\n const hit = v.viewer.GetMeshIntersectionUnderMouse?.(intersectionMode, mouseCoords);\n if (!hit) return;\n\n const s = measureRef.current!;\n const point = new Vector3Ctor(hit.point.x, hit.point.y, hit.point.z);\n const normal = worldNormalFromHit(hit);\n\n // Third click → start over.\n if (s.points.length === 2) {\n for (const m of s.markers) {\n scene.remove(m);\n m.geometry?.dispose?.();\n m.material?.dispose?.();\n }\n if (s.line) {\n scene.remove(s.line);\n s.line.geometry?.dispose?.();\n s.line.material?.dispose?.();\n }\n if (s.label) s.label.style.opacity = '0';\n s.points = []; s.markers = []; s.line = null;\n s.normals = [];\n setMeasureDistance(null);\n }\n\n s.points.push(point);\n s.normals.push(normal);\n // In ⊥ mode the user is selecting a *surface*, so paint a\n // translucent overlay on the entire coplanar face instead of the\n // single-point sphere marker. Falls back to the sphere if face\n // detection fails (e.g. the user picked a curved surface where no\n // coplanar triangles exist).\n if (measureMode === 'perp') {\n const highlight = buildFaceHighlight(hit.object, hit);\n s.markers.push(highlight ?? makeMarker(point));\n } else {\n s.markers.push(makeMarker(point));\n }\n\n if (s.points.length === 2) {\n const a = s.points[0];\n let b = s.points[1];\n\n let dist: number;\n let suffix = '';\n\n if (measureMode === 'perp') {\n // Perpendicular mode: draw the line *along the surface normal*\n // (i.e. at 90° to surface A), ending on the plane parallel to\n // A passing through B's click point. The endpoint may land\n // inside or outside face B's highlight depending on where the\n // user clicked, but the line itself is unambiguously the\n // perpendicular gap — never the diagonal between two arbitrary\n // click points. Falls back to point-to-point if the first pick\n // missed a face.\n const refN = s.normals[0] ?? s.normals[1];\n if (refN) {\n const len = Math.sqrt(refN.x * refN.x + refN.y * refN.y + refN.z * refN.z) || 1;\n const nx = refN.x / len, ny = refN.y / len, nz = refN.z / len;\n const dx = b.x - a.x, dy = b.y - a.y, dz = b.z - a.z;\n // Signed projection of (b − a) onto n. Sign keeps the\n // perpendicular endpoint on the same side as the second\n // click, so the line visually crosses the gap rather than\n // drawing into the source body.\n const proj = dx * nx + dy * ny + dz * nz;\n const projectedB = new Vector3Ctor(a.x + nx * proj, a.y + ny * proj, a.z + nz * proj);\n // Re-anchor the second endpoint to the perpendicular foot —\n // both the rendered line and the label midpoint follow.\n s.points[1] = projectedB;\n b = projectedB;\n dist = Math.abs(proj);\n suffix = ' ⊥';\n } else {\n const dx = b.x - a.x, dy = b.y - a.y, dz = b.z - a.z;\n dist = Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n } else {\n const dx = b.x - a.x, dy = b.y - a.y, dz = b.z - a.z;\n dist = Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n\n s.line = drawLine(a, b);\n setMeasureDistance(dist);\n const label = ensureLabel();\n label.textContent = `${formatMeasureDistance(dist)}${suffix}`;\n }\n\n v.viewer.Render?.();\n };\n\n const onPointerDown = (ev: PointerEvent) => {\n // Left-button only. Right-click and middle-click are camera-pan/orbit\n // gestures we don't want to interfere with.\n if (ev.button !== 0) return;\n downX = ev.clientX;\n downY = ev.clientY;\n downTime = performance.now();\n dragging = false;\n downActive = true;\n // *No* stopPropagation here — OV needs the event for orbit drag.\n };\n const onPointerMove = (ev: PointerEvent) => {\n if (!downActive) return;\n const dx = ev.clientX - downX, dy = ev.clientY - downY;\n if (dx * dx + dy * dy > DRAG_TOL * DRAG_TOL) dragging = true;\n };\n const onPointerUp = (ev: PointerEvent) => {\n if (ev.button !== 0 || !downActive) return;\n const elapsed = performance.now() - downTime;\n const wasClick = !dragging && elapsed < DRAG_TIME;\n downActive = false;\n if (!wasClick) return; // it was a camera gesture, hand off\n doMeasurePick(ev);\n };\n\n const onKeyDown = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') setMeasureEnabled(false);\n };\n\n canvas.style.cursor = 'crosshair';\n // Bubble phase — OV's orbit-control listeners are also bubble; we\n // don't preempt them since we never call stopPropagation.\n canvas.addEventListener('pointerdown', onPointerDown);\n canvas.addEventListener('pointermove', onPointerMove);\n canvas.addEventListener('pointerup', onPointerUp);\n canvas.addEventListener('pointercancel', onPointerUp);\n window.addEventListener('keydown', onKeyDown);\n\n return () => {\n canvas.style.cursor = '';\n canvas.removeEventListener('pointerdown', onPointerDown);\n canvas.removeEventListener('pointermove', onPointerMove);\n canvas.removeEventListener('pointerup', onPointerUp);\n canvas.removeEventListener('pointercancel', onPointerUp);\n window.removeEventListener('keydown', onKeyDown);\n teardown();\n setMeasureDistance(null);\n };\n }, [measureEnabled, measureMode, loading, tree]);\n\n // Hint timer.\n useEffect(() => {\n if (!showHint || loading) return;\n const t = setTimeout(() => setShowHint(false), 5000);\n return () => clearTimeout(t);\n }, [showHint, loading]);\n\n const toggleNodeVisible = (node: TreeNode) => {\n const ids = new Set<number>();\n collectNodeIds(node, ids);\n setHidden(prev => {\n const next = new Set(prev);\n // If any descendant is currently visible, hide them all; else reveal.\n const anyVisible = [...ids].some(id => !next.has(id));\n for (const id of ids) {\n if (anyVisible) next.add(id);\n else next.delete(id);\n }\n return next;\n });\n };\n\n const toggleExpanded = (id: number) => {\n setExpanded(prev => ({ ...prev, [id]: !prev[id] }));\n };\n\n const fitNode = (node: TreeNode) => {\n // Fit the whole model — fitting to a specific subtree would need its\n // bounds via a custom enumerator; defer that for now.\n handleFit();\n // Future: filter visibility-by-subtree to focus.\n void node;\n };\n\n const handleFit = () => {\n try {\n const v = viewerRef.current;\n const sphere = v?.viewer?.GetBoundingSphere?.(() => true);\n if (sphere) v.viewer.FitSphereToWindow(sphere, true);\n v?.viewer?.Render?.();\n } catch {}\n };\n\n // Switch between perspective and orthographic projection. The viewer keeps\n // the current camera position; just rebuilds the THREE camera under the hood.\n useEffect(() => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer || loading) return;\n try {\n v.viewer.SetProjectionMode(perspective ? OV.ProjectionMode.Perspective : OV.ProjectionMode.Orthographic);\n } catch {}\n }, [perspective, loading]);\n\n // Camera presets — eye/center/up around the model's bounding sphere.\n const setCameraPreset = (preset: 'top' | 'front' | 'side' | 'iso') => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer) return;\n try {\n const sphere = v.viewer.GetBoundingSphere?.(() => true);\n if (!sphere) return;\n const c = sphere.center;\n const r = sphere.radius || 1;\n const dist = r * 3;\n const cx = c.x ?? 0, cy = c.y ?? 0, cz = c.z ?? 0;\n let eye: any, up: any;\n switch (preset) {\n case 'top': eye = new OV.Coord3D(cx, cy, cz + dist); up = new OV.Coord3D(0, 1, 0); break;\n case 'front': eye = new OV.Coord3D(cx, cy - dist, cz); up = new OV.Coord3D(0, 0, 1); break;\n case 'side': eye = new OV.Coord3D(cx + dist, cy, cz); up = new OV.Coord3D(0, 0, 1); break;\n case 'iso':\n default: {\n const k = dist / Math.sqrt(3);\n eye = new OV.Coord3D(cx + k, cy - k, cz + k);\n up = new OV.Coord3D(0, 0, 1);\n break;\n }\n }\n const center = new OV.Coord3D(cx, cy, cz);\n const cam = new OV.Camera(eye, center, up, 45);\n v.viewer.SetCamera(cam);\n v.viewer.AdjustClippingPlanesToSphere?.(sphere);\n v.viewer.Render?.();\n } catch {}\n };\n\n const handleSnapshot = () => {\n try {\n const v = viewerRef.current;\n const size = v?.viewer?.GetCanvasSize?.() ?? { width: 1280, height: 720 };\n const dataUrl = v?.viewer?.GetImageAsDataUrl?.(size.width, size.height, false);\n if (!dataUrl) return;\n const a = document.createElement('a');\n a.href = dataUrl;\n a.download = `${filename.replace(/\\.[^.]+$/, '')}-snapshot.png`;\n a.click();\n } catch {}\n };\n\n const handleResetDisplay = () => {\n setBgColor('#f5f6f8');\n setShowEdges(true);\n setEdgeColor('#000000');\n setEdgeThreshold(1);\n setSectionEnabled(false);\n setSectionAxis('x'); // matches the new default\n setSectionFlip(false);\n setSectionPosition(0.5);\n setSectionAngle(0);\n };\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n const ext = (filename.split('.').pop() || '').toUpperCase();\n\n // ── render helpers ───────────────────────────────────────────────────────\n const renderTreeNode = (node: TreeNode, depth = 0): React.ReactNode => {\n const hasChildren = node.children.length > 0;\n const isExpanded = expanded[node.id] !== false; // default expanded for first two levels\n const isVisible = !hidden.has(node.id);\n return (\n <div key={node.id}>\n <div\n className=\"group flex items-center gap-1 px-1.5 py-1 hover:bg-gray-100 cursor-default text-[12px] text-gray-700\"\n style={{ paddingLeft: `${depth * 12 + 6}px` }}\n >\n {hasChildren ? (\n <button\n onClick={() => toggleExpanded(node.id)}\n className=\"h-4 w-4 shrink-0 flex items-center justify-center text-gray-500 hover:text-gray-900\"\n title={isExpanded ? 'Collapse' : 'Expand'}\n >\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={isExpanded ? 'M19.5 8.25l-7.5 7.5-7.5-7.5' : 'M8.25 4.5l7.5 7.5-7.5 7.5'} />\n </svg>\n </button>\n ) : (\n <span className=\"h-4 w-4 shrink-0 flex items-center justify-center\">\n <span className=\"h-1 w-1 rounded-full bg-gray-400\" />\n </span>\n )}\n <span className={`flex-1 truncate ${isVisible ? '' : 'opacity-40'}`} title={node.name}>{node.name}</span>\n <button\n onClick={() => fitNode(node)}\n className=\"h-4 w-4 shrink-0 text-gray-400 hover:text-gray-900 opacity-0 group-hover:opacity-100 transition-opacity\"\n title=\"Fit to view\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n </svg>\n </button>\n <button\n onClick={() => toggleNodeVisible(node)}\n className=\"h-4 w-4 shrink-0 text-gray-500 hover:text-gray-900\"\n title={isVisible ? 'Hide' : 'Show'}\n >\n {isVisible ? (\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n ) : (\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.98 8.223A10.477 10.477 0 001.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.45 10.45 0 0112 4.5c4.756 0 8.773 3.162 10.065 7.498a10.523 10.523 0 01-4.293 5.774M6.228 6.228L3 3m3.228 3.228l3.65 3.65m7.894 7.894L21 21m-3.228-3.228l-3.65-3.65m0 0a3 3 0 10-4.243-4.243m4.242 4.242L9.88 9.88\" />\n </svg>\n )}\n </button>\n </div>\n {isExpanded && hasChildren && (\n <div>{node.children.map(c => renderTreeNode(c, depth + 1))}</div>\n )}\n </div>\n );\n };\n\n const tBtn = 'h-8 w-8 shrink-0 flex items-center justify-center rounded text-gray-600 hover:bg-gray-200 hover:text-gray-900 transition-colors';\n const tBtnActive = 'h-8 w-8 shrink-0 flex items-center justify-center rounded bg-gray-200 text-gray-900';\n // Wide variant — used for text-labelled buttons (e.g. Perspective /\n // Orthographic) so the label has room to render without being clipped\n // by the fixed 32 px square of `tBtn`.\n const tBtnWide = 'h-8 shrink-0 flex items-center justify-center px-2 rounded text-gray-600 hover:bg-gray-200 hover:text-gray-900 transition-colors';\n const tBtnWideActive = 'h-8 shrink-0 flex items-center justify-center px-2 rounded bg-gray-200 text-gray-900';\n const tBtnSep = 'h-5 w-px bg-gray-300 mx-1';\n\n return (\n <div className=\"flex flex-col h-full bg-white\">\n <PanelActions>\n <button onClick={handleFit} className={tBtn} title=\"Fit to view\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n </svg>\n </button>\n <div className={tBtnSep} />\n <button onClick={() => setCameraPreset('iso')} className={tBtn} title=\"Isometric view\">\n <span className=\"text-[10px] font-semibold\">ISO</span>\n </button>\n <button onClick={() => setCameraPreset('top')} className={tBtn} title=\"Top view\">\n <span className=\"text-[10px] font-semibold\">TOP</span>\n </button>\n <button onClick={() => setCameraPreset('front')} className={tBtn} title=\"Front view\">\n <span className=\"text-[10px] font-semibold\">FRT</span>\n </button>\n <button onClick={() => setCameraPreset('side')} className={tBtn} title=\"Side view\">\n <span className=\"text-[10px] font-semibold\">SDE</span>\n </button>\n <button\n onClick={() => setPerspective(p => !p)}\n className={perspective ? tBtnWideActive : tBtnWide}\n title={perspective ? 'Switch to orthographic view' : 'Switch to perspective view'}\n >\n <span className=\"text-[11px] font-semibold whitespace-nowrap\">{perspective ? 'Perspective' : 'Orthographic'}</span>\n </button>\n <div className={tBtnSep} />\n <button onClick={handleSnapshot} className={tBtn} title=\"Save snapshot as PNG\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.827 6.175A2.31 2.31 0 015.186 7.23c-.38.054-.757.112-1.134.175C2.999 7.58 2.25 8.507 2.25 9.574V18a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9.574c0-1.067-.75-1.994-1.802-2.169a47.865 47.865 0 00-1.134-.175 2.31 2.31 0 01-1.64-1.055l-.822-1.316a2.192 2.192 0 00-1.736-1.039 48.774 48.774 0 00-5.232 0 2.192 2.192 0 00-1.736 1.039l-.821 1.316z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 12.75a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0zM18.75 10.5h.008v.008h-.008V10.5z\" />\n </svg>\n </button>\n <button onClick={() => setShowHint(s => !s)} className={tBtn} title=\"How to navigate\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z\" />\n </svg>\n </button>\n <button\n onClick={() => setMeasureEnabled(m => !m)}\n className={measureEnabled ? tBtnActive : tBtn}\n title={measureEnabled ? 'Stop measuring (Esc)' : 'Measure distance — click two points on the model'}\n >\n {/* Ruler icon */}\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 14.25l6-6 6 6 4.5-4.5M9.75 8.25v3M12.75 11.25v3M15.75 14.25v3\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 18.75h19.5\" />\n </svg>\n </button>\n {measureEnabled && (\n <div className=\"flex items-stretch h-8 rounded border border-gray-200 overflow-hidden\">\n <button\n onClick={() => setMeasureMode('point')}\n className={`px-2 text-[11px] font-semibold transition-colors ${measureMode === 'point' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Point — measure straight-line distance between two picked points\"\n >\n Point\n </button>\n <button\n onClick={() => setMeasureMode('perp')}\n className={`px-2 text-[12px] font-semibold transition-colors ${measureMode === 'perp' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Perpendicular — pick two surfaces and measure the perpendicular gap between them\"\n >\n ⊥\n </button>\n </div>\n )}\n {measureEnabled && measureDistance !== null && (\n <div className=\"px-2 py-1 text-[11px] font-mono font-semibold text-orange-600 bg-orange-50 border border-orange-200 rounded whitespace-nowrap\" title={measureMode === 'perp' ? 'Perpendicular distance between the two picked surfaces' : 'Straight-line distance between the two picked points'}>\n {formatMeasureDistance(measureDistance)}{measureMode === 'perp' ? ' ⊥' : ''}\n </div>\n )}\n <div className={tBtnSep} />\n <button onClick={() => setShowMeshes(s => !s)} className={showMeshes ? tBtnActive : tBtn} title=\"Toggle meshes panel\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\" />\n </svg>\n </button>\n <button onClick={() => setShowSettings(s => !s)} className={showSettings ? tBtnActive : tBtn} title=\"Toggle display panel\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </button>\n <button onClick={onDownload ?? handleDefaultDownload} className={tBtn} title=\"Download original file\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" />\n </svg>\n </button>\n {onEmail && (\n <button onClick={onEmail} className={tBtn} title=\"Email\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" />\n </svg>\n </button>\n )}\n </PanelActions>\n\n {/* Body: viewport with floating Meshes / Model Display panels overlaid */}\n <div className=\"flex-1 flex min-h-0\">\n <div className=\"relative flex-1 min-w-0\" style={{ background: bgColor }}>\n <div ref={containerRef} style={{ width: '100%', height: '100%' }} />\n\n {/* Floating Meshes panel — anchored top-left, mirrors DXF Layers panel */}\n {showMeshes && (\n <div className=\"absolute top-2 left-2 w-64 max-h-[80%] flex flex-col bg-white/95 backdrop-blur border border-gray-200 rounded-md shadow-xl z-10 text-xs\">\n <div className=\"flex items-center justify-between px-2 py-1.5 border-b border-gray-200 bg-gray-50\">\n <span className=\"font-medium text-gray-700\">Meshes</span>\n <button onClick={() => setShowMeshes(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\" title=\"Close\">×</button>\n </div>\n <div className=\"flex-1 overflow-y-auto py-1\">\n {tree ? renderTreeNode(tree) : (\n <div className=\"px-3 py-3 text-[11px] text-gray-500 italic\">{loading ? 'Reading model…' : 'No structure available'}</div>\n )}\n </div>\n {tree && (\n <div className=\"px-3 py-1.5 text-[10px] text-gray-500 border-t border-gray-200\">\n {hidden.size === 0 ? 'All visible' : `${hidden.size} hidden`}\n </div>\n )}\n </div>\n )}\n\n {showHint && !loading && !error && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 bg-gray-900/85 text-white text-[11px] px-3 py-1.5 rounded-full shadow-lg flex items-center gap-3 z-10 pointer-events-none\">\n <span>Drag to rotate</span>\n <span className=\"text-white/40\">•</span>\n <span>Right-click drag to pan</span>\n <span className=\"text-white/40\">•</span>\n <span>Scroll to zoom</span>\n </div>\n )}\n\n {loading && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-white/85 text-sm text-gray-600 gap-2\">\n <svg className=\"h-6 w-6 text-blue-500 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.2\" />\n <path d=\"M22 12a10 10 0 0 1-10 10\" strokeLinecap=\"round\" />\n </svg>\n <span>Loading 3D model…</span>\n {ext === 'STP' || ext === 'STEP' ? <span className=\"text-[10px] text-gray-400\">STEP files load OpenCascade WASM (~5 MB) on first use.</span> : null}\n </div>\n )}\n {error && (\n <div className=\"absolute inset-0 flex items-center justify-center text-sm text-red-600 px-6 text-center bg-white/85\">{error}</div>\n )}\n\n {/* Floating Model Display panel — anchored top-right */}\n {showSettings && (\n <div className=\"absolute top-2 right-2 w-64 max-h-[80%] flex flex-col bg-white/95 backdrop-blur border border-gray-200 rounded-md shadow-xl z-10 text-xs\">\n <div className=\"flex items-center justify-between px-2 py-1.5 border-b border-gray-200 bg-gray-50\">\n <span className=\"font-medium text-gray-700\">Model Display</span>\n <button onClick={() => setShowSettings(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\" title=\"Close\">×</button>\n </div>\n <div className=\"flex-1 overflow-y-auto px-3 py-3 space-y-3 text-[12px] text-gray-700\">\n <label className=\"flex items-center justify-between gap-2\">\n <span>Background Color</span>\n <input type=\"color\" value={bgColor} onChange={(e) => setBgColor(e.target.value)} className=\"h-6 w-10 rounded border border-gray-300 bg-white\" />\n </label>\n <label className=\"flex items-center justify-between gap-2\">\n <span>Show Edges</span>\n <button\n onClick={() => setShowEdges(s => !s)}\n role=\"switch\"\n aria-checked={showEdges}\n className={`relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors ${showEdges ? 'bg-blue-500' : 'bg-gray-300'}`}\n >\n <span className={`inline-block h-4 w-4 rounded-full bg-white shadow-sm transition-transform ${showEdges ? 'translate-x-[18px]' : 'translate-x-0.5'}`} />\n </button>\n </label>\n <label className=\"flex items-center justify-between gap-2\">\n <span className={showEdges ? '' : 'opacity-40'}>Edge Color</span>\n <input\n type=\"color\"\n value={edgeColor}\n onChange={(e) => setEdgeColor(e.target.value)}\n disabled={!showEdges}\n className=\"h-6 w-10 rounded border border-gray-300 bg-white disabled:opacity-40\"\n />\n </label>\n <div className={showEdges ? '' : 'opacity-40 pointer-events-none'}>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Edge Threshold</span>\n <span className=\"text-gray-500 tabular-nums\">{edgeThreshold}°</span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={45}\n step={1}\n value={edgeThreshold}\n onChange={(e) => setEdgeThreshold(Number(e.target.value))}\n className=\"w-full accent-blue-500\"\n />\n </div>\n\n <div className=\"border-t border-gray-200 -mx-3 px-3 pt-3 mt-1\">\n <label className=\"flex items-center justify-between gap-2\">\n <span className=\"font-medium\">Section View</span>\n <button\n onClick={() => setSectionEnabled(s => !s)}\n role=\"switch\"\n aria-checked={sectionEnabled}\n className={`relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors ${sectionEnabled ? 'bg-blue-500' : 'bg-gray-300'}`}\n >\n <span className={`inline-block h-4 w-4 rounded-full bg-white shadow-sm transition-transform ${sectionEnabled ? 'translate-x-[18px]' : 'translate-x-0.5'}`} />\n </button>\n </label>\n\n <div className={sectionEnabled ? 'mt-2 space-y-2' : 'mt-2 space-y-2 opacity-40 pointer-events-none'}>\n {/* Angle — rotates the cut plane around a perpendicular\n reference axis (full 0–360° sweep). Sits above\n Axis + Position because changing it visibly affects\n both, so users find it first. */}\n <div>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Angle</span>\n <span className=\"text-gray-500 tabular-nums\">{sectionAngle}°</span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={180}\n step={1}\n value={sectionAngle}\n onChange={(e) => setSectionAngle(Number(e.target.value))}\n className=\"w-full accent-blue-500\"\n />\n </div>\n\n <div>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Axis</span>\n <button\n onClick={() => setSectionFlip(f => !f)}\n className=\"text-[10px] text-gray-600 hover:text-gray-900 px-1.5 py-0.5 rounded bg-gray-100 hover:bg-gray-200\"\n title=\"Flip section direction\"\n >\n {sectionFlip ? '← flipped' : 'flip →'}\n </button>\n </div>\n <div className=\"grid grid-cols-3 gap-1\">\n {(['x', 'y', 'z'] as const).map(ax => (\n <button\n key={ax}\n onClick={() => setSectionAxis(ax)}\n className={`py-1 rounded text-[11px] font-semibold ${sectionAxis === ax ? 'bg-blue-500 text-white' : 'bg-gray-100 text-gray-700 hover:bg-gray-200'}`}\n >\n {ax.toUpperCase()}\n </button>\n ))}\n </div>\n </div>\n\n <div>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Position</span>\n <span className=\"text-gray-500 tabular-nums\">{Math.round(sectionPosition * 100)}%</span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={sectionPosition}\n onChange={(e) => setSectionPosition(Number(e.target.value))}\n className=\"w-full accent-blue-500\"\n />\n </div>\n\n </div>\n </div>\n </div>\n <div className=\"px-3 py-2 border-t border-gray-200\">\n <button\n onClick={handleResetDisplay}\n className=\"w-full text-[11px] text-gray-700 bg-gray-100 hover:bg-gray-200 rounded py-1.5 transition-colors\"\n >\n Reset to Default\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\ninterface ImagePanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\nfunction ImagePanel({ url, filename, onDownload, onEmail }: ImagePanelProps) {\n const [zoom, setZoom] = useState(1);\n const [error, setError] = useState(false);\n const [annotating, setAnnotating] = useState(false);\n const annotatorRef = useRef<ImageAnnotatorHandle>(null);\n\n // Fetch into a blob URL before triggering the anchor download.\n // The bare-anchor approach (`a.href = url; a.download = …; a.click()`)\n // can fall through to navigation when the server's response headers\n // don't cleanly opt into the download — the browser then loads the\n // image URL into the SPA frame, which clears the Preview state and\n // leaves the user with the empty \"Drop a file here…\" placeholder.\n // Going through fetch → Blob → object URL means the anchor target\n // is always a controlled blob: URL the browser will always save.\n const handleDefaultDownload = async () => {\n // For same-document blob: URLs we can skip the round-trip entirely.\n if (url.startsWith('blob:') || url.startsWith('data:')) {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n return;\n }\n const tryFetch = async (init: RequestInit) => {\n const res = await fetch(url, init);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.blob();\n };\n try {\n let blob: Blob;\n try {\n blob = await tryFetch({ credentials: 'include' });\n } catch {\n // Some media servers reject credentialed requests with an opaque\n // network failure — retry once without cookies before giving up.\n blob = await tryFetch({ credentials: 'omit' });\n }\n const blobUrl = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = blobUrl;\n a.download = filename;\n a.click();\n // Defer revoke so the browser has a tick to start the download.\n setTimeout(() => URL.revokeObjectURL(blobUrl), 1000);\n } catch {\n toast.error(\"Download failed — couldn't reach the file.\");\n }\n };\n\n const btn = 'px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1';\n\n return (\n <div className=\"flex flex-col h-full\">\n <PanelActions>\n {!annotating && (\n <>\n <button onClick={() => setZoom(z => Math.max(0.1, Math.round((z - 0.25) * 100) / 100))} className={btn}>−</button>\n <span className=\"text-gray-500 w-12 text-center tabular-nums\">{Math.round(zoom * 100)}%</span>\n <button onClick={() => setZoom(z => Math.min(8, Math.round((z + 0.25) * 100) / 100))} className={btn}>+</button>\n <button onClick={() => setZoom(1)} className={btn}>1:1</button>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <button onClick={() => setAnnotating(true)} className={btn} title=\"Annotate this image\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125\" /></svg>\n Annotate\n </button>\n </>\n )}\n {annotating && (\n <>\n <button onClick={() => setAnnotating(false)} className={btn} title=\"Back to viewer\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 19.5L8.25 12l7.5-7.5\" /></svg>\n View\n </button>\n <button onClick={() => annotatorRef.current?.copy()} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 00-3.375-3.375h-1.5a1.125 1.125 0 01-1.125-1.125v-1.5a3.375 3.375 0 00-3.375-3.375H9.75\" /></svg>\n Copy\n </button>\n <button onClick={() => annotatorRef.current?.save()} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Save\n </button>\n </>\n )}\n <button onClick={onDownload ?? handleDefaultDownload} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Download\n </button>\n {onEmail && (\n <button onClick={onEmail} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n Email\n </button>\n )}\n </PanelActions>\n {annotating ? (\n <ImageAnnotator ref={annotatorRef} src={url} filename={filename} />\n ) : (\n <div className=\"flex-1 overflow-auto bg-gray-100 flex items-center justify-center p-4\">\n {error ? (\n <div className=\"text-sm text-red-600\">Failed to load image.</div>\n ) : (\n <img\n src={url}\n alt={filename}\n onError={() => setError(true)}\n style={{ transform: `scale(${zoom})`, transformOrigin: 'center center', transition: 'transform 120ms ease' }}\n className=\"max-w-full max-h-full shadow-lg rounded bg-white\"\n />\n )}\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/apps/ImageAnnotator.tsx","../src/apps/Preview.tsx"],"names":["ImageAnnotator","useRef","useEffect","useState","jsxs","jsx","Fragment","sourceMat","v","diag"],"mappings":";;;;;;;;AAoCA,IAAM,MAAA,GAAS,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS,CAAA;AACtG,IAAM,KAAA,GAAQ;AAAA,EACZ,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,QAAA,EAAY,KAAK,sCAAA,EAAuC;AAAA,EAC/E,EAAE,EAAA,EAAI,OAAA,EAAU,KAAA,EAAO,OAAA,EAAY,KAAK,mCAAA,EAAoC;AAAA,EAC5E,EAAE,EAAA,EAAI,MAAA,EAAU,KAAA,EAAO,MAAA,EAAY,KAAK,2CAAA,EAA4C;AAAA,EACpF,EAAE,EAAA,EAAI,SAAA,EAAU,KAAA,EAAO,SAAA,EAAY,KAAK,6CAAA;AAC1C,CAAA;AACA,IAAM,cAAA,GAAiB,CAAA;AACvB,IAAM,iBAAA,GAAoB,EAAA;AAC1B,IAAM,mBAAA,GAAsB,EAAA;AAC5B,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,QAAA,GAAW,IAAA;AACjB,IAAM,QAAA,GAAW,CAAA;AACjB,IAAM,SAAA,GAAY,IAAA;AAElB,IAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAoBzD,IAAM,cAAA,GAAiB,UAAA,CAAsD,SAASA,eAAAA,CACpF,EAAE,KAAK,QAAA,EAAU,OAAA,EAAS,QAAA,EAAS,EAAG,GAAA,EACtC;AACA,EAAA,MAAM,OAAA,GAAU,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,OAA0B,IAAI,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,OAAsB,IAAI,CAAA;AACzC,EAAA,MAAM,QAAA,GAAW,OAAgC,IAAI,CAAA;AAErD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAe,QAAQ,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAC,CAAA;AAC5C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,cAAc,CAAA;AACnD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,iBAAiB,CAAA;AAC1D,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAI,SAAS,KAAA,CAAM,CAAC,EAAE,EAAE,CAAA;AACpD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,mBAAmB,CAAA;AAChE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA,CAAuB,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAA0C,IAAI,CAAA;AAChF,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAA0C,IAAI,CAAA;AAC5E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,CAAC,CAAA;AAElC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAA4B,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAA6E,IAAI,CAAA;AACvH,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAgE,IAAI,CAAA;AAE1G,EAAA,MAAM,OAAA,GAAU,OAOd,IAAI,CAAA;AACN,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAM;AAChC,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO,EAAE,GAAG,OAAA,CAAQ,CAAA,GAAI,MAAM,CAAA,EAAG,OAAA,CAAQ,IAAI,IAAA,EAAK;AAAA,EACpD,CAAA,EAAG,CAAC,OAAA,EAAS,IAAI,CAAC,CAAA;AAClB,EAAA,MAAM,QAAQ,WAAA,IAAe,SAAA,GAAY,WAAA,CAAY,CAAA,GAAI,UAAU,CAAA,GAAI,CAAA;AAGvE,EAAA,MAAM,QAAA,GAAW,OAAA;AAAA,IACf,MAAM,WAAA,CAAY,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,UAAU,CAAA,IAAK,IAAA;AAAA,IACpD,CAAC,aAAa,UAAU;AAAA,GAC1B;AAIA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,KAAS,YAAY,QAAA,EAAU;AAEjC,MAAA,IAAI,OAAA,IAAW,QAAA,EAAU,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA;AAChD,MAAA,IAAI,QAAA,IAAY,QAAA,EAAU,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA;AACnD,MAAA,IAAI,QAAA,CAAS,IAAA,KAAS,MAAA,EAAQ,aAAA,CAAc,SAAS,MAAM,CAAA;AAC3D,MAAA,IAAI,QAAA,CAAS,SAAS,MAAA,EAAQ;AAC5B,QAAA,WAAA,CAAY,SAAS,IAAI,CAAA;AACzB,QAAA,WAAA,CAAY,SAAS,IAAI,CAAA;AACzB,QAAA,WAAA,CAAY,SAAS,IAAI,CAAA;AACzB,QAAA,aAAA,CAAc,SAAS,MAAM,CAAA;AAC7B,QAAA,gBAAA,CAAiB,SAAS,SAAS,CAAA;AAAA,MACrC;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,WAAA;AAClB,IAAA,GAAA,CAAI,SAAS,MAAM;AACjB,MAAA,QAAA,CAAS,OAAA,GAAU,GAAA;AACnB,MAAA,YAAA,CAAa,EAAE,CAAA,EAAG,GAAA,CAAI,cAAc,CAAA,EAAG,GAAA,CAAI,eAAe,CAAA;AAC1D,MAAA,cAAA,CAAe,EAAE,CAAA;AACjB,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB,CAAA;AACA,IAAA,GAAA,CAAI,OAAA,GAAU,MAAM,aAAA,CAAM,KAAA,CAAM,sBAAsB,CAAA;AACtD,IAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AAAA,EACZ,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAGR,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,CAAA,GAAI,KAAK,qBAAA,EAAsB;AACrC,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,QAAQ,EAAE,CAAA;AACvC,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,SAAS,EAAE,CAAA;AACxC,MAAA,IAAI,MAAA,KAAW,CAAA,IAAK,MAAA,KAAW,CAAA,EAAG;AAClC,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,CAAA,GAAI,SAAA,CAAU,CAAA;AACtC,MAAA,IAAI,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,CAAA;AACnC,MAAA,IAAI,IAAI,MAAA,EAAQ;AAAE,QAAA,CAAA,GAAI,MAAA;AAAQ,QAAA,CAAA,GAAI,CAAA,GAAI,KAAA;AAAA,MAAO;AAC7C,MAAA,IAAI,IAAI,MAAA,EAAQ;AAAE,QAAA,CAAA,GAAI,MAAA;AAAQ,QAAA,CAAA,GAAI,CAAA,GAAI,KAAA;AAAA,MAAO;AAC7C,MAAA,UAAA,CAAW,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA;AAAA,IACrB,CAAA;AACA,IAAA,MAAA,EAAO;AACP,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,MAAM,CAAA;AACpC,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,EAAA,CAAG,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAC/C,IAAA,OAAO,MAAM,GAAG,UAAA,EAAW;AAAA,EAC7B,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAKd,EAAA,MAAM,WAAA,GAAc,OAAA;AAAA,IAClB,MAAM,WAAA,CAAY,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,IACjD,CAAC,WAAW;AAAA,GACd;AACA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,MAAM,QAAA,CAAS,OAAA;AACrB,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,CAAA,IAAK,CAAC,SAAA,EAAW;AAC9B,IAAA,CAAA,CAAE,QAAQ,SAAA,CAAU,CAAA;AACpB,IAAA,CAAA,CAAE,SAAS,SAAA,CAAU,CAAA;AACrB,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA;AAC7B,IAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AACvB,IAAA,KAAA,MAAW,CAAA,IAAK,WAAA,EAAa,WAAA,CAAY,GAAA,EAAK,CAAC,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,SAAA,EAAW,WAAA,EAAa,OAAO,CAAC,CAAA;AAGpC,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAsE;AACvF,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAC9B,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,EAAe;AAC9B,IAAA,EAAA,CAAG,IAAI,CAAA,CAAE,OAAA;AAAS,IAAA,EAAA,CAAG,IAAI,CAAA,CAAE,OAAA;AAC3B,IAAA,MAAM,GAAA,GAAM,IAAI,YAAA,EAAa;AAC7B,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAC9B,IAAA,MAAM,CAAA,GAAI,EAAA,CAAG,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA;AAC1C,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AAAA,EAC1B,CAAA;AAGA,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KAA8C;AAC/D,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAAqB;AACnC,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,CAAA,GAAI,UAAU,EAAE,CAAA;AACtB,MAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,QAAA,UAAA,CAAW,SAAA,CAAU,MAAM,IAAA,CAAK,KAAA,EAAO,GAAG,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAC,CAAA;AAAA,MACtE,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,KAAA,EAAO;AAE9B,QAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA;AAC/C,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,KAAK,CAAC,CAAA,GAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG;AAC5D,UAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAClB,UAAA,UAAA,CAAW,EAAE,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,EAAM,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QACjF;AAAA,MACF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC/B,QAAA,cAAA,CAAe,aAAA,CAAc,IAAA,CAAK,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,MAC7C,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC/B,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA;AAC5B,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA;AAC5B,QAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAA,KAAO,IAAA,CAAK,EAAA,GAAK,SAAA,CAAU,KAAK,QAAA,EAAU,EAAA,EAAI,EAAE,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,MAC/F,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,QAAA,cAAA,CAAe,UAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,IAAA,CAAK,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,MACpG;AAAA,IACF,CAAA;AACA,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,IAAI,IAAA,EAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,UAAA,CAAW,CAAA,CAAA,KAAK;AACd,UAAA,IAAI,CAAC,CAAA,IAAK,SAAA,CAAU,CAAC,GAAG,OAAO,IAAA;AAC/B,UAAA,MAAM,OAAmB,EAAE,GAAG,CAAA,EAAG,EAAA,EAAI,OAAM,EAAE;AAC7C,UAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AACtC,UAAA,aAAA,CAAc,KAAK,EAAE,CAAA;AACrB,UAAA,OAAA,CAAQ,QAAQ,CAAA;AAChB,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,IAAA,EAAM,IAAA,KAAS,KAAA,EAAO;AAC/B,QAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAAE,UAAA,UAAA,CAAW,IAAI,CAAA;AAAG,UAAA;AAAA,QAAQ;AACxD,QAAA,MAAM,IAAA,GAAiB,EAAE,EAAA,EAAI,KAAA,EAAM,EAAG,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AACvF,QAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AACtC,QAAA,aAAA,CAAc,KAAK,EAAE,CAAA;AACrB,QAAA,OAAA,CAAQ,QAAQ,CAAA;AAChB,QAAA,UAAA,CAAW,IAAI,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,MAAM,CAAA;AAC7C,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,IAAI,CAAA;AACzC,IAAA,MAAA,CAAO,gBAAA,CAAiB,iBAAiB,IAAI,CAAA;AAC7C,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,MAAM,CAAA;AAChD,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC5C,MAAA,MAAA,CAAO,mBAAA,CAAoB,iBAAiB,IAAI,CAAA;AAAA,IAClD,CAAA;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,MAAM,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAC,CAAA;AAEhD,EAAA,MAAM,qBAAA,GAAwB,CAAC,CAAA,EAAmC,IAAA,KAAqB;AACrF,IAAA,IAAI,SAAS,QAAA,EAAU;AACvB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,aAAA,CAAc,KAAK,EAAE,CAAA;AACrB,IAAA,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,SAAA,CAAU,CAAC,CAAA,EAAG,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,EAC9E,CAAA;AAEA,EAAA,MAAM,uBAAA,GAA0B,CAAC,CAAA,EAAmC,IAAA,EAAkB,MAAA,KAAmB;AACvG,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,SAAA,CAAU,EAAE,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,SAAA,CAAU,CAAC,CAAA,EAAG,QAAA,EAAU,MAAM,CAAA;AAAA,EACxF,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,CAAA,KAAyC;AACrE,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,CAAA,GAAI,UAAU,CAAC,CAAA;AACrB,MAAA,cAAA,CAAe,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,KAAA,EAAO,EAAA,EAAI,CAAA;AAC5C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,CAAA;AACjC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AAEnB,MAAA,SAAA,CAAU,EAAE,IAAA,EAAM,KAAA,EAAO,QAAQ,CAAC,KAAK,GAAG,CAAA;AAC1C,MAAA,UAAA,CAAW,EAAE,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,CAAC,KAAK,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AACnE,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,UAAU,IAAA,EAAM,KAAA,EAAO,OAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAC,CAAA;AACnE,IAAA,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,CAAC,IAAA,KAAqB;AAClD,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AAC1B,IAAA,cAAA,CAAe,EAAE,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,IAAI,CAAA;AAAA,EAC/E,CAAA;AAMA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KAAsB;AACnC,MAAA,IAAI,SAAS,aAAA,IAAiB,oBAAA,CAAqB,KAAK,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA,EAAG;AACzF,MAAA,IAAA,CAAK,EAAA,CAAG,OAAA,IAAW,EAAA,CAAG,OAAA,MAAa,EAAA,CAAG,GAAA,KAAQ,GAAA,IAAO,EAAA,CAAG,GAAA,KAAQ,GAAA,CAAA,IAAQ,CAAC,EAAA,CAAG,QAAA,EAAU;AACpF,QAAA,EAAA,CAAG,cAAA,EAAe;AAClB,QAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AACxC,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,IAAI,EAAA,CAAG,GAAA,KAAQ,QAAA,IAAY,EAAA,CAAG,QAAQ,WAAA,EAAa;AACjD,QAAA,EAAA,CAAG,cAAA,EAAe;AAClB,QAAA,cAAA,CAAe,UAAQ,IAAA,CAAK,MAAA,CAAO,OAAK,CAAA,CAAE,EAAA,KAAO,UAAU,CAAC,CAAA;AAC5D,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB,CAAA,MAAA,IAAW,EAAA,CAAG,GAAA,KAAQ,QAAA,EAAU;AAC9B,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAKf,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAAc;AACtC,IAAA,QAAA,CAAS,CAAC,CAAA;AACV,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AACnC,MAAA,IAAI,CAAA,CAAE,EAAA,KAAO,UAAA,EAAY,OAAO,CAAA;AAChC,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,OAAO,CAAA;AAChC,MAAA,OAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAAA,IAC1B,CAAC,CAAC,CAAA;AAAA,EACJ,CAAA;AACA,EAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAAc;AACvC,IAAA,SAAA,CAAU,CAAC,CAAA;AACX,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AACnC,MAAA,IAAI,CAAA,CAAE,EAAA,KAAO,UAAA,EAAY,OAAO,CAAA;AAChC,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ;AACvF,QAAA,OAAO,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MAC3B;AACA,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAC,CAAA;AAAA,EACJ,CAAA;AACA,EAAA,MAAM,qBAAA,GAAwB,CAAC,CAAA,KAAc;AAC3C,IAAA,aAAA,CAAc,CAAC,CAAA;AACf,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,cAAA,CAAe,UAAQ,IAAA,CAAK,GAAA;AAAA,MAAI,CAAA,CAAA,KAC7B,CAAA,CAAE,EAAA,KAAO,UAAA,IAAc,CAAA,CAAE,IAAA,KAAS,MAAA,GAAU,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE,GAAI;AAAA,KACpE,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,mBAAA,GAAsB,CAAC,CAAA,KAAc;AACzC,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,cAAA,CAAe,UAAQ,IAAA,CAAK,GAAA;AAAA,MAAI,CAAA,CAAA,KAC7B,CAAA,CAAE,EAAA,KAAO,UAAA,IAAc,CAAA,CAAE,IAAA,KAAS,MAAA,GAAU,EAAE,GAAG,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE,GAAI;AAAA,KAClE,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,mBAAA,GAAsB,CAAC,CAAA,KAAc;AACzC,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,cAAA,CAAe,UAAQ,IAAA,CAAK,GAAA;AAAA,MAAI,CAAA,CAAA,KAC7B,CAAA,CAAE,EAAA,KAAO,UAAA,IAAc,CAAA,CAAE,IAAA,KAAS,MAAA,GAAU,EAAE,GAAG,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE,GAAI;AAAA,KAClE,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,uBAAA,GAA0B,CAAC,KAAA,KAA2C;AAC1E,IAAA,MAAM,IAAA,GAAO,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,UAAA,EAAY,SAAA,EAAW,aAAA,EAAc,CAAE,KAAK,CAAA;AACpF,IAAA,IAAI,KAAA,KAAU,MAAA,EAAQ,WAAA,CAAY,IAAI,CAAA;AACtC,IAAA,IAAI,KAAA,KAAU,QAAA,EAAU,aAAA,CAAc,IAAI,CAAA;AAC1C,IAAA,IAAI,KAAA,KAAU,WAAA,EAAa,gBAAA,CAAiB,IAAI,CAAA;AAChD,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,cAAA,CAAe,UAAQ,IAAA,CAAK,GAAA;AAAA,MAAI,CAAA,CAAA,KAC7B,CAAA,CAAE,EAAA,KAAO,UAAA,IAAc,EAAE,IAAA,KAAS,MAAA,GAAU,EAAE,GAAG,CAAA,EAAG,CAAC,KAAK,GAAG,MAAK,GAAI;AAAA,KACxE,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,MAAM,QAAQ,WAAA,CAAY,KAAA;AAC1B,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG;AACjB,MAAA,IAAI,YAAY,SAAA,EAAW;AACzB,QAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,KAAK,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,EAAA,KAAO,WAAA,CAAY,SAAS,CAAC,CAAA;AAAA,MACzE;AACA,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,YAAY,SAAA,EAAW;AACzB,MAAA,cAAA,CAAe,UAAQ,IAAA,CAAK,GAAA;AAAA,QAAI,CAAA,CAAA,KAC9B,CAAA,CAAE,EAAA,KAAO,WAAA,CAAY,SAAA,IAAa,CAAA,CAAE,IAAA,KAAS,MAAA,GACzC,EAAE,GAAG,CAAA,EAAG,IAAA,EAAM,OAAM,GACpB;AAAA,OACL,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAiB;AAAA,QACrB,IAAI,KAAA,EAAM;AAAA,QACV,IAAA,EAAM,MAAA;AAAA,QACN,GAAG,WAAA,CAAY,CAAA;AAAA,QACf,GAAG,WAAA,CAAY,CAAA;AAAA,QACf,IAAA,EAAM,KAAA;AAAA,QACN,KAAA;AAAA,QACA,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,UAAA;AAAA,QACR,SAAA,EAAW;AAAA,OACb;AACA,MAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AACtC,MAAA,aAAA,CAAc,KAAK,EAAE,CAAA;AACrB,MAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAClB;AACA,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACrB,CAAA;AAGA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,QAAA,CAAS,OAAA,IAAW,CAAC,SAAA,EAAW;AACrD,IAAA,MAAM,CAAA,GAAI,WAAA;AACV,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,GAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA;AAC1B,IAAA,GAAA,CAAI,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA;AAChC,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACpD,IAAA,YAAA,CAAa,QAAQ,SAAA,CAAU,CAAA;AAC/B,IAAA,YAAA,CAAa,SAAS,SAAA,CAAU,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,UAAA,CAAW,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AACrC,IAAA,KAAA,MAAW,CAAA,IAAK,WAAA,EAAa,WAAA,CAAY,IAAA,EAAM,CAAC,CAAA;AAChD,IAAA,IAAA,CAAK,SAAA,CAAU,YAAA,EAAc,CAAA,CAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC/D,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,EAAM;AACzB,IAAA,MAAA,CAAO,SAAS,MAAM;AACpB,MAAA,QAAA,CAAS,OAAA,GAAU,MAAA;AACnB,MAAA,YAAA,CAAa,EAAE,CAAA,EAAG,MAAA,CAAO,cAAc,CAAA,EAAG,MAAA,CAAO,eAAe,CAAA;AAChE,MAAA,cAAA;AAAA,QAAe,CAAA,IAAA,KACb,IAAA,CACG,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,CAC/B,GAAA,CAAI,CAAA,CAAA,KAAK,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA,CAAE,CAAA,EAAG,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CACjC,MAAA,CAAO,CAAA,CAAA,KAAK,YAAA,CAAa,CAAA,EAAG,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,aAAa,CAAC;AAAA,OAC3E;AACA,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,IACrB,CAAA;AACA,IAAA,MAAA,CAAO,GAAA,GAAM,GAAA,CAAI,SAAA,CAAU,WAAW,CAAA;AAAA,EACxC,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,CAAe,IAAI,CAAA;AAE5C,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AACxC,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA;AAGA,EAAA,MAAM,oBAAoB,YAA+C;AACvE,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,GAAA,IAAO,CAAC,WAAW,OAAO,IAAA;AACrC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,GAAA,CAAI,QAAQ,SAAA,CAAU,CAAA;AACtB,IAAA,GAAA,CAAI,SAAS,SAAA,CAAU,CAAA;AACvB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA;AAChC,IAAA,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACtB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,IAAI,CAAA;AAChC,IAAA,KAAA,CAAM,iBAAiB,eAAe,CAAA,CAAE,QAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA;AAC/D,IAAA,MAAM,GAAA,GAAM,IAAI,aAAA,EAAc,CAAE,kBAAkB,KAAK,CAAA;AACvD,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,CAAC,GAAG,CAAA,EAAG,EAAE,IAAA,EAAM,6BAAA,EAA+B,CAAA;AACvE,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,eAAA,CAAgB,OAAO,CAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,EAAM;AACzB,IAAA,MAAM,IAAI,QAAc,CAAA,OAAA,KAAW;AACjC,MAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC9B,MAAA,MAAA,CAAO,OAAA,GAAU,MAAM,OAAA,EAAQ;AAC/B,MAAA,MAAA,CAAO,GAAA,GAAM,MAAA;AAAA,IACf,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ,CAAA,EAAG,GAAG,SAAA,CAAU,CAAA,EAAG,UAAU,CAAC,CAAA;AACrD,IAAA,GAAA,CAAI,gBAAgB,MAAM,CAAA;AAC1B,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,mBAAA,CAAoB,KAAK,OAAO;AAAA,IAC9B,MAAM,YAAY;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,iBAAA,EAAkB;AACpC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,GAAA,CAAI,OAAO,CAAA,IAAA,KAAQ;AACjB,QAAA,IAAI,CAAC,IAAA,EAAM;AAAE,UAAA,aAAA,CAAM,MAAM,kBAAkB,CAAA;AAAG,UAAA;AAAA,QAAQ;AACtD,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,QAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAC5C,QAAA,CAAA,CAAE,QAAA,GAAW,GAAG,IAAI,CAAA,cAAA,CAAA;AACpB,QAAA,CAAA,CAAE,KAAA,EAAM;AACR,QAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,MACzB,GAAG,WAAW,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,MAAM,YAAY;AAChB,MAAA,IAAI,EAAE,WAAA,IAAe,SAAA,CAAA,IAAc,OAAO,kBAAkB,WAAA,EAAa;AACvE,QAAA,aAAA,CAAM,MAAM,gDAAgD,CAAA;AAC5D,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,iBAAA,EAAkB;AACpC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,GAAA,CAAI,MAAA,CAAO,OAAM,IAAA,KAAQ;AACvB,QAAA,IAAI,CAAC,IAAA,EAAM;AAAE,UAAA,aAAA,CAAM,MAAM,gBAAgB,CAAA;AAAG,UAAA;AAAA,QAAQ;AACpD,QAAA,IAAI;AACF,UAAA,MAAM,SAAA,CAAU,SAAA,CAAU,KAAA,CAAM,CAAC,IAAI,aAAA,CAAc,EAAE,WAAA,EAAa,IAAA,EAAM,CAAC,CAAC,CAAA;AAC1E,UAAA,aAAA,CAAM,QAAQ,qBAAqB,CAAA;AAAA,QACrC,CAAA,CAAA,MAAQ;AACN,UAAA,aAAA,CAAM,MAAM,qCAAqC,CAAA;AAAA,QACnD;AAAA,MACF,GAAG,WAAW,CAAA;AAAA,IAChB;AAAA,GACF,CAAA,EAAI,CAAC,SAAA,EAAW,QAAQ,CAAC,CAAA;AAGzB,EAAA,MAAM,KAAA,GAA0D,QAAQ,MAAM;AAAA,IAC5E,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,eAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,wBAAA,EAAyB,CAAA,EAAE,CAAA,EAAO;AAAA,IACtO,EAAE,EAAA,EAAI,MAAA,EAAU,KAAA,EAAO,YAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,iJAAA,EAAkJ,CAAA,EAAE,CAAA,EAAO;AAAA,IAC/V,EAAE,EAAA,EAAI,MAAA,EAAU,KAAA,EAAO,WAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,SAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,KAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,GAAE,CAAA,EAAO;AAAA,IACxM,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,SAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAQ,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,GAAE,CAAA,EAAO;AAAA,IAC/L,EAAE,EAAA,EAAI,OAAA,EAAU,KAAA,EAAO,OAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,yBAAA,EAA0B,CAAA,EAAE,CAAA,EAAO;AAAA,IACvO,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,QAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,oDAAA,EAAqD,CAAA,EAAE,CAAA,EAAO;AAAA,IAClQ,EAAE,EAAA,EAAI,MAAA,EAAU,KAAA,EAAO,MAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,wBAAA,EAAyB,CAAA,EAAE,CAAA,EAAO;AAAA,IACtO,EAAE,EAAA,EAAI,MAAA,EAAU,KAAA,EAAO,MAAA,EAAiB,IAAA,kBAAM,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,8CAAA,EAA+C,CAAA,EAAE,CAAA;AAAO,GAC9P,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAW,CAAC,MAAA,KAChB,CAAA,gCAAA,EAAmC,MAAA,GAAS,2BAA2B,iCAAiC,CAAA,CAAA;AAI1G,EAAA,MAAM,OAAA,GAAU,QAAA,EAAU,IAAA,KAAS,IAAA,KAAS,WAAW,IAAA,GAAO,IAAA,CAAA;AAC9D,EAAA,MAAM,oBAAoB,OAAA,KAAY,MAAA,IAAU,YAAY,QAAA,IAAY,OAAA,KAAY,WAAW,OAAA,KAAY,MAAA;AAC3G,EAAA,MAAM,iBAAoB,OAAA,KAAY,MAAA;AACtC,EAAA,MAAM,mBAAoB,OAAA,KAAY,MAAA;AAEtC,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAEb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sGAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,IAAI,CAAA,CAAA,qBACT,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,SAAS,MAAM;AAAE,YAAA,OAAA,CAAQ,EAAE,EAAE,CAAA;AAAG,YAAA,aAAA,CAAc,IAAI,CAAA;AAAA,UAAG,CAAA;AAAA,UACrD,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,SAAA,EAAW,QAAA,CAAS,IAAA,KAAS,CAAA,CAAE,EAAE,CAAA;AAAA,UAEhC,QAAA,EAAA,CAAA,CAAE;AAAA,SAAA;AAAA,QALE,CAAA,CAAE;AAAA,OAOV,CAAA;AAAA,sBAED,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,0BAG1C,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA,MAAA,CAAO,IAAI,CAAA,CAAA,qBACV,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,OAAA,EAAS,MAAM,gBAAA,CAAiB,CAAC,CAAA;AAAA,UACjC,KAAA,EAAO,CAAA;AAAA,UACP,SAAA,EAAW,CAAA,4BAAA,EAA+B,KAAA,KAAU,CAAA,GAAI,uCAAuC,iBAAiB,CAAA,CAAA;AAAA,UAChH,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA;AAAE,SAAA;AAAA,QAJlB;AAAA,OAMR,CAAA,EACH,CAAA;AAAA,MAEC,qCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EAA4B,CAAA;AAAA,wBAC3C,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAK,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BACZ,GAAA,CAAC,WAAM,IAAA,EAAK,OAAA,EAAQ,KAAK,CAAA,EAAG,GAAA,EAAK,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,QAAQ,QAAA,EAAU,CAAC,CAAA,KAAM,iBAAA,CAAkB,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAC,CAAA,EAAG,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,0BAC1J,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA+B,QAAA,EAAA,MAAA,EAAO;AAAA,SAAA,EACxD;AAAA,OAAA,EACF,CAAA;AAAA,MAGD,kCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EAA4B,CAAA;AAAA,wBAC3C,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAK,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BACZ,GAAA,CAAC,WAAM,IAAA,EAAK,OAAA,EAAQ,KAAK,CAAA,EAAG,GAAA,EAAK,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,YAAY,QAAA,EAAU,CAAC,CAAA,KAAM,qBAAA,CAAsB,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAC,CAAA,EAAG,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,0BAClK,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA+B,QAAA,EAAA,UAAA,EAAW;AAAA,SAAA,EAC5D;AAAA,OAAA,EACF,CAAA;AAAA,MAGD,oCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EAA4B,CAAA;AAAA,wBAC3C,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,CAAC,CAAA,KAAM,mBAAA,CAAoB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,EAAG,SAAA,EAAU,6DAAA,EACtF,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,qBAAK,GAAA,CAAC,QAAA,EAAA,EAAkB,KAAA,EAAO,CAAA,CAAE,EAAA,EAAK,QAAA,EAAA,CAAA,CAAE,KAAA,EAAA,EAAtB,CAAA,CAAE,EAA0B,CAAS,CAAA,EACpE,CAAA;AAAA,4BACC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,uBAAA,CAAwB,MAAM,GAAQ,SAAA,EAAW,QAAA,CAAS,QAAQ,CAAA,EAAQ,OAAM,MAAA,EAAO,QAAA,kBAAA,GAAA,CAAC,UAAK,SAAA,EAAU,WAAA,EAAY,eAAC,CAAA,EAAO,CAAA;AAAA,4BACjJ,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,uBAAA,CAAwB,QAAQ,GAAM,SAAA,EAAW,QAAA,CAAS,UAAU,CAAA,EAAM,OAAM,QAAA,EAAS,QAAA,kBAAA,GAAA,CAAC,UAAK,SAAA,EAAU,QAAA,EAAS,eAAC,CAAA,EAAO,CAAA;AAAA,4BAChJ,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,uBAAA,CAAwB,WAAW,GAAG,SAAA,EAAW,QAAA,CAAS,aAAa,CAAA,EAAG,OAAM,WAAA,EAAY,QAAA,kBAAA,GAAA,CAAC,UAAK,SAAA,EAAU,WAAA,EAAY,eAAC,CAAA,EAAO,CAAA;AAAA,wBACvJ,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAK,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,0BACV,GAAA,CAAC,WAAM,IAAA,EAAK,OAAA,EAAQ,KAAK,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,UAAU,QAAA,EAAU,CAAC,CAAA,KAAM,mBAAA,CAAoB,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAC,CAAA,EAAG,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,0BAC/J,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA+B,QAAA,EAAA,QAAA,EAAS;AAAA,SAAA,EAC1D;AAAA,OAAA,EACF,CAAA;AAAA,sBAGF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,sBAG3C,GAAA,CAAC,YAAO,OAAA,EAAS,MAAM,QAAQ,CAAA,CAAA,KAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,KAAA,CAAA,CAAO,IAAI,SAAA,IAAa,GAAG,IAAI,GAAG,CAAC,GAAG,SAAA,EAAU,mDAAA,EAAoD,KAAA,EAAM,UAAA,EAAW,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBAClL,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,QAAE;AAAA,OAAA,EAAC,CAAA;AAAA,sBACvF,GAAA,CAAC,YAAO,OAAA,EAAS,MAAM,QAAQ,CAAA,CAAA,KAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,KAAA,CAAA,CAAO,IAAI,SAAA,IAAa,GAAG,IAAI,GAAG,CAAC,GAAG,SAAA,EAAU,mDAAA,EAAoD,KAAA,EAAM,SAAA,EAAU,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACjL,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAA,EAAU,mDAAA,EAAoD,KAAA,EAAM,aAAA,EAAc,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,sBAExH,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,sBAE3C,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,YAAY,MAAA,KAAW,CAAA,EAAG,SAAA,EAAU,uEAAA,EAAwE,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,sBAErJ,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,QAAA,WAAA,oBACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,SAAA,EAAW,SAAA,EAAU,8DAA6D,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,8BAC5G,QAAA,EAAA,EAAO,OAAA,EAAS,UAAA,EAAY,SAAA,EAAU,qDAAoD,QAAA,EAAA,QAAA,EAAM;AAAA,SAAA,EACnG,CAAA;AAAA,QAED,OAAA,IAAW,CAAC,WAAA,oBACX,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAA,QAAA,wBACE,QAAA,EAAA,EAAO,OAAA,EAAS,QAAA,EAAU,SAAA,EAAU,yEAAwE,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BAErH,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAS,YAAY;AACnB,gBAAA,MAAM,GAAA,GAAM,MAAM,iBAAA,EAAkB;AACpC,gBAAA,IAAI,CAAC,GAAA,EAAK;AAAE,kBAAA,aAAA,CAAM,MAAM,kBAAkB,CAAA;AAAG,kBAAA;AAAA,gBAAQ;AACrD,gBAAA,GAAA,CAAI,OAAO,CAAA,IAAA,KAAQ;AACjB,kBAAA,IAAI,CAAC,IAAA,EAAM;AAAE,oBAAA,aAAA,CAAM,MAAM,kBAAkB,CAAA;AAAG,oBAAA;AAAA,kBAAQ;AACtD,kBAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,gBACd,GAAG,WAAW,CAAA;AAAA,cAChB,CAAA;AAAA,cACA,SAAA,EAAU,gFAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA;AAAA,wBAGC,KAAA,EAAA,EAAI,GAAA,EAAK,SAAS,SAAA,EAAU,gFAAA,EAC1B,yBAAe,SAAA,oBACd,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,8DAAA;AAAA,QACV,OAAO,EAAE,KAAA,EAAO,YAAY,CAAA,EAAG,MAAA,EAAQ,YAAY,CAAA,EAAE;AAAA,QAErD,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,CAAA,EAAG,OAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,SAAQ,EAAG,CAAA;AAAA,0BACpH,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,MAAA;AAAA,cACL,SAAS,CAAA,IAAA,EAAO,SAAA,CAAU,CAAC,CAAA,CAAA,EAAI,UAAU,CAAC,CAAA,CAAA;AAAA,cAC1C,mBAAA,EAAoB,MAAA;AAAA,cACpB,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,UAAA;AAAA,gBAAY,KAAA,EAAO,CAAA;AAAA,gBAAG,KAAA,EAAO,MAAA;AAAA,gBAAQ,MAAA,EAAQ,MAAA;AAAA,gBACvD,WAAA,EAAa,MAAA;AAAA,gBACb,QAAQ,IAAA,KAAS,QAAA,GAAW,SAAA,GAAY,IAAA,KAAS,SAAS,MAAA,GAAS;AAAA,eACrE;AAAA,cACA,aAAA,EAAe,oBAAA;AAAA,cAEd,QAAA,EAAA;AAAA,gBAAA,WAAA,CAAY,IAAI,CAAA,CAAA,qBACf,GAAA;AAAA,kBAAC,cAAA;AAAA,kBAAA;AAAA,oBAEC,IAAA,EAAM,CAAA;AAAA,oBACN,QAAA,EAAU,eAAe,CAAA,CAAE,EAAA;AAAA,oBAC3B,IAAA;AAAA,oBACA,aAAA,EAAe,CAAC,CAAA,KAAM,qBAAA,CAAsB,GAAG,CAAC,CAAA;AAAA,oBAChD,aAAA,EAAe,MAAM,qBAAA,CAAsB,CAAC,CAAA;AAAA,oBAC5C,qBAAqB,CAAC,CAAA,EAAG,WAAW,uBAAA,CAAwB,CAAA,EAAG,GAAG,MAAM;AAAA,mBAAA;AAAA,kBANnE,CAAA,CAAE;AAAA,iBAQV,CAAA;AAAA,gBACA,OAAA,oBAAW,GAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,EAAA,EAAI,WAAA,EAAY,EAAiB,OAAA,EAAO,IAAA,EAAC,CAAA;AAAA,gBACxF,WAAA,oBAAe,GAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,aAAa,SAAA,EAAsB;AAAA;AAAA;AAAA,WACxE;AAAA,UAEC,WAAA,oBACC,GAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,WAAA;AAAA,cACA,KAAA;AAAA,cACA,IAAA,EAAM,QAAA;AAAA,cACN,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,QAAQ,CAAA,EAAG,GAAA,IAAO,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA;AAAA,cAC1D,IAAA,EAAM,QAAA;AAAA,cACN,MAAA,EAAQ,UAAA;AAAA,cACR,SAAA,EAAW,aAAA;AAAA,cACX,KAAA;AAAA,cACA,QAAA,EAAU,CAAC,KAAA,KAAU,cAAA,CAAe,EAAE,GAAG,WAAA,EAAa,OAAO,CAAA;AAAA,cAC7D,QAAA,EAAU,UAAA;AAAA,cACV,QAAA,EAAU,MAAM,cAAA,CAAe,IAAI;AAAA;AAAA;AACrC;AAAA;AAAA,KAEJ,EAEJ,CAAA;AAAA,wBAGC,KAAA,EAAA,EAAI,SAAA,EAAU,oFACZ,QAAA,EAAA,IAAA,KAAS,QAAA,GACL,aAAa,+FAAA,GAAkG,mDAAA,GAChH,IAAA,KAAS,MAAA,GACP,gCACA,IAAA,KAAS,MAAA,GACP,6CACA,IAAA,KAAS,MAAA,GACP,2BACA,4BAAA,EACZ;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC,CAAA;AAED,IAAO,sBAAA,GAAQ;AAcf,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA,EAAG,aAAA,EAAe,aAAA,EAAe,mBAAA,EAAoB,EAAkB;AAC/H,EAAA,MAAM,GAAA,GAAM,YAAY,IAAI,CAAA;AAC5B,EAAA,MAAM,WAAA,GAAmB,aAAA,GACrB,EAAE,aAAA,EAAe,aAAA,EAAe,KAAA,EAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,EAAO,EAAE,GACjE,EAAC;AACL,EAAA,MAAM,IAAA,GAAY,aAAA,GAAgB,EAAE,aAAA,KAAkB,EAAC;AAEvD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,IAAA,mBACE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAG,IAAA,CAAK,CAAA;AAAA,QAAG,GAAG,IAAA,CAAK,CAAA;AAAA,QAAG,OAAO,IAAA,CAAK,CAAA;AAAA,QAAG,QAAQ,IAAA,CAAK,CAAA;AAAA,QAClD,IAAI,IAAA,CAAK,MAAA;AAAA,QAAQ,IAAI,IAAA,CAAK,MAAA;AAAA,QAC1B,IAAA,EAAK,MAAA;AAAA,QAAO,QAAQ,IAAA,CAAK,KAAA;AAAA,QAAO,aAAa,IAAA,CAAK,MAAA;AAAA,QAClD,aAAA,EAAc,OAAA;AAAA,QAAQ,cAAA,EAAe,OAAA;AAAA,QACpC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,IAAA,IAAA,mBACE,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAA;AAAA,QAAG,EAAA,EAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAA;AAAA,QAC/C,EAAA,EAAI,KAAK,CAAA,GAAI,CAAA;AAAA,QAAG,EAAA,EAAI,KAAK,CAAA,GAAI,CAAA;AAAA,QAC7B,IAAA,EAAK,MAAA;AAAA,QAAO,QAAQ,IAAA,CAAK,KAAA;AAAA,QAAO,aAAa,IAAA,CAAK,MAAA;AAAA,QACjD,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,IAAA,IAAA,mBAAO,GAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAY,WAAA,EAA0B,CAAA;AAAA,EAC3D,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC/B,IAAA,IAAA,mBACE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AAAA,QAC3B,IAAA,EAAK,MAAA;AAAA,QAAO,QAAQ,IAAA,CAAK,KAAA;AAAA,QAAO,aAAa,IAAA,CAAK,MAAA;AAAA,QAClD,aAAA,EAAc,OAAA;AAAA,QAAQ,cAAA,EAAe,OAAA;AAAA,QACpC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,IAAA,IAAA,mBACE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAG,IAAA,CAAK,CAAA;AAAA,QAAG,GAAG,IAAA,CAAK,CAAA;AAAA,QAAG,OAAO,IAAA,CAAK,CAAA;AAAA,QAAG,QAAQ,IAAA,CAAK,CAAA;AAAA,QAClD,IAAA,EAAK,mBAAA;AAAA,QACL,MAAA,EAAQ,WAAW,SAAA,GAAY,MAAA;AAAA,QAC/B,WAAA,EAAa,WAAW,CAAA,GAAI,CAAA;AAAA,QAC5B,eAAA,EAAiB,WAAW,KAAA,GAAQ,MAAA;AAAA,QACnC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ,CAAA,MAAO;AAEL,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,IAAI,CAAA,EAAG,GAAA,IAAO,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA;AAClE,IAAA,IAAA,mBACE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAG,IAAA,CAAK,CAAA;AAAA,QAAG,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,IAAA;AAAA,QAC5B,MAAM,IAAA,CAAK,KAAA;AAAA,QACX,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,UAAA,EAAY,IAAA,CAAK,IAAA,GAAO,GAAA,GAAM,GAAA;AAAA,QAC9B,SAAA,EAAW,IAAA,CAAK,MAAA,GAAS,QAAA,GAAW,QAAA;AAAA,QACpC,cAAA,EAAgB,IAAA,CAAK,SAAA,GAAY,WAAA,GAAc,MAAA;AAAA,QAC/C,UAAA,EAAY,IAAA;AAAA,QACZ,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAO;AAAA,QAC3B,GAAG,WAAA;AAAA,QACH,GAAG,IAAA;AAAA,QAEH,QAAA,EAAA,IAAA,CAAK,KAAK,KAAA,CAAM,IAAI,EAAE,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAChC,GAAA,CAAC,OAAA,EAAA,EAAc,GAAG,IAAA,CAAK,CAAA,EAAG,EAAA,EAAI,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,KAAK,IAAA,GAAO,GAAA,EAAM,QAAA,EAAA,IAAA,EAAA,EAAlD,CAAuD,CACpE;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,4BACG,GAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,IAAA;AAAA,IACA,QAAA,IAAY,CAAC,OAAA,oBACZ,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAY,WAAA;AAAA,UACZ,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA;AAAA,UAAG,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA;AAAA,UACzB,KAAA,EAAO,IAAI,CAAA,GAAI,CAAA;AAAA,UAAG,MAAA,EAAQ,IAAI,CAAA,GAAI,CAAA;AAAA,UAClC,IAAA,EAAK,MAAA;AAAA,UAAO,MAAA,EAAO,SAAA;AAAA,UAAU,aAAa,CAAA,GAAI,IAAA;AAAA,UAC9C,iBAAiB,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAAA,UACxC,aAAA,EAAc;AAAA;AAAA,OAChB;AAAA,MACC,mBAAA,oBAAuB,GAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAY,MAAY,mBAAA,EAA0C;AAAA,KAAA,EAC3G;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM;AACd,CAAA,EAIG;AACD,EAAA,MAAM,IAAI,CAAA,GAAI,IAAA;AACd,EAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,EAAA,MAAM,WAAA,GAAc,CAAC,MAAA,MAAoB;AAAA,IACvC,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA,IACR,WAAA,EAAa,EAAA;AAAA,IACb,aAAA,EAAe,KAAA;AAAA,IACf,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,IAChB,aAAA,EAAe;AAAA,GACjB,CAAA;AAEA,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,IAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,YAAO,EAAA,EAAI,IAAA,CAAK,IAAI,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,EAAO,GAAG,WAAA,CAAY,MAAM,GAAG,aAAA,EAAe,CAAC,MAAM,mBAAA,CAAoB,CAAA,EAAG,OAAO,CAAA,EAAG,CAAA;AAAA,0BACvH,QAAA,EAAA,EAAO,EAAA,EAAI,KAAK,EAAA,EAAI,EAAA,EAAI,KAAK,EAAA,EAAI,CAAA,EAAO,GAAG,WAAA,CAAY,MAAM,GAAG,aAAA,EAAe,CAAC,MAAM,mBAAA,CAAoB,CAAA,EAAG,KAAK,CAAA,EAAG;AAAA,KAAA,EACxH,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,SAAS,MAAA,EAAQ;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,CAAA;AACnD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,YAAO,EAAA,EAAI,CAAA,EAAO,EAAA,EAAI,CAAA,EAAO,GAAO,GAAG,WAAA,CAAY,aAAa,CAAA,EAAG,eAAe,CAAC,CAAA,KAAM,mBAAA,CAAoB,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA;AAAA,wBACvH,QAAA,EAAA,EAAO,EAAA,EAAI,IAAI,CAAA,EAAG,EAAA,EAAI,GAAO,CAAA,EAAO,GAAG,WAAA,CAAY,aAAa,GAAG,aAAA,EAAe,CAAC,MAAM,mBAAA,CAAoB,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA;AAAA,wBACvH,QAAA,EAAA,EAAO,EAAA,EAAI,IAAI,CAAA,EAAG,EAAA,EAAI,IAAI,CAAA,EAAG,CAAA,EAAO,GAAG,WAAA,CAAY,aAAa,GAAG,aAAA,EAAe,CAAC,MAAM,mBAAA,CAAoB,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA;AAAA,wBACvH,QAAA,EAAA,EAAO,EAAA,EAAI,GAAO,EAAA,EAAI,CAAA,GAAI,GAAG,CAAA,EAAO,GAAG,WAAA,CAAY,aAAa,GAAG,aAAA,EAAe,CAAC,MAAM,mBAAA,CAAoB,CAAA,EAAG,IAAI,CAAA,EAAG;AAAA,GAAA,EAC1H,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,WAAA,EAAY,EAA0C;AAChF,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,SAAS,CAAC,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,EAAI,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,EAAE,CAAA;AAC7D,EAAA,MAAM,EAAA,GAAK,KAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACvC,EAAA,MAAM,EAAA,GAAK,KAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACvC,EAAA,MAAM,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,KAAK,EAAE,CAAA,EAAA,EAAK,IAAA,CAAK,EAAA,GAAK,UAAU,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA,CAAA,EAAI,KAAK,EAAA,GAAK,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,EAAA,GAAK,UAAU,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,IAAI,IAAA,CAAK,EAAA,GAAK,UAAU,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA,EAAA,CAAA;AACrL,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAG,GAAG,WAAA,EACL,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,IAAI,IAAA,CAAK,EAAA;AAAA,QAAI,IAAI,IAAA,CAAK,EAAA;AAAA,QAAI,IAAI,IAAA,CAAK,EAAA;AAAA,QAAI,IAAI,IAAA,CAAK,EAAA;AAAA,QAChD,QAAQ,IAAA,CAAK,KAAA;AAAA,QAAO,aAAa,IAAA,CAAK,MAAA;AAAA,QAAQ,aAAA,EAAc;AAAA;AAAA,KAC9D;AAAA,wBACC,MAAA,EAAA,EAAK,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,KAAK,KAAA,EAAO;AAAA,GAAA,EACnC,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,SAAA,EAAU,EAAkG;AACvI,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAE,aAAA,EAAc,MAAA,EACf,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,CAAA,MAAA,EAAS,SAAA,CAAU,CAAC,CAAA,EAAA,EAAK,UAAU,CAAC,CAAA,OAAA,EAAU,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,CAAC,CAAA,EAAA,CAAA;AAAA,QACpH,IAAA,EAAK,kBAAA;AAAA,QACL,QAAA,EAAS;AAAA;AAAA,KACX;AAAA,oBACA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAG,IAAA,CAAK,CAAA;AAAA,QAAG,GAAG,IAAA,CAAK,CAAA;AAAA,QAAG,OAAO,IAAA,CAAK,CAAA;AAAA,QAAG,QAAQ,IAAA,CAAK,CAAA;AAAA,QAClD,IAAA,EAAK,MAAA;AAAA,QAAO,MAAA,EAAO,MAAA;AAAA,QAAO,WAAA,EAAa,CAAA;AAAA,QAAG,eAAA,EAAgB;AAAA;AAAA;AAC5D,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,iBAAA,CAAkB;AAAA,EACzB,WAAA;AAAA,EAAa,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU;AACtF,CAAA,EAYG;AACD,EAAA,MAAM,GAAA,GAAM,OAA4B,IAAI,CAAA;AAC5C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,EAAA,GAAK,sBAAsB,MAAM;AACrC,MAAA,GAAA,CAAI,SAAS,KAAA,EAAM;AACnB,MAAA,GAAA,CAAI,SAAS,MAAA,IAAS;AAAA,IACxB,CAAC,CAAA;AACD,IAAA,OAAO,MAAM,qBAAqB,EAAE,CAAA;AAAA,EACtC,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,IAAA,EAAM,CAAA,EAAG,WAAA,CAAY,CAAA,GAAI,KAAK,CAAA,EAAA,CAAA;AAAA,QAC9B,GAAA,EAAK,CAAA,EAAG,WAAA,CAAY,CAAA,GAAI,KAAK,CAAA,EAAA,CAAA;AAAA,QAC7B,SAAA,EAAW,kBAAA;AAAA,QACX,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,MAExC,QAAA,kBAAA,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,OAAO,WAAA,CAAY,KAAA;AAAA,UACnB,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,MAAA,EAAQ,QAAA;AAAA,UACR,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,YAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AAAE,cAAA,CAAA,CAAE,cAAA,EAAe;AAAG,cAAA,QAAA,EAAS;AAAA,YAAG,WACjD,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AAAE,cAAA,CAAA,CAAE,cAAA,EAAe;AAAG,cAAA,QAAA,EAAS;AAAA,YAAG;AAAA,UAC/E,CAAA;AAAA,UACA,WAAA,EAAY,uBAAA;AAAA,UACZ,IAAA,EAAM,CAAA;AAAA,UACN,SAAA,EAAU,2FAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,KAAA;AAAA,YACA,QAAA,EAAU,CAAA,EAAG,IAAA,GAAO,KAAK,CAAA,EAAA,CAAA;AAAA,YACzB,UAAA,EAAY,IAAA;AAAA,YACZ,UAAA,EAAY,OAAO,GAAA,GAAM,GAAA;AAAA,YACzB,SAAA,EAAW,SAAS,QAAA,GAAW,QAAA;AAAA,YAC/B,cAAA,EAAgB,YAAY,WAAA,GAAc,MAAA;AAAA,YAC1C,QAAA,EAAU;AAAA;AACZ;AAAA;AACF;AAAA,GACF;AAEJ;AAIA,SAAS,UACP,IAAA,EACA,KAAA,EACA,GAAA,EACA,KAAA,EACA,QACA,UAAA,EACmB;AACnB,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,MAAM,CAAA,GAAI,aAAA,CAAc,KAAA,EAAO,GAAG,CAAA;AAClC,IAAA,OAAO,EAAE,IAAI,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,QAAQ,UAAA,EAAW;AAAA,EACnG;AACA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,CAAA,GAAI,aAAA,CAAc,KAAA,EAAO,GAAG,CAAA;AAClC,IAAA,OAAO,EAAE,EAAA,EAAI,EAAA,EAAI,MAAM,QAAA,EAAU,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,OAAO,MAAA,EAAO;AAAA,EACjF;AACA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,OAAO,EAAE,EAAA,EAAI,EAAA,EAAI,MAAM,OAAA,EAAS,EAAA,EAAI,MAAM,CAAA,EAAG,EAAA,EAAI,KAAA,CAAM,CAAA,EAAG,IAAI,GAAA,CAAI,CAAA,EAAG,IAAI,GAAA,CAAI,CAAA,EAAG,OAAO,MAAA,EAAO;AAAA,EAChG;AACA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,CAAA,GAAI,aAAA,CAAc,KAAA,EAAO,GAAG,CAAA;AAClC,IAAA,OAAO,EAAE,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,QAAA,EAAU,GAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AAAA,EAClE;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAU,CAAA,EAAwB;AACzC,EAAA,IAAI,EAAE,IAAA,KAAS,OAAA,SAAgB,IAAA,CAAK,GAAA,CAAI,EAAE,EAAA,GAAK,CAAA,CAAE,EAAE,CAAA,GAAI,KAAK,IAAA,CAAK,GAAA,CAAI,EAAE,EAAA,GAAK,CAAA,CAAE,EAAE,CAAA,GAAI,CAAA;AACpF,EAAA,IAAI,EAAE,IAAA,KAAS,MAAA,EAAS,OAAO,CAAA,CAAE,OAAO,MAAA,GAAS,CAAA;AACjD,EAAA,IAAI,GAAA,IAAO,KAAK,GAAA,IAAO,CAAA,SAAU,CAAA,CAAE,CAAA,GAAI,CAAA,IAAK,CAAA,CAAE,CAAA,GAAI,CAAA;AAClD,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAA,CAAU,CAAA,EAAe,EAAA,EAAY,EAAA,EAAwB;AACpE,EAAA,IAAI,CAAA,CAAE,SAAS,OAAA,EAAS,OAAO,EAAE,GAAG,CAAA,EAAG,EAAA,EAAI,CAAA,CAAE,EAAA,GAAK,EAAA,EAAI,IAAI,CAAA,CAAE,EAAA,GAAK,IAAI,EAAA,EAAI,CAAA,CAAE,KAAK,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,EAAA,GAAK,EAAA,EAAG;AAClG,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAS,OAAO,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,QAAM,EAAE,CAAA,EAAG,EAAE,CAAA,GAAI,EAAA,EAAI,GAAG,CAAA,CAAE,CAAA,GAAI,EAAA,EAAG,CAAE,CAAA,EAAE;AACjG,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAS,OAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,IAAI,EAAA,EAAG;AAChE,EAAA,OAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,IAAI,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,EAAG;AAC1C;AAEA,SAAS,MAAA,CACP,QAAA,EACA,MAAA,EACA,CAAA,EACY;AACZ,EAAA,IAAI,QAAA,CAAS,SAAS,OAAA,EAAS;AAC7B,IAAA,IAAI,MAAA,KAAW,OAAA,EAAS,OAAO,EAAE,GAAG,QAAA,EAAU,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,CAAA,CAAE,CAAA,EAAE;AAC/D,IAAA,IAAI,MAAA,KAAW,KAAA,EAAS,OAAO,EAAE,GAAG,QAAA,EAAU,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,CAAA,CAAE,CAAA,EAAE;AAC/D,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAI,SAAS,IAAA,KAAS,MAAA,IAAU,QAAA,CAAS,IAAA,KAAS,QAAQ,OAAO,QAAA;AACjE,EAAA,MAAM,OAAS,QAAA,CAAS,CAAA;AACxB,EAAA,MAAM,KAAA,GAAS,QAAA,CAAS,CAAA,GAAI,QAAA,CAAS,CAAA;AACrC,EAAA,MAAM,MAAS,QAAA,CAAS,CAAA;AACxB,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,CAAA,GAAI,QAAA,CAAS,CAAA;AACrC,EAAA,IAAI,KAAK,IAAA,EAAM,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,OAAO,EAAA,GAAK,MAAA;AAC1C,EAAA,IAAI,WAAW,IAAA,EAAM;AAAE,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,EAAG;AAC3C,EAAA,IAAI,WAAW,IAAA,EAAM;AAAE,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,EAAG;AAC3C,EAAA,IAAI,WAAW,IAAA,EAAM;AAAE,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,EAAG;AAC3C,EAAA,IAAI,WAAW,IAAA,EAAM;AAAE,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,EAAG;AAC3C,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG,EAAG,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA;AAC1D,EAAA,OAAO,EAAE,GAAG,QAAA,EAAU,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AACvD;AAEA,SAAS,YAAY,CAAA,EAA+D;AAClF,EAAA,IAAI,CAAA,CAAE,SAAS,OAAA,EAAS;AACtB,IAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAC7B,IAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAC7B,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,IAAA,CAAK,GAAA,CAAI,EAAE,EAAA,GAAK,CAAA,CAAE,EAAE,CAAA,EAAG,GAAG,IAAA,CAAK,GAAA,CAAI,EAAE,EAAA,GAAK,CAAA,CAAE,EAAE,CAAA,EAAE;AAAA,EACpE;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,IAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAC3D,IAAA,IAAI,IAAA,GAAO,EAAE,MAAA,CAAO,CAAC,EAAE,CAAA,EAAG,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,GAAG,IAAA,GAAO,CAAA,CAAE,OAAO,CAAC,CAAA,CAAE,GAAG,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,CAAA;AACzF,IAAA,KAAA,MAAW,CAAA,IAAK,EAAE,MAAA,EAAQ;AACxB,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AAAG,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACrD,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AAAG,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AAAA,IACvD;AACA,IAAA,OAAO,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAG,IAAA,GAAO,IAAA,EAAM,CAAA,EAAG,IAAA,GAAO,IAAA,EAAK;AAAA,EAC5D;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC/B,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAA;AAC/D,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,OAAA,GAAU,CAAA,CAAE,OAAO,IAAA,EAAM,CAAA,EAAG,MAAM,MAAA,GAAS,CAAA,CAAE,OAAO,GAAA,EAAI;AAAA,EACtF;AACA,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAE;AAC1C;AAEA,SAAS,aAAA,CAAc,GAA6B,CAAA,EAA6B;AAC/E,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC3B,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC3B,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAC5B,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAC5B,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AACtB;AAEA,SAAS,YAAA,CAAa,CAAA,EAAe,CAAA,EAAW,CAAA,EAAoB;AAClE,EAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,EAAA,OAAO,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,KAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA,IAAK,EAAA,CAAG,CAAA,GAAI,CAAA,IAAK,GAAG,CAAA,GAAI,CAAA;AAClE;AAEA,SAAS,aAAa,MAAA,EAA4C;AAChE,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAChC,EAAA,IAAI,CAAA,GAAI,CAAA,EAAA,EAAK,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA;AACvC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,IAAK,CAAA,GAAA,EAAM,MAAA,CAAO,CAAC,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,CAAC,EAAE,CAAC,CAAA,CAAA;AAC7E,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,WAAA,CACP,KACA,IAAA,EACA;AACA,EAAA,MAAM,CAAA,GAAI,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AACxC,EAAA,MAAM,CAAA,GAAI,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AACxC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AAC3D,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AAC5D,EAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG;AACpB,EAAA,MAAM,OAAO,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,YAAA;AACd,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,MAAM,KAAA,EAAO;AACpC,IAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,MAAM,KAAA,EAAO;AACpC,MAAA,IAAI,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA;AACpC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAI,EAAE,CAAA;AACrC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAI,EAAE,CAAA;AACrC,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,MAAA,EAAQ,EAAA,EAAA,EAAM;AAClC,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,MAAA,EAAQ,EAAA,EAAA,EAAM;AAClC,UAAA,MAAM,CAAA,GAAA,CAAA,CAAM,EAAA,GAAK,EAAA,IAAM,CAAA,IAAK,KAAK,EAAA,CAAA,IAAO,CAAA;AACxC,UAAA,CAAA,IAAK,IAAA,CAAK,KAAK,CAAC,CAAA;AAAG,UAAA,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AAAG,UAAA,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AAAG,UAAA,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACrF,UAAA,CAAA,EAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAAG,MAAA,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAAG,MAAA,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAAG,MAAA,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AACzF,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,MAAA,EAAQ,EAAA,EAAA,EAAM;AAClC,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,MAAA,EAAQ,EAAA,EAAA,EAAM;AAClC,UAAA,MAAM,CAAA,GAAA,CAAA,CAAM,EAAA,GAAK,EAAA,IAAM,CAAA,IAAK,KAAK,EAAA,CAAA,IAAO,CAAA;AACxC,UAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AAAG,UAAA,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AAAG,UAAA,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AAAG,UAAA,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AAAA,QACnF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAC7B;AC9jCA,IAAM,kBAAA,GAAqB,cAAkC,IAAI,CAAA;AACjE,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAAkC;AACjE,EAAA,MAAM,IAAA,GAAO,WAAW,kBAAkB,CAAA;AAC1C,EAAA,OAAO,IAAA,GAAO,YAAA,CAAa,QAAA,EAAU,IAAI,CAAA,GAAI,IAAA;AAC/C;AASA,IAAI,sBAAA,GAAyB,KAAA;AAC7B,SAAS,6BAAA,GAAgC;AACvC,EAAA,IAAI,sBAAA,EAAwB;AAC5B,EAAA,IAAI,OAAO,sBAAsB,WAAA,EAAa;AAC9C,EAAA,sBAAA,GAAyB,IAAA;AACzB,EAAA,MAAM,IAAA,GAAO,kBAAkB,SAAA,CAAU,UAAA;AACzC,EAAA,iBAAA,CAAkB,SAAA,CAAU,UAAA,GAAa,SAAS,iBAAA,CAEhD,MACA,KAAA,EACA;AACA,IAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,QAAA,IAAY,SAAS,oBAAA,EAAsB;AAE1E,MAAA,KAAA,GAAQ,EAAE,GAAI,KAAA,IAAS,EAAC,EAAI,SAAS,IAAA,EAAK;AAAA,IAC5C;AACA,IAAA,OAAQ,IAAA,CAAa,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,OAAA,CAAQ,KAAK,mEAAmE,CAAA;AAClF;AAEA,IAAM,iBAAA,GAAoB,EAAA;AAC1B,SAAS,iBAAiB,CAAA,EAAW;AACnC,EAAA,OAAO,CAAA,CAAE,MAAA,GAAS,iBAAA,GAAoB,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,iBAAA,GAAoB,CAAC,CAAC,CAAA,MAAA,CAAA,GAAM,CAAA;AAClF;AAMA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAU,6BAAoB,SAAA,EAAW;AAC5E,EAAS,QAAA,CAAA,mBAAA,CAAoB,SAAA,GAC3B,CAAA,6BAAA,EAAyC,QAAA,CAAA,OAAO,CAAA,yBAAA,CAAA;AACpD;AAyBA,IAAM,UAAA,GAAa,mCAAA;AAgBnB,IAAI,OAAA,GAA+B,IAAA;AACnC,IAAI,SAAA,GAAY,CAAA;AAKT,SAAS,cAAc,IAAA,EAAwC;AACpE,EAAA,MAAM,QAAQ,EAAE,SAAA;AAChB,EAAA,OAAA,GAAU,EAAE,OAAO,IAAA,EAAK;AACxB,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,EAAsB;AAC3B,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,MAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,UAAA,EAAY,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,IACrF;AAAA,GACF;AACF;AAEe,SAAR,OAAA,GAA2B;AAQhC,EAAA,MAAM,WAAA,GAAcC,OAAwC,MAAS,CAAA;AACrE,EAAA,IAAI,WAAA,CAAY,YAAY,MAAA,EAAW;AACrC,IAAA,WAAA,CAAY,OAAA,GAAU,OAAA;AAAA,EACxB;AACA,EAAAC,UAAU,MAAM;AAId,IAAA,IAAI,WAAA,CAAY,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,YAAY,OAAA,EAAS;AACnE,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,CAAC,MAAM,OAAO,CAAA,GAAIC,SAAgC,WAAA,CAAY,OAAA,EAAS,QAAQ,IAAI,CAAA;AAGzF,EAAAD,UAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,YAAY,OAAA,EAAS,KAAA;AACrC,IAAA,IAAI,WAAW,IAAA,EAAM;AACrB,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAa;AAC5B,MAAA,MAAM,SAAU,CAAA,CAAgC,MAAA;AAChD,MAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,KAAA,KAAU,OAAA,EAAS;AACzC,MAAA,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACd,QAAA,IAAI,IAAA,EAAM,GAAA,IAAO,IAAA,CAAK,GAAA,KAAQ,MAAA,CAAO,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AAC7E,UAAA,GAAA,CAAI,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,QAC9B;AACA,QAAA,OAAO,MAAA,CAAO,IAAA;AAAA,MAChB,CAAC,CAAA;AAAA,IACH,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,OAAO,CAAA;AAC3C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,UAAA,EAAY,OAAO,CAAA;AAAA,EAC7D,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,SAAAA,CAAU,MAAM,MAAM;AACpB,IAAA,IAAI,IAAA,EAAM,KAAK,UAAA,CAAW,OAAO,GAAG,GAAA,CAAI,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,EAElE,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAY,IAAA,EAAM,QAAA,GAAW,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA,GAAI,UAAA;AAErE,EAAA,MAAM,OAAA,GAAUD,OAAyB,IAAI,CAAA;AAC7C,EAAA,MAAM,OAAA,GAAUA,OAAuB,IAAI,CAAA;AAG3C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIE,SAAgC,IAAI,CAAA;AAC9E,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAIlD,EAAA,MAAM,YAAA,GAAeF,OAAO,CAAC,CAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAM;AAChD,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,YAAA,CAAa,OAAA,GAAU,CAAA;AACvB,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA;AAKA,EAAA,MAAM,cAAA,GAAiB,CAAC,EAAA,KAAoB;AAC1C,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,iBAAiB,CAAA;AAC5C,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO,gBAAA,EAAiB,KAAM,OAAA,CAAQ,OAAA,CAAQ,OAAA;AAAA,EAChD,CAAA;AAIA,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,eAAA,GAAkB,MAAM,SAAA,EAAU;AACxC,IAAA,MAAM,YAAA,GAAe,MAAM,SAAA,EAAU;AACrC,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,SAAA,EAAU;AAAA,IACpC,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,eAAe,CAAA;AAClD,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,YAAY,CAAA;AAC5C,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,eAAe,CAAA;AACrD,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,YAAY,CAAA;AAC/C,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAC7C,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAe;AACjC,IAAA,MAAM,GAAA,GAAA,CAAO,KAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA,EAAI,WAAA,EAAY;AAC3D,IAAA,MAAM,OACJ,GAAA,KAAQ,KAAA,GAAQ,KAAA,GACd,GAAA,KAAQ,QAAQ,KAAA,GAChB,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,GAAI,UAC5E,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,OAAO,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA,EAAO,KAAK,EAAE,QAAA,CAAS,GAAG,IAAI,IAAA,GACjG,MAAA;AACJ,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAI,GAAA,KAAQ,KAAA,EAAO,aAAA,CAAM,KAAA,CAAM,qEAAqE,CAAA;AAAA,WAC/F,aAAA,CAAM,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAA,IAAO,SAAS,CAAA,CAAE,CAAA;AAC9D,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AAIpC,IAAA,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACd,MAAA,IAAI,MAAM,GAAA,EAAK,UAAA,CAAW,OAAO,CAAA,IAAK,IAAA,CAAK,QAAQ,GAAA,EAAK;AACtD,QAAA,GAAA,CAAI,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,MAC9B;AACA,MAAA,OAAO,EAAE,GAAA,EAAK,QAAA,EAAU,IAAA,CAAK,MAAM,IAAA,EAAK;AAAA,IAC1C,CAAC,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAA2C;AAC7D,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC/B,IAAA,IAAI,IAAA,aAAiB,IAAI,CAAA;AACzB,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAAA,EAC/C,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAuB;AACzC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,SAAA,EAAU;AACV,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,YAAA,CAAa,KAAA,GAAQ,CAAC,CAAA;AACrC,IAAA,IAAI,IAAA,aAAiB,IAAI,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,OAAA,mBACJE,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gFAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAO,gHAAA;AAAA,QACP,QAAA,EAAU,UAAA;AAAA,QACV,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACAD,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,UAAA;AAAA,QACT,SAAA,EAAU,yHAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC9F,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,oUAAA,EAAqU,CAAA,EAC5X,CAAA;AAAA,UAAM;AAAA;AAAA;AAAA,KAER;AAAA,oBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAiC,QAAA,EAAA,kCAAA,EAAuB,CAAA;AAAA,IACvE,IAAA,EAAM,QAAA,oBACLD,IAAAA,CAAAE,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,sBAC3CA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4DAA2D,KAAA,EAAO,IAAA,CAAK,QAAA,EAAW,QAAA,EAAA,IAAA,CAAK,QAAA,EAAS;AAAA,KAAA,EAClH,CAAA;AAAA,oBAIFA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,gBAAA,EAAkB,WAAU,yCAAA,EAA0C;AAAA,GAAA,EAClF,CAAA;AAGF,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAA,mBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EAA0B,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC1G,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,8PAAA,EAA+P,CAAA,EACtT,CAAA;AAAA,sBACAD,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA;AAAA,QAAA,6BAAA;AAAA,wBAA2BC,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,UAAA,EAAY,SAAA,EAAU,iCAAgC,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,QAAS;AAAA,OAAA,EAAC,CAAA;AAAA,sBACzJD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sEAAA,EAAuE,QAAA,EAAA,mBAAA,EAAiB,CAAA;AAAA,wBACrGD,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA;AAAA,0BAAAA,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,YAAO;AAAA,WAAA,EAA6B,CAAA;AAAA,0BACtFD,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,YAAO,wCAAA;AAAA,4BAAiCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAY,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,YAAO;AAAA,WAAA,EAAU,CAAA;AAAA,0BACjJD,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,4CAAA,EAA0C,CAAA;AAAA,YAAO,8BAAA;AAAA,4BAAuBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAY,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,YAAO;AAAA,WAAA,EAAU,CAAA;AAAA,0BACnLD,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,4CAAA,EAA0C,CAAA;AAAA,YAAO;AAAA,WAAA,EAAgB;AAAA,SAAA,EACjH,CAAA;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yCAAwC,QAAA,EAAA,mEAAA,EAAiE;AAAA,OAAA,EACxH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,IAAc,CAAC,KAAK,GAAA,EAAK;AACvC,IAAA,IAAA,mBAAOA,IAAC,eAAA,EAAA,EAAgB,QAAA,EAAU,KAAK,QAAA,EAAU,OAAA,EAAS,KAAK,iBAAA,EAAmB,CAAA;AAAA,EACpF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,KAAA,EAAO;AAC9B,IAAA,IAAA,mBAAOA,GAAAA,CAAC,QAAA,EAAA,EAAwB,GAAA,EAAK,IAAA,CAAK,KAAK,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,UAAA,EAAY,KAAK,UAAA,EAAY,OAAA,EAAS,IAAA,CAAK,OAAA,EAAA,EAA7F,KAAK,GAAiG,CAAA;AAAA,EAC9H,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,IAAA,EAAM;AAC7B,IAAA,IAAA,mBAAOA,GAAAA,CAAC,SAAA,EAAA,EAAyB,GAAA,EAAK,IAAA,CAAK,KAAK,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,UAAA,EAAY,KAAK,UAAA,EAAY,OAAA,EAAS,IAAA,CAAK,OAAA,EAAA,EAA7F,KAAK,GAAiG,CAAA;AAAA,EAC/H,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,IAAA,IAAA,mBAAOA,GAAAA,CAAC,UAAA,EAAA,EAA0B,GAAA,EAAK,IAAA,CAAK,KAAK,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,UAAA,EAAY,KAAK,UAAA,EAAY,OAAA,EAAS,IAAA,CAAK,OAAA,EAAA,EAA7F,KAAK,GAAiG,CAAA;AAAA,EAChI,CAAA,MAAO;AACL,IAAA,IAAA,mBAAOA,GAAAA,CAAC,QAAA,EAAA,EAAwB,GAAA,EAAK,IAAA,CAAK,KAAK,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,UAAA,EAAY,KAAK,UAAA,EAAY,OAAA,EAAS,IAAA,CAAK,OAAA,EAAA,EAA7F,KAAK,GAAiG,CAAA;AAAA,EAC9H;AAEA,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,+BAAA;AAAA,MACV,GAAA,EAAK,OAAA;AAAA,MACL,WAAA,EAAa,CAAC,CAAA,KAAM;AAGlB,QAAA,IAAI,CAAC,CAAA,CAAE,YAAA,EAAc,KAAA,EAAO,QAAA,GAAW,OAAO,CAAA,EAAG;AAEjD,QAAA,IAAI,CAAC,cAAA,CAAe,CAAA,CAAE,aAA4B,CAAA,EAAG;AACrD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,YAAA,CAAa,OAAA,EAAA;AACb,QAAA,IAAI,CAAC,UAAA,EAAY,aAAA,CAAc,IAAI,CAAA;AAAA,MACrC,CAAA;AAAA,MACA,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,IAAI,CAAC,CAAA,CAAE,YAAA,EAAc,KAAA,EAAO,QAAA,GAAW,OAAO,CAAA,EAAG;AACjD,QAAA,IAAI,CAAC,cAAA,CAAe,CAAA,CAAE,aAA4B,CAAA,EAAG;AACrD,QAAA,CAAA,CAAE,cAAA,EAAe;AAAA,MACnB,CAAA;AAAA,MACA,aAAa,MAAM;AACjB,QAAA,IAAI,YAAA,CAAa,OAAA,GAAU,CAAA,EAAG,YAAA,CAAa,OAAA,EAAA;AAC3C,QAAA,IAAI,YAAA,CAAa,OAAA,KAAY,CAAA,EAAG,aAAA,CAAc,KAAK,CAAA;AAAA,MACrD,CAAA;AAAA,MACA,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,QAAA,IAAI,CAAC,cAAA,CAAe,CAAA,CAAE,aAA4B,CAAA,EAAG;AACnD,UAAA,SAAA,EAAU;AACV,UAAA;AAAA,QACF;AACA,QAAA,UAAA,CAAW,CAAC,CAAA;AAAA,MACd,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,CAAA,EAAG,SAAS,CAAA,UAAA,CAAA,EAAc,CAAA;AAAA,wBAC9CA,GAAAA,CAAC,QAAA,EAAA,EAAS,GAAA,EAAI,SAAA,EAAU,CAAA;AAAA,QACvB,OAAA;AAAA,wBACDA,GAAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,KAAA,EAAO,aAAA,EAClC,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAkB,gBAAK,CAAA,EACxC,CAAA;AAAA,QACC,UAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kIAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EAA4E,QAAA,EAAA,cAAA,EAE3F,CAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ;AAEA,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAU,OAAA,EAAQ,EAA2C;AACtF,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EAAuC,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,CAAA,EACvH,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,YAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,aAAA,EAAc,KAAA,EAAM,CAAA;AAAA,wBACnDA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B,eAAc,OAAA,EAAQ;AAAA,OAAA,EAC3D,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EAAiE,qBAAW,iBAAA,EAAkB,CAAA;AAAA,sBAC7GA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAA2C,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EACrE,CAAA;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAsD,KAAA,EAAO,EAAE,SAAA,EAAW,uCAAA,IAA2C,CAAA,EACtI,CAAA;AAAA,oBACAA,GAAAA,CAAC,OAAA,EAAA,EAAO,QAAA,EAAA,CAAA,qGAAA,CAAA,EAAwG;AAAA,GAAA,EAClH,CAAA;AAEJ;AASA,IAAM,YAAA,GAAe,CAAC,EAAA,EAAI,EAAA,EAAI,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAW1D,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAyDvB,SAAS,SAAS,EAAE,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,SAAQ,EAAkB;AACvE,EAAA,MAAM,SAAA,GAAYJ,OAA0B,IAAI,CAAA;AAChD,EAAA,MAAM,YAAA,GAAeA,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,YAAA,GAAeA,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIE,SAA2C,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,CAAC,CAAA;AAClC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,CAAC,CAAA;AAC9C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,CAAC,CAAA;AAIpC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,IAAI,CAAA;AAE3C,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAS,QAAA,CAAA,WAAA,CAAY,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA,GAAA,KAAO;AAC5C,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,MAAA,CAAO,GAAG,CAAA;AACV,MAAA,aAAA,CAAc,IAAI,QAAQ,CAAA;AAC1B,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AACb,MAAA,IAAI,CAAC,SAAA,EAAW;AAAE,QAAA,aAAA,CAAM,MAAM,oBAAoB,CAAA;AAAG,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAAG;AAAA,IAC1E,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAMR,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,OAAA,IAAW,CAAC,aAAa,OAAA,EAAS;AAC/C,IAAA,MAAM,MAAM,MAAM;AAChB,MAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAC3B,MAAA,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK;AAC1B,QAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,WAAA,IAAe,GAAA;AACxD,QAAA,MAAM,WAAW,CAAA,CAAE,WAAA,CAAY,EAAE,KAAA,EAAO,GAAG,CAAA;AAC3C,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAA,CAAK,UAAA,GAAa,EAAA,IAAM,QAAA,CAAS,KAAA,EAAO,GAAG,CAAA,EAAG,CAAC,CAAA;AAC1E,QAAA,QAAA,CAAS,CAAA,IAAA,KAAS,KAAK,GAAA,CAAI,IAAA,GAAO,IAAI,CAAA,GAAI,IAAA,GAAQ,OAAO,IAAK,CAAA;AAAA,MAChE,CAAC,CAAA;AAAA,IACH,CAAA;AACA,IAAA,GAAA,EAAI;AACJ,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,GAAG,CAAA;AACjC,IAAA,EAAA,CAAG,OAAA,CAAQ,aAAa,OAAO,CAAA;AAC/B,IAAA,OAAO,MAAM,GAAG,UAAA,EAAW;AAAA,EAC7B,CAAA,EAAG,CAAC,GAAA,EAAK,IAAA,EAAM,OAAO,CAAC,CAAA;AAEvB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,SAAA,CAAU,OAAA,EAAS;AAChC,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,IAAA,GAA8D,IAAA;AAClE,IAAA,IAAI,SAAA,GAAuC,IAAA;AAC3C,IAAA,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK;AAC1B,MAAA,IAAI,SAAA,IAAa,CAAC,SAAA,CAAU,OAAA,EAAS;AACrC,MAAA,MAAM,QAAA,GAAW,CAAA,CAAE,WAAA,CAAY,EAAE,OAAO,CAAA;AACxC,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,MAAA,CAAO,QAAQ,QAAA,CAAS,KAAA;AACxB,MAAA,MAAA,CAAO,SAAS,QAAA,CAAS,MAAA;AAKzB,MAAA,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA,EAAA,CAAA;AACtC,MAAA,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,EAAA,CAAA;AACxC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,MAAA,IAAA,GAAO,EAAE,MAAA,CAAO,EAAE,QAAQ,aAAA,EAAe,GAAA,EAAK,UAAU,CAAA;AACxD,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAI3B,MAAA,MAAM,SAAS,YAAA,CAAa,OAAA;AAC5B,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,eAAA,EAAgB;AACvB,QAAA,MAAA,CAAO,MAAM,WAAA,CAAY,sBAAA,EAAwB,MAAA,CAAO,QAAA,CAAS,KAAK,CAAC,CAAA;AACvE,QAAA,SAAA,GAAY,IAAa,QAAA,CAAA,SAAA,CAAU;AAAA,UACjC,iBAAA,EAAmB,EAAE,iBAAA,EAAkB;AAAA,UACvC,SAAA,EAAW,MAAA;AAAA,UACX;AAAA,SACD,CAAA;AACD,QAAA,SAAA,CAAU,MAAA,EAAO,CAAE,IAAA,CAAK,MAAM;AAC5B,UAAA,IAAI,SAAA,EAAW;AACf,UAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,UAAA,GAAA,CAAI,SAAA,GAAY,cAAA;AAChB,UAAA,MAAA,CAAO,OAAO,GAAG,CAAA;AAAA,QACnB,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACnB;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,IAAA,EAAM,MAAA,EAAO;AACb,MAAA,SAAA,EAAW,MAAA,EAAO;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,IAAA,EAAM,KAAK,CAAC,CAAA;AAIrB,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,MAAM,YAAA,CAAa,OAAA,EAAS,SAAA,CAAU,OAAO,WAAW,CAAA;AACnE,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,EAAE,CAAA;AACvC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,WAAA,EAAa,EAAE,CAAA;AAAA,EACzD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,EAAA,EAAI,QAAQ,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AAAE,MAAA,aAAA,CAAM,MAAM,uBAAuB,CAAA;AAAG,MAAA;AAAA,IAAQ;AAC1D,IAAA,MAAM,WAA8B,EAAC;AACrC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,UAAA,EAAY,CAAA,EAAA,EAAK;AACpC,MAAA,QAAA,CAAS,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAK,CAAA,CAAA,KAAK;AACrC,QAAA,MAAM,KAAK,CAAA,CAAE,WAAA,CAAY,EAAE,KAAA,EAAO,GAAG,CAAA;AACrC,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACzC,QAAA,CAAA,CAAE,QAAQ,EAAA,CAAG,KAAA;AAAO,QAAA,CAAA,CAAE,SAAS,EAAA,CAAG,MAAA;AAClC,QAAA,OAAO,EAAE,MAAA,CAAO,EAAE,QAAQ,CAAA,EAAG,aAAA,EAAe,EAAE,UAAA,CAAW,IAAI,GAAI,QAAA,EAAU,EAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,KAAK,MAAM,CAAA,CAAE,WAAW,CAAA;AAAA,MACnH,CAAC,CAAC,CAAA;AAAA,IACJ;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAA,MAAA,KAAU;AACnC,MAAA,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,CAAA,mBAAA,EAAsB,QAAQ,CAAA,uGAAA,CAAyG,CAAA;AAC1J,MAAA,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,UAAA,EAAa,GAAG,CAAA,GAAA,CAAK,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AACpE,MAAA,GAAA,CAAI,QAAA,CAAS,MAAM,gBAAgB,CAAA;AACnC,MAAA,GAAA,CAAI,SAAS,KAAA,EAAM;AACnB,MAAA,UAAA,CAAW,MAAM;AAAE,QAAA,GAAA,CAAI,KAAA,EAAM;AAAG,QAAA,GAAA,CAAI,KAAA,EAAM;AAAA,MAAG,GAAG,GAAG,CAAA;AAAA,IACrD,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,IAAA,CAAA,CAAE,KAAA,EAAM;AAAA,EACV,CAAA;AAIA,EAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,IAAI,CAAA;AAKtC,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAwC;AAC3D,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAI,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,EAAS;AAC5B,IAAA,MAAM,KAAK,YAAA,CAAa,OAAA;AACxB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,KAAA,GAAQ,GAAG,SAAA,IAAa,CAAA;AAC9B,IAAA,MAAM,WAAW,EAAA,CAAG,SAAA,GAAY,EAAA,CAAG,YAAA,IAAgB,GAAG,YAAA,GAAe,CAAA;AACrE,IAAA,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,QAAA,IAAY,OAAO,UAAA,EAAY;AACjD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,CAAQ,OAAK,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,CAAA,GAAI,CAAC,CAAC,CAAA;AAIxC,MAAA,qBAAA,CAAsB,MAAM;AAAE,QAAA,IAAI,YAAA,CAAa,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,SAAA,GAAY,CAAA;AAAA,MAAG,CAAC,CAAA;AAAA,IAC/F,WAAW,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,KAAA,IAAS,OAAO,CAAA,EAAG;AAC5C,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,CAAQ,OAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAC/B,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,IAAI,aAAa,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,SAAA,GAAY,aAAa,OAAA,CAAQ,YAAA;AAAA,MAClF,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AACA,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAA2C;AAC5D,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,MAAM,GAAA,GAAA,CAAO,QAAA,CAAS,aAAA,EAAe,OAAA,IAAW,IAAI,WAAA,EAAY;AAChE,IAAA,IAAI,QAAQ,OAAA,IAAW,GAAA,KAAQ,UAAA,IAAe,QAAA,CAAS,eAA+B,iBAAA,EAAmB;AACzG,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,UAAA,IAAc,CAAA,CAAE,QAAQ,YAAA,EAAc;AAClD,MAAA,IAAI,OAAO,UAAA,EAAY;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,OAAA,CAAQ,OAAK,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,MAAG;AAAA,IAC1F,WAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,CAAA,CAAE,QAAQ,WAAA,EAAa;AACtD,MAAA,IAAI,OAAO,CAAA,EAAG;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,OAAA,CAAQ,OAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,MAAG;AAAA,IACxE,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,MAAA,EAAQ;AAC3B,MAAA,CAAA,CAAE,cAAA,EAAe;AAAG,MAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,KAAA,EAAO;AAC1B,MAAA,CAAA,CAAE,cAAA,EAAe;AAAG,MAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,IACxC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,6FAAA;AAEZ,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAA,CAAA,KAAK,KAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA,EAAG,SAAA,EAAU,yEACtF,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAc,IAAA,EAAK,MAAA,EAAO,SAAQ,WAAA,EAAY,MAAA,EAAO,gBAAe,WAAA,EAAa,CAAA,EAAG,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAAE,6BAAA,EAA8B,GAAE,CAAA,EAC1L,CAAA;AAAA,sBACAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QAAK,KAAA;AAAA,QAAI;AAAA,OAAA,EAAW,CAAA;AAAA,sBAC9EC,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,MAAM,OAAA,CAAQ,OAAK,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG,QAAA,EAAU,QAAQ,UAAA,EAAY,SAAA,EAAU,yEACxG,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAc,IAAA,EAAK,MAAA,EAAO,SAAQ,WAAA,EAAY,MAAA,EAAO,gBAAe,WAAA,EAAa,CAAA,EAAG,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAAE,2BAAA,EAA4B,GAAE,CAAA,EACxL,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,sBAC3CA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,SAAS,MAAM;AAAE,YAAA,UAAA,CAAW,KAAK,CAAA;AAAG,YAAA,QAAA,CAAS,CAAA,CAAA,KAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAA,CAAO,CAAA,GAAI,IAAA,IAAQ,GAAG,CAAA,GAAI,GAAG,CAAC,CAAA;AAAA,UAAG,CAAA;AAAA,UACtG,SAAA,EAAW,GAAA;AAAA,UACZ,QAAA,EAAA;AAAA;AAAA,OAAC;AAAA,sBACFD,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,OAAA,GAAU,KAAA,GAAS,YAAA,CAAa,SAAS,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA,GAAI,QAAA;AAAA,UACrG,UAAU,CAAA,CAAA,KAAK;AACb,YAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,KAAA;AACnB,YAAA,IAAI,MAAM,KAAA,EAAO;AAAE,cAAA,UAAA,CAAW,IAAI,CAAA;AAAG,cAAA;AAAA,YAAQ;AAC7C,YAAA,IAAI,MAAM,QAAA,EAAU;AAAE,cAAA,UAAA,CAAW,KAAK,CAAA;AAAG,cAAA,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,GAAI,GAAG,CAAA;AAAA,YAAG;AAAA,UACtE,CAAA;AAAA,UACA,SAAA,EAAU,kJAAA;AAAA,UACV,KAAA,EAAM,MAAA;AAAA,UAEN,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,YACtB,CAAC,OAAA,IAAW,CAAC,YAAA,CAAa,SAAS,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAC,CAAA,oBACzDD,IAAAA,CAAC,QAAA,EAAA,EAAO,OAAM,QAAA,EAAU,QAAA,EAAA;AAAA,cAAA,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAG,CAAA;AAAA,cAAE;AAAA,aAAA,EAAC,CAAA;AAAA,YAElD,aAAa,GAAA,CAAI,CAAA,CAAA,qBAAKA,IAAAA,CAAC,QAAA,EAAA,EAAe,OAAO,CAAA,EAAI,QAAA,EAAA;AAAA,cAAA,CAAA;AAAA,cAAE;AAAA,aAAA,EAAA,EAAhB,CAAiB,CAAS;AAAA;AAAA;AAAA,OAChE;AAAA,sBACAC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,SAAS,MAAM;AAAE,YAAA,UAAA,CAAW,KAAK,CAAA;AAAG,YAAA,QAAA,CAAS,CAAA,CAAA,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAA,CAAO,CAAA,GAAI,IAAA,IAAQ,GAAG,CAAA,GAAI,GAAG,CAAC,CAAA;AAAA,UAAG,CAAA;AAAA,UACpG,SAAA,EAAW,GAAA;AAAA,UACZ,QAAA,EAAA;AAAA;AAAA,OAAC;AAAA,sBACFA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAW,GAAA,IAAO,OAAA,GAAU,4BAAA,GAA+B,EAAA,CAAA;AAAA,UAC3D,KAAA,EAAM,2EAAA;AAAA,UACP,QAAA,EAAA;AAAA;AAAA,OAAG;AAAA,sBACJA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,sBAC3CD,IAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,WAAA,EAAa,WAAW,GAAA,EACvC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,0lBAAA,EAA2lB,CAAA,EAAE,CAAA;AAAA,QAAM;AAAA,OAAA,EAE/vB,CAAA;AAAA,sBACAD,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,UAAA,IAAc,qBAAA,EAAuB,WAAW,GAAA,EAC/D,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,0GAAA,EAA2G,CAAA,EAAE,CAAA;AAAA,QAAM;AAAA,OAAA,EAE/Q,CAAA;AAAA,MACC,2BACCD,IAAAA,CAAC,YAAO,OAAA,EAAS,OAAA,EAAS,WAAW,GAAA,EACnC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,wPAAA,EAAyP,CAAA,EAAE,CAAA;AAAA,QAAM;AAAA,OAAA,EAE7Z;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,SAAA,EAAU,+CAAA;AAAA,QAKV,QAAA,EAAU,CAAA;AAAA,QACV,OAAA,EAAS,WAAA;AAAA,QACT,SAAA,EAAW,SAAA;AAAA,QAEV,QAAA,EAAA,OAAA,mBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EAAgE,QAAA,EAAA,gBAAA,EAAc,CAAA,mBAE7FD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,WAAO,QAAA,EAAA,cAAA,EAAe,CAAA;AAAA,0BACvBD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,QAAA,EAAA,EAAO,GAAA,EAAK,SAAA,EAAW,WAAU,eAAA,EAAgB,CAAA;AAAA,4BAClDA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,YAAA;AAAA,gBACL,SAAA,EAAU,uBAAA;AAAA,gBACV,eAAe,CAAA,CAAA,KAAK,CAAA,CAAE,aAAA,CAAc,SAAA,CAAU,IAAI,WAAW;AAAA;AAAA;AAC/D,WAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ;AAaA,IAAM,iBAAA,GAA8B;AAAA,EAClC,0GAAA;AAAA,EACA,gIAAA;AAAA,EACA;AACF,CAAA;AAYA,IAAM,iBAAA,GAA4C;AAAA,EAChD,CAAA,EAAG,MAAA;AAAA,EAAQ,IAAA,EAAM,MAAA;AAAA,EAAQ,EAAA,EAAI,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EAC7C,EAAA,EAAI,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EAAU,EAAA,EAAI,MAAA;AAAA,EAAQ,IAAA,EAAM,MAAA;AAAA,EAClD,CAAA,EAAG,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EAAS,CAAA,EAAG,MAAA;AAAA,EAAQ,IAAA,EAAM,MAAA;AAAA,EAC7C,EAAA,EAAI,MAAA;AAAA,EAAQ,EAAA,EAAI,MAAA;AAAA,EAAQ,IAAA,EAAM,MAAA;AAAA,EAAQ,CAAA,EAAG,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EAC3D,CAAA,EAAG,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EAAU,GAAA,EAAK,SAAA;AAAA,EAAW,OAAA,EAAS,SAAA;AAAA,EACxD,CAAA,EAAG,SAAA;AAAA,EAAW,OAAA,EAAS,SAAA;AAAA,EAAW,EAAA,EAAI,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EACxD,EAAA,EAAI,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EAAU,EAAA,EAAI,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EACpD,CAAA,EAAG,SAAA;AAAA,EAAW,OAAA,EAAS,SAAA;AAAA,EAAW,EAAA,EAAI,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EACtD,GAAA,EAAK,SAAA;AAAA,EAAW,OAAA,EAAS,SAAA;AAAA,EAAW,SAAA,EAAW,SAAA;AAAA,EAC/C,CAAA,EAAG,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EAAU,CAAA,EAAG,KAAA;AAAA,EAAO,GAAA,EAAK,KAAA;AAAA,EAC9C,EAAA,EAAI,SAAA;AAAA,EAAW,OAAA,EAAS,SAAA;AAAA,EAAW,CAAA,EAAG,OAAA;AAAA,EAAS,EAAA,EAAI,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EAAS,IAAA,EAAM,MAAA;AAAA,EAClF,CAAA,EAAG,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EAAS,CAAA,EAAG,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EAAU,EAAA,EAAI,OAAA;AAAA,EAAS,KAAA,EAAO;AACjF,CAAA;AAEA,IAAM,YAAA,GAAe,wJAAA;AAErB,SAAS,SAAS,EAAE,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,SAAQ,EAAkB;AACvE,EAAA,MAAM,YAAA,GAAeJ,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,SAAA,GAAYA,OAAY,IAAI,CAAA;AAClC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIE,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAAqB,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,IAAI,CAAA;AAgB7C,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAuD,MAAM,CAAA;AACnG,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAI1E,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAqD,IAAI,CAAA;AAMvG,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAG5E,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,SAAS,EAAE,CAAA;AAK7D,EAAA,MAAM,cAAA,GAAiBF,OAAO,WAAW,CAAA;AACzC,EAAA,MAAM,mBAAA,GAAsBA,OAAO,gBAAgB,CAAA;AACnD,EAAAC,UAAU,MAAM;AAAE,IAAA,cAAA,CAAe,OAAA,GAAU,WAAA;AAAA,EAAa,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AACxE,EAAAA,UAAU,MAAM;AAAE,IAAA,mBAAA,CAAoB,OAAA,GAAU,gBAAA;AAAA,EAAkB,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAGvF,EAAA,MAAM,gBAAA,GAAmBD,OAA4B,IAAI,CAAA;AAGzD,EAAA,MAAM,eAAA,GAAkBA,OAA4B,IAAI,CAAA;AAExD,EAAA,MAAM,cAAA,GAAiBA,OAA4B,IAAI,CAAA;AAKvD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIE,SAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC1D,EAAA,MAAM,UAAA,GAAaF,OAAO,EAAE,CAAA;AAC5B,EAAA,MAAM,WAAA,GAAcA,OAAyB,IAAI,CAAA;AACjD,EAAA,MAAM,OAAA,GAAUA,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAaA,OAkCT,IAAI,CAAA;AAEd,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,MAAA,GAAc,IAAA;AAClB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,SAAA,CAAU,EAAE,CAAA;AAEZ,IAAA,CAAC,YAAY;AACX,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,OAAO,YAAY,CAAA;AACrC,QAAA,SAAA,GAAa,GAAA,CAAY,SAAA;AAAA,MAC3B,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,0CAA0C,CAAA;AACnD,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAA,IAAa,CAAC,YAAA,CAAa,OAAA,EAAS;AACxC,MAAA,IAAI;AAMF,QAAA,MAAM,IAAI,QAAc,CAAA,OAAA,KAAW;AACjC,UAAA,MAAM,WAAW,MAAM;AACrB,YAAA,MAAM,CAAA,GAAI,YAAA,CAAa,OAAA,EAAS,qBAAA,EAAsB;AACtD,YAAA,IAAI,KAAK,CAAA,CAAE,KAAA,GAAQ,KAAK,CAAA,CAAE,MAAA,GAAS,GAAG,OAAA,EAAQ;AAAA,uCACnB,QAAQ,CAAA;AAAA,UACrC,CAAA;AACA,UAAA,QAAA,EAAS;AAAA,QACX,CAAC,CAAA;AACD,QAAA,IAAI,SAAA,IAAa,CAAC,YAAA,CAAa,OAAA,EAAS;AAGxC,QAAA,IAAI,KAAA,GAAa,IAAA;AACjB,QAAA,IAAI;AAAE,UAAA,KAAA,GAAQ,MAAM;AAAA;AAAA,YAA0B;AAAA,WAAc;AAAA,QAAG,CAAA,CAAA,MAAQ;AAAA,QAAC;AACxE,QAAA,MAAM,UAAA,GAAa,OAAO,KAAA,IAAS,IAAA;AACnC,QAAA,MAAM,UAAA,GAAkB,EAAE,UAAA,EAAY,IAAA,EAAK;AAC3C,QAAA,IAAI,UAAA,EAAY,UAAA,CAAW,UAAA,GAAa,IAAI,WAAW,QAAQ,CAAA;AAC/D,QAAA,MAAA,GAAS,IAAI,SAAA,CAAU,YAAA,CAAa,OAAA,EAAS,UAAU,CAAA;AACvD,QAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAEpB,QAAA,MAAM,QAAA,GAAY,OAAO,MAAA,KAAW,WAAA,IAAgB,OAAe,4BAAA,IAC9D,iBAAA;AACL,QAAA,MAAM,MAAA,CAAO,KAAK,EAAE,GAAA,EAAK,OAAO,QAAA,EAAU,aAAA,EAAe,MAAM,CAAA;AAC/D,QAAA,IAAI,SAAA,EAAW;AAGf,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAc,MAAA,CAAO,SAAA,IAAY,IAAK,EAAC;AAC7C,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,YAAA,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,CAAA,MAAM;AAAA,cACvB,MAAM,CAAA,CAAE,IAAA;AAAA,cACR,WAAA,EAAa,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,IAAA;AAAA,cAChC,OAAO,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,GAAQ,KAAA,CAAA;AAAA,cAC/C,OAAA,EAAS;AAAA,cACT,CAAC,CAAA;AAAA,UACL;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAAC;AAGT,QAAA,MAAM,QAAQ,MAAM;AAClB,UAAA,IAAI;AACF,YAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,EAAS,qBAAA,EAAsB;AACzD,YAAA,IAAI,QAAQ,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AAC7C,cAAA,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,GAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,YAClE;AACA,YAAA,MAAM,MAAA,GAAS,OAAO,SAAA,IAAY;AAClC,YAAA,MAAM,MAAA,GAAS,OAAO,SAAA,IAAY;AAClC,YAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,cAAA,MAAA,CAAO,OAAA;AAAA,gBACL,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,gBAAG,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,gBAC7C,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,gBAAG,MAAA,CAAO,OAAO,MAAA,CAAO;AAAA,eAC/C;AAAA,YACF;AACA,YAAA,MAAA,CAAO,MAAA,IAAS;AAAA,UAClB,SAAS,GAAA,EAAK;AAEZ,YAAA,OAAA,CAAQ,IAAA,CAAK,8BAA8B,GAAG,CAAA;AAAA,UAChD;AAAA,QACF,CAAA;AACA,QAAA,KAAA,EAAM;AACN,QAAA,qBAAA,CAAsB,KAAK,CAAA;AAC3B,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB,SAAS,CAAA,EAAQ;AACf,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,CAAA,EAAG,WAAW,uBAAuB,CAAA;AAC9C,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,IAAI;AAAE,QAAA,MAAA,EAAQ,OAAA,IAAU;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AACpC,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAGR,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AAC1B,IAAA,MAAM,IAAI,UAAA,CAAW,MAAM,WAAA,CAAY,KAAK,GAAG,GAAI,CAAA;AACnD,IAAA,OAAO,MAAM,aAAa,CAAC,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAyDtB,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAM,CAAA,CAAE,UAAU,GAAA,GAAM,GAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAClE,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,OAAA,IAAW,KAAA,IAAS,CAAC,CAAA,EAAG;AAE5B,IAAA,MAAM,KAAA,GAAa,EAAE,QAAA,IAAW;AAChC,IAAA,MAAM,MAAA,GAAc,EAAE,SAAA,IAAY;AAClC,IAAA,MAAM,MAAA,GAAwC,EAAE,SAAA,IAAY;AAC5D,IAAA,IAAI,CAAC,SAAS,CAAC,MAAA,IAAU,CAAC,MAAA,IAAU,CAAC,aAAa,OAAA,EAAS;AAE3D,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,CAAQ,aAAA,IAAiB,OAAA,CAAQ,aAAA,CAAc,WAAA,CAAY,CAAA,CAAE,OAAO,CAAA;AACvF,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IACvB,CAAA;AAEA,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,QAAA,EAAS;AACT,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,IAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,0DAAA;AACxB,IAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,OAAO,CAAA;AAExC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,KAAK,CAAA;AACxE,IAAA,GAAA,CAAI,YAAA,CAAa,SAAS,uEAAuE,CAAA;AAIjG,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,MAAM,CAAA;AAC1E,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,QAAQ,CAAA;AAC9E,IAAA,MAAA,CAAO,YAAA,CAAa,MAAM,mBAAmB,CAAA;AAC7C,IAAA,MAAA,CAAO,YAAA,CAAa,WAAW,WAAW,CAAA;AAC1C,IAAA,MAAA,CAAO,YAAA,CAAa,QAAQ,GAAG,CAAA;AAC/B,IAAA,MAAA,CAAO,YAAA,CAAa,QAAQ,GAAG,CAAA;AAC/B,IAAA,MAAA,CAAO,YAAA,CAAa,eAAe,GAAG,CAAA;AACtC,IAAA,MAAA,CAAO,YAAA,CAAa,gBAAgB,GAAG,CAAA;AACvC,IAAA,MAAA,CAAO,YAAA,CAAa,UAAU,oBAAoB,CAAA;AAClD,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,MAAM,CAAA;AAC/E,IAAA,SAAA,CAAU,YAAA,CAAa,KAAK,uBAAuB,CAAA;AACnD,IAAA,SAAA,CAAU,YAAA,CAAa,QAAQ,SAAS,CAAA;AACxC,IAAA,MAAA,CAAO,YAAY,SAAS,CAAA;AAC5B,IAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AACvB,IAAA,GAAA,CAAI,YAAY,IAAI,CAAA;AACpB,IAAA,OAAA,CAAQ,YAAY,GAAG,CAAA;AAMvB,IAAA,MAAM,YAAY,MAAM;AACtB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,MAAM,CAAA;AACxE,MAAA,EAAA,CAAG,YAAA,CAAa,UAAU,SAAS,CAAA;AACnC,MAAA,EAAA,CAAG,YAAA,CAAa,gBAAgB,GAAG,CAAA;AACnC,MAAA,EAAA,CAAG,YAAA,CAAa,oBAAoB,KAAK,CAAA;AACzC,MAAA,EAAA,CAAG,YAAA,CAAa,WAAW,MAAM,CAAA;AACjC,MAAA,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AACnB,MAAA,GAAA,CAAI,YAAY,EAAE,CAAA;AAClB,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,YAAY,SAAA,EAAU;AAC5B,IAAA,MAAM,aAAa,SAAA,EAAU;AAK7B,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,MAAM,CAAA;AAC9E,IAAA,QAAA,CAAS,YAAA,CAAa,UAAU,SAAS,CAAA;AACzC,IAAA,QAAA,CAAS,YAAA,CAAa,gBAAgB,GAAG,CAAA;AACzC,IAAA,QAAA,CAAS,YAAA,CAAa,WAAW,MAAM,CAAA;AACvC,IAAA,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AACzB,IAAA,GAAA,CAAI,YAAY,QAAQ,CAAA;AACxB,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,MAAM,CAAA;AAC9E,IAAA,QAAA,CAAS,YAAA,CAAa,UAAU,SAAS,CAAA;AACzC,IAAA,QAAA,CAAS,YAAA,CAAa,gBAAgB,GAAG,CAAA;AACzC,IAAA,QAAA,CAAS,YAAA,CAAa,WAAW,MAAM,CAAA;AACvC,IAAA,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AACzB,IAAA,GAAA,CAAI,YAAY,QAAQ,CAAA;AAExB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,MAAM,CAAA;AAC5E,IAAA,MAAA,CAAO,YAAA,CAAa,UAAU,SAAS,CAAA;AACvC,IAAA,MAAA,CAAO,YAAA,CAAa,gBAAgB,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,YAAA,CAAa,kBAAkB,OAAO,CAAA;AAC7C,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU,MAAA;AACvB,IAAA,GAAA,CAAI,YAAY,MAAM,CAAA;AAKtB,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,MAAM,CAAA;AACjF,IAAA,WAAA,CAAY,YAAA,CAAa,UAAU,SAAS,CAAA;AAC5C,IAAA,WAAA,CAAY,YAAA,CAAa,gBAAgB,KAAK,CAAA;AAC9C,IAAA,WAAA,CAAY,YAAA,CAAa,kBAAkB,OAAO,CAAA;AAClD,IAAA,WAAA,CAAY,MAAM,OAAA,GAAU,MAAA;AAC5B,IAAA,GAAA,CAAI,YAAY,WAAW,CAAA;AAK3B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU,CAAA,kFAAA,CAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,4BAAA;AACd,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AACrD,IAAA,OAAA,CAAQ,YAAA,CAAa,SAAS,IAAI,CAAA;AAClC,IAAA,OAAA,CAAQ,YAAA,CAAa,UAAU,IAAI,CAAA;AACnC,IAAA,OAAA,CAAQ,YAAA,CAAa,WAAW,WAAW,CAAA;AAC3C,IAAA,OAAA,CAAQ,YAAA,CAAa,SAAS,gCAAgC,CAAA;AAC9D,IAAA,MAAA,CAAO,YAAY,OAAO,CAAA;AAC1B,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAiD;AACpE,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,GAAG,CAAA;AAC7C,MAAA,KAAA,CAAM,CAAC,CAAA;AACP,MAAA,CAAA,CAAE,MAAM,OAAA,GAAU,MAAA;AAClB,MAAA,OAAA,CAAQ,YAAY,CAAC,CAAA;AACrB,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,CAAC,CAAA,KAAM;AAC3C,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,MAAM,CAAA;AAChD,MAAA,CAAA,CAAE,YAAA,CAAa,KAAK,GAAG,CAAA;AAAI,MAAA,CAAA,CAAE,YAAA,CAAa,KAAK,GAAG,CAAA;AAClD,MAAA,CAAA,CAAE,YAAA,CAAa,SAAS,IAAI,CAAA;AAAG,MAAA,CAAA,CAAE,YAAA,CAAa,UAAU,IAAI,CAAA;AAC5D,MAAA,CAAA,CAAE,YAAA,CAAa,QAAQ,uBAAuB,CAAA;AAC9C,MAAA,CAAA,CAAE,YAAA,CAAa,UAAU,SAAS,CAAA;AAClC,MAAA,CAAA,CAAE,YAAA,CAAa,gBAAgB,KAAK,CAAA;AACpC,MAAA,CAAA,CAAE,YAAY,CAAC,CAAA;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,MAAM,qBAAA,GAAwB,WAAA,CAAY,CAAC,CAAA,KAAM;AAC/C,MAAA,MAAM,IAAA,GAAO,CAAC,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,KAAe;AAC/D,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,MAAM,CAAA;AACjD,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AAAG,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AACnE,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AAAG,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AACnE,QAAA,EAAA,CAAG,YAAA,CAAa,UAAU,SAAS,CAAA;AACnC,QAAA,EAAA,CAAG,YAAA,CAAa,gBAAgB,KAAK,CAAA;AACrC,QAAA,EAAA,CAAG,YAAA,CAAa,kBAAkB,OAAO,CAAA;AACzC,QAAA,OAAO,EAAA;AAAA,MACT,CAAA;AACA,MAAA,CAAA,CAAE,YAAY,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAE,CAAC,CAAA;AAChC,MAAA,CAAA,CAAE,YAAY,IAAA,CAAK,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IAClC,CAAC,CAAA;AAED,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,CAAA,KAAM;AACvC,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,SAAS,CAAA;AACtD,MAAA,IAAA,CAAK,YAAA,CAAa,UAAU,qBAAqB,CAAA;AACjD,MAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,uBAAuB,CAAA;AACjD,MAAA,IAAA,CAAK,YAAA,CAAa,UAAU,SAAS,CAAA;AACrC,MAAA,IAAA,CAAK,YAAA,CAAa,gBAAgB,KAAK,CAAA;AACvC,MAAA,IAAA,CAAK,YAAA,CAAa,mBAAmB,OAAO,CAAA;AAC5C,MAAA,CAAA,CAAE,YAAY,IAAI,CAAA;AAAA,IACpB,CAAC,CAAA;AAED,IAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,CAAC,CAAA,KAAM;AAC3C,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,SAAS,CAAA;AACtD,MAAA,IAAA,CAAK,YAAA,CAAa,UAAU,iBAAiB,CAAA;AAC7C,MAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,uBAAuB,CAAA;AACjD,MAAA,IAAA,CAAK,YAAA,CAAa,UAAU,SAAS,CAAA;AACrC,MAAA,IAAA,CAAK,YAAA,CAAa,gBAAgB,KAAK,CAAA;AACvC,MAAA,IAAA,CAAK,YAAA,CAAa,mBAAmB,OAAO,CAAA;AAC5C,MAAA,CAAA,CAAE,YAAY,IAAI,CAAA;AAAA,IACpB,CAAC,CAAA;AAED,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,CAAA,KAAM;AACvC,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,QAAQ,CAAA;AAClD,MAAA,CAAA,CAAE,YAAA,CAAa,MAAM,IAAI,CAAA;AAAG,MAAA,CAAA,CAAE,YAAA,CAAa,MAAM,IAAI,CAAA;AAAG,MAAA,CAAA,CAAE,YAAA,CAAa,KAAK,GAAG,CAAA;AAC/E,MAAA,CAAA,CAAE,YAAA,CAAa,QAAQ,uBAAuB,CAAA;AAC9C,MAAA,CAAA,CAAE,YAAA,CAAa,UAAU,SAAS,CAAA;AAClC,MAAA,CAAA,CAAE,YAAA,CAAa,gBAAgB,KAAK,CAAA;AACpC,MAAA,CAAA,CAAE,YAAY,CAAC,CAAA;AACf,MAAA,MAAM,IAAA,GAAO,CAAC,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,KAAe;AAC/D,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,MAAM,CAAA;AACjD,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AAAG,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AACnE,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AAAG,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AACnE,QAAA,EAAA,CAAG,YAAA,CAAa,UAAU,SAAS,CAAA;AACnC,QAAA,EAAA,CAAG,YAAA,CAAa,gBAAgB,KAAK,CAAA;AACrC,QAAA,EAAA,CAAG,YAAA,CAAa,kBAAkB,OAAO,CAAA;AACzC,QAAA,OAAO,EAAA;AAAA,MACT,CAAA;AACA,MAAA,CAAA,CAAE,YAAY,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,IAAI,CAAC,CAAA;AACxC,MAAA,CAAA,CAAE,YAAY,IAAA,CAAK,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,IAC1C,CAAC,CAAA;AAED,IAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAmB;AACvC,MAAA,iBAAA,CAAkB,KAAA,CAAM,OAAA,GAAU,IAAA,KAAS,UAAA,GAAa,EAAA,GAAK,MAAA;AAC7D,MAAA,qBAAA,CAAsB,KAAA,CAAM,OAAA,GAAU,IAAA,KAAS,cAAA,GAAiB,EAAA,GAAK,MAAA;AACrE,MAAA,aAAA,CAAc,KAAA,CAAM,OAAA,GAAU,IAAA,KAAS,MAAA,GAAS,EAAA,GAAK,MAAA;AACrD,MAAA,iBAAA,CAAkB,KAAA,CAAM,OAAA,GAAU,IAAA,KAAS,UAAA,GAAa,EAAA,GAAK,MAAA;AAC7D,MAAA,aAAA,CAAc,KAAA,CAAM,OAAA,GAAU,IAAA,KAAS,MAAA,GAAS,EAAA,GAAK,MAAA;AAAA,IACvD,CAAA;AACA,IAAA,OAAA,CAAQ,YAAY,MAAM,CAAA;AAE1B,IAAA,UAAA,CAAW,OAAA,GAAU;AAAA,MACnB,OAAO,EAAC;AAAA,MACR,cAAA,EAAgB,IAAA;AAAA,MAChB,OAAA;AAAA,MAAS,GAAA;AAAA,MAAK,IAAA,EAAM,MAAA;AAAA,MAAQ,SAAA,EAAW,WAAA;AAAA,MAAa,UAAA,EAAY,IAAA;AAAA,MAAM,OAAA,EAAS,SAAA;AAAA,MAC/E,QAAA,EAAU,UAAA;AAAA,MACV,QAAA;AAAA,MAAU,QAAA;AAAA,MACV,SAAS,EAAC;AAAA,MAAG,KAAA,EAAO,IAAA;AAAA,MAAM,IAAA,EAAM,MAAA;AAAA,MAChC,IAAA,EAAM,IAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAkBA,IAAA,MAAM,cACJ,MAAA,EAAQ,QAAA,EAAU,WAAA,IAAe,KAAA,EAAO,UAAU,WAAA,IAAe,IAAA;AACnE,IAAA,IAAI,KAAA,GAAQ,KAAA;AAWZ,IAAA,MAAM,WAAA,GAAc,CAAC,EAAA,EAAY,EAAA,KAAe;AAC9C,MAAA,IAAI,CAAC,WAAA,EAAa,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AACtC,MAAA,MAAM,EAAA,GAAK,IAAI,WAAA,CAAY,EAAA,EAAI,IAAI,CAAC,CAAA,CAAE,QAAQ,MAAM,CAAA;AACpD,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,WAAA,EAAa,CAAA,GAAI,MAAA,CAAO,YAAA;AACzC,MAAA,OAAO,EAAE,CAAA,EAAA,CAAI,EAAA,CAAG,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,CAAI,CAAC,EAAA,CAAG,CAAA,GAAI,CAAA,IAAK,IAAI,CAAA,EAAE;AAAA,IACzD,CAAA;AAUA,IAAA,MAAM,aAAA,GAAgB,GAAA;AACtB,IAAA,CAAC,MAAM;AACL,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,UAAA,CAAW,OAAA;AACtB,QAAA,IAAI,CAAC,EAAA,EAAI;AACT,QAAA,MAAM,QAAkB,EAAC;AACzB,QAAA,MAAM,SAAmB,EAAC;AAC1B,QAAA,IAAI,SAAA,GAAY,KAAA;AAGhB,QAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAuB;AAC7C,UAAA,MAAM,EAAA,GAAK,GAAG,UAAA,EAAY,kBAAA;AAC1B,UAAA,MAAM,EAAA,GAAK,GAAG,UAAA,EAAY,kBAAA;AAC1B,UAAA,IAAI,MAAM,EAAA,EAAI;AACZ,YAAA,MAAM,MAAkB,EAAC;AACzB,YAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,GAAG,KAAK,CAAA;AACrC,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,cAAA,GAAA,CAAI,IAAA,CAAK,CAAC,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA,EAAG,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA,EAAG,EAAA,CAAG,IAAA,CAAK,CAAC,GAAG,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA,EAAG,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA,EAAG,EAAA,CAAG,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AAAA,YACnF;AACA,YAAA,OAAO,GAAA;AAAA,UACT;AACA,UAAA,MAAM,EAAA,GAAK,GAAG,UAAA,EAAY,iBAAA;AAC1B,UAAA,IAAI,EAAA,EAAI;AACN,YAAA,MAAM,MAAkB,EAAC;AACzB,YAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,EAAA,CAAG,OAAO,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG,GAAG,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,CAAG,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AAChF,YAAA,OAAO,GAAA;AAAA,UACT;AACA,UAAA,OAAO,CAAC,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,QAC5B,CAAA;AACA,QAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,KAAa;AAC1B,UAAA,MAAM,KAAA,GAAQ,CAAC,CAAC,GAAA,EAAK,cAAA;AACrB,UAAA,MAAM,KAAA,GAAQ,CAAC,CAAC,GAAA,EAAK,QAAA;AACrB,UAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,EAAO;AACtB,UAAA,MAAM,IAAI,GAAA,CAAI,QAAA;AACd,UAAA,MAAM,GAAA,GAAM,GAAG,UAAA,EAAY,QAAA;AAC3B,UAAA,IAAI,CAAC,GAAA,EAAK;AACV,UAAA,MAAM,GAAA,GAAM,eAAe,CAAC,CAAA;AAC5B,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,MAAM,MAAM,CAAA,CAAE,KAAA;AACd,YAAA,MAAM,SAAA,GAAY,KAAK,KAAA,CAAA,CAAO,GAAA,GAAM,IAAI,KAAA,GAAQ,GAAA,CAAI,SAAS,CAAC,CAAA;AAC9D,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,cAAA,MAAM,KAAK,GAAA,GAAM,GAAA,CAAI,KAAK,CAAA,GAAI,CAAC,IAAI,CAAA,GAAI,CAAA;AACvC,cAAA,MAAM,EAAA,GAAK,MAAM,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AAC/C,cAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,EAAE,GAAG,EAAA,GAAK,GAAA,CAAI,KAAK,EAAE,CAAA;AACzC,cAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,EAAE,GAAG,EAAA,GAAK,GAAA,CAAI,KAAK,EAAE,CAAA;AACzC,cAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,EAAA,GAAK,EAAA,GAAK,EAAE,CAAA,EAAG;AACzC,cAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,gBAAA,IAAI,KAAA,CAAM,MAAA,IAAU,aAAA,GAAgB,CAAA,EAAG;AAAE,kBAAA,SAAA,GAAY,IAAA;AAAM,kBAAA;AAAA,gBAAQ;AACnE,gBAAA,MAAM,GAAA,GAAM,EAAE,CAAC,CAAA,GAAI,KAAK,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAC,GAAG,GAAA,GAAM,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA,GAAK,EAAE,CAAC,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA;AAC3E,gBAAA,MAAM,GAAA,GAAM,EAAE,CAAC,CAAA,GAAI,KAAK,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAC,GAAG,GAAA,GAAM,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA,GAAK,EAAE,CAAC,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA;AAC3E,gBAAA,IAAI,GAAA,KAAQ,GAAA,IAAO,GAAA,KAAQ,GAAA,EAAK;AAChC,gBAAA,KAAA,CAAM,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAAA,cAC/B;AAAA,YACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,OAAO,CAAA,EAAA,EAAK;AAClC,cAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,CAAC,GAAG,CAAA,GAAI,GAAA,CAAI,KAAK,CAAC,CAAA;AACrC,cAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,EAAG;AAC7B,cAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,gBAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA,GAAI,IAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,CAAC,GAAG,CAAA,CAAE,CAAC,IAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,cACpE;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAA;AACA,QAAA,IAAI,OAAO,KAAA,CAAM,eAAA,KAAoB,UAAA,EAAY,KAAA,CAAM,gBAAgB,KAAK,CAAA;AAAA,aACvE,KAAA,CAAM,SAAS,KAAK,CAAA;AACzB,QAAA,EAAA,CAAG,IAAA,GAAO,IAAI,YAAA,CAAa,KAAK,CAAA;AAChC,QAAA,EAAA,CAAG,KAAA,GAAQ,IAAI,YAAA,CAAa,MAAM,CAAA;AAClC,QAAA,IAAI,SAAA,EAAW;AAEb,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,sCAAA,EAAyC,aAAa,CAAA,iDAAA,CAA8C,CAAA;AAAA,QACnH;AACA,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX,CAAA,GAAG;AAMH,IAAA,MAAM,OAAA,GAAU,EAAA;AAQhB,IAAA,MAAM,iBAAA,GAAoB,CACxB,GAAA,EAAa,GAAA,EAAa,KAAa,GAAA,EACvC,GAAA,EAAa,GAAA,EAAa,GAAA,EAAa,GAAA,KACpC;AACH,MAAA,MAAM,KAAK,GAAA,GAAM,GAAA,KAAQ,MAAM,GAAA,CAAA,GAAA,CAAQ,GAAA,GAAM,QAAQ,GAAA,GAAM,GAAA,CAAA;AAC3D,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,MAAM,OAAO,IAAA;AAC/B,MAAA,MAAM,CAAA,GAAA,CAAA,CAAM,MAAM,GAAA,KAAQ,GAAA,GAAM,QAAQ,GAAA,GAAM,GAAA,KAAQ,MAAM,GAAA,CAAA,IAAQ,CAAA;AACpE,MAAA,MAAM,CAAA,GAAA,CAAA,CAAM,MAAM,GAAA,KAAQ,GAAA,GAAM,QAAQ,GAAA,GAAM,GAAA,KAAQ,MAAM,GAAA,CAAA,IAAQ,CAAA;AACpE,MAAA,MAAM,GAAA,GAAM,IAAA;AACZ,MAAA,IAAI,CAAA,GAAI,CAAC,GAAA,IAAO,CAAA,GAAI,CAAA,GAAI,GAAA,IAAO,CAAA,GAAI,CAAC,GAAA,IAAO,CAAA,GAAI,CAAA,GAAI,GAAA,EAAK,OAAO,IAAA;AAC/D,MAAA,OAAO,EAAE,EAAA,EAAI,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,GAAA,CAAA,EAAM,EAAA,EAAI,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,GAAA,CAAA,EAAM,CAAA,EAAE;AAAA,IACnE,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,CAAC,EAAA,EAAY,EAAA,KAAe;AAC3C,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,IAAK,CAAC,SAAS,CAAC,CAAA,CAAE,MAAM,OAAO,IAAA;AAIpC,MAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC3B,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC3B,MAAA,MAAM,GAAA,GAAM,GAAG,CAAA,GAAI,CAAA,CAAE,GAAG,GAAA,GAAM,EAAA,CAAG,IAAI,CAAA,CAAE,CAAA;AACvC,MAAA,MAAM,GAAA,GAAM,GAAG,CAAA,GAAI,CAAA,CAAE,GAAG,GAAA,GAAM,EAAA,CAAG,IAAI,CAAA,CAAE,CAAA;AACvC,MAAA,MAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA;AAC9B,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAGjB,MAAA,MAAM,GAAA,GAAA,CAAA,CAAQ,KAAK,CAAA,CAAE,CAAA,IAAK,OAAO,EAAA,GAAK,CAAA,CAAE,KAAK,GAAA,IAAO,GAAA;AACpD,MAAA,MAAM,GAAA,GAAA,CAAA,CAAQ,KAAK,CAAA,CAAE,CAAA,IAAK,OAAO,EAAA,GAAK,CAAA,CAAE,KAAK,GAAA,IAAO,GAAA;AACpD,MAAA,MAAM,KAAK,OAAA,IAAW,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,GAAG,CAAA,IAAK,CAAA,CAAA;AAC9C,MAAA,MAAM,KAAK,OAAA,IAAW,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,GAAG,CAAA,IAAK,CAAA,CAAA;AAC9C,MAAA,MAAM,IAAA,GAAO,GAAA,GAAM,EAAA,EAAI,IAAA,GAAO,GAAA,GAAM,IAAI,IAAA,GAAO,GAAA,GAAM,EAAA,EAAI,IAAA,GAAO,GAAA,GAAM,EAAA;AAEtE,MAAA,MAAM,KAAK,OAAA,GAAU,OAAA;AAKrB,MAAA,IAAI,MAAA,GAAsB,MAAM,GAAA,GAAM,EAAA;AACtC,MAAA,IAAI,OAAA,GAAuB,MAAM,IAAA,GAAO,EAAA;AACxC,MAAA,IAAI,QAAA,GAAwB,MAAM,KAAA,GAAQ,EAAA;AAC1C,MAAA,IAAI,KAAA,GAAqB,MAAM,EAAA,GAAK,EAAA;AACpC,MAAA,MAAM,OAAiH,EAAC;AAExH,MAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA,EAAG;AACvC,QAAA,MAAM,KAAK,IAAA,CAAK,CAAC,CAAA,EAAG,EAAA,GAAK,KAAK,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,GAAK,KAAK,CAAA,GAAI,CAAC,GAAG,EAAA,GAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AACvE,QAAA,IAAK,EAAA,GAAK,IAAA,IAAQ,EAAA,GAAK,IAAA,IAAU,KAAK,IAAA,IAAQ,EAAA,GAAK,IAAA,IAC9C,EAAA,GAAK,QAAQ,EAAA,GAAK,IAAA,IAAU,EAAA,GAAK,IAAA,IAAQ,KAAK,IAAA,EAAO;AAC1D,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,GAAA,GAAM,EAAA,GAAK,GAAA,GAAM,EAAA,EAAI,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,GAAA,GAAM,EAAA,GAAK,GAAA,GAAM,EAAA;AACpE,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,GAAA,GAAM,EAAA,GAAK,GAAA,GAAM,EAAA,EAAI,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,GAAA,GAAM,EAAA,GAAK,GAAA,GAAM,EAAA;AACpE,QAAA,IAAI,IAAA,GAAO,KAAA;AAEX,QAAA,IAAI,EAAA,GAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAC7B,QAAA,IAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AACxB,QAAA,IAAI,KAAK,EAAA,EAAI;AAAE,UAAA,IAAA,GAAO,IAAA;AAAM,UAAA,IAAI,KAAK,GAAA,EAAK;AAAE,YAAA,GAAA,GAAM,EAAA;AAAI,YAAA,MAAA,GAAS,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,MAAM,UAAA,EAAW;AAAA,UAAG;AAAA,QAAE;AACvG,QAAA,EAAA,GAAK,EAAA,GAAK,GAAA;AAAK,QAAA,EAAA,GAAK,EAAA,GAAK,GAAA;AACzB,QAAA,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACpB,QAAA,IAAI,KAAK,EAAA,EAAI;AAAE,UAAA,IAAA,GAAO,IAAA;AAAM,UAAA,IAAI,KAAK,GAAA,EAAK;AAAE,YAAA,GAAA,GAAM,EAAA;AAAI,YAAA,MAAA,GAAS,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,MAAM,UAAA,EAAW;AAAA,UAAG;AAAA,QAAE;AAEvG,QAAA,EAAA,GAAK,EAAA,GAAA,CAAM,MAAM,GAAA,IAAO,CAAA;AAAG,QAAA,EAAA,GAAK,EAAA,GAAA,CAAM,MAAM,GAAA,IAAO,CAAA;AACnD,QAAA,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACpB,QAAA,IAAI,KAAK,EAAA,EAAI;AAAE,UAAA,IAAA,GAAO,IAAA;AAAM,UAAA,IAAI,KAAK,IAAA,EAAM;AAAE,YAAA,IAAA,GAAO,EAAA;AAAI,YAAA,OAAA,GAAU,EAAE,EAAA,EAAA,CAAK,EAAA,GAAK,EAAA,IAAM,CAAA,EAAG,KAAK,EAAA,GAAK,EAAA,IAAM,CAAA,EAAG,IAAA,EAAM,UAAA,EAAW;AAAA,UAAG;AAAA,QAAE;AAEhI,QAAA,MAAM,GAAA,GAAM,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,GAAM,GAAA;AACnC,QAAA,MAAM,IAAA,GAAO,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA;AAC/B,QAAA,IAAI,OAAO,CAAA,EAAG;AACZ,UAAA,MAAM,MAAM,EAAA,GAAK,GAAA,IAAO,GAAA,GAAA,CAAO,EAAA,GAAK,OAAO,GAAA,IAAO,IAAA;AAClD,UAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG;AAClB,YAAA,EAAA,GAAK,EAAA,IAAM,MAAM,CAAA,GAAI,GAAA,CAAA;AAAM,YAAA,EAAA,GAAK,EAAA,IAAM,MAAM,CAAA,GAAI,GAAA,CAAA;AAChD,YAAA,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACpB,YAAA,IAAI,KAAK,EAAA,EAAI;AACX,cAAA,IAAA,GAAO,IAAA;AACP,cAAA,IAAI,KAAK,KAAA,EAAO;AAAE,gBAAA,KAAA,GAAQ,EAAA;AAAI,gBAAA,QAAA,GAAW,EAAE,EAAA,EAAI,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,EAAK,EAAA,EAAI,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,EAAK,IAAA,EAAM,MAAA,EAAO;AAAA,cAAG;AAAA,YAC7G;AAAA,UACF;AAAA,QACF;AACA,QAAA,IAAI,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,CAAA;AAAA,MAC5D;AAGA,MAAA,MAAM,QAAQ,CAAA,CAAE,KAAA;AAChB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,UAAA,MAAM,IAAI,KAAA,CAAM,CAAC,GAAG,CAAA,GAAI,KAAA,CAAM,IAAI,CAAC,CAAA;AACnC,UAAA,IAAI,IAAI,IAAA,IAAQ,CAAA,GAAI,QAAQ,CAAA,GAAI,IAAA,IAAQ,IAAI,IAAA,EAAM;AAClD,UAAA,MAAM,KAAK,EAAA,IAAM,CAAA,CAAE,CAAA,GAAI,GAAA,GAAM,IAAI,GAAA,GAAM,CAAA,CAAA;AACvC,UAAA,MAAM,KAAK,EAAA,IAAM,CAAA,CAAE,CAAA,GAAI,GAAA,GAAM,IAAI,GAAA,GAAM,CAAA,CAAA;AACvC,UAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC1B,UAAA,IAAI,KAAK,GAAA,EAAK;AAAE,YAAA,GAAA,GAAM,EAAA;AAAI,YAAA,MAAA,GAAS,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,MAAM,MAAA,EAAO;AAAA,UAAG;AAAA,QACrE;AAAA,MACF;AAKA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,QAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACxC,UAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,UAAA,MAAM,KAAK,iBAAA,CAAkB,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,KAAK,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,EAAE,GAAA,EAAK,CAAA,CAAE,KAAK,CAAA,CAAE,GAAA,EAAK,EAAE,GAAG,CAAA;AACnF,UAAA,IAAI,CAAC,EAAA,EAAI;AACT,UAAA,MAAM,KAAK,EAAA,GAAK,EAAA,CAAG,EAAA,EAAI,EAAA,GAAK,KAAK,EAAA,CAAG,EAAA;AACpC,UAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC1B,UAAA,IAAI,EAAA,IAAM,EAAA,IAAM,EAAA,IAAM,EAAA,EAAI;AAC1B,UAAA,EAAA,GAAK,EAAA;AACL,UAAA,KAAA,GAAQ,EAAE,IAAI,CAAA,CAAE,EAAA,GAAK,GAAG,CAAA,IAAK,CAAA,CAAE,KAAK,CAAA,CAAE,EAAA,CAAA,EAAK,IAAI,CAAA,CAAE,EAAA,GAAK,GAAG,CAAA,IAAK,CAAA,CAAE,KAAK,CAAA,CAAE,EAAA,CAAA,EAAK,MAAM,cAAA,EAAe;AAAA,QACnG;AAAA,MACF;AAOA,MAAA,MAAM,GAAA,GAAM,SAAS,MAAA,GAAU,EAAA,GAAK,MAAM,CAAA,GAAI,KAAA,GAAQ,SAAW,KAAA,IAAS,MAAA;AAC1E,MAAA,OAAO,OAAO,OAAA,IAAW,QAAA;AAAA,IAC3B,CAAA;AAGA,IAAA,MAAM,aAAa,MAAsB;AACvC,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,MAAA,EAAA,CAAG,MAAM,OAAA,GAAU,CAAA,6LAAA,CAAA;AACnB,MAAA,OAAA,CAAQ,YAAY,EAAE,CAAA;AACtB,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA,CAAE,KAAA;AACtB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAKvC,MAAA,EAAA,CAAG,MAAM,OAAA,GAAU,CAAA,kTAAA,CAAA;AACnB,MAAA,OAAA,CAAQ,YAAY,EAAE,CAAA;AACtB,MAAA,CAAA,CAAE,KAAA,GAAQ,EAAA;AACV,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,cAAA,GAAiB,CAAC,EAAA,EAAoB,CAAA,EAAW,CAAA,KAAc;AACnE,MAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC1B,MAAA,EAAA,CAAG,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAA,CAAA;AACtB,MAAA,EAAA,CAAG,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAA,CAAA;AAAA,IACvB,CAAA;AAOA,IAAA,MAAM,sBAAsB,MAAM;AAChC,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,KAAK,CAAC,CAAA,CAAE,kBAAkB,CAAA,CAAE,KAAA,CAAM,SAAS,CAAA,EAAG;AACnD,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACnB,MAAA,MAAM,MAAM,CAAA,CAAE,cAAA;AACd,MAAA,MAAM,QAAQ,mBAAA,CAAoB,OAAA;AAClC,MAAA,MAAM,OAAO,cAAA,CAAe,OAAA;AAC5B,MAAA,IAAI,KAAA,KAAU,QAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,KAAM,IAAA,KAAS,YAAA,IAAgB,IAAA,KAAS,UAAA,CAAA,EAAa;AAC9F,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,IAAK,CAAA,CAAE,IAAI,CAAA,GAAI,EAAA;AAChC,UAAA,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,EAAE,GAAG,CAAA,CAAE,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,EAAE;AAAA,QAC3D,CAAA,MAAO;AACL,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,IAAK,CAAA,CAAE,IAAI,CAAA,GAAI,EAAA;AAChC,UAAA,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,EAAE,GAAG,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAE;AAAA,QAC3D;AAAA,MACF,CAAA,MAAO;AACL,QAAA,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,EAAE,GAAG,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,CAAA,EAAE;AAAA,MACpC;AAAA,IACF,CAAA;AAOA,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,EAA8B,CAAA,KAAsE;AACvH,MAAA,MAAM,OAAO,cAAA,CAAe,OAAA;AAC5B,MAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,IAAA;AAC5B,MAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG,OAAO,YAAA;AACrB,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,IAAI,YAAA,GAAe,UAAA;AAAA,IACrE,CAAA;AAMA,IAAA,MAAM,qBAAqB,MAAM;AAC/B,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACnB,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACnB,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAG7B,MAAA,MAAM,UAAU,cAAA,CAAe,OAAA;AAC/B,MAAA,MAAM,QAAQ,mBAAA,CAAoB,OAAA;AAClC,MAAA,IAAI,UAAU,IAAA,IAAQ,MAAA,CAAO,SAAS,KAAK,CAAA,IAAK,YAAY,YAAA,EAAc;AAExE,QAAA,OAAO,EAAE,IAAA,EAAM,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAE,EAAG,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,GAAE,EAAE;AAAA,MAC5D;AACA,MAAA,IAAI,UAAU,IAAA,IAAQ,MAAA,CAAO,SAAS,KAAK,CAAA,IAAK,YAAY,UAAA,EAAY;AAEtE,QAAA,OAAO,EAAE,IAAA,EAAM,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAE,EAAG,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,GAAE,EAAE;AAAA,MAC5D;AACA,MAAA,IAAI,IAAA,KAAS,YAAA,EAAc,OAAO,EAAE,MAAM,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,GAAE,EAAE;AACpE,MAAA,IAAI,IAAA,KAAS,UAAA,EAAc,OAAO,EAAE,MAAM,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,GAAE,EAAE;AACpE,MAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE;AAAA,IAC1B,CAAA;AAEA,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,mBAAA,EAAoB;AACpB,MAAA,MAAM,UAAU,cAAA,CAAe,OAAA;AAC/B,MAAA,MAAM,QAAQ,mBAAA,CAAoB,OAAA;AAClC,MAAA,MAAM,WAAA,GAAc,UAAU,IAAA,IAAQ,MAAA,CAAO,SAAS,KAAK,CAAA,KAAM,OAAA,KAAY,YAAA,IAAgB,OAAA,KAAY,UAAA,CAAA;AAEzG,MAAA,IAAI,EAAE,OAAA,CAAQ,CAAC,GAAG,cAAA,CAAe,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,CAAA,EAAG,EAAE,KAAA,CAAM,CAAC,EAAE,CAAC,CAAA;AACzE,MAAA,IAAI,EAAE,OAAA,CAAQ,CAAC,GAAG,cAAA,CAAe,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,CAAA,EAAG,EAAE,KAAA,CAAM,CAAC,EAAE,CAAC,CAAA;AAIzE,MAAA,MAAM,WAAA,GAAc,CAAC,EAAA,EAA2B,GAAA,EAAiC,OAAA,KAAqB;AACpG,QAAA,IAAI,CAAC,EAAA,EAAI;AACT,QAAA,IAAI,CAAC,OAAA,IAAW,CAAA,CAAE,KAAA,CAAM,SAAS,CAAA,EAAG;AAAE,UAAA,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AAAQ,UAAA;AAAA,QAAQ;AACzE,QAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,WAAA,EAAa,CAAA,GAAI,MAAA,CAAO,YAAA;AACzC,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AACtC,QAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC/B,QAAA,MAAM,KAAA,GAAQ,YAAY,CAAA,CAAE,CAAA,GAAI,IAAI,EAAA,EAAI,CAAA,CAAE,CAAA,GAAI,GAAA,CAAI,EAAE,CAAA;AACpD,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAA,GAAI,EAAA,CAAG,CAAA,EAAG,KAAA,CAAM,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA,IAAK,CAAA;AAC5D,QAAA,MAAM,YAAY,UAAA,GAAa,KAAA;AAC/B,QAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,CAAE,CAAA,GAAI,GAAA,CAAI,EAAA,GAAK,SAAA,EAAW,CAAA,CAAE,CAAA,GAAI,GAAA,CAAI,EAAA,GAAK,SAAS,CAAA;AACzE,QAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,CAAE,CAAA,GAAI,GAAA,CAAI,EAAA,GAAK,SAAA,EAAW,CAAA,CAAE,CAAA,GAAI,GAAA,CAAI,EAAA,GAAK,SAAS,CAAA;AACzE,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAClC,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAClC,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAClC,QAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAClC,QAAA,EAAA,CAAG,MAAM,OAAA,GAAU,EAAA;AAAA,MACrB,CAAA;AACA,MAAA,IAAI,QAAQ,OAAA,KAAY,YAAA;AACxB,MAAA,IAAI,QAAQ,OAAA,KAAY,UAAA;AACxB,MAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,QAAA,IAAI,CAAA,CAAE,KAAA,CAAM,MAAA,IAAU,CAAA,EAAG;AACvB,UAAA,MAAM,CAAA,GAAI,YAAY,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA;AAC5C,UAAA,KAAA,GAAQ,CAAA,KAAM,YAAA;AACd,UAAA,KAAA,GAAQ,CAAA,KAAM,UAAA;AAAA,QAChB,CAAA,MAAO;AACL,UAAA,KAAA,GAAQ,IAAA;AACR,UAAA,KAAA,GAAQ,IAAA;AAAA,QACV;AAAA,MACF;AACA,MAAA,WAAA,CAAY,CAAA,CAAE,SAAS,EAAE,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,IAAK,KAAK,CAAA;AAC9C,MAAA,WAAA,CAAY,CAAA,CAAE,UAAU,EAAE,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,IAAK,KAAK,CAAA;AAE/C,MAAA,IAAI,CAAA,CAAE,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACxB,QAAA,MAAM,CAAA,GAAI,EAAE,KAAA,CAAM,CAAC,GAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AACnC,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC7B,QAAA,MAAM,OAAO,kBAAA,EAAmB;AAChC,QAAA,MAAM,KAAK,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAC/C,QAAA,MAAM,KAAK,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA,EAAG,IAAA,CAAK,GAAG,CAAC,CAAA;AAC3C,QAAA,CAAA,CAAE,KAAM,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AACvC,QAAA,CAAA,CAAE,KAAM,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AACvC,QAAA,CAAA,CAAE,KAAM,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AACvC,QAAA,CAAA,CAAE,KAAM,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AACvC,QAAA,CAAA,CAAE,IAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,yBAAyB,CAAA;AAC9D,QAAA,CAAA,CAAE,IAAA,CAAM,YAAA,CAAa,YAAA,EAAc,yBAAyB,CAAA;AAG5D,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA;AACnD,QAAA,CAAA,CAAE,IAAA,CAAM,KAAA,CAAM,OAAA,GAAU,OAAA,GAAU,MAAM,EAAA,GAAK,MAAA;AAG7C,QAAA,IAAI,WAAA,IAAe,EAAE,SAAA,EAAW;AAC9B,UAAA,MAAM,IAAI,IAAA,KAAS,YAAA,GAAe,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,KAAM,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AACxE,UAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC/B,UAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC/B,UAAA,CAAA,CAAE,UAAU,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAC3C,UAAA,CAAA,CAAE,UAAU,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAC3C,UAAA,CAAA,CAAE,UAAU,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAC3C,UAAA,CAAA,CAAE,UAAU,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAC3C,UAAA,CAAA,CAAE,SAAA,CAAU,YAAA,CAAa,cAAA,EAAgB,yBAAyB,CAAA;AAClE,UAAA,CAAA,CAAE,SAAA,CAAU,YAAA,CAAa,YAAA,EAAc,yBAAyB,CAAA;AAChE,UAAA,CAAA,CAAE,SAAA,CAAU,MAAM,OAAA,GAAU,EAAA;AAE5B,UAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,UAAA,MAAA,CAAO,WAAA,GAAc,qBAAA,CAAsB,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AAC1D,UAAA,MAAM,GAAA,GAAA,CAAO,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAC5B,UAAA,MAAM,GAAA,GAAA,CAAO,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAC5B,UAAA,MAAA,CAAO,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AAC1B,UAAA,MAAA,CAAO,KAAA,CAAM,GAAA,GAAO,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AAC1B,UAAA,MAAM,CAAA,GAAI,MAAA,CAAO,WAAA,EAAa,CAAA,GAAI,MAAA,CAAO,YAAA;AACzC,UAAA,MAAA,CAAO,KAAA,CAAM,OAAA,GAAW,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,KAAK,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,CAAA,GAAK,MAAA,GAAS,EAAA;AAAA,QAC/E,CAAA,MAAO;AACL,UAAA,IAAI,CAAA,CAAE,SAAA,EAAW,CAAA,CAAE,SAAA,CAAU,MAAM,OAAA,GAAU,MAAA;AAC7C,UAAA,IAAI,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,UAAA,CAAW,MAAM,OAAA,GAAU,MAAA;AAAA,QACjD;AAKA,QAAA,MAAM,OAAO,CAAA,CAAE,QAAA;AACf,QAAA,MAAM,OAAO,CAAA,CAAE,QAAA;AACf,QAAA,IAAI,CAAC,WAAA,IAAe,IAAA,KAAS,YAAA,IAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA,EAAM;AACvE,UAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC9B,UAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC9B,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,MAAM,OAAA,GAAU,EAAA;AACrB,UAAA,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AAAA,QACvB,CAAA,MAAA,IAAW,CAAC,WAAA,IAAe,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA,EAAM;AAC5E,UAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC9B,UAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC9B,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,UAAA,IAAA,CAAK,MAAM,OAAA,GAAU,EAAA;AACrB,UAAA,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AAAA,QACvB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AACrB,UAAA,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AAAA,QACvB;AAEA,QAAA,IAAI,EAAE,KAAA,EAAO;AACX,UAAA,MAAM,EAAA,GAAA,CAAM,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAC3B,UAAA,MAAM,EAAA,GAAA,CAAM,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAC3B,UAAA,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AAC1B,UAAA,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AACzB,UAAA,MAAM,CAAA,GAAI,MAAA,CAAO,WAAA,EAAa,CAAA,GAAI,MAAA,CAAO,YAAA;AACzC,UAAA,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,OAAA,GAAW,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,CAAA,GAAK,MAAA,GAAS,EAAA;AAG1E,UAAA,IAAI,OAAA,IAAW,GAAA,EAAK,CAAA,CAAE,KAAA,CAAM,MAAM,OAAA,GAAU,MAAA;AAAA,QAC9C;AAAA,MACF,CAAA,MAAO;AACL,QAAA,CAAA,CAAE,IAAA,CAAM,MAAM,OAAA,GAAU,MAAA;AACxB,QAAA,IAAI,CAAA,CAAE,SAAA,EAAW,CAAA,CAAE,SAAA,CAAU,MAAM,OAAA,GAAU,MAAA;AAC7C,QAAA,IAAI,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,UAAA,CAAW,MAAM,OAAA,GAAU,MAAA;AAC/C,QAAA,IAAI,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AAC3C,QAAA,IAAI,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AAAA,MAC7C;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,mBAAmB,MAAM;AAC7B,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAA,CAAE,UAAA,EAAY,OAAO,CAAA,CAAE,UAAA;AAC3B,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,MAAA,EAAA,CAAG,MAAM,OAAA,GAAU,CAAA,kTAAA,CAAA;AACnB,MAAA,OAAA,CAAQ,YAAY,EAAE,CAAA;AACtB,MAAA,CAAA,CAAE,UAAA,GAAa,EAAA;AACf,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAGA,IAAA,MAAM,QAAA,GAAW,CAAA;AACjB,IAAA,MAAM,SAAA,GAAY,GAAA;AAClB,IAAA,IAAI,KAAA,GAAQ,GAAG,KAAA,GAAQ,CAAA,EAAG,WAAW,CAAA,EAAG,UAAA,GAAa,OAAO,QAAA,GAAW,KAAA;AACvE,IAAA,IAAI,QAAA,GAAwC,IAAA;AAE5C,IAAA,MAAM,iBAAA,GAAoB,CAAC,EAAA,KAAY;AACrC,MAAA,MAAM,IAAI,EAAA,EAAI,MAAA;AACd,MAAA,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,QAAA,EAAU,WAAW,CAAA,EAAG;AACpC,MAAA,KAAA,GAAQ,EAAE,WAAA,CAAY,CAAA;AACtB,MAAA,KAAA,GAAQ,EAAE,WAAA,CAAY,CAAA;AACtB,MAAA,QAAA,GAAW,YAAY,GAAA,EAAI;AAC3B,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,UAAA,GAAa,IAAA;AAAA,IACf,CAAA;AAEA,IAAA,MAAM,iBAAA,GAAoB,CAAC,EAAA,KAAqB;AAC9C,MAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,OAAA,GAAU,IAAA,CAAK,IAAA;AAC7B,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,OAAA,GAAU,IAAA,CAAK,GAAA;AAE7B,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAA,CAAK,EAAA,GAAK,UAAU,CAAA,GAAA,CAAK,EAAA,GAAK,UAAU,CAAA,GAAI,QAAA,GAAW,UAAU,QAAA,GAAW,IAAA;AAAA,MAC9E;AAGA,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,IAAA,EAAM;AACnB,MAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,QAAA,CAAA,CAAE,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AACvB,QAAA;AAAA,MACF;AACA,MAAA,QAAA,GAAW,QAAA,CAAS,IAAI,EAAE,CAAA;AAC1B,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,QAAA,CAAS,EAAA,EAAI,SAAS,EAAE,CAAA;AAC9C,QAAA,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AAC1B,QAAA,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AACzB,QAAA,CAAA,CAAE,IAAA,CAAK,MAAM,OAAA,GAAU,EAAA;AACvB,QAAA,YAAA,CAAa,SAAS,IAAI,CAAA;AAAA,MAC5B,CAAA,MAAO;AACL,QAAA,CAAA,CAAE,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AAAA,MACzB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,eAAA,GAAkB,CAAC,EAAA,KAAY;AACnC,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,UAAA,GAAa,KAAA;AACb,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,EAAI,GAAI,QAAA;AACpC,MAAA,IAAI,QAAA,IAAY,UAAU,SAAA,EAAW;AAGrC,MAAA,MAAM,GAAA,GAAM,IAAI,MAAA,EAAQ,QAAA;AACxB,MAAA,IAAI,CAAC,GAAA,EAAK;AAGV,MAAA,MAAM,SAAS,QAAA,GACX,EAAE,CAAA,EAAG,QAAA,CAAS,IAAI,CAAA,EAAG,QAAA,CAAS,EAAA,EAAG,GACjC,EAAE,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,EAAE;AACzB,MAAA,MAAA,CAAO,MAAM,CAAA;AAAA,IACf,CAAA;AAMA,IAAA,MAAM,iBAAiB,MAAM;AAC3B,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,KAAA,CAAM,WAAW,CAAA,EAAG;AAChC,MAAA,mBAAA,EAAoB;AACpB,MAAA,MAAM,CAAA,GAAI,EAAE,KAAA,CAAM,CAAC,GAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AACnC,MAAA,MAAM,UAAU,cAAA,CAAe,OAAA;AAC/B,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC7B,MAAA,MAAM,QAAQ,mBAAA,CAAoB,OAAA;AAClC,MAAA,MAAM,WAAA,GAAc,UAAU,IAAA,IAAQ,MAAA,CAAO,SAAS,KAAK,CAAA,KAAM,OAAA,KAAY,YAAA,IAAgB,OAAA,KAAY,UAAA,CAAA;AACzG,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,MAAA,GAAS,EAAA;AACb,MAAA,IAAI,IAAA;AAGJ,MAAA,IAAI,KAAA,GAA6C,IAAA;AACjD,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AACzD,MAAA,IAAI,WAAA,IAAe,YAAY,YAAA,EAAc;AAC3C,QAAA,IAAA,GAAO,GAAA;AACP,QAAA,MAAA,GAAS,SAAA;AACT,QAAA,KAAA,GAAQ,UAAA;AACR,QAAA,IAAA,GAAO,CAAA,UAAA,EAAQ,qBAAA,CAAsB,GAAG,CAAC,CAAA,wBAAA,EAAsB,sBAAsB,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAC,CAAA,CAAA;AAAA,MACvG,CAAA,MAAA,IAAW,WAAA,IAAe,OAAA,KAAY,UAAA,EAAY;AAChD,QAAA,IAAA,GAAO,GAAA;AACP,QAAA,MAAA,GAAS,SAAA;AACT,QAAA,KAAA,GAAQ,YAAA;AACR,QAAA,IAAA,GAAO,CAAA,UAAA,EAAQ,qBAAA,CAAsB,GAAG,CAAC,CAAA,wBAAA,EAAsB,sBAAsB,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAC,CAAA,CAAA;AAAA,MACvG,CAAA,MAAA,IAAW,SAAS,YAAA,EAAc;AAChC,QAAA,IAAA,GAAO,GAAA;AACP,QAAA,MAAA,GAAS,SAAA;AACT,QAAA,IAAA,GAAO,CAAA,mBAAA,EAAsB,qBAAA,CAAsB,GAAG,CAAC,CAAA,UAAA,CAAA;AAAA,MACzD,CAAA,MAAA,IAAW,SAAS,UAAA,EAAY;AAC9B,QAAA,IAAA,GAAO,GAAA;AACP,QAAA,MAAA,GAAS,SAAA;AACT,QAAA,IAAA,GAAO,CAAA,mBAAA,EAAsB,qBAAA,CAAsB,GAAG,CAAC,CAAA,UAAA,CAAA;AAAA,MACzD,CAAA,MAAO;AACL,QAAA,IAAA,GAAO,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACtC,QAAA,IAAA,GAAO,CAAA,WAAA,EAAc,qBAAA,CAAsB,IAAI,CAAC,CAAA,aAAA,EAAW,qBAAA,CAAsB,GAAG,CAAC,CAAA,aAAA,EAAW,qBAAA,CAAsB,GAAG,CAAC,CAAA,CAAA;AAAA,MAC5H;AAIA,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,QAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,QAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,QAAA,IAAI,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,MAAM,OAAA,GAAU,GAAA;AACrC,QAAA;AAAA,MACF;AACA,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,MAAM,QAAQ,WAAA,EAAY;AAC1B,MAAA,KAAA,CAAM,MAAM,OAAA,GAAU,GAAA;AACtB,MAAA,KAAA,CAAM,cAAc,CAAA,EAAG,qBAAA,CAAsB,IAAI,CAAC,GAAG,MAAM,CAAA,CAAA;AAAA,IAC7D,CAAA;AAIA,IAAA,gBAAA,CAAiB,UAAU,MAAM;AAC/B,MAAA,cAAA,EAAe;AACf,MAAA,aAAA,EAAc;AAAA,IAChB,CAAA;AAGA,IAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAA8C;AACpE,MAAA,CAAA,CAAE,IAAA,CAAM,MAAM,OAAA,GAAU,MAAA;AACxB,MAAA,IAAI,CAAA,CAAE,SAAA,EAAW,CAAA,CAAE,SAAA,CAAU,MAAM,OAAA,GAAU,MAAA;AAC7C,MAAA,IAAI,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,UAAA,CAAW,MAAM,OAAA,GAAU,MAAA;AAC/C,MAAA,IAAI,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AAC3C,MAAA,IAAI,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AAC3C,MAAA,IAAI,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,MAAM,OAAA,GAAU,GAAA;AACrC,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,IACzB,CAAA;AAEA,IAAA,MAAM,aAAa,MAAM;AACvB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,KAAA,MAAW,KAAK,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,aAAA,EAAe,YAAY,CAAC,CAAA;AACzD,MAAA,CAAA,CAAE,UAAU,EAAC;AACb,MAAA,CAAA,CAAE,QAAQ,EAAC;AACX,MAAA,CAAA,CAAE,cAAA,GAAiB,IAAA;AACnB,MAAA,IAAI,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,MAAM,OAAA,GAAU,MAAA;AACzC,MAAA,IAAI,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AAC3C,MAAA,cAAA,CAAe,CAAC,CAAA;AAAA,IAClB,CAAA;AACA,IAAA,eAAA,CAAgB,OAAA,GAAU,UAAA;AAG1B,IAAA,cAAA,CAAe,UAAU,MAAM;AAC7B,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,KAAA,CAAM,WAAW,CAAA,EAAG;AAChC,MAAA,CAAA,CAAE,MAAM,GAAA,EAAI;AACZ,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAI;AACxB,MAAA,CAAA,EAAG,aAAA,EAAe,YAAY,CAAC,CAAA;AAC/B,MAAA,CAAA,CAAE,cAAA,GAAiB,IAAA;AACnB,MAAA,cAAA,CAAe,CAAC,CAAA;AAChB,MAAA,aAAA,EAAc;AAAA,IAChB,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAgC;AAC9C,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,EAAG;AAGR,MAAA,IAAI,CAAA,CAAE,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,UAAA,EAAW;AAErC,MAAA,IAAI,CAAA,CAAE,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACxB,QAAA,CAAA,CAAE,KAAA,CAAM,KAAK,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA;AAC/B,QAAA,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,CAAA;AAAA,MAC7B,CAAA,MAAO;AAKL,QAAA,CAAA,CAAE,iBAAiB,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AACpC,QAAA,CAAA,CAAE,KAAA,CAAM,KAAK,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA;AAC/B,QAAA,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,CAAA;AAC3B,QAAA,cAAA,EAAe;AAAA,MACjB;AACA,MAAA,aAAA,EAAc;AAAA,IAChB,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KAAsB;AACvC,MAAA,IAAI,EAAA,CAAG,GAAA,KAAQ,QAAA,EAAU,iBAAA,CAAkB,KAAK,CAAA;AAAA,IAClD,CAAA;AAGA,IAAA,MAAA,CAAO,MAAM,MAAA,GAAS,WAAA;AACtB,IAAA,IAAI;AAAE,MAAA,CAAA,CAAE,SAAA,GAAY,eAAe,iBAAiB,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAC;AAChE,IAAA,IAAI;AAAE,MAAA,CAAA,CAAE,SAAA,GAAY,aAAa,eAAe,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAC;AAC5D,IAAA,IAAI;AAAE,MAAA,CAAA,CAAE,SAAA,GAAY,eAAe,aAAa,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAC;AAC5D,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,iBAAiB,CAAA;AACxD,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAE5C,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,MAAM,MAAA,GAAS,EAAA;AACtB,MAAA,IAAI;AAAE,QAAA,CAAA,CAAE,WAAA,GAAc,eAAe,iBAAiB,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAClE,MAAA,IAAI;AAAE,QAAA,CAAA,CAAE,WAAA,GAAc,aAAa,eAAe,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAC9D,MAAA,IAAI;AAAE,QAAA,CAAA,CAAE,WAAA,GAAc,eAAe,aAAa,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAC9D,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,iBAAiB,CAAA;AAC3D,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC/C,MAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,MAAA,QAAA,EAAS;AACT,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,IACzB,CAAA;AAAA,EASF,GAAG,CAAC,cAAA,EAAgB,OAAA,EAAS,KAAA,EAAO,SAAS,CAAC,CAAA;AAK9C,EAAAA,UAAU,MAAM;AACd,IAAA,gBAAA,CAAiB,OAAA,IAAU;AAAA,EAC7B,CAAA,EAAG,CAAC,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAElC,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAiB;AACpC,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AAC9B,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,IAAA,EAAM,OAAO,CAAA;AAC5B,MAAA,MAAM,IAAA,GAAO,CAAC,CAAA,CAAE,OAAA;AAChB,MAAA,IAAI;AAAE,QAAA,SAAA,CAAU,OAAA,EAAS,SAAA,GAAY,IAAA,EAAM,IAAI,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAC3D,MAAA,OAAO,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,IAAA,EAAK;AAAA,IAC/B,CAAC,CAAC,CAAA;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,OAAA,KAAqB;AACzC,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AAC9B,MAAA,IAAI,CAAA,CAAE,OAAA,KAAY,OAAA,EAAS,OAAO,CAAA;AAClC,MAAA,IAAI;AAAE,QAAA,SAAA,CAAU,OAAA,EAAS,SAAA,GAAY,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAChE,MAAA,OAAO,EAAE,GAAG,CAAA,EAAG,OAAA,EAAQ;AAAA,IACzB,CAAC,CAAC,CAAA;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,IAAA,CAAA,CAAE,KAAA,EAAM;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,MAAA,MAAM,MAAA,GAAS,GAAG,SAAA,IAAY;AAC9B,MAAA,MAAM,MAAA,GAAS,GAAG,SAAA,IAAY;AAC9B,MAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,QAAA,CAAA,CAAE,OAAA;AAAA,UACA,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,UAAG,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,UAC7C,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,UAAG,MAAA,CAAO,OAAO,MAAA,CAAO;AAAA,SAC/C;AAAA,MACF,CAAA,MAAO;AACL,QAAA,CAAA,EAAG,OAAA,IAAU;AAAA,MACf;AACA,MAAA,CAAA,EAAG,MAAA,IAAS;AAAA,IACd,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA;AAOA,EAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAAgB;AAClC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,EAAK,IAAK,UAAA,CAAW,OAAA;AACtC,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA,GAAc,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA;AAC7C,IAAA,MAAM,WAAW,MAAM;AAAE,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IAAM,CAAA;AACpD,IAAA,MAAM,YAAA,GAAe,CAAC,IAAA,EAA0B,IAAA,KAAiB;AAC/D,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,eAAA,CAAgB,OAAA,IAAU;AAC1B,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,EAAS;AAAA,IACX,CAAA;AAEA,IAAA,IAAI,uBAAA,CAAwB,IAAA,CAAK,GAAG,CAAA,EAAG;AACrC,MAAA,IAAI,cAAA,KAAmB,WAAA,KAAgB,YAAA,IAAgB,WAAA,KAAgB,UAAA,CAAA,EAAa;AAClF,QAAA,MAAM,CAAA,GAAI,WAAW,GAAG,CAAA;AACxB,QAAA,IAAI,CAAA,EAAG;AACL,UAAA,oBAAA,CAAqB,GAAG,CAAA;AACxB,UAAA,mBAAA,CAAoB,CAAC,CAAA;AACrB,UAAA,UAAA,CAAW,CAAA,MAAA,EAAI,WAAA,KAAgB,YAAA,GAAe,GAAA,GAAM,GAAG,CAAA,WAAA,EAAc,qBAAA,CAAsB,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA,kDAAA,CAA+C,CAAA;AAAA,QACxJ,CAAA,MAAO;AACL,UAAA,oBAAA,CAAqB,EAAE,CAAA;AACvB,UAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,UAAA,UAAA,CAAW,yBAAyB,CAAA;AAAA,QACtC;AAAA,MACF,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,gEAA2D,CAAA;AAAA,MACxE;AACA,MAAA;AAAA,IACF;AACA,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,IAAA;AAAA,MAAM,KAAK,MAAA;AAAA,MAAQ,KAAK,KAAA;AAAA,MAAO,KAAK,aAAA;AACvC,QAAA,YAAA,CAAa,SAAS,oEAA+D,CAAA;AACrF,QAAA;AAAA,MACF,KAAK,KAAA;AAAA,MAAO,KAAK,KAAA;AAAA,MAAO,KAAK,QAAA;AAAA,MAAU,KAAK,WAAA;AAC1C,QAAA,YAAA,CAAa,QAAQ,sGAAuF,CAAA;AAC5G,QAAA;AAAA;AAAA;AAAA,MAGF,KAAK,GAAA;AAAA,MAAK,KAAK,KAAA;AAAA,MAAO,KAAK,YAAA;AACzB,QAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,QAAA,cAAA,CAAe,YAAY,CAAA;AAC3B,QAAA,UAAA,CAAW,iDAAuC,CAAA;AAClD,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,GAAA;AAAA,MAAK,KAAK,KAAA;AAAA,MAAO,KAAK,UAAA;AACzB,QAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,QAAA,cAAA,CAAe,UAAU,CAAA;AACzB,QAAA,UAAA,CAAW,+CAAqC,CAAA;AAChD,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,IAAA;AAAA,MAAM,KAAK,MAAA;AACd,QAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,QAAA,cAAA,CAAe,MAAM,CAAA;AACrB,QAAA,UAAA,CAAW,2EAAsE,CAAA;AACjF,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,iBAAA,CAAkB,CAAC,cAAc,CAAA;AACjC,QAAA,UAAA,CAAW,cAAA,GAAiB,iBAAiB,qCAAgC,CAAA;AAC7E,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,GAAA;AAAA,MAAK,KAAK,MAAA;AACb,QAAA,cAAA,CAAe,OAAA,IAAU;AACzB,QAAA,UAAA,CAAW,oBAAoB,CAAA;AAC/B,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,GAAA;AAAA,MAAK,KAAK,IAAA;AAAA,MAAM,KAAK,MAAA;AAAA,MAAQ,KAAK,KAAA;AAAA,MAAO,KAAK,aAAA;AACjD,QAAA,eAAA,EAAgB;AAChB,QAAA,UAAA,CAAW,eAAe,CAAA;AAC1B,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,IAAA;AAAA,MAAM,KAAK,OAAA;AAAA,MAAS,KAAK,QAAA;AAC5B,QAAA,aAAA,CAAc,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AACrB,QAAA,UAAA,CAAW,sBAAsB,CAAA;AACjC,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,KAAA;AAAA,MAAO,KAAK,OAAA;AACf,QAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,QAAA,oBAAA,CAAqB,EAAE,CAAA;AACvB,QAAA,eAAA,CAAgB,OAAA,IAAU;AAC1B,QAAA,UAAA,CAAW,sBAAsB,CAAA;AACjC,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,GAAA;AAAA,MAAK,KAAK,MAAA;AACb,QAAA,UAAA,CAAW,YAAY,CAAA;AACvB,QAAA;AAAA,MACF,SAAS;AACP,QAAA,MAAM,OAAA,GAAU,kBAAkB,GAAG,CAAA;AACrC,QAAA,IAAI,OAAA,EAAS,UAAA,CAAW,CAAA,EAAG,OAAO,CAAA,iGAAA,CAA8F,CAAA;AAAA,aAC3H,UAAA,CAAW,CAAA,iBAAA,EAAoB,GAAA,CAAI,WAAA,EAAa,CAAA,8CAAA,CAA2C,CAAA;AAAA,MAClG;AAAA;AACF,EACF,CAAA;AAMA,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,EAAE,gBAAA,IAAoB,CAAA,CAAE,WAAW,CAAA,CAAE,OAAA,IAAW,EAAE,MAAA,EAAQ;AAC9D,MAAA,IAAI,EAAE,GAAA,CAAI,MAAA,KAAW,CAAA,IAAK,CAAA,CAAE,QAAQ,GAAA,EAAK;AACzC,MAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,MAAA,IAAI,CAAA,KAAM,EAAE,OAAA,KAAY,OAAA,IAAW,EAAE,OAAA,KAAY,UAAA,IAAc,EAAE,iBAAA,CAAA,EAAoB;AACrF,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,iBAAiB,CAAA;AAC9C,MAAA,IAAI,OAAA,IAAW,gBAAA,EAAiB,KAAM,OAAA,CAAQ,QAAQ,OAAA,EAAS;AAC/D,MAAA,WAAA,CAAY,SAAS,KAAA,EAAM;AAAA,IAC7B,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAOL,EAAA,MAAM,WAAA,GAAcD,OAAO,QAAQ,CAAA;AACnC,EAAA,MAAM,iBAAA,GAAoBA,OAAO,cAAc,CAAA;AAC/C,EAAAC,UAAU,MAAM;AAAE,IAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAAA,EAAU,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAC/D,EAAAA,UAAU,MAAM;AAAE,IAAA,iBAAA,CAAkB,OAAA,GAAU,cAAA;AAAA,EAAgB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AACjF,EAAAA,UAAU,MAAM;AACd,IAAA,OAAO,+BAA+B,MAAM;AAC1C,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,iBAAiB,CAAA;AAC9C,MAAA,IAAI,CAAC,OAAA,IAAW,gBAAA,OAAuB,OAAA,CAAQ,OAAA,CAAQ,SAAS,OAAO,KAAA;AACvE,MAAA,IAAI,YAAY,OAAA,EAAS;AACvB,QAAA,WAAA,CAAY,EAAE,CAAA;AACd,QAAA,UAAA,CAAW,UAAU,CAAA;AACrB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,QAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,QAAA,UAAA,CAAW,cAAc,CAAA;AACzB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,GAAA,GAAM,6FAAA;AACZ,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAe;AAC/B,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,MAAA;AAClC,IAAA,OAAO,MAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,WAAU,sBAAA,EAC3B,QAAA,EAAA;AAAA,oBAAAA,KAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,aAAA,CAAc,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,UACpC,SAAA,EAAW,GAAA,IAAO,UAAA,GAAa,cAAA,GAAiB,EAAA,CAAA;AAAA,UAChD,KAAA,EAAM,yBAAA;AAAA,UACN,QAAA,EAAU,OAAO,MAAA,KAAW,CAAA;AAAA,UAE5B,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,sMAAA,EAAuM,CAAA,EAAE,CAAA;AAAA,YAAM,SAAA;AAAA,YACjW,OAAO,MAAA,GAAS,CAAA,oBAAKD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EAAgB,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cAAE,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAAA,cAAO,GAAA;AAAA,cAAE,MAAA,CAAO,MAAA;AAAA,cAAO;AAAA,aAAA,EAAC;AAAA;AAAA;AAAA,OACvH;AAAA,sBACAC,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,YAAY,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA,EAAG,WAAW,GAAA,EAAK,KAAA,EAAM,iBAAA,EACjE,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,IAAA,EAAK,QAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAAE,sMAAA,EAAuM,GAAE,CAAA,EACrW,CAAA;AAAA,sBACAD,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,iBAAA,CAAkB,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,UACxC,SAAA,EAAW,GAAA,IAAO,cAAA,GAAiB,cAAA,GAAiB,EAAA,CAAA;AAAA,UACpD,KAAA,EAAO,iBAAiB,sBAAA,GAAyB,iFAAA;AAAA,UAEjD,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC9F,QAAA,EAAA;AAAA,8BAAAC,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,qEAAA,EAAsE,CAAA;AAAA,8BAC3HA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,kBAAA,EAAmB;AAAA,aAAA,EAC1E,CAAA;AAAA,YAAM;AAAA;AAAA;AAAA,OAER;AAAA,MACC,cAAA,oBACCD,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAF,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iGAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,cAAA,CAAe,MAAM,CAAA;AAAA,cACpC,SAAA,EAAW,CAAA,uBAAA,EAA0B,WAAA,KAAgB,MAAA,GAAS,6BAA6B,yCAAyC,CAAA,CAAA;AAAA,cACpI,KAAA,EAAM,uGAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,cAAA,CAAe,YAAY,CAAA;AAAA,cAC1C,SAAA,EAAW,CAAA,uBAAA,EAA0B,WAAA,KAAgB,YAAA,GAAe,6BAA6B,yCAAyC,CAAA,CAAA;AAAA,cAC1I,KAAA,EAAM,8FAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,cAAA,CAAe,UAAU,CAAA;AAAA,cACxC,SAAA,EAAW,CAAA,uBAAA,EAA0B,WAAA,KAAgB,UAAA,GAAa,6BAA6B,yCAAyC,CAAA,CAAA;AAAA,cACxI,KAAA,EAAM,0FAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,cAAA,CAAe,OAAO,CAAA;AAAA,cACrC,SAAA,EAAW,CAAA,uBAAA,EAA0B,WAAA,KAAgB,OAAA,GAAU,6BAA6B,yCAAyC,CAAA,CAAA;AAAA,cACrI,KAAA,EAAM,kFAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF,CAAA;AAAA,QAAA,CAME,WAAA,KAAgB,gBAAgB,WAAA,KAAgB,UAAA,qBAChDD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,SAAA;AAAA,cACV,IAAA,EAAK,KAAA;AAAA,cACL,KAAA,EAAO,iBAAA;AAAA,cACP,WAAA,EAAa,WAAA,KAAgB,YAAA,GAAe,aAAA,GAAW,aAAA;AAAA,cACvD,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,MAAM,GAAA,GAAM,EAAE,MAAA,CAAO,KAAA;AACrB,gBAAA,oBAAA,CAAqB,GAAG,CAAA;AACxB,gBAAA,IAAI,GAAA,CAAI,IAAA,EAAK,KAAM,EAAA,sBAAwB,IAAI,CAAA;AAAA,qBAC1C;AACH,kBAAA,MAAM,CAAA,GAAI,WAAW,GAAG,CAAA;AACxB,kBAAA,mBAAA,CAAoB,OAAO,QAAA,CAAS,CAAC,KAAK,CAAA,KAAM,CAAA,GAAI,IAAI,IAAI,CAAA;AAAA,gBAC9D;AAAA,cACF,CAAA;AAAA,cACA,SAAA,EAAU,wIAAA;AAAA,cACV,KAAA,EAAM;AAAA;AAAA,WACR;AAAA,UACC,gBAAA,KAAqB,wBACpBA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAS,MAAM;AAAE,gBAAA,mBAAA,CAAoB,IAAI,CAAA;AAAG,gBAAA,oBAAA,CAAqB,EAAE,CAAA;AAAA,cAAG,CAAA;AAAA,cACtE,SAAA,EAAU,oDAAA;AAAA,cACV,KAAA,EAAM,sBAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EAEJ;AAAA,OAAA,EAEJ,CAAA;AAAA,MAED,cAAA,IAAkB,eAAA,KAAoB,IAAA,oBACrCD,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,+HAAA;AAAA,UACV,OACE,eAAA,KAAoB,YAAA,GAAe,CAAA,2DAAA,EAAyD,WAAA,KAAgB,SAAS,qCAAA,GAAmC,EAAE,CAAA,CAAA,GACxJ,eAAA,KAAoB,aAAa,CAAA,yDAAA,EAAuD,WAAA,KAAgB,MAAA,GAAS,qCAAA,GAAmC,EAAE,CAAA,CAAA,GACtJ,sDAAA;AAAA,UAGH,QAAA,EAAA;AAAA,YAAA,qBAAA,CAAsB,eAAe,CAAA;AAAA,YACrC,eAAA,KAAoB,YAAA,GAAe,SAAA,GAChC,eAAA,KAAoB,aAAa,SAAA,GACjC;AAAA;AAAA;AAAA,OACN;AAAA,sBAEFC,IAAC,QAAA,EAAA,EAAO,OAAA,EAAS,iBAAiB,SAAA,EAAW,GAAA,EAAK,KAAA,EAAM,qBAAA,EAAsB,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,sBACjFD,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,UAAA,IAAc,qBAAA,EAAuB,WAAW,GAAA,EAC/D,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,0GAAA,EAA2G,CAAA,EAAE,CAAA;AAAA,QAAM;AAAA,OAAA,EAE/Q,CAAA;AAAA,MACC,2BACCD,IAAAA,CAAC,YAAO,OAAA,EAAS,OAAA,EAAS,WAAW,GAAA,EACnC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,wPAAA,EAAyP,CAAA,EAAE,CAAA;AAAA,QAAM;AAAA,OAAA,EAE7Z;AAAA,KAAA,EAEJ,CAAA;AAAA,oBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAIb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAO,EAAG,CAAA;AAAA,MAEjE,UAAA,IAAc,OAAO,MAAA,GAAS,CAAA,oBAC7BD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0IAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mFAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BAClDD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,YAAO,OAAA,EAAS,MAAM,aAAa,IAAI,CAAA,EAAG,SAAA,EAAU,uDAAA,EAAwD,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,4BAChHA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAa,KAAK,CAAA,EAAG,SAAA,EAAU,uDAAA,EAAwD,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,4BAClHA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA,EAAG,SAAA,EAAU,uDAAA,EAAwD,KAAA,EAAM,OAAA,EAAQ,QAAA,EAAA,MAAA,EAAC;AAAA,WAAA,EAChI;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACZ,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,qBACVD,IAAAA,CAAC,OAAA,EAAA,EAAmB,SAAA,EAAU,oEAAA,EAC5B,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,SAAS,CAAA,CAAE,OAAA;AAAA,cACX,QAAA,EAAU,MAAM,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA;AAAA,cAClC,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,iEAAA;AAAA,cACV,OAAO,EAAE,UAAA,EAAY,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA;AAAE;AAAA,WACzC;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,KAAA,EAAO,CAAA,CAAE,WAAA,EAAc,QAAA,EAAA,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,IAAA,EAAK;AAAA,SAAA,EAAA,EAX9E,CAAA,CAAE,IAYd,CACD,CAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,MAGD,QAAA,IAAY,CAAC,OAAA,IAAW,CAAC,yBACxBD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uKAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,mIAAA,EAAoI,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAExS,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACjCD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,8FAAA,EAA+F,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAEnQ,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACjCA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,wBAClBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACjCD,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,UAAA,OAAA;AAAA,0BAAKC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA0B,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,UAAO,KAAA;AAAA,0BAAGA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA0B,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,UAAO;AAAA,SAAA,EAAW;AAAA,OAAA,EAClI,CAAA;AAAA,MAGD,2BACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uFAAsF,QAAA,EAAA,uBAAA,EAAgB,CAAA;AAAA,MAEtH,yBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAA2F,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EAEpH,CAAA;AAAA,oBAKAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACZ,QAAA,EAAA;AAAA,MAAA,OAAA,oBACCC,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0DAAA,EAA2D,KAAA,EAAO,SAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,sBAErGD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+DAAA,EAAgE,QAAA,EAAA,GAAA,EAAI,CAAA;AAAA,wBACpFA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,WAAA;AAAA,YACL,KAAA,EAAO,QAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC3C,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,cAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,cACrB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC7B,gBAAA,IAAI,QAAA,EAAU;AAGZ,kBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,kBAAA,WAAA,CAAY,EAAE,CAAA;AACd,kBAAA,UAAA,CAAW,UAAU,CAAA;AAAA,gBACvB,CAAA,MAAO;AACL,kBAAC,CAAA,CAAE,OAA4B,IAAA,EAAK;AAAA,gBACtC;AAAA,cACF;AAAA,YACF,CAAA;AAAA,YACA,WAAA,EAAY,yDAAA;AAAA,YACZ,UAAA,EAAY,KAAA;AAAA,YACZ,YAAA,EAAa,KAAA;AAAA,YACb,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAaA,IAAM,iBAAA,GAAoB,4DAAA;AAU1B,SAAS,SAAA,CAAU,IAAA,EAAW,KAAA,GAAQ,CAAA,EAAa;AACjD,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,IAAA,CAAK,KAAA,IAAQ,IAAK,CAAA;AAAA,IACtB,MAAM,IAAA,CAAK,OAAA,IAAU,KAAM,KAAA,KAAU,IAAI,MAAA,GAAS,MAAA,CAAA;AAAA,IAClD,UAAA,EAAY,CAAC,CAAC,IAAA,CAAK,UAAA,IAAa;AAAA,IAChC,WAAA,EAAa,IAAA,CAAK,cAAA,IAAiB,IAAK,EAAC;AAAA,IACzC,QAAA,EAAA,CAAW,IAAA,CAAK,aAAA,IAAgB,IAAK,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,SAAA,CAAU,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAC;AAAA,GAClF;AACF;AAGA,SAAS,cAAA,CAAe,MAAgB,GAAA,EAAkB;AACxD,EAAA,GAAA,CAAI,GAAA,CAAI,KAAK,EAAE,CAAA;AACf,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,EAAU,cAAA,CAAe,GAAG,GAAG,CAAA;AACtD;AAGA,SAAS,QAAA,CAAS,IAAS,GAAA,EAAa;AACtC,EAAA,MAAM,CAAA,GAAI,oBAAA,CAAqB,IAAA,CAAK,GAAG,CAAA;AACvC,EAAA,MAAM,IAAI,CAAA,GAAI,QAAA,CAAS,EAAE,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AACnC,EAAA,OAAO,IAAI,EAAA,CAAG,QAAA,CAAU,CAAA,IAAK,EAAA,GAAM,KAAO,CAAA,IAAK,CAAA,GAAK,GAAA,EAAM,CAAA,GAAI,GAAI,CAAA;AACpE;AASA,SAAS,sBAAsB,EAAA,EAAoB;AAGjD,EAAA,IAAI,EAAA,IAAM,KAAM,OAAO,CAAA,EAAA,CAAI,KAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAChD,EAAA,OAAO,CAAA,EAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AACzB;AAEA,SAAS,UAAU,EAAE,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,SAAQ,EAAmB;AACzE,EAAA,MAAM,YAAA,GAAeJ,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,SAAA,GAAYA,OAAY,IAAI,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQA,OAAY,IAAI,CAAA;AAC9B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIE,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,IAAI,CAAA;AAG7C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAA0B,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA,CAAkC,EAAE,CAAA;AACpE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,IAAIA,QAAAA,iBAAsB,IAAI,KAAK,CAAA;AAG3D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,SAAS,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,SAAS,CAAA;AACpD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAS,CAAC,CAAA;AAGpD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AAItD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,KAAK,CAAA;AAGpD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAA0B,GAAG,CAAA;AACnE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAS,GAAG,CAAA;AAC1D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,CAAC,CAAA;AASlD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAA2B,OAAO,CAAA;AACxE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC1E,EAAA,MAAM,UAAA,GAAaF,OAOT,IAAI,CAAA;AAKd,EAAA,MAAM,UAAA,GAAaA,OAMT,IAAI,CAAA;AAGd,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,MAAA,GAAc,IAAA;AAClB,IAAA,IAAI,cAAA,GAAwC,IAAA;AAC5C,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,SAAA,iBAAU,IAAI,KAAK,CAAA;AAEnB,IAAA,CAAC,YAAY;AACX,MAAA,IAAI,EAAA;AACJ,MAAA,IAAI;AACF,QAAA,EAAA,GAAK,MAAM,OAAO,kBAAkB,CAAA;AAAA,MACtC,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,kFAAkF,CAAA;AAC3F,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AACA,QAAA;AAAA,MACF;AACA,MAAA,KAAA,CAAM,OAAA,GAAU,EAAA;AAChB,MAAA,IAAI,SAAA,IAAa,CAAC,YAAA,CAAa,OAAA,EAAS;AAIxC,MAAA,MAAM,IAAI,QAAc,CAAA,OAAA,KAAW;AACjC,QAAA,MAAM,WAAW,MAAM;AACrB,UAAA,MAAM,CAAA,GAAI,YAAA,CAAa,OAAA,EAAS,qBAAA,EAAsB;AACtD,UAAA,IAAI,KAAK,CAAA,CAAE,KAAA,GAAQ,KAAK,CAAA,CAAE,MAAA,GAAS,GAAG,OAAA,EAAQ;AAAA,qCACnB,QAAQ,CAAA;AAAA,QACrC,CAAA;AACA,QAAA,QAAA,EAAS;AAAA,MACX,CAAC,CAAA;AACD,MAAA,IAAI,SAAA,IAAa,CAAC,YAAA,CAAa,OAAA,EAAS;AAExC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAY,OAAO,MAAA,KAAW,WAAA,IAAgB,OAAe,4BAAA,IAC9D,iBAAA;AACL,QAAA,EAAA,CAAG,yBAAyB,QAAQ,CAAA;AAKpC,QAAA,6BAAA,EAA8B;AAE9B,QAAA,MAAA,GAAS,IAAI,EAAA,CAAG,cAAA,CAAe,YAAA,CAAa,OAAA,EAAS;AAAA,UACnD,iBAAiB,IAAI,EAAA,CAAG,UAAU,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAAA,UACpD,cAAc,IAAI,EAAA,CAAG,QAAA,CAAS,GAAA,EAAK,KAAK,GAAG,CAAA;AAAA,UAC3C,YAAA,EAAc,IAAI,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,IAAI,EAAA,CAAG,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,UACnE,eAAe,MAAM;AACnB,YAAA,IAAI,SAAA,EAAW;AACf,YAAA,IAAI;AACF,cAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,IAAW;AAChC,cAAA,MAAM,IAAA,GAAO,OAAO,WAAA,IAAc;AAClC,cAAA,IAAI,IAAA,EAAM;AACR,gBAAA,MAAM,CAAA,GAAI,UAAU,IAAI,CAAA;AACxB,gBAAA,OAAA,CAAQ,CAAC,CAAA;AAET,gBAAA,MAAM,YAAqC,EAAE,CAAC,CAAA,CAAE,EAAE,GAAG,IAAA,EAAK;AAC1D,gBAAA,KAAA,MAAW,KAAK,CAAA,CAAE,QAAA,EAAU,SAAA,CAAU,CAAA,CAAE,EAAE,CAAA,GAAI,IAAA;AAC9C,gBAAA,WAAA,CAAY,SAAS,CAAA;AAAA,cACvB;AAAA,YACF,SAAS,GAAA,EAAK;AAEZ,cAAA,OAAA,CAAQ,IAAA,CAAK,yCAAyC,GAAG,CAAA;AAAA,YAC3D;AACA,YAAA,UAAA,CAAW,KAAK,CAAA;AAAA,UAClB,CAAA;AAAA,UACA,mBAAmB,MAAM;AACvB,YAAA,IAAI,CAAC,SAAA,EAAW;AACd,cAAA,QAAA,CAAS,0BAA0B,CAAA;AACnC,cAAA,UAAA,CAAW,KAAK,CAAA;AAAA,YAClB;AAAA,UACF;AAAA,SACD,CAAA;AACD,QAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAEpB,QAAA,MAAM,SAAA,GAAY,IAAI,EAAA,CAAG,SAAA,CAAU,UAAU,EAAA,CAAG,UAAA,CAAW,KAAK,GAAG,CAAA;AACnE,QAAA,MAAA,CAAO,uBAAA,CAAwB,CAAC,SAAS,CAAC,CAAA;AAO1C,QAAA,IAAI,YAAA,CAAa,OAAA,IAAW,OAAO,cAAA,KAAmB,WAAA,EAAa;AACjE,UAAA,cAAA,GAAiB,IAAI,eAAe,MAAM;AACxC,YAAA,IAAI;AACF,cAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,cAAA,IAAI,CAAA,EAAG,MAAA,EAAoB,CAAA,CAAE,MAAA,EAAO;AAAA,mBAAA,IAC3B,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAQ,CAAA,CAAE,OAAO,MAAA,EAAO;AAC5C,cAAA,CAAA,EAAG,QAAQ,MAAA,IAAS;AAAA,YACtB,CAAA,CAAA,MAAQ;AAAA,YAAC;AAAA,UACX,CAAC,CAAA;AACD,UAAA,cAAA,CAAe,OAAA,CAAQ,aAAa,OAAO,CAAA;AAAA,QAC7C;AAAA,MACF,SAAS,CAAA,EAAQ;AACf,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,CAAA,EAAG,WAAW,0BAA0B,CAAA;AACjD,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,IAAI;AAAE,QAAA,cAAA,EAAgB,UAAA,EAAW;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAC7C,MAAA,IAAI;AAAE,QAAA,MAAA,EAAQ,OAAA,IAAU;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AACpC,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,QAAQ,CAAC,CAAA;AAKlB,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,GAAG,MAAA,EAAQ;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAc;AAC3B,QAAA,IAAI,IAAA,CAAK,UAAU,eAAA,EAAiB;AACpC,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,QAAA,EAAU,oBAAA,IAAwB,IAAA,CAAK,QAAA;AACvD,QAAA,MAAM,MAAA,GAA6B,EAAA,EAAI,EAAA,EAAI,MAAA,IAAU,EAAA,EAAI,MAAA;AACzD,QAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,UAAA,IAAA,CAAK,OAAA,GAAU,CAAC,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAAA,QACnC;AAAA,MACF,CAAA;AACA,MAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,uBAAA,GAA0B,KAAK,CAAA;AACnD,MAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,cAAA,GAAiB,KAAK,CAAA;AAC1C,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,SAAS,GAAA,EAAK;AAEZ,MAAA,OAAA,CAAQ,IAAA,CAAK,sCAAsC,GAAG,CAAA;AAAA,IACxD;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAI,CAAC,CAAA;AAGjB,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,CAAA,EAAG,MAAA,EAAQ;AACvB,IAAA,IAAI;AACF,MAAA,CAAA,CAAE,MAAA,CAAO,eAAA,CAAgB,IAAI,EAAA,CAAG,YAAA,CAAa,SAAA,EAAW,QAAA,CAAS,EAAA,EAAI,SAAS,CAAA,EAAG,aAAa,CAAC,CAAA;AAS/F,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAA,EAAG;AACL,QAAA,MAAM,cAAqB,EAAC;AAC5B,QAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,cAAA,GAAiB,CAAC,IAAA,KAAc;AAClD,UAAA,IAAI,IAAA,CAAK,QAAA,EAAU,eAAA,EAAiB,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,QAC3D,CAAC,CAAA;AACD,QAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,UAAA,CAAA,CAAE,MAAA,EAAQ,OAAO,CAAC,CAAA;AAClB,UAAA,CAAA,CAAE,UAAU,OAAA,IAAU;AACtB,UAAA,CAAA,CAAE,UAAU,OAAA,IAAU;AAAA,QACxB;AACA,QAAA,MAAM,QAAQ,CAAA,CAAE,KAAA;AAChB,QAAA,MAAM,YAAA,GAAe,CAAC,GAAA,KAAa;AACjC,UAAA,IAAI,CAAC,GAAA,IAAO,CAAA,CAAE,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AACtC,UAAA,CAAA,CAAE,aAAA,CAAc,GAAA,CAAI,GAAA,EAAK,EAAE,cAAA,EAAgB,IAAI,cAAA,EAAgB,WAAA,EAAa,GAAA,CAAI,WAAA,EAAa,CAAA;AAC7F,UAAA,GAAA,CAAI,cAAA,GAAiB,CAAC,KAAK,CAAA;AAC3B,UAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,UAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAAA,QACpB,CAAA;AACA,QAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,cAAA,GAAiB,CAAC,IAAA,KAAc;AAClD,UAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,UAAA,IAAI,KAAA,CAAM,QAAQ,GAAG,CAAA,aAAc,CAAA,IAAK,GAAA,eAAkB,CAAC,CAAA;AAAA,4BACzC,GAAG,CAAA;AAAA,QACvB,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA,EAAG,CAAC,SAAA,EAAW,SAAA,EAAW,aAAa,CAAC,CAAA;AAGxC,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,CAAA,EAAG,MAAA,EAAQ;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,EAAA,EAAI,OAAO,CAAA;AAC9B,MAAA,CAAA,CAAE,MAAA,CAAO,kBAAA,CAAmB,IAAI,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAC,CAAA;AAChE,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAcZ,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAA,IAAU,OAAA,EAAS;AAE3B,IAAA,MAAM,QAAA,GAAW,EAAE,MAAA,CAAO,QAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,KAAA;AACvB,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,KAAA,EAAO;AAGzB,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,CAAA,CAAE,aAAA,CAAc,SAAQ,EAAG;AACnD,QAAA,GAAA,CAAI,iBAAiB,IAAA,CAAK,cAAA;AAC1B,QAAA,GAAA,CAAI,cAAc,IAAA,CAAK,WAAA;AACvB,QAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAAA,MACpB;AACA,MAAA,KAAA,MAAW,MAAA,IAAU,EAAE,OAAA,EAAS;AAC9B,QAAA,MAAA,CAAO,MAAA,EAAQ,OAAO,MAAM,CAAA;AAE5B,QAAA,MAAA,CAAO,UAAU,OAAA,IAAU;AAAA,MAC7B;AACA,MAAA,IAAI,EAAE,OAAA,EAAS;AACb,QAAA,KAAA,CAAM,MAAA,CAAO,EAAE,OAAO,CAAA;AACtB,QAAA,CAAA,CAAE,OAAA,CAAQ,UAAU,OAAA,IAAU;AAC9B,QAAA,CAAA,CAAE,OAAA,CAAQ,UAAU,OAAA,IAAU;AAAA,MAChC;AACA,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IACvB;AAEA,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,QAAA,CAAS,oBAAA,GAAuB,KAAA;AAChC,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,cAAA,GAAiB,MAAM,IAAI,CAAA;AACjD,IAAA,IAAI,CAAC,IAAA,EAAM;AAGX,IAAA,MAAM,UAAiB,EAAC;AACxB,IAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,eAAA,GAAkB,CAAC,IAAA,KAAc;AACnD,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,eAAA,EAAiB,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IACxD,CAAC,CAAA;AACD,IAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,MAAA,QAAA,CAAS,oBAAA,GAAuB,KAAA;AAChC,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAClB,MAAA;AAAA,IACF;AAIA,IAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,IAAA,MAAM,OAAO,MAAA,CAAO,WAAA;AACpB,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,EAAU,WAAA;AAClC,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,EAAU,WAAA;AAClC,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,EAAU,UAAA,EAAY,QAAA,EAAU,WAAA;AAC1D,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,YAAY,CAAC,QAAA,IAAY,CAAC,UAAA,EAAY;AAGlD,MAAA,OAAA,CAAQ,KAAK,uEAAuE,CAAA;AAAA,IACtF;AAGA,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,QAAA,GAAW,CAAA,EAAG,UAAA,GAAa,CAAA;AAChD,IAAA,MAAM,iBAAA,GAAoB,KAAK,mBAAA,GAAsB,GAAA;AACrD,IAAA,MAAM,sBAAA,GAAyB,MAAM,sBAAA,GAAyB,IAAA;AAC9D,IAAA,MAAM,gBAAA,GAAmB,IAAA;AAMzB,IAAA,IAAI,UAAA,GAAa,IAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,SAAS,UAAA,IAAa;AACjC,MAAA,MAAM,KAAA,GAAQ,IAAI,oBAAA,IAAuB;AACzC,MAAA,UAAA,GAAa,OAAO,OAAA,KAAY,KAAA;AAIhC,MAAA,QAAA,CAAS,gBAAA,GAAmB,IAAA;AAE5B,MAAA,OAAA,CAAQ,IAAA,CAAK,qCAAA,EAAuC,UAAA,EAAY,WAAA,EAAa,QAAQ,MAAM,CAAA;AAAA,IAC7F,CAAA,CAAA,MAAQ;AAAA,IAAC;AAOT,IAAA,QAAA,CAAS,oBAAA,GAAuB,IAAA;AAYhC,IAAA,MAAM,KAAA,GAAa;AAAA,MACjB,QAAQ,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC5B,QAAA,EAAU;AAAA,KACZ;AACA,IAAA,KAAA,CAAM,KAAA,GAAQ,SAAS,UAAA,GAAsB;AAC3C,MAAA,MAAM,CAAA,GAAS;AAAA,QACb,MAAA,EAAQ,EAAE,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAE;AAAA,QAC/D,UAAU,IAAA,CAAK;AAAA,OACjB;AACA,MAAA,CAAA,CAAE,KAAA,GAAQ,UAAA;AACV,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,UAAiB,EAAC;AACxB,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoD;AAE9E,IAAA,MAAM,eAAA,GAAkB,CAAC,GAAA,KAAa;AACpC,MAAA,IAAI,CAAC,GAAA,IAAO,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AACpC,MAAA,aAAA,CAAc,GAAA,CAAI,KAAK,EAAE,cAAA,EAAgB,IAAI,cAAA,EAAgB,WAAA,EAAa,GAAA,CAAI,WAAA,EAAa,CAAA;AAC3F,MAAA,GAAA,CAAI,cAAA,GAAiB,CAAC,KAAK,CAAA;AAC3B,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAAA,IACpB,CAAA;AAEA,IAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,MAAA,IAAI,KAAA,CAAM,QAAQ,GAAG,CAAA,aAAc,CAAA,IAAK,GAAA,kBAAqB,CAAC,CAAA;AAAA,2BACzC,GAAG,CAAA;AASxB,MAAA,MAAMK,aAAY,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA;AAChD,MAAA,IAAI,IAAA,IAAQ,UAAA,IAAcA,UAAAA,EAAW,KAAA,EAAO;AAC1C,QAAA,MAAM,WAAA,GAAc,CAAC,IAAA,EAAc,EAAA,KAAe;AAChD,UAAA,MAAM,CAAA,GAASA,WAAU,KAAA,EAAM;AAC/B,UAAA,CAAA,CAAE,UAAA,GAAa,KAAA;AACf,UAAA,CAAA,CAAE,SAAA,GAAY,KAAA;AACd,UAAA,CAAA,CAAE,UAAA,GAAa,KAAA;AACf,UAAA,CAAA,CAAE,YAAA,GAAe,IAAA;AACjB,UAAA,CAAA,CAAE,WAAA,GAAc,iBAAA;AAChB,UAAA,CAAA,CAAE,WAAA,GAAc,EAAA;AAChB,UAAA,CAAA,CAAE,YAAA,GAAe,EAAA;AACjB,UAAA,CAAA,CAAE,YAAA,GAAe,EAAA;AACjB,UAAA,CAAA,CAAE,IAAA,GAAO,IAAA;AACT,UAAA,CAAA,CAAE,WAAA,GAAc,KAAA;AAChB,UAAA,CAAA,CAAE,cAAA,GAAiB,CAAC,KAAK,CAAA;AACzB,UAAA,CAAA,CAAE,WAAA,GAAc,IAAA;AAChB,UAAA,CAAA,CAAE,WAAA,GAAc,IAAA;AAChB,UAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,IAAA,CAAK,UAAU,CAAC,CAAA;AACxC,UAAA,MAAA,CAAO,gBAAA,GAAmB,KAAA;AAC1B,UAAA,MAAA,CAAO,WAAA,GAAc,CAAA;AACrB,UAAA,MAAA,CAAO,SAAS,eAAA,GAAkB,IAAA;AAClC,UAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,UAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,QACrB,CAAA;AACA,QAAA,WAAA,CAAY,UAAU,sBAAsB,CAAA;AAC5C,QAAA,WAAA,CAAY,WAAW,sBAAsB,CAAA;AAAA,MAC/C;AAAA,IACF;AAGA,IAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,cAAA,GAAiB,CAAC,IAAA,KAAc;AAClD,MAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,MAAA,IAAI,KAAA,CAAM,QAAQ,GAAG,CAAA,aAAc,CAAA,IAAK,GAAA,kBAAqB,CAAC,CAAA;AAAA,2BACzC,GAAG,CAAA;AAAA,IAC1B,CAAC,CAAA;AAOD,IAAA,IAAI,OAAA,GAAe,IAAA;AACnB,IAAA,MAAM,SAAA,GAAa,QAAQ,CAAC,CAAA,EAAG,aAAa,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAE,QAAQ,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,QAAA,CAAA;AACrH,IAAA,IAAI,UAAA,IAAc,IAAA,IAAQ,QAAA,IAAY,UAAA,IAAc,WAAW,KAAA,EAAO;AACpE,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA;AACjC,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,CAAC,CAAA,GAAI,CAAA;AAC1C,MAAA,MAAM,OAAO,OAAA,GAAU,CAAA;AAEvB,MAAA,MAAM,OAAA,GAAe,IAAI,QAAA,EAAS;AAClC,MAAA,MAAM,SAAA,GAAY,IAAI,YAAA,CAAa;AAAA,QACjC,CAAC,IAAA;AAAA,QAAM,CAAC,IAAA;AAAA,QAAM,CAAA;AAAA,QACb,IAAA;AAAA,QAAM,CAAC,IAAA;AAAA,QAAM,CAAA;AAAA,QACb,IAAA;AAAA,QAAO,IAAA;AAAA,QAAM,CAAA;AAAA,QACd,CAAC,IAAA;AAAA,QAAO,IAAA;AAAA,QAAM;AAAA,OACf,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa;AAAA,QAC/B,CAAA;AAAA,QAAG,CAAA;AAAA,QAAG,CAAA;AAAA,QAAI,CAAA;AAAA,QAAG,CAAA;AAAA,QAAG,CAAA;AAAA,QAAI,CAAA;AAAA,QAAG,CAAA;AAAA,QAAG,CAAA;AAAA,QAAI,CAAA;AAAA,QAAG,CAAA;AAAA,QAAG;AAAA,OACrC,CAAA;AACD,MAAA,OAAA,CAAQ,aAAa,UAAA,EAAY,IAAI,UAAA,CAAW,SAAA,EAAW,CAAC,CAAC,CAAA;AAC7D,MAAA,OAAA,CAAQ,aAAa,QAAA,EAAU,IAAI,UAAA,CAAW,OAAA,EAAS,CAAC,CAAC,CAAA;AACzD,MAAA,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAEnC,MAAA,MAAM,MAAA,GAAc,UAAU,KAAA,EAAM;AAOpC,MAAA,MAAM,cAAA,GAAkB,SAAA,CAAU,KAAA,EAAO,MAAA,IAAS,IAAK,QAAA;AACvD,MAAA,MAAA,CAAO,QAAA,EAAU,SAAS,cAAc,CAAA;AACxC,MAAA,IAAI,mBAAA,IAAuB,MAAA,EAAQ,MAAA,CAAO,iBAAA,GAAoB,IAAA;AAC9D,MAAA,MAAA,CAAO,IAAA,GAAO,UAAA;AACd,MAAA,MAAA,CAAO,WAAA,GAAc,KAAA;AACrB,MAAA,MAAA,CAAO,OAAA,GAAU,CAAA;AACjB,MAAA,MAAA,CAAO,YAAA,GAAe,IAAA;AACtB,MAAA,MAAA,CAAO,UAAA,GAAa,CAAA;AACpB,MAAA,MAAA,CAAO,WAAA,GAAc,mBAAA;AACrB,MAAA,MAAA,CAAO,WAAA,GAAc,gBAAA;AACrB,MAAA,MAAA,CAAO,YAAA,GAAe,gBAAA;AACtB,MAAA,MAAA,CAAO,YAAA,GAAe,gBAAA;AAEtB,MAAA,MAAA,CAAO,iBAAiB,EAAC;AAGzB,MAAA,MAAA,CAAO,aAAA,GAAgB,IAAA;AACvB,MAAA,MAAA,CAAO,mBAAA,GAAsB,EAAA;AAC7B,MAAA,MAAA,CAAO,kBAAA,GAAqB,EAAA;AAC5B,MAAA,MAAA,CAAO,WAAA,GAAc,IAAA;AAErB,MAAA,OAAA,GAAU,IAAI,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AAClC,MAAA,OAAA,CAAQ,WAAA,GAAc,CAAA;AACtB,MAAA,OAAA,CAAQ,SAAS,eAAA,GAAkB,IAAA;AACnC,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB;AAEA,IAAA,UAAA,CAAW,UAAU,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,eAAe,IAAA,EAAK;AAEpE,IAAA,OAAA,CAAQ,KAAK,8BAAA,EAAgC,OAAA,CAAQ,QAAQ,OAAA,EAAS,CAAC,CAAC,OAAO,CAAA;AAC/E,IAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,EACpB,CAAA,EAAG,CAAC,cAAA,EAAgB,OAAA,EAAS,IAAI,CAAC,CAAA;AAGlC,EAAAL,UAAU,MAAM;AACd,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAA,IAAU,CAAC,CAAA,IAAK,CAAC,cAAA,EAAgB;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,MAAA,MAAM,UAAU,WAAA,KAAgB,GAAA,GAAM,CAAA,GAAI,WAAA,KAAgB,MAAM,CAAA,GAAI,CAAA;AACpE,MAAA,MAAM,GAAA,GAAM,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,CAAE,OAAO,CAAA;AACxD,MAAA,MAAM,GAAA,GAAM,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,CAAE,OAAO,CAAA;AACxD,MAAA,MAAM,CAAA,GAAI,GAAA,GAAA,CAAO,GAAA,GAAM,GAAA,IAAO,eAAA;AAM9B,MAAA,MAAM,MAAA,GAAK,YAAA,GAAe,IAAA,CAAK,EAAA,GAAM,GAAA;AACrC,MAAA,MAAM,SAAA,GAAO,KAAK,GAAA,CAAI,MAAC,GAAG,SAAA,GAAO,IAAA,CAAK,IAAI,MAAC,CAAA;AAC3C,MAAA,MAAM,IAAA,GAAO,cAAc,CAAA,CAAA,GAAK,CAAA;AAChC,MAAA,IAAI,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA;AASzB,MAAA,IAAI,gBAAgB,GAAA,EAAU;AAAE,QAAA,EAAA,GAAK,IAAA,GAAO,SAAA;AAAM,QAAA,EAAA,GAAK,IAAA,GAAO,SAAA;AAAA,MAAM,CAAA,MAAA,IAC3D,gBAAgB,GAAA,EAAK;AAAE,QAAA,EAAA,GAAK,IAAA,GAAO,SAAA;AAAM,QAAA,EAAA,GAAK,IAAA,GAAO,SAAA;AAAA,MAAM,CAAA,MACtC;AAAE,QAAA,EAAA,GAAK,IAAA,GAAO,SAAA;AAAM,QAAA,EAAA,GAAK,IAAA,GAAO,SAAA;AAAA,MAAM;AAMpE,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AAAA,QAC/B,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AAAA,QAC/B,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,IAAK;AAAA,OACjC;AACA,MAAA,MAAM,EAAA,GAAK,WAAA,KAAgB,GAAA,GAAM,CAAA,GAAI,MAAA,CAAO,CAAA;AAC5C,MAAA,MAAM,EAAA,GAAK,WAAA,KAAgB,GAAA,GAAM,CAAA,GAAI,MAAA,CAAO,CAAA;AAC5C,MAAA,MAAM,EAAA,GAAK,WAAA,KAAgB,GAAA,GAAM,CAAA,GAAI,MAAA,CAAO,CAAA;AAE5C,MAAA,CAAA,CAAE,KAAA,CAAM,OAAO,CAAA,GAAI,EAAA;AACnB,MAAA,CAAA,CAAE,KAAA,CAAM,OAAO,CAAA,GAAI,EAAA;AACnB,MAAA,CAAA,CAAE,KAAA,CAAM,OAAO,CAAA,GAAI,EAAA;AAGnB,MAAA,CAAA,CAAE,MAAM,QAAA,GAAW,EAAE,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,CAAA;AAI9C,MAAA,IAAI,EAAE,OAAA,EAAS;AACb,QAAA,MAAM,KAAK,MAAA,CAAO,CAAA,EAAG,KAAK,MAAA,CAAO,CAAA,EAAG,KAAK,MAAA,CAAO,CAAA;AAEhD,QAAA,MAAM,IAAA,GAAO,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,EAAE,KAAA,CAAM,QAAA;AACnD,QAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,IAAA;AACrB,QAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,IAAA;AACrB,QAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,IAAA;AACrB,QAAA,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AACjC,QAAA,CAAA,CAAE,QAAQ,MAAA,GAAS,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAAA,MAC9C;AAEA,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,SAAS,GAAA,EAAK;AAEZ,MAAA,OAAA,CAAQ,IAAA,CAAK,mCAAmC,GAAG,CAAA;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,cAAA,EAAgB,aAAa,WAAA,EAAa,eAAA,EAAiB,YAAY,CAAC,CAAA;AAqB5E,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAA,IAAU,OAAA,IAAW,CAAC,aAAa,OAAA,EAAS;AAEpD,IAAA,MAAM,QAAA,GAAW,EAAE,MAAA,CAAO,QAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,KAAA;AAMvB,IAAA,MAAM,SAAwC,QAAA,EAAU,UAAA;AACxD,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,KAAA,IAAS,CAAC,MAAA,EAAQ;AAIpC,IAAA,IAAI,UAAA,GAAkB,IAAA;AACtB,IAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,eAAA,GAAkB,CAAC,CAAA,KAAW;AAChD,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,CAAA,CAAE,QAAA,EAAU,mBAAmB,CAAC,CAAA,CAAE,QAAA,EAAU,eAAA,EAAiB,UAAA,GAAa,CAAA;AAAA,IAChG,CAAC,CAAA;AACD,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,WAAA,GAAc,WAAW,QAAA,CAAS,WAAA;AACxC,IAAA,MAAM,WAAW,UAAA,CAAW,WAAA;AAC5B,IAAA,MAAM,YAAA,GAAA,CAAgB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,GAAI,UAAA,CAAW,QAAA,CAAS,CAAC,CAAA,GAAI,UAAA,CAAW,QAAA,GAAW,WAAA;AAC1G,IAAA,MAAM,YAAA,GAAe,WAAW,QAAA,CAAS,WAAA;AACzC,IAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,QAAA,CAAS,UAAA,EAAY,QAAA,EAAU,WAAA;AACjE,IAAA,IAAI,CAAC,eAAe,CAAC,QAAA,IAAY,CAAC,YAAA,IAAgB,CAAC,YAAA,IAAgB,CAAC,cAAA,EAAgB;AAKpF,IAAA,IAAI,gBAAA,GAAwB,IAAA;AAC5B,IAAA,IAAI,qBAAA,GAA6B,IAAA;AACjC,IAAA,KAAA,CAAM,QAAA,CAAS,CAAC,GAAA,KAAa;AAC3B,MAAA,IAAI,oBAAoB,qBAAA,EAAuB;AAC/C,MAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AAC1B,MAAA,gBAAA,GAAmB,GAAA,CAAI,WAAA;AACvB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,IAAI,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,GAAI,GAAA,CAAI,QAAA;AAChE,MAAA,IAAI,GAAA,EAAK,WAAA,EAAa,qBAAA,GAAwB,GAAA,CAAI,WAAA;AAAA,IACpD,CAAC,CAAA;AAGD,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,CAAA,CAAE,KAAA,KAAU,IAAA,EAAM,oBAAA,CAAqB,EAAE,KAAK,CAAA;AAClD,MAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,QAAA,KAAA,CAAM,OAAO,CAAC,CAAA;AACd,QAAA,CAAA,CAAE,UAAU,OAAA,IAAU;AACtB,QAAA,CAAA,CAAE,UAAU,OAAA,IAAU;AAAA,MACxB;AACA,MAAA,IAAI,EAAE,IAAA,EAAM;AACV,QAAA,KAAA,CAAM,MAAA,CAAO,EAAE,IAAI,CAAA;AACnB,QAAA,CAAA,CAAE,IAAA,CAAK,UAAU,OAAA,IAAU;AAC3B,QAAA,CAAA,CAAE,IAAA,CAAK,UAAU,OAAA,IAAU;AAAA,MAC7B;AACA,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA,CAAM,aAAA,IAAiB,KAAA,CAAM,aAAA,CAAc,WAAA,CAAY,CAAA,CAAE,KAAK,CAAA;AAC/E,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,CAAA;AAEA,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,QAAA,EAAS;AACT,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA;AAAA,IACF;AAGA,IAAA,UAAA,CAAW,UAAU,EAAE,MAAA,EAAQ,EAAC,EAAG,SAAS,EAAC,EAAG,OAAA,EAAS,IAAI,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAK;AAMlG,IAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,IAAA,MAAM,gBAAA,GAAmB,EAAA,EAAI,gBAAA,EAAkB,QAAA,IAAY,CAAA;AAI3D,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,cAAA,GAAiB,MAAM,IAAI,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,OACT,IAAA,CAAK,IAAA;AAAA,MAAA,CACF,KAAK,GAAA,CAAI,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,KAAM,KAC5B,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAA,CAC5B,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,KAAM;AAAA,KAC/B,GACA,GAAA;AACJ,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,MAAO,GAAG,CAAA;AAE/C,IAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAe;AAEjC,MAAA,MAAM,SAAA,GAAY,IAAI,UAAA,GAAa,EAAA;AACnC,MAAA,MAAM,YAAsB,EAAC;AAC7B,MAAA,MAAM,UAAoB,EAAC;AAC3B,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,IAAM,UAAA,EAAY,EAAA,EAAA,EAAM;AACvC,QAAA,MAAMM,KAAI,EAAA,GAAK,UAAA;AACf,QAAA,MAAM,GAAA,GAAMA,KAAI,IAAA,CAAK,EAAA;AACrB,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,IAAM,SAAA,EAAW,EAAA,EAAA,EAAM;AACtC,UAAA,MAAM,IAAI,EAAA,GAAK,SAAA;AACf,UAAA,MAAM,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,CAAA;AAC5B,UAAA,SAAA,CAAU,IAAA;AAAA,YACR,eAAe,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,YAC7C,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAAA,YAC3B,eAAe,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,KAAK;AAAA,WAC/C;AAAA,QACF;AAAA,MACF;AACA,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,UAAA,EAAY,EAAA,EAAA,EAAM;AACtC,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,SAAA,EAAW,EAAA,EAAA,EAAM;AACrC,UAAA,MAAM,CAAA,GAAI,EAAA,IAAM,SAAA,GAAY,CAAA,CAAA,GAAK,EAAA;AACjC,UAAA,MAAM,CAAA,GAAI,IAAI,SAAA,GAAY,CAAA;AAC1B,UAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAAA,QAC3C;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAI,YAAA,EAAa;AAC9B,MAAA,IAAA,CAAK,YAAA,CAAa,YAAY,IAAI,cAAA,CAAe,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG,CAAC,CAAC,CAAA;AAChF,MAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AACrB,MAAA,IAAA,CAAK,oBAAA,IAAuB;AAC5B,MAAA,MAAM,GAAA,GAAW,IAAI,YAAA,EAAa;AAClC,MAAA,GAAA,CAAI,KAAA,EAAO,SAAS,QAAQ,CAAA;AAC5B,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,UAAA,GAAa,KAAA;AACjB,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,MAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AACd,MAAA,MAAM,IAAA,GAAY,IAAI,QAAA,CAAS,IAAA,EAAM,GAAG,CAAA;AACxC,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,KAAK,CAAA;AACxB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,SAAS,eAAA,GAAkB,IAAA;AAChC,MAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAcA,IAAA,MAAM,kBAAA,GAAqB,CAAC,IAAA,EAAW,GAAA,KAAyB;AAC9D,MAAA,MAAM,OAAO,IAAA,EAAM,QAAA;AACnB,MAAA,MAAM,OAAA,GAAU,MAAM,UAAA,EAAY,QAAA;AAClC,MAAA,IAAI,CAAC,QAAQ,CAAC,OAAA,IAAW,CAAC,GAAA,EAAK,IAAA,EAAM,QAAQ,OAAO,IAAA;AACpD,MAAA,MAAM,YAA+B,OAAA,CAAQ,KAAA;AAC7C,MAAA,MAAM,OAAA,GAAoC,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,MAAM,KAAA,GAAQ,IAAA;AAG1E,MAAA,MAAM,UAAA,GAAa,IAAI,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA;AACxE,MAAA,IAAA,CAAK,eAAe,UAAU,CAAA;AAC9B,MAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,MAAA;AAEpB,MAAA,MAAM,MAAA,GAAS,EAAE,EAAA,CAAG,CAAA,GAAI,UAAA,CAAW,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,UAAA,CAAW,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,UAAA,CAAW,CAAA,CAAA;AAI/E,MAAA,IAAA,CAAK,kBAAA,IAAqB;AAC1B,MAAA,MAAM,KAAK,IAAA,CAAK,WAAA;AAChB,MAAA,MAAMC,KAAAA,GAAO,EAAA,GACT,IAAA,CAAK,IAAA,CAAA,CAAM,EAAA,CAAG,IAAI,CAAA,GAAI,EAAA,CAAG,GAAA,CAAI,CAAA,KAAM,CAAA,GAAA,CAAK,EAAA,CAAG,IAAI,CAAA,GAAI,EAAA,CAAG,GAAA,CAAI,CAAA,KAAM,CAAA,GAAA,CAAK,EAAA,CAAG,GAAA,CAAI,CAAA,GAAI,EAAA,CAAG,GAAA,CAAI,CAAA,KAAM,CAAC,CAAA,GAC9F,GAAA;AACJ,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAIA,KAAAA,GAAO,MAAO,IAAK,CAAA;AAC9C,MAAA,MAAM,UAAA,GAAa,MAAA;AAEnB,MAAA,MAAM,WAAW,OAAA,GAAU,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,QAAQ,KAAA,GAAQ,CAAA;AAChE,MAAA,MAAM,UAAoB,EAAC;AAK3B,MAAA,MAAM,IAAA,GAAO,IAAI,WAAA,EAAY;AAE7B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,QAAA,MAAM,KAAK,OAAA,GAAU,OAAA,CAAQ,CAAA,GAAI,CAAC,IAAQ,CAAA,GAAI,CAAA;AAC9C,QAAA,MAAM,EAAA,GAAK,UAAU,OAAA,CAAQ,CAAA,GAAI,IAAI,CAAC,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAClD,QAAA,MAAM,EAAA,GAAK,UAAU,OAAA,CAAQ,CAAA,GAAI,IAAI,CAAC,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAClD,QAAA,MAAM,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,CAAC,GAAO,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,IAAI,CAAC,CAAA;AACvF,QAAA,MAAM,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,CAAC,GAAO,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,IAAI,CAAC,CAAA;AACvF,QAAA,MAAM,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,CAAC,GAAO,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,GAAK,SAAA,CAAU,EAAA,GAAK,IAAI,CAAC,CAAA;AAEvF,QAAA,MAAM,KAAK,EAAA,GAAK,EAAA,EAAI,KAAK,EAAA,GAAK,EAAA,EAAI,KAAK,EAAA,GAAK,EAAA;AAC5C,QAAA,MAAM,KAAK,EAAA,GAAK,EAAA,EAAI,KAAK,EAAA,GAAK,EAAA,EAAI,KAAK,EAAA,GAAK,EAAA;AAC5C,QAAA,IAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AACxB,QAAA,IAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AACxB,QAAA,IAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AACxB,QAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAClD,QAAA,IAAI,SAAS,CAAA,EAAG;AAChB,QAAA,EAAA,IAAM,IAAA;AAAM,QAAA,EAAA,IAAM,IAAA;AAAM,QAAA,EAAA,IAAM,IAAA;AAG9B,QAAA,MAAM,IAAA,GAAO,KAAK,EAAA,CAAG,CAAA,GAAI,KAAK,EAAA,CAAG,CAAA,GAAI,KAAK,EAAA,CAAG,CAAA;AAC7C,QAAA,IAAI,OAAO,UAAA,EAAY;AAGvB,QAAA,MAAM,GAAA,GAAA,CAAO,EAAA,GAAK,EAAA,GAAK,EAAA,IAAM,CAAA,EAAG,GAAA,GAAA,CAAO,EAAA,GAAK,EAAA,GAAK,EAAA,IAAM,CAAA,EAAG,GAAA,GAAA,CAAO,EAAA,GAAK,KAAK,EAAA,IAAM,CAAA;AACjF,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,CAAA,GAAI,GAAA,GAAM,EAAA,CAAG,CAAA,GAAI,GAAA,GAAM,EAAA,CAAG,CAAA,GAAI,GAAA,GAAM,MAAM,CAAA;AACnE,QAAA,IAAI,OAAO,SAAA,EAAW;AAGtB,QAAA,KAAA,MAAW,CAAC,KAAK,GAAA,EAAK,GAAG,KAAK,CAAC,CAAC,IAAI,EAAA,EAAI,EAAE,GAAG,CAAC,EAAA,EAAI,IAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAC,CAAA,EAAG;AACxE,UAAA,IAAA,CAAK,GAAA,GAAM,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AACxB,UAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AACxB,UAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,QACrC;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEjC,MAAA,MAAM,KAAA,GAAQ,IAAI,YAAA,EAAa;AAC/B,MAAA,KAAA,CAAM,YAAA,CAAa,YAAY,IAAI,cAAA,CAAe,IAAI,YAAA,CAAa,OAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AAC/E,MAAA,KAAA,CAAM,oBAAA,IAAuB;AAE7B,MAAA,MAAM,IAAA,GAAY,IAAI,YAAA,EAAa;AACnC,MAAA,IAAA,CAAK,KAAA,EAAO,SAAS,QAAQ,CAAA;AAC7B,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,MAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAIlB,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA,IAAA,CAAK,mBAAA,GAAsB,EAAA;AAC3B,MAAA,IAAA,CAAK,kBAAA,GAAqB,EAAA;AAE1B,MAAA,MAAM,SAAA,GAAiB,IAAI,QAAA,CAAS,KAAA,EAAO,IAAI,CAAA;AAC/C,MAAA,SAAA,CAAU,WAAA,GAAc,IAAA;AACxB,MAAA,SAAA,CAAU,SAAS,eAAA,GAAkB,IAAA;AACrC,MAAA,KAAA,CAAM,IAAI,SAAS,CAAA;AACnB,MAAA,OAAO,SAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,CAAC,CAAA,EAAQ,CAAA,KAAW;AACnC,MAAA,MAAM,IAAA,GAAO,IAAI,YAAA,EAAa;AAC9B,MAAA,IAAA,CAAK,YAAA,CAAa,YAAY,IAAI,cAAA,CAAe,IAAI,YAAA,CAAa,CAAC,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAKrG,MAAA,MAAM,WAAW,gBAAA,IAAoB,QAAA;AACrC,MAAA,MAAM,cAAc,qBAAA,IAAyB,YAAA;AAC7C,MAAA,MAAM,GAAA,GAAW,IAAI,WAAA,CAAY,EAAE,OAAO,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAC3H,MAAA,MAAM,IAAA,GAAY,IAAI,QAAA,CAAS,IAAA,EAAM,GAAG,CAAA;AACxC,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,SAAS,eAAA,GAAkB,IAAA;AAChC,MAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA,CAAE,KAAA;AACtB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,MAAA,EAAA,CAAG,MAAM,QAAA,GAAW,UAAA;AAGpB,MAAA,EAAA,CAAG,MAAM,IAAA,GAAO,SAAA;AAChB,MAAA,EAAA,CAAG,MAAM,GAAA,GAAM,SAAA;AACf,MAAA,EAAA,CAAG,MAAM,SAAA,GAAY,uBAAA;AACrB,MAAA,EAAA,CAAG,MAAM,OAAA,GAAU,SAAA;AACnB,MAAA,EAAA,CAAG,MAAM,QAAA,GAAW,MAAA;AACpB,MAAA,EAAA,CAAG,MAAM,UAAA,GAAa,KAAA;AACtB,MAAA,EAAA,CAAG,MAAM,UAAA,GAAa,sCAAA;AACtB,MAAA,EAAA,CAAG,MAAM,UAAA,GAAa,yBAAA;AACtB,MAAA,EAAA,CAAG,MAAM,KAAA,GAAQ,MAAA;AACjB,MAAA,EAAA,CAAG,MAAM,YAAA,GAAe,KAAA;AACxB,MAAA,EAAA,CAAG,MAAM,aAAA,GAAgB,MAAA;AACzB,MAAA,EAAA,CAAG,MAAM,UAAA,GAAa,QAAA;AACtB,MAAA,EAAA,CAAG,MAAM,SAAA,GAAY,4BAAA;AACrB,MAAA,EAAA,CAAG,MAAM,MAAA,GAAS,GAAA;AAClB,MAAA,YAAA,CAAa,OAAA,CAAS,YAAY,EAAE,CAAA;AACpC,MAAA,CAAA,CAAE,KAAA,GAAQ,EAAA;AACV,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,KAAK,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA,IAAK,CAAC,EAAE,KAAA,EAAO;AAE3C,MAAA,MAAM,MAAA,GAAS,EAAE,MAAA,CAAO,MAAA;AACxB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,CAAC,GAAG,CAAA,GAAI,CAAA,CAAE,OAAO,CAAC,CAAA;AACrC,MAAA,MAAM,MAAM,IAAI,WAAA,CAAA,CAAa,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA,EAAA,CAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA,EAAA,CAAI,EAAE,CAAA,GAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAE7E,MAAA,MAAM,SAAA,GAAY,IAAI,KAAA,EAAM;AAC5B,MAAA,SAAA,CAAU,UAAU,MAAM,CAAA;AAC1B,MAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,MAAA,MAAM,CAAA,GAAA,CAAM,SAAA,CAAU,CAAA,GAAI,CAAA,IAAK,IAAK,IAAA,CAAK,KAAA;AACzC,MAAA,MAAM,KAAM,CAAC,SAAA,CAAU,CAAA,GAAI,CAAA,IAAK,IAAK,IAAA,CAAK,MAAA;AAC1C,MAAA,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AACzB,MAAA,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AAKxB,MAAA,MAAM,SAAA,GAAY,IAAI,CAAA,IAAK,CAAA,GAAI,KAAK,CAAA,GAAI,IAAA,CAAK,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,MAAA;AAC/D,MAAA,CAAA,CAAE,MAAM,KAAA,CAAM,OAAA,GAAW,UAAU,CAAA,GAAI,CAAA,IAAK,YAAa,GAAA,GAAM,GAAA;AAAA,IACjE,CAAA;AAKA,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,WAAA,EAAY;AACZ,MAAA,CAAA,CAAE,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AAAA,IACtC,CAAA;AACA,IAAA,UAAA,CAAW,OAAA,CAAQ,KAAA,GAAQ,qBAAA,CAAsB,IAAI,CAAA;AASrD,IAAA,MAAM,QAAA,GAAW,CAAA;AACjB,IAAA,MAAM,SAAA,GAAY,GAAA;AAClB,IAAA,IAAI,KAAA,GAAQ,GAAG,KAAA,GAAQ,CAAA,EAAG,WAAW,CAAA,EAAG,QAAA,GAAW,OAAO,UAAA,GAAa,KAAA;AAMvE,IAAA,MAAM,kBAAA,GAAqB,CAAC,GAAA,KAAyD;AACnF,MAAA,MAAM,EAAA,GAAK,KAAK,IAAA,EAAM,MAAA;AACtB,MAAA,MAAM,MAAM,GAAA,EAAK,MAAA;AACjB,MAAA,IAAI,CAAC,EAAA,IAAM,CAAC,GAAA,EAAK,OAAO,IAAA;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,CAAY,EAAA,CAAG,GAAG,EAAA,CAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAG9C,QAAA,KAAA,CAAM,kBAAA,GAAqB,IAAI,WAAW,CAAA;AAC1C,QAAA,OAAO,EAAE,GAAG,KAAA,CAAM,CAAA,EAAG,GAAG,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,CAAA,EAAE;AAAA,MAC9C,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,EAAE,GAAG,EAAA,CAAG,CAAA,EAAG,GAAG,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAE;AAAA,MACrC;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,EAAA,KAAqB;AAG1C,MAAA,IAAI,CAAC,CAAA,CAAE,MAAA,CAAO,MAAA,EAAQ;AACtB,MAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,CAAA,EAAG,EAAA,CAAG,OAAA,GAAU,IAAA,CAAK,IAAA;AAAA,QACrB,CAAA,EAAG,EAAA,CAAG,OAAA,GAAU,IAAA,CAAK;AAAA,OACvB;AACA,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,CAAO,6BAAA,GAAgC,kBAAkB,WAAW,CAAA;AAClF,MAAA,IAAI,CAAC,GAAA,EAAK;AAEV,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA;AACnE,MAAA,MAAM,MAAA,GAAS,mBAAmB,GAAG,CAAA;AAGrC,MAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACzB,QAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,UAAA,KAAA,CAAM,OAAO,CAAC,CAAA;AACd,UAAA,CAAA,CAAE,UAAU,OAAA,IAAU;AACtB,UAAA,CAAA,CAAE,UAAU,OAAA,IAAU;AAAA,QACxB;AACA,QAAA,IAAI,EAAE,IAAA,EAAM;AACV,UAAA,KAAA,CAAM,MAAA,CAAO,EAAE,IAAI,CAAA;AACnB,UAAA,CAAA,CAAE,IAAA,CAAK,UAAU,OAAA,IAAU;AAC3B,UAAA,CAAA,CAAE,IAAA,CAAK,UAAU,OAAA,IAAU;AAAA,QAC7B;AACA,QAAA,IAAI,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,MAAM,OAAA,GAAU,GAAA;AACrC,QAAA,CAAA,CAAE,SAAS,EAAC;AAAG,QAAA,CAAA,CAAE,UAAU,EAAC;AAAG,QAAA,CAAA,CAAE,IAAA,GAAO,IAAA;AACxC,QAAA,CAAA,CAAE,UAAU,EAAC;AACb,QAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,MACzB;AAEA,MAAA,CAAA,CAAE,MAAA,CAAO,KAAK,KAAK,CAAA;AACnB,MAAA,CAAA,CAAE,OAAA,CAAQ,KAAK,MAAM,CAAA;AAMrB,MAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,QAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,GAAA,CAAI,MAAA,EAAQ,GAAG,CAAA;AACpD,QAAA,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,SAAA,IAAa,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,MAC/C,CAAA,MAAO;AACL,QAAA,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,MAClC;AAEA,MAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACzB,QAAA,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA;AACpB,QAAA,IAAI,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA;AAElB,QAAA,IAAI,IAAA;AACJ,QAAA,IAAI,MAAA,GAAS,EAAA;AAEb,QAAA,IAAI,gBAAgB,MAAA,EAAQ;AAS1B,UAAA,MAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,QAAQ,CAAC,CAAA;AACxC,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,KAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AAC9E,YAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,GAAA,EAAK,EAAA,GAAK,KAAK,CAAA,GAAI,GAAA,EAAK,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,GAAA;AAC1D,YAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAKnD,YAAA,MAAM,IAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACtC,YAAA,MAAM,UAAA,GAAa,IAAI,WAAA,CAAY,CAAA,CAAE,IAAI,EAAA,GAAK,IAAA,EAAM,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,IAAA,EAAM,CAAA,CAAE,CAAA,GAAI,KAAK,IAAI,CAAA;AAGpF,YAAA,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,GAAI,UAAA;AACd,YAAA,CAAA,GAAI,UAAA;AACJ,YAAA,IAAA,GAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AACpB,YAAA,MAAA,GAAS,SAAA;AAAA,UACX,CAAA,MAAO;AACL,YAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AACnD,YAAA,IAAA,GAAO,KAAK,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAAA,UAC9C;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AACnD,UAAA,IAAA,GAAO,KAAK,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAAA,QAC9C;AAEA,QAAA,CAAA,CAAE,IAAA,GAAO,QAAA,CAAS,CAAA,EAAG,CAAC,CAAA;AACtB,QAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,QAAA,MAAM,QAAQ,WAAA,EAAY;AAC1B,QAAA,KAAA,CAAM,cAAc,CAAA,EAAG,qBAAA,CAAsB,IAAI,CAAC,GAAG,MAAM,CAAA,CAAA;AAAA,MAC7D;AAEA,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,EAAA,KAAqB;AAG1C,MAAA,IAAI,EAAA,CAAG,WAAW,CAAA,EAAG;AACrB,MAAA,KAAA,GAAQ,EAAA,CAAG,OAAA;AACX,MAAA,KAAA,GAAQ,EAAA,CAAG,OAAA;AACX,MAAA,QAAA,GAAW,YAAY,GAAA,EAAI;AAC3B,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,UAAA,GAAa,IAAA;AAAA,IAEf,CAAA;AACA,IAAA,MAAM,aAAA,GAAgB,CAAC,EAAA,KAAqB;AAC1C,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,MAAM,KAAK,EAAA,CAAG,OAAA,GAAU,KAAA,EAAO,EAAA,GAAK,GAAG,OAAA,GAAU,KAAA;AACjD,MAAA,IAAI,KAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,QAAA,GAAW,UAAU,QAAA,GAAW,IAAA;AAAA,IAC1D,CAAA;AACA,IAAA,MAAM,WAAA,GAAc,CAAC,EAAA,KAAqB;AACxC,MAAA,IAAI,EAAA,CAAG,MAAA,KAAW,CAAA,IAAK,CAAC,UAAA,EAAY;AACpC,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,EAAI,GAAI,QAAA;AACpC,MAAA,MAAM,QAAA,GAAW,CAAC,QAAA,IAAY,OAAA,GAAU,SAAA;AACxC,MAAA,UAAA,GAAa,KAAA;AACb,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,aAAA,CAAc,EAAE,CAAA;AAAA,IAClB,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KAAsB;AACvC,MAAA,IAAI,EAAA,CAAG,GAAA,KAAQ,QAAA,EAAU,iBAAA,CAAkB,KAAK,CAAA;AAAA,IAClD,CAAA;AAEA,IAAA,MAAA,CAAO,MAAM,MAAA,GAAS,WAAA;AAGtB,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACpD,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACpD,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAChD,IAAA,MAAA,CAAO,gBAAA,CAAiB,iBAAiB,WAAW,CAAA;AACpD,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAE5C,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,MAAM,MAAA,GAAS,EAAA;AACtB,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACnD,MAAA,MAAA,CAAO,mBAAA,CAAoB,iBAAiB,WAAW,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC/C,MAAA,QAAA,EAAS;AACT,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,IACzB,CAAA;AAAA,EACF,GAAG,CAAC,cAAA,EAAgB,WAAA,EAAa,OAAA,EAAS,IAAI,CAAC,CAAA;AAG/C,EAAAP,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AAC1B,IAAA,MAAM,IAAI,UAAA,CAAW,MAAM,WAAA,CAAY,KAAK,GAAG,GAAI,CAAA;AACnD,IAAA,OAAO,MAAM,aAAa,CAAC,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAEtB,EAAA,MAAM,iBAAA,GAAoB,CAAC,IAAA,KAAmB;AAC5C,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,IAAA,cAAA,CAAe,MAAM,GAAG,CAAA;AACxB,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ;AAChB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AAEzB,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,GAAG,CAAA,CAAE,IAAA,CAAK,CAAA,EAAA,KAAM,CAAC,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA;AACpD,MAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,QAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAAA,aACtB,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,MACrB;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,EAAA,KAAe;AACrC,IAAA,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,CAAC,EAAE,GAAG,CAAC,IAAA,CAAK,EAAE,CAAA,EAAE,CAAE,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAmB;AAGlC,IAAA,SAAA,EAAU;AAEL,EACP,CAAA;AAEA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,MAAA,MAAM,MAAA,GAAS,CAAA,EAAG,MAAA,EAAQ,iBAAA,GAAoB,MAAM,IAAI,CAAA;AACxD,MAAA,IAAI,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,iBAAA,CAAkB,QAAQ,IAAI,CAAA;AACnD,MAAA,CAAA,EAAG,QAAQ,MAAA,IAAS;AAAA,IACtB,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA;AAIA,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,CAAA,EAAG,UAAU,OAAA,EAAS;AAClC,IAAA,IAAI;AACF,MAAA,CAAA,CAAE,MAAA,CAAO,kBAAkB,WAAA,GAAc,EAAA,CAAG,eAAe,WAAA,GAAc,EAAA,CAAG,eAAe,YAAY,CAAA;AAAA,IACzG,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA,EAAG,CAAC,WAAA,EAAa,OAAO,CAAC,CAAA;AAGzB,EAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,KAA6C;AACpE,IAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,CAAA,EAAG,MAAA,EAAQ;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,CAAO,iBAAA,GAAoB,MAAM,IAAI,CAAA;AACtD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AACjB,MAAA,MAAM,CAAA,GAAI,OAAO,MAAA,IAAU,CAAA;AAC3B,MAAA,MAAM,OAAO,CAAA,GAAI,CAAA;AACjB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,IAAK,CAAA,EAAG,EAAA,GAAK,EAAE,CAAA,IAAK,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA,IAAK,CAAA;AAChD,MAAA,IAAI,GAAA,EAAU,EAAA;AACd,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,KAAA;AAAS,UAAA,GAAA,GAAM,IAAI,EAAA,CAAG,OAAA,CAAQ,EAAA,EAAI,EAAA,EAAI,KAAK,IAAI,CAAA;AAAG,UAAA,EAAA,GAAK,IAAI,EAAA,CAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,UAAA;AAAA,QACrF,KAAK,OAAA;AAAS,UAAA,GAAA,GAAM,IAAI,EAAA,CAAG,OAAA,CAAQ,EAAA,EAAI,EAAA,GAAK,MAAM,EAAE,CAAA;AAAG,UAAA,EAAA,GAAK,IAAI,EAAA,CAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,UAAA;AAAA,QACrF,KAAK,MAAA;AAAS,UAAA,GAAA,GAAM,IAAI,EAAA,CAAG,OAAA,CAAQ,EAAA,GAAK,IAAA,EAAM,IAAI,EAAE,CAAA;AAAG,UAAA,EAAA,GAAK,IAAI,EAAA,CAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,UAAA;AAAA,QACrF,KAAK,KAAA;AAAA,QACL,SAAS;AACP,UAAA,MAAM,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAC5B,UAAA,GAAA,GAAM,IAAI,GAAG,OAAA,CAAQ,EAAA,GAAK,GAAG,EAAA,GAAK,CAAA,EAAG,KAAK,CAAC,CAAA;AAC3C,UAAA,EAAA,GAAK,IAAI,EAAA,CAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3B,UAAA;AAAA,QACF;AAAA;AAEF,MAAA,MAAM,SAAS,IAAI,EAAA,CAAG,OAAA,CAAQ,EAAA,EAAI,IAAI,EAAE,CAAA;AACxC,MAAA,MAAM,MAAM,IAAI,EAAA,CAAG,OAAO,GAAA,EAAK,MAAA,EAAQ,IAAI,EAAE,CAAA;AAC7C,MAAA,CAAA,CAAE,MAAA,CAAO,UAAU,GAAG,CAAA;AACtB,MAAA,CAAA,CAAE,MAAA,CAAO,+BAA+B,MAAM,CAAA;AAC9C,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,MAAA,MAAM,IAAA,GAAO,GAAG,MAAA,EAAQ,aAAA,QAAqB,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AACxE,MAAA,MAAM,OAAA,GAAU,GAAG,MAAA,EAAQ,iBAAA,GAAoB,KAAK,KAAA,EAAO,IAAA,CAAK,QAAQ,KAAK,CAAA;AAC7E,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,OAAA;AACT,MAAA,CAAA,CAAE,WAAW,CAAA,EAAG,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAC,CAAA,aAAA,CAAA;AAChD,MAAA,CAAA,CAAE,KAAA,EAAM;AAAA,IACV,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,UAAA,CAAW,SAAS,CAAA;AACpB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,YAAA,CAAa,SAAS,CAAA;AACtB,IAAA,gBAAA,CAAiB,CAAC,CAAA;AAClB,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,cAAA,CAAe,GAAG,CAAA;AAClB,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,kBAAA,CAAmB,GAAG,CAAA;AACtB,IAAA,eAAA,CAAgB,CAAC,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,IAAA,CAAA,CAAE,KAAA,EAAM;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,GAAA,GAAA,CAAO,SAAS,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI,IAAK,IAAI,WAAA,EAAY;AAG1D,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,EAAgB,KAAA,GAAQ,CAAA,KAAuB;AACrE,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA,KAAM,KAAA;AACzC,IAAA,MAAM,SAAA,GAAY,CAAC,MAAA,CAAO,GAAA,CAAI,KAAK,EAAE,CAAA;AACrC,IAAA,uBACEE,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,sGAAA;AAAA,UACV,OAAO,EAAE,WAAA,EAAa,GAAG,KAAA,GAAQ,EAAA,GAAK,CAAC,CAAA,EAAA,CAAA,EAAK;AAAA,UAE3C,QAAA,EAAA;AAAA,YAAA,WAAA,mBACCC,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,cAAA,CAAe,IAAA,CAAK,EAAE,CAAA;AAAA,gBACrC,SAAA,EAAU,qFAAA;AAAA,gBACV,KAAA,EAAO,aAAa,UAAA,GAAa,QAAA;AAAA,gBAEjC,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,MAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAC1F,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAAG,UAAA,GAAa,6BAAA,GAAgC,2BAAA,EAA6B,CAAA,EAClI;AAAA;AAAA,aACF,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAmC,CAAA,EACrD,CAAA;AAAA,4BAEFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,gBAAA,EAAmB,SAAA,GAAY,EAAA,GAAK,YAAY,CAAA,CAAA,EAAI,KAAA,EAAO,IAAA,CAAK,IAAA,EAAO,eAAK,IAAA,EAAK,CAAA;AAAA,4BAClGA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,OAAA,CAAY,CAAA;AAAA,gBAC3B,SAAA,EAAU,yGAAA;AAAA,gBACV,KAAA,EAAM,aAAA;AAAA,gBAEN,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAc,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC9F,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,uJAAA,EAAwJ,CAAA,EAC/M;AAAA;AAAA,aACF;AAAA,4BACAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAAA,gBACrC,SAAA,EAAU,oDAAA;AAAA,gBACV,KAAA,EAAO,YAAY,MAAA,GAAS,MAAA;AAAA,gBAE3B,QAAA,EAAA,SAAA,mBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC9F,QAAA,EAAA;AAAA,kCAAAC,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,wLAAA,EAAyL,CAAA;AAAA,kCAC9OA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,kCAAA,EAAmC;AAAA,iBAAA,EAC1F,CAAA,mBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EAAc,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,gBAAe,WAAA,EAAa,GAAA,EAC9F,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,uUAAA,EAAwU,CAAA,EAC/X;AAAA;AAAA;AAEJ;AAAA;AAAA,OACF;AAAA,MACC,UAAA,IAAc,WAAA,oBACbA,GAAAA,CAAC,SAAK,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,cAAA,CAAe,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAC,CAAA,EAAE;AAAA,KAAA,EAAA,EAhDrD,KAAK,EAkDf,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,iIAAA;AACb,EAAA,MAAM,UAAA,GAAa,qFAAA;AAInB,EAAA,MAAM,QAAA,GAAW,kIAAA;AACjB,EAAA,MAAM,cAAA,GAAiB,sFAAA;AACvB,EAAA,MAAM,OAAA,GAAU,2BAAA;AAEhB,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,aAAA,EACjD,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC1F,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,uJAAA,EAAwJ,GAC/M,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,EAAS,CAAA;AAAA,sBACzBA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,MAAM,eAAA,CAAgB,KAAK,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,kBACpE,QAAA,kBAAAA,GAAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EAA4B,iBAAG,CAAA,EACjD,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,MAAM,eAAA,CAAgB,KAAK,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,YACpE,QAAA,kBAAAA,GAAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EAA4B,iBAAG,CAAA,EACjD,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,MAAM,eAAA,CAAgB,OAAO,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,cACtE,QAAA,kBAAAA,GAAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EAA4B,iBAAG,CAAA,EACjD,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,MAAM,eAAA,CAAgB,MAAM,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,aACrE,QAAA,kBAAAA,GAAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EAA4B,iBAAG,CAAA,EACjD,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,cAAA,CAAe,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,UACrC,SAAA,EAAW,cAAc,cAAA,GAAiB,QAAA;AAAA,UAC1C,KAAA,EAAO,cAAc,6BAAA,GAAgC,4BAAA;AAAA,UAErD,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6CAAA,EAA+C,QAAA,EAAA,WAAA,GAAc,gBAAgB,cAAA,EAAe;AAAA;AAAA,OAC9G;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,EAAS,CAAA;AAAA,sBACzBA,IAAC,QAAA,EAAA,EAAO,OAAA,EAAS,gBAAgB,SAAA,EAAW,IAAA,EAAM,OAAM,sBAAA,EACtD,QAAA,kBAAAD,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,IAAA,EAAK,MAAA,EAAO,SAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC1F,QAAA,EAAA;AAAA,wBAAAC,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,mWAAA,EAAoW,CAAA;AAAA,wBACzZA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,gFAAA,EAAiF;AAAA,OAAA,EACxI,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,YAAY,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA,EAAG,WAAW,IAAA,EAAM,KAAA,EAAM,iBAAA,EAClE,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,QAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC1F,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAAE,sMAAA,EAAuM,GAC9P,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,iBAAA,CAAkB,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,UACxC,SAAA,EAAW,iBAAiB,UAAA,GAAa,IAAA;AAAA,UACzC,KAAA,EAAO,iBAAiB,sBAAA,GAAyB,uDAAA;AAAA,UAGjD,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC1F,QAAA,EAAA;AAAA,4BAAAC,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,qEAAA,EAAsE,CAAA;AAAA,4BAC3HA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,kBAAA,EAAmB;AAAA,WAAA,EAC1E;AAAA;AAAA,OACF;AAAA,MACC,cAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,cAAA,CAAe,OAAO,CAAA;AAAA,YACrC,SAAA,EAAW,CAAA,iDAAA,EAAoD,WAAA,KAAgB,OAAA,GAAU,6BAA6B,yCAAyC,CAAA,CAAA;AAAA,YAC/J,KAAA,EAAM,uEAAA;AAAA,YACP,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,cAAA,CAAe,MAAM,CAAA;AAAA,YACpC,SAAA,EAAW,CAAA,iDAAA,EAAoD,WAAA,KAAgB,MAAA,GAAS,6BAA6B,yCAAyC,CAAA,CAAA;AAAA,YAC9J,KAAA,EAAM,uFAAA;AAAA,YACP,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF,CAAA;AAAA,MAED,cAAA,IAAkB,eAAA,KAAoB,IAAA,oBACrCD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+HAAA,EAAgI,KAAA,EAAO,WAAA,KAAgB,MAAA,GAAS,wDAAA,GAA2D,sDAAA,EACvO,QAAA,EAAA;AAAA,QAAA,qBAAA,CAAsB,eAAe,CAAA;AAAA,QAAG,WAAA,KAAgB,SAAS,SAAA,GAAO;AAAA,OAAA,EAC3E,CAAA;AAAA,sBAEFC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,EAAS,CAAA;AAAA,sBACzBA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,cAAc,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA,EAAG,WAAW,UAAA,GAAa,UAAA,GAAa,MAAM,KAAA,EAAM,qBAAA,EAC9F,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC1F,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAAE,8CAAA,EAA+C,GACtG,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA,EAAG,SAAA,EAAW,YAAA,GAAe,UAAA,GAAa,IAAA,EAAM,KAAA,EAAM,sBAAA,EAClG,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC1F,QAAA,EAAA;AAAA,wBAAAC,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,w9BAAA,EAAy9B,CAAA;AAAA,wBAC9gCA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,kCAAA,EAAmC;AAAA,OAAA,EAC1F,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,cAAc,qBAAA,EAAuB,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,wBAAA,EAC3E,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,KAC1F,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,0GAAA,EAA2G,GAClK,CAAA,EACF,CAAA;AAAA,MACC,OAAA,oBACCA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,OAAA,EAAS,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,OAAA,EAC/C,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,KAC1F,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,wPAAA,EAAyP,GAChT,CAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA0B,KAAA,EAAO,EAAE,UAAA,EAAY,SAAQ,EACpE,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAO,EAAG,CAAA;AAAA,MAGjE,UAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yIAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mFAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BAClDA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA,EAAG,SAAA,EAAU,uDAAA,EAAwD,KAAA,EAAM,OAAA,EAAQ,QAAA,EAAA,MAAA,EAAC;AAAA,SAAA,EAChI,CAAA;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,iBAAO,cAAA,CAAe,IAAI,CAAA,mBACzBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAA8C,QAAA,EAAA,OAAA,GAAU,qBAAA,GAAmB,0BAAyB,CAAA,EAEvH,CAAA;AAAA,QACC,IAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EACZ,QAAA,EAAA,MAAA,CAAO,IAAA,KAAS,CAAA,GAAI,aAAA,GAAgB,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,OAAA,CAAA,EACrD;AAAA,OAAA,EAEJ,CAAA;AAAA,MAGD,QAAA,IAAY,CAAC,OAAA,IAAW,CAAC,yBACxBD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uKAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,wBACpBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACjCA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,yBAAA,EAAuB,CAAA;AAAA,wBAC7BA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACjCA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,gBAAA,EAAc;AAAA,OAAA,EACtB,CAAA;AAAA,MAGD,OAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oGAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EAAqC,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,CAAA,EACrH,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,YAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,aAAA,EAAc,KAAA,EAAM,CAAA;AAAA,0BACnDA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B,eAAc,OAAA,EAAQ;AAAA,SAAA,EAC3D,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,wBAAA,EAAiB,CAAA;AAAA,QACtB,GAAA,KAAQ,KAAA,IAAS,GAAA,KAAQ,MAAA,mBAASA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,wDAAA,EAAsD,CAAA,GAAU;AAAA,OAAA,EACjJ,CAAA;AAAA,MAED,yBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uGAAuG,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAI7H,YAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0IAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mFAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,0BACzDA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA,EAAG,SAAA,EAAU,uDAAA,EAAwD,KAAA,EAAM,OAAA,EAAQ,QAAA,EAAA,MAAA,EAAC;AAAA,SAAA,EAClI,CAAA;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,4BACtBA,GAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,OAAA,EAAQ,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA,KAAM,WAAW,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,EAAG,WAAU,kDAAA,EAAmD;AAAA,WAAA,EAChJ,CAAA;AAAA,0BACAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,4BAChBA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,YAAA,CAAa,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,gBACnC,IAAA,EAAK,QAAA;AAAA,gBACL,cAAA,EAAc,SAAA;AAAA,gBACd,SAAA,EAAW,CAAA,kFAAA,EAAqF,SAAA,GAAY,aAAA,GAAgB,aAAa,CAAA,CAAA;AAAA,gBAEzI,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,6EAA6E,SAAA,GAAY,oBAAA,GAAuB,iBAAiB,CAAA,CAAA,EAAI;AAAA;AAAA;AACxJ,WAAA,EACF,CAAA;AAAA,0BACAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,4BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,SAAA,GAAY,EAAA,GAAK,cAAc,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,4BAC1DA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,OAAA;AAAA,gBACL,KAAA,EAAO,SAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC5C,UAAU,CAAC,SAAA;AAAA,gBACX,SAAA,EAAU;AAAA;AAAA;AACZ,WAAA,EACF,CAAA;AAAA,0BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,SAAA,GAAY,KAAK,gCAAA,EAC/B,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,8BACpBD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA;AAAA,gBAAA,aAAA;AAAA,gBAAc;AAAA,eAAA,EAAC;AAAA,aAAA,EAC/D,CAAA;AAAA,4BACAC,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,OAAA;AAAA,gBACL,GAAA,EAAK,CAAA;AAAA,gBACL,GAAA,EAAK,EAAA;AAAA,gBACL,IAAA,EAAM,CAAA;AAAA,gBACN,KAAA,EAAO,aAAA;AAAA,gBACP,QAAA,EAAU,CAAC,CAAA,KAAM,gBAAA,CAAiB,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,gBACxD,SAAA,EAAU;AAAA;AAAA;AACZ,WAAA,EACF,CAAA;AAAA,0BAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,8BAC1CA,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,MAAM,iBAAA,CAAkB,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,kBACxC,IAAA,EAAK,QAAA;AAAA,kBACL,cAAA,EAAc,cAAA;AAAA,kBACd,SAAA,EAAW,CAAA,kFAAA,EAAqF,cAAA,GAAiB,aAAA,GAAgB,aAAa,CAAA,CAAA;AAAA,kBAE9I,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,6EAA6E,cAAA,GAAiB,oBAAA,GAAuB,iBAAiB,CAAA,CAAA,EAAI;AAAA;AAAA;AAC7J,aAAA,EACF,CAAA;AAAA,4BAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,cAAA,GAAiB,mBAAmB,+CAAA,EAKlD,QAAA,EAAA;AAAA,8BAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,kCACXD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA;AAAA,oBAAA,YAAA;AAAA,oBAAa;AAAA,mBAAA,EAAC;AAAA,iBAAA,EAC9D,CAAA;AAAA,gCACAC,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,OAAA;AAAA,oBACL,GAAA,EAAK,CAAA;AAAA,oBACL,GAAA,EAAK,GAAA;AAAA,oBACL,IAAA,EAAM,CAAA;AAAA,oBACN,KAAA,EAAO,YAAA;AAAA,oBACP,QAAA,EAAU,CAAC,CAAA,KAAM,eAAA,CAAgB,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,oBACvD,SAAA,EAAU;AAAA;AAAA;AACZ,eAAA,EACF,CAAA;AAAA,8BAEAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,kCACVA,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAS,MAAM,cAAA,CAAe,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,sBACrC,SAAA,EAAU,mGAAA;AAAA,sBACV,KAAA,EAAM,wBAAA;AAAA,sBAEL,wBAAc,gBAAA,GAAc;AAAA;AAAA;AAC/B,iBAAA,EACF,CAAA;AAAA,gCACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACX,QAAA,EAAA,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,CAAY,GAAA,CAAI,CAAA,EAAA,qBAC9BA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBAEC,OAAA,EAAS,MAAM,cAAA,CAAe,EAAE,CAAA;AAAA,oBAChC,SAAA,EAAW,CAAA,uCAAA,EAA0C,WAAA,KAAgB,EAAA,GAAK,2BAA2B,6CAA6C,CAAA,CAAA;AAAA,oBAEjJ,aAAG,WAAA;AAAY,mBAAA;AAAA,kBAJX;AAAA,iBAMR,CAAA,EACH;AAAA,eAAA,EACF,CAAA;AAAA,8BAEAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,kCACdD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAK,KAAA,CAAM,kBAAkB,GAAG,CAAA;AAAA,oBAAE;AAAA,mBAAA,EAAC;AAAA,iBAAA,EACnF,CAAA;AAAA,gCACAC,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,OAAA;AAAA,oBACL,GAAA,EAAK,CAAA;AAAA,oBACL,GAAA,EAAK,CAAA;AAAA,oBACL,IAAA,EAAM,IAAA;AAAA,oBACN,KAAA,EAAO,eAAA;AAAA,oBACP,QAAA,EAAU,CAAC,CAAA,KAAM,kBAAA,CAAmB,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,oBAC1D,SAAA,EAAU;AAAA;AAAA;AACZ,eAAA,EACF;AAAA,aAAA,EAEF;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,kBAAA;AAAA,YACT,SAAA,EAAU,iGAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA,SAED,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AASA,SAAS,WAAW,EAAE,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,SAAQ,EAAoB;AAC3E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIF,SAAS,CAAC,CAAA;AAClC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,KAAK,CAAA;AACxC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,YAAA,GAAeF,OAA6B,IAAI,CAAA;AAUtD,EAAA,MAAM,wBAAwB,YAAY;AAExC,IAAA,IAAI,IAAI,UAAA,CAAW,OAAO,KAAK,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACtD,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,MAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,MAAA,CAAA,CAAE,KAAA,EAAM;AACR,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,OAAO,IAAA,KAAsB;AAC5C,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA;AACjC,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AACjD,MAAA,OAAO,IAAI,IAAA,EAAK;AAAA,IAClB,CAAA;AACA,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,MAAM,QAAA,CAAS,EAAE,WAAA,EAAa,WAAW,CAAA;AAAA,MAClD,CAAA,CAAA,MAAQ;AAGN,QAAA,IAAA,GAAO,MAAM,QAAA,CAAS,EAAE,WAAA,EAAa,QAAQ,CAAA;AAAA,MAC/C;AACA,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACxC,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,OAAA;AACT,MAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,MAAA,CAAA,CAAE,KAAA,EAAM;AAER,MAAA,UAAA,CAAW,MAAM,GAAA,CAAI,eAAA,CAAgB,OAAO,GAAG,GAAI,CAAA;AAAA,IACrD,CAAA,CAAA,MAAQ;AACN,MAAA,aAAA,CAAM,MAAM,iDAA4C,CAAA;AAAA,IAC1D;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,6FAAA;AAEZ,EAAA,uBACEG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,YAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,CAAC,UAAA,oBACAA,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,YAAO,OAAA,EAAS,MAAM,QAAQ,CAAA,CAAA,KAAK,IAAA,CAAK,IAAI,GAAA,EAAK,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,IAAQ,GAAG,CAAA,GAAI,GAAG,CAAC,CAAA,EAAG,SAAA,EAAW,KAAK,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACzGD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,UAAE;AAAA,SAAA,EAAC,CAAA;AAAA,wBACvFC,IAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAA,CAAA,KAAK,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAA,CAAO,CAAA,GAAI,QAAQ,GAAG,CAAA,GAAI,GAAG,CAAC,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,wBACvGA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,QAAQ,CAAC,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,wBACtDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,wBAC3CD,IAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAA,CAAc,IAAI,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK,KAAA,EAAM,qBAAA,EAChE,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,gKAAA,EAAiK,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAErU;AAAA,OAAA,EACF,CAAA;AAAA,MAED,UAAA,oBACCD,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAF,IAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK,KAAA,EAAM,gBAAA,EACjE,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,6BAAA,EAA8B,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAElM,CAAA;AAAA,wBACAD,IAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAa,OAAA,EAAS,IAAA,EAAK,EAAG,SAAA,EAAW,GAAA,EAC9D,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,+cAAA,EAAgd,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAEpnB,CAAA;AAAA,wBACAD,IAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAa,OAAA,EAAS,IAAA,EAAK,EAAG,SAAA,EAAW,GAAA,EAC9D,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,0GAAA,EAA2G,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAE/Q;AAAA,OAAA,EACF,CAAA;AAAA,sBAEFD,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,UAAA,IAAc,qBAAA,EAAuB,WAAW,GAAA,EAC/D,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,0GAAA,EAA2G,CAAA,EAAE,CAAA;AAAA,QAAM;AAAA,OAAA,EAE/Q,CAAA;AAAA,MACC,2BACCD,IAAAA,CAAC,YAAO,OAAA,EAAS,OAAA,EAAS,WAAW,GAAA,EACnC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,wPAAA,EAAyP,CAAA,EAAE,CAAA;AAAA,QAAM;AAAA,OAAA,EAE7Z;AAAA,KAAA,EAEJ,CAAA;AAAA,IACC,UAAA,mBACCA,GAAAA,CAAC,sBAAA,EAAA,EAAe,KAAK,YAAA,EAAc,GAAA,EAAK,GAAA,EAAK,QAAA,EAAoB,CAAA,mBAEjEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACZ,QAAA,EAAA,KAAA,mBACCA,GAAAA,CAAC,SAAI,SAAA,EAAU,sBAAA,EAAuB,QAAA,EAAA,uBAAA,EAAqB,CAAA,mBAE3DA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,GAAA;AAAA,QACL,GAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,QAC5B,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,CAAA,EAAK,eAAA,EAAiB,eAAA,EAAiB,UAAA,EAAY,sBAAA,EAAuB;AAAA,QAC3G,SAAA,EAAU;AAAA;AAAA,KACZ,EAEJ;AAAA,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-O3BLL2WA.js","sourcesContent":["/**\n * Image annotator — opens an image with vector-style annotations layered\n * over it. Each annotation is a real, editable object: select to drag /\n * resize, recolor / restyle from the toolbar, Delete to remove. Zoom\n * scales the editing surface; the underlying image-pixel coordinate\n * system is preserved so saved exports always render at full resolution.\n *\n * Architecture:\n * - <canvas> bottom layer: original image + any committed mosaic\n * regions (mosaic edits real pixels)\n * - <svg> top layer: shapes / arrows / text / freehand. State-\n * driven, every annotation is interactive.\n * - viewBox locked to image-pixel coords so the SVG hit-tests and\n * coordinates are unaffected by the display zoom level.\n *\n * Tools: select (default), draw (freehand), rect, circle, arrow, mosaic,\n * text, crop.\n *\n * Save / Copy buttons live on the OUTER Preview toolbar (alongside Open).\n * The annotator exposes them via `useImperativeHandle` on a forwardRef —\n * see ImageAnnotatorHandle.\n */\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport toast from '../shell/toast';\n\ntype Tool = 'select' | 'draw' | 'rect' | 'circle' | 'arrow' | 'mosaic' | 'text' | 'crop';\ntype Corner = 'nw' | 'ne' | 'se' | 'sw' | 'start' | 'end';\n\ntype RectAnno = { id: string; type: 'rect'; x: number; y: number; w: number; h: number; color: string; stroke: number; radius: number };\ntype CircleAnno = { id: string; type: 'circle'; x: number; y: number; w: number; h: number; color: string; stroke: number };\ntype ArrowAnno = { id: string; type: 'arrow'; x1: number; y1: number; x2: number; y2: number; color: string; stroke: number };\ntype MosaicAnno = { id: string; type: 'mosaic'; x: number; y: number; w: number; h: number };\ntype DrawAnno = { id: string; type: 'draw'; points: { x: number; y: number }[]; color: string; stroke: number };\ntype TextAnno = { id: string; type: 'text'; x: number; y: number; text: string; color: string; size: number; font: string; bold: boolean; italic: boolean; underline: boolean };\ntype Annotation = RectAnno | CircleAnno | ArrowAnno | MosaicAnno | DrawAnno | TextAnno;\n\nconst COLORS = ['#ef4444', '#f97316', '#eab308', '#22c55e', '#3b82f6', '#8b5cf6', '#000000', '#ffffff'];\nconst FONTS = [\n { id: 'system', label: 'System', css: '-apple-system, system-ui, sans-serif' },\n { id: 'serif', label: 'Serif', css: 'Georgia, \"Times New Roman\", serif' },\n { id: 'mono', label: 'Mono', css: 'ui-monospace, \"SF Mono\", Menlo, monospace' },\n { id: 'cursive',label: 'Cursive', css: '\"Brush Script MT\", \"Comic Sans MS\", cursive' },\n];\nconst STROKE_DEFAULT = 4;\nconst TEXT_SIZE_DEFAULT = 24;\nconst RECT_RADIUS_DEFAULT = 12;\nconst MOSAIC_BLOCK = 12;\nconst ZOOM_MIN = 0.25;\nconst ZOOM_MAX = 4;\nconst ZOOM_STEP = 0.25;\n\nconst newId = () => Math.random().toString(36).slice(2, 9);\n\nexport interface ImageAnnotatorHandle {\n copy: () => Promise<void>;\n save: () => Promise<void>;\n}\n\nexport interface ImageAnnotatorProps {\n src: string;\n filename: string;\n /** Standalone-mode: when provided, an Apply pill is rendered in the\n * annotator's toolbar that composites the current canvas + SVG into a PNG\n * blob and hands it back. Used by callers like the bug-report dialog that\n * embed the annotator outside the Preview app and want the result. */\n onApply?: (blob: Blob) => void;\n /** Standalone-mode companion to `onApply` — Cancel pill that lets the\n * consumer dismiss the annotator without applying. */\n onCancel?: () => void;\n}\n\nconst ImageAnnotator = forwardRef<ImageAnnotatorHandle, ImageAnnotatorProps>(function ImageAnnotator(\n { src, filename, onApply, onCancel }, ref,\n) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n const imageRef = useRef<HTMLImageElement | null>(null);\n\n const [tool, setTool] = useState<Tool>('select');\n const [color, setColor] = useState(COLORS[0]);\n const [stroke, setStroke] = useState(STROKE_DEFAULT);\n const [textSize, setTextSize] = useState(TEXT_SIZE_DEFAULT);\n const [textFont, setTextFont] = useState(FONTS[0].id);\n const [textBold, setTextBold] = useState(true);\n const [textItalic, setTextItalic] = useState(false);\n const [textUnderline, setTextUnderline] = useState(false);\n const [rectRadius, setRectRadius] = useState(RECT_RADIUS_DEFAULT);\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [imageSize, setImageSize] = useState<{ w: number; h: number } | null>(null);\n const [fitSize, setFitSize] = useState<{ w: number; h: number } | null>(null);\n const [zoom, setZoom] = useState(1);\n\n const [preview, setPreview] = useState<Annotation | null>(null);\n const [pendingText, setPendingText] = useState<{ x: number; y: number; value: string; editingId?: string } | null>(null);\n const [pendingCrop, setPendingCrop] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\n\n const dragRef = useRef<\n | { kind: 'draw'; start: { x: number; y: number } }\n | { kind: 'pen'; points: { x: number; y: number }[] }\n | { kind: 'move'; id: string; start: { x: number; y: number }; original: Annotation }\n | { kind: 'resize'; id: string; corner: Corner; start: { x: number; y: number }; original: Annotation }\n | { kind: 'crop'; start: { x: number; y: number } }\n | null\n >(null);\n const [isDragging, setIsDragging] = useState(false);\n\n const displaySize = useMemo(() => {\n if (!fitSize) return null;\n return { w: fitSize.w * zoom, h: fitSize.h * zoom };\n }, [fitSize, zoom]);\n const scale = displaySize && imageSize ? displaySize.w / imageSize.w : 1;\n\n // ── selected annotation ────────────────────────────────────────────────────\n const selected = useMemo(\n () => annotations.find(a => a.id === selectedId) ?? null,\n [annotations, selectedId],\n );\n\n // When user picks a tool, sync the toolbar inputs to that tool's defaults\n // for new shapes (without affecting selected annotations).\n useEffect(() => {\n if (tool === 'select' && selected) {\n // Reflect the selected annotation in the toolbar.\n if ('color' in selected) setColor(selected.color);\n if ('stroke' in selected) setStroke(selected.stroke);\n if (selected.type === 'rect') setRectRadius(selected.radius);\n if (selected.type === 'text') {\n setTextSize(selected.size);\n setTextFont(selected.font);\n setTextBold(selected.bold);\n setTextItalic(selected.italic);\n setTextUnderline(selected.underline);\n }\n }\n }, [selectedId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ── load image ────────────────────────────────────────────────────────────\n useEffect(() => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n imageRef.current = img;\n setImageSize({ w: img.naturalWidth, h: img.naturalHeight });\n setAnnotations([]);\n setSelectedId(null);\n };\n img.onerror = () => toast.error('Failed to load image');\n img.src = src;\n }, [src]);\n\n // Compute fit-to-area display size (independent of zoom).\n useEffect(() => {\n if (!imageSize) return;\n const update = () => {\n const wrap = wrapRef.current;\n if (!wrap) return;\n const r = wrap.getBoundingClientRect();\n const availW = Math.max(0, r.width - 32);\n const availH = Math.max(0, r.height - 32);\n if (availW === 0 || availH === 0) return;\n const ratio = imageSize.w / imageSize.h;\n let w = imageSize.w, h = imageSize.h;\n if (w > availW) { w = availW; h = w / ratio; }\n if (h > availH) { h = availH; w = h * ratio; }\n setFitSize({ w, h });\n };\n update();\n const ro = new ResizeObserver(update);\n if (wrapRef.current) ro.observe(wrapRef.current);\n return () => ro.disconnect();\n }, [imageSize]);\n\n // Render canvas: image + mosaic regions baked in. fitSize in deps so we\n // re-render the moment the canvas mounts (it only mounts when displaySize\n // is computed).\n const mosaicAnnos = useMemo(\n () => annotations.filter(a => a.type === 'mosaic') as MosaicAnno[],\n [annotations],\n );\n useEffect(() => {\n const img = imageRef.current;\n const c = canvasRef.current;\n if (!img || !c || !imageSize) return;\n c.width = imageSize.w;\n c.height = imageSize.h;\n const ctx = c.getContext('2d')!;\n ctx.drawImage(img, 0, 0);\n for (const m of mosaicAnnos) applyMosaic(ctx, m);\n }, [imageSize, mosaicAnnos, fitSize]);\n\n // ── coord helpers ─────────────────────────────────────────────────────────\n const evToImage = (e: { clientX: number; clientY: number }): { x: number; y: number } => {\n const svg = svgRef.current;\n if (!svg) return { x: 0, y: 0 };\n const pt = svg.createSVGPoint();\n pt.x = e.clientX; pt.y = e.clientY;\n const ctm = svg.getScreenCTM();\n if (!ctm) return { x: 0, y: 0 };\n const t = pt.matrixTransform(ctm.inverse());\n return { x: t.x, y: t.y };\n };\n\n // ── drag (window-level) ───────────────────────────────────────────────────\n const beginDrag = (drag: NonNullable<typeof dragRef.current>) => {\n dragRef.current = drag;\n setIsDragging(true);\n };\n\n useEffect(() => {\n if (!isDragging) return;\n const onMove = (ev: PointerEvent) => {\n const drag = dragRef.current;\n if (!drag) return;\n const p = evToImage(ev);\n if (drag.kind === 'draw') {\n setPreview(makeShape(tool, drag.start, p, color, stroke, rectRadius));\n } else if (drag.kind === 'pen') {\n // Append point if it moved enough to matter.\n const last = drag.points[drag.points.length - 1];\n if (Math.abs(p.x - last.x) > 1 || Math.abs(p.y - last.y) > 1) {\n drag.points.push(p);\n setPreview({ id: '', type: 'draw', points: drag.points.slice(), color, stroke });\n }\n } else if (drag.kind === 'crop') {\n setPendingCrop(normalizeRect(drag.start, p));\n } else if (drag.kind === 'move') {\n const dx = p.x - drag.start.x;\n const dy = p.y - drag.start.y;\n setAnnotations(prev => prev.map(a => a.id === drag.id ? translate(drag.original, dx, dy) : a));\n } else if (drag.kind === 'resize') {\n setAnnotations(prev => prev.map(a => a.id === drag.id ? resize(drag.original, drag.corner, p) : a));\n }\n };\n const onUp = () => {\n const drag = dragRef.current;\n dragRef.current = null;\n setIsDragging(false);\n if (drag?.kind === 'draw') {\n setPreview(p => {\n if (!p || isTrivial(p)) return null;\n const anno: Annotation = { ...p, id: newId() } as Annotation;\n setAnnotations(prev => [...prev, anno]);\n setSelectedId(anno.id);\n setTool('select');\n return null;\n });\n } else if (drag?.kind === 'pen') {\n if (drag.points.length < 2) { setPreview(null); return; }\n const anno: DrawAnno = { id: newId(), type: 'draw', points: drag.points, color, stroke };\n setAnnotations(prev => [...prev, anno]);\n setSelectedId(anno.id);\n setTool('select');\n setPreview(null);\n }\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n return () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n };\n }, [isDragging, tool, color, stroke, rectRadius]);\n\n const handleAnnoPointerDown = (e: React.PointerEvent<SVGElement>, anno: Annotation) => {\n if (tool !== 'select') return;\n e.stopPropagation();\n setSelectedId(anno.id);\n beginDrag({ kind: 'move', id: anno.id, start: evToImage(e), original: anno });\n };\n\n const handleHandlePointerDown = (e: React.PointerEvent<SVGElement>, anno: Annotation, corner: Corner) => {\n e.stopPropagation();\n beginDrag({ kind: 'resize', id: anno.id, corner, start: evToImage(e), original: anno });\n };\n\n const handleSvgPointerDown = (e: React.PointerEvent<SVGSVGElement>) => {\n if (tool === 'select') {\n setSelectedId(null);\n return;\n }\n if (tool === 'text') {\n const p = evToImage(e);\n setPendingText({ x: p.x, y: p.y, value: '' });\n return;\n }\n const start = evToImage(e);\n if (tool === 'crop') {\n beginDrag({ kind: 'crop', start });\n return;\n }\n if (tool === 'draw') {\n // 'draw' (the registry) means freehand pen here.\n beginDrag({ kind: 'pen', points: [start] });\n setPreview({ id: '', type: 'draw', points: [start], color, stroke });\n return;\n }\n setPreview(makeShape(tool, start, start, color, stroke, rectRadius));\n beginDrag({ kind: 'draw', start });\n };\n\n const handleAnnoDoubleClick = (anno: Annotation) => {\n if (anno.type !== 'text') return;\n setPendingText({ x: anno.x, y: anno.y, value: anno.text, editingId: anno.id });\n };\n\n // Keyboard shortcuts:\n // Delete / Backspace — removes the selected annotation\n // Escape — deselect\n // Cmd/Ctrl-Z — undo last annotation\n useEffect(() => {\n const onKey = (ev: KeyboardEvent) => {\n if (document.activeElement && /^(INPUT|TEXTAREA)$/.test(document.activeElement.tagName)) return;\n if ((ev.metaKey || ev.ctrlKey) && (ev.key === 'z' || ev.key === 'Z') && !ev.shiftKey) {\n ev.preventDefault();\n setAnnotations(prev => prev.slice(0, -1));\n setSelectedId(null);\n return;\n }\n if (!selectedId) return;\n if (ev.key === 'Delete' || ev.key === 'Backspace') {\n ev.preventDefault();\n setAnnotations(prev => prev.filter(a => a.id !== selectedId));\n setSelectedId(null);\n } else if (ev.key === 'Escape') {\n setSelectedId(null);\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [selectedId]);\n\n // ── live edits to selected annotation ──────────────────────────────────────\n // Helpers that mutate the selected annotation if there is one, else just\n // change the toolbar default for the next new shape.\n const setColorAndApply = (c: string) => {\n setColor(c);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a => {\n if (a.id !== selectedId) return a;\n if (a.type === 'mosaic') return a;\n return { ...a, color: c } as Annotation;\n }));\n };\n const setStrokeAndApply = (s: number) => {\n setStroke(s);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a => {\n if (a.id !== selectedId) return a;\n if (a.type === 'rect' || a.type === 'circle' || a.type === 'arrow' || a.type === 'draw') {\n return { ...a, stroke: s } as Annotation;\n }\n return a;\n }));\n };\n const setRectRadiusAndApply = (r: number) => {\n setRectRadius(r);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a =>\n (a.id === selectedId && a.type === 'rect') ? { ...a, radius: r } : a,\n ));\n };\n const setTextSizeAndApply = (s: number) => {\n setTextSize(s);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a =>\n (a.id === selectedId && a.type === 'text') ? { ...a, size: s } : a,\n ));\n };\n const setTextFontAndApply = (f: string) => {\n setTextFont(f);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a =>\n (a.id === selectedId && a.type === 'text') ? { ...a, font: f } : a,\n ));\n };\n const toggleTextStyleAndApply = (which: 'bold' | 'italic' | 'underline') => {\n const next = !{ bold: textBold, italic: textItalic, underline: textUnderline }[which];\n if (which === 'bold') setTextBold(next);\n if (which === 'italic') setTextItalic(next);\n if (which === 'underline') setTextUnderline(next);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a =>\n (a.id === selectedId && a.type === 'text') ? { ...a, [which]: next } : a,\n ));\n };\n\n // ── text input ─────────────────────────────────────────────────────────────\n const commitText = () => {\n if (!pendingText) return;\n const value = pendingText.value;\n if (!value.trim()) {\n if (pendingText.editingId) {\n setAnnotations(prev => prev.filter(a => a.id !== pendingText.editingId));\n }\n setPendingText(null);\n return;\n }\n if (pendingText.editingId) {\n setAnnotations(prev => prev.map(a =>\n a.id === pendingText.editingId && a.type === 'text'\n ? { ...a, text: value }\n : a,\n ));\n } else {\n const anno: TextAnno = {\n id: newId(),\n type: 'text',\n x: pendingText.x,\n y: pendingText.y,\n text: value,\n color,\n size: textSize,\n font: textFont,\n bold: textBold,\n italic: textItalic,\n underline: textUnderline,\n };\n setAnnotations(prev => [...prev, anno]);\n setSelectedId(anno.id);\n setTool('select');\n }\n setPendingText(null);\n };\n\n // ── crop ───────────────────────────────────────────────────────────────────\n const applyCrop = () => {\n if (!pendingCrop || !imageRef.current || !imageSize) return;\n const r = pendingCrop;\n const tmp = document.createElement('canvas');\n tmp.width = Math.round(r.w);\n tmp.height = Math.round(r.h);\n const tctx = tmp.getContext('2d')!;\n const sourceCanvas = document.createElement('canvas');\n sourceCanvas.width = imageSize.w;\n sourceCanvas.height = imageSize.h;\n const sctx = sourceCanvas.getContext('2d')!;\n sctx.drawImage(imageRef.current, 0, 0);\n for (const m of mosaicAnnos) applyMosaic(sctx, m);\n tctx.drawImage(sourceCanvas, r.x, r.y, r.w, r.h, 0, 0, r.w, r.h);\n const newImg = new Image();\n newImg.onload = () => {\n imageRef.current = newImg;\n setImageSize({ w: newImg.naturalWidth, h: newImg.naturalHeight });\n setAnnotations(prev =>\n prev\n .filter(a => a.type !== 'mosaic')\n .map(a => translate(a, -r.x, -r.y))\n .filter(a => withinBounds(a, newImg.naturalWidth, newImg.naturalHeight)),\n );\n setPendingCrop(null);\n };\n newImg.src = tmp.toDataURL('image/png');\n };\n const cancelCrop = () => setPendingCrop(null);\n\n const undoLast = () => {\n setAnnotations(prev => prev.slice(0, -1));\n setSelectedId(null);\n };\n\n // ── export (Save / Copy via outer toolbar through useImperativeHandle) ────\n const compositeToCanvas = async (): Promise<HTMLCanvasElement | null> => {\n const c = canvasRef.current;\n const svg = svgRef.current;\n if (!c || !svg || !imageSize) return null;\n const out = document.createElement('canvas');\n out.width = imageSize.w;\n out.height = imageSize.h;\n const octx = out.getContext('2d')!;\n octx.drawImage(c, 0, 0);\n const clone = svg.cloneNode(true) as SVGSVGElement;\n clone.querySelectorAll('[data-chrome]').forEach(n => n.remove());\n const xml = new XMLSerializer().serializeToString(clone);\n const svgBlob = new Blob([xml], { type: 'image/svg+xml;charset=utf-8' });\n const svgUrl = URL.createObjectURL(svgBlob);\n const svgImg = new Image();\n await new Promise<void>(resolve => {\n svgImg.onload = () => resolve();\n svgImg.onerror = () => resolve();\n svgImg.src = svgUrl;\n });\n octx.drawImage(svgImg, 0, 0, imageSize.w, imageSize.h);\n URL.revokeObjectURL(svgUrl);\n return out;\n };\n\n useImperativeHandle(ref, () => ({\n save: async () => {\n const out = await compositeToCanvas();\n if (!out) return;\n out.toBlob(blob => {\n if (!blob) { toast.error('Failed to export'); return; }\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n const base = filename.replace(/\\.[^.]+$/, '');\n a.download = `${base}-annotated.png`;\n a.click();\n URL.revokeObjectURL(url);\n }, 'image/png');\n },\n copy: async () => {\n if (!('clipboard' in navigator) || typeof ClipboardItem === 'undefined') {\n toast.error('Clipboard images not supported in this browser');\n return;\n }\n const out = await compositeToCanvas();\n if (!out) return;\n out.toBlob(async blob => {\n if (!blob) { toast.error('Failed to copy'); return; }\n try {\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);\n toast.success('Copied to clipboard');\n } catch {\n toast.error('Copy failed (clipboard permission?)');\n }\n }, 'image/png');\n },\n }), [imageSize, filename]);\n\n // ── tool definitions ──────────────────────────────────────────────────────\n const tools: { id: Tool; label: string; icon: JSX.Element }[] = useMemo(() => [\n { id: 'select', label: 'Select / Move', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 3l7 17 2-7 7-2L5 3z\" /></svg> },\n { id: 'draw', label: 'Pen / Draw', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487z\" /></svg> },\n { id: 'rect', label: 'Rectangle', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><rect x=\"4\" y=\"6\" width=\"16\" height=\"12\" rx=\"3\" /></svg> },\n { id: 'circle', label: 'Ellipse', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><ellipse cx=\"12\" cy=\"12\" rx=\"8\" ry=\"6\" /></svg> },\n { id: 'arrow', label: 'Arrow', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 19L19 5m0 0h-7m7 0v7\" /></svg> },\n { id: 'mosaic', label: 'Mosaic', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z\" /></svg> },\n { id: 'text', label: 'Text', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 6h16M12 6v14M9 20h6\" /></svg> },\n { id: 'crop', label: 'Crop', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 2v15a1 1 0 001 1h15M2 6h15a1 1 0 011 1v15\" /></svg> },\n ], []);\n\n const btnClass = (active: boolean) =>\n `p-1.5 rounded transition-colors ${active ? 'bg-blue-500 text-white' : 'text-gray-700 hover:bg-gray-200'}`;\n\n // Decide which secondary controls to show based on current context\n // (selected annotation type takes priority over the chosen tool).\n const ctxType = selected?.type ?? (tool === 'select' ? null : tool);\n const showStrokeControl = ctxType === 'rect' || ctxType === 'circle' || ctxType === 'arrow' || ctxType === 'draw';\n const showRectRadius = ctxType === 'rect';\n const showTextControls = ctxType === 'text';\n\n return (\n <div className=\"flex flex-col h-full bg-gray-100\">\n {/* Tool bar */}\n <div className=\"flex items-center gap-1.5 px-3 py-2 border-b border-gray-200 bg-white shrink-0 flex-wrap text-[12px]\">\n {tools.map(t => (\n <button\n key={t.id}\n onClick={() => { setTool(t.id); setSelectedId(null); }}\n title={t.label}\n className={btnClass(tool === t.id)}\n >\n {t.icon}\n </button>\n ))}\n\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n\n {/* Color picker — always visible */}\n <div className=\"flex items-center gap-1\">\n {COLORS.map(c => (\n <button\n key={c}\n onClick={() => setColorAndApply(c)}\n title={c}\n className={`h-5 w-5 rounded-full border ${color === c ? 'ring-2 ring-blue-500 ring-offset-1' : 'border-gray-300'}`}\n style={{ background: c }}\n />\n ))}\n </div>\n\n {showStrokeControl && (\n <>\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n <label className=\"flex items-center gap-1.5 text-gray-600\">\n <span>Weight</span>\n <input type=\"range\" min={1} max={20} step={1} value={stroke} onChange={(e) => setStrokeAndApply(Number(e.target.value))} className=\"w-16 accent-blue-500\" />\n <span className=\"tabular-nums w-5 text-right\">{stroke}</span>\n </label>\n </>\n )}\n\n {showRectRadius && (\n <>\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n <label className=\"flex items-center gap-1.5 text-gray-600\">\n <span>Radius</span>\n <input type=\"range\" min={0} max={48} step={1} value={rectRadius} onChange={(e) => setRectRadiusAndApply(Number(e.target.value))} className=\"w-16 accent-blue-500\" />\n <span className=\"tabular-nums w-6 text-right\">{rectRadius}</span>\n </label>\n </>\n )}\n\n {showTextControls && (\n <>\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n <select value={textFont} onChange={(e) => setTextFontAndApply(e.target.value)} className=\"text-xs border border-gray-300 rounded px-1 py-0.5 bg-white\">\n {FONTS.map(f => <option key={f.id} value={f.id}>{f.label}</option>)}\n </select>\n <button onClick={() => toggleTextStyleAndApply('bold')} className={btnClass(textBold)} title=\"Bold\"><span className=\"font-bold\">B</span></button>\n <button onClick={() => toggleTextStyleAndApply('italic')} className={btnClass(textItalic)} title=\"Italic\"><span className=\"italic\">I</span></button>\n <button onClick={() => toggleTextStyleAndApply('underline')} className={btnClass(textUnderline)} title=\"Underline\"><span className=\"underline\">U</span></button>\n <label className=\"flex items-center gap-1.5 text-gray-600\">\n <span>Size</span>\n <input type=\"range\" min={10} max={96} step={1} value={textSize} onChange={(e) => setTextSizeAndApply(Number(e.target.value))} className=\"w-16 accent-blue-500\" />\n <span className=\"tabular-nums w-7 text-right\">{textSize}</span>\n </label>\n </>\n )}\n\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n\n {/* Zoom */}\n <button onClick={() => setZoom(z => Math.max(ZOOM_MIN, Math.round((z - ZOOM_STEP) * 100) / 100))} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-700\" title=\"Zoom out\">−</button>\n <span className=\"text-gray-600 tabular-nums w-10 text-center\">{Math.round(zoom * 100)}%</span>\n <button onClick={() => setZoom(z => Math.min(ZOOM_MAX, Math.round((z + ZOOM_STEP) * 100) / 100))} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-700\" title=\"Zoom in\">+</button>\n <button onClick={() => setZoom(1)} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-700\" title=\"Fit to area\">Fit</button>\n\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n\n <button onClick={undoLast} disabled={annotations.length === 0} className=\"px-2 py-1 rounded hover:bg-gray-200 disabled:opacity-30 text-gray-700\">Undo</button>\n\n <div className=\"ml-auto flex items-center gap-2\">\n {pendingCrop && (\n <>\n <button onClick={applyCrop} className=\"px-2 py-1 rounded bg-blue-500 text-white hover:bg-blue-600\">Apply Crop</button>\n <button onClick={cancelCrop} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-700\">Cancel</button>\n </>\n )}\n {onApply && !pendingCrop && (\n <>\n {onCancel && (\n <button onClick={onCancel} className=\"px-3 py-1 rounded hover:bg-gray-200 text-gray-700 text-xs font-medium\">Cancel</button>\n )}\n <button\n onClick={async () => {\n const out = await compositeToCanvas();\n if (!out) { toast.error('Failed to export'); return; }\n out.toBlob(blob => {\n if (!blob) { toast.error('Failed to export'); return; }\n onApply(blob);\n }, 'image/png');\n }}\n className=\"px-3 py-1 rounded bg-blue-500 text-white hover:bg-blue-600 text-xs font-medium\"\n >\n Apply\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Canvas + SVG layered surface */}\n <div ref={wrapRef} className=\"flex-1 overflow-auto bg-gray-200 flex items-center justify-center p-4 relative\">\n {displaySize && imageSize && (\n <div\n className=\"relative shadow-lg rounded overflow-hidden bg-white shrink-0\"\n style={{ width: displaySize.w, height: displaySize.h }}\n >\n <canvas ref={canvasRef} style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', display: 'block' }} />\n <svg\n ref={svgRef}\n viewBox={`0 0 ${imageSize.w} ${imageSize.h}`}\n preserveAspectRatio=\"none\"\n style={{\n position: 'absolute', inset: 0, width: '100%', height: '100%',\n touchAction: 'none',\n cursor: tool === 'select' ? 'default' : tool === 'text' ? 'text' : 'crosshair',\n }}\n onPointerDown={handleSvgPointerDown}\n >\n {annotations.map(a => (\n <AnnotationView\n key={a.id}\n anno={a}\n selected={selectedId === a.id}\n zoom={zoom}\n onPointerDown={(e) => handleAnnoPointerDown(e, a)}\n onDoubleClick={() => handleAnnoDoubleClick(a)}\n onHandlePointerDown={(e, corner) => handleHandlePointerDown(e, a, corner)}\n />\n ))}\n {preview && <AnnotationView anno={{ ...preview, id: '__preview' } as Annotation} preview />}\n {pendingCrop && <CropOverlay rect={pendingCrop} imageSize={imageSize} />}\n </svg>\n\n {pendingText && (\n <PendingTextEditor\n pendingText={pendingText}\n color={color}\n size={textSize}\n font={FONTS.find(f => f.id === textFont)?.css ?? FONTS[0].css}\n bold={textBold}\n italic={textItalic}\n underline={textUnderline}\n scale={scale}\n onChange={(value) => setPendingText({ ...pendingText, value })}\n onCommit={commitText}\n onCancel={() => setPendingText(null)}\n />\n )}\n </div>\n )}\n </div>\n\n {/* Hint footer */}\n <div className=\"px-3 py-1.5 border-t border-gray-200 bg-white text-[11px] text-gray-500 shrink-0\">\n {tool === 'select'\n ? (selectedId ? 'Drag to move. Drag a corner to resize. Delete / Backspace removes. Click outside to deselect.' : 'Tap a shape to select. Double-click text to edit.')\n : tool === 'text'\n ? 'Click to drop a text label.'\n : tool === 'crop'\n ? 'Drag a rectangle to set the crop region.'\n : tool === 'draw'\n ? 'Drag to draw freehand.'\n : 'Drag on the image to draw.'}\n </div>\n </div>\n );\n});\n\nexport default ImageAnnotator;\n\n// ── annotation rendering ─────────────────────────────────────────────────────\n\ninterface AnnoViewProps {\n anno: Annotation;\n selected?: boolean;\n preview?: boolean;\n zoom?: number;\n onPointerDown?: (e: React.PointerEvent<SVGElement>) => void;\n onDoubleClick?: () => void;\n onHandlePointerDown?: (e: React.PointerEvent<SVGElement>, corner: Corner) => void;\n}\n\nfunction AnnotationView({ anno, selected, preview, zoom = 1, onPointerDown, onDoubleClick, onHandlePointerDown }: AnnoViewProps) {\n const dim = boundingBox(anno);\n const interactive: any = onPointerDown\n ? { onPointerDown, pointerEvents: 'all', style: { cursor: 'move' } }\n : {};\n const dblc: any = onDoubleClick ? { onDoubleClick } : {};\n\n let body: JSX.Element;\n if (anno.type === 'rect') {\n body = (\n <rect\n x={anno.x} y={anno.y} width={anno.w} height={anno.h}\n rx={anno.radius} ry={anno.radius}\n fill=\"none\" stroke={anno.color} strokeWidth={anno.stroke}\n strokeLinecap=\"round\" strokeLinejoin=\"round\"\n {...interactive}\n />\n );\n } else if (anno.type === 'circle') {\n body = (\n <ellipse\n cx={anno.x + anno.w / 2} cy={anno.y + anno.h / 2}\n rx={anno.w / 2} ry={anno.h / 2}\n fill=\"none\" stroke={anno.color} strokeWidth={anno.stroke}\n {...interactive}\n />\n );\n } else if (anno.type === 'arrow') {\n body = <ArrowShape anno={anno} interactive={interactive} />;\n } else if (anno.type === 'draw') {\n body = (\n <path\n d={pointsToPath(anno.points)}\n fill=\"none\" stroke={anno.color} strokeWidth={anno.stroke}\n strokeLinecap=\"round\" strokeLinejoin=\"round\"\n {...interactive}\n />\n );\n } else if (anno.type === 'mosaic') {\n body = (\n <rect\n x={anno.x} y={anno.y} width={anno.w} height={anno.h}\n fill=\"rgba(0,0,0,0.001)\"\n stroke={selected ? '#3b82f6' : 'none'}\n strokeWidth={selected ? 2 : 0}\n strokeDasharray={selected ? '6,4' : undefined}\n {...interactive}\n />\n );\n } else {\n // text\n const font = FONTS.find(f => f.id === anno.font)?.css ?? FONTS[0].css;\n body = (\n <text\n x={anno.x} y={anno.y + anno.size}\n fill={anno.color}\n fontSize={anno.size}\n fontWeight={anno.bold ? 700 : 400}\n fontStyle={anno.italic ? 'italic' : 'normal'}\n textDecoration={anno.underline ? 'underline' : undefined}\n fontFamily={font}\n style={{ userSelect: 'none' }}\n {...interactive}\n {...dblc}\n >\n {anno.text.split('\\n').map((line, i) => (\n <tspan key={i} x={anno.x} dy={i === 0 ? 0 : anno.size * 1.2}>{line}</tspan>\n ))}\n </text>\n );\n }\n\n return (\n <g>\n {body}\n {selected && !preview && (\n <>\n <rect\n data-chrome=\"selection\"\n x={dim.x - 4} y={dim.y - 4}\n width={dim.w + 8} height={dim.h + 8}\n fill=\"none\" stroke=\"#3b82f6\" strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom},${4 / zoom}`}\n pointerEvents=\"none\"\n />\n {onHandlePointerDown && <ResizeHandles anno={anno} zoom={zoom} onHandlePointerDown={onHandlePointerDown} />}\n </>\n )}\n </g>\n );\n}\n\nfunction ResizeHandles({\n anno, zoom, onHandlePointerDown,\n}: {\n anno: Annotation;\n zoom: number;\n onHandlePointerDown: (e: React.PointerEvent<SVGElement>, corner: Corner) => void;\n}) {\n const r = 6 / zoom;\n const sw = 1.5 / zoom;\n const handleProps = (cursor: string) => ({\n fill: '#fff',\n stroke: '#3b82f6',\n strokeWidth: sw,\n pointerEvents: 'all' as const,\n style: { cursor } as React.CSSProperties,\n 'data-chrome': 'handle',\n });\n\n if (anno.type === 'arrow') {\n return (\n <>\n <circle cx={anno.x1} cy={anno.y1} r={r} {...handleProps('grab')} onPointerDown={(e) => onHandlePointerDown(e, 'start')} />\n <circle cx={anno.x2} cy={anno.y2} r={r} {...handleProps('grab')} onPointerDown={(e) => onHandlePointerDown(e, 'end')} />\n </>\n );\n }\n if (anno.type === 'text' || anno.type === 'draw') {\n return null;\n }\n const x = anno.x, y = anno.y, w = anno.w, h = anno.h;\n return (\n <>\n <circle cx={x} cy={y} r={r} {...handleProps('nwse-resize')} onPointerDown={(e) => onHandlePointerDown(e, 'nw')} />\n <circle cx={x + w} cy={y} r={r} {...handleProps('nesw-resize')} onPointerDown={(e) => onHandlePointerDown(e, 'ne')} />\n <circle cx={x + w} cy={y + h} r={r} {...handleProps('nwse-resize')} onPointerDown={(e) => onHandlePointerDown(e, 'se')} />\n <circle cx={x} cy={y + h} r={r} {...handleProps('nesw-resize')} onPointerDown={(e) => onHandlePointerDown(e, 'sw')} />\n </>\n );\n}\n\nfunction ArrowShape({ anno, interactive }: { anno: ArrowAnno; interactive: any }) {\n const headLen = Math.max(12, anno.stroke * 4);\n const angle = Math.atan2(anno.y2 - anno.y1, anno.x2 - anno.x1);\n const a1 = angle + Math.PI - Math.PI / 7;\n const a2 = angle + Math.PI + Math.PI / 7;\n const head = `M${anno.x2},${anno.y2} L${anno.x2 + headLen * Math.cos(a1)},${anno.y2 + headLen * Math.sin(a1)} L${anno.x2 + headLen * Math.cos(a2)},${anno.y2 + headLen * Math.sin(a2)} Z`;\n return (\n <g {...interactive}>\n <line\n x1={anno.x1} y1={anno.y1} x2={anno.x2} y2={anno.y2}\n stroke={anno.color} strokeWidth={anno.stroke} strokeLinecap=\"round\"\n />\n <path d={head} fill={anno.color} />\n </g>\n );\n}\n\nfunction CropOverlay({ rect, imageSize }: { rect: { x: number; y: number; w: number; h: number }; imageSize: { w: number; h: number } }) {\n return (\n <g pointerEvents=\"none\">\n <path\n d={`M0,0 H${imageSize.w} V${imageSize.h} H0 Z M${rect.x},${rect.y} V${rect.y + rect.h} H${rect.x + rect.w} V${rect.y} Z`}\n fill=\"rgba(0,0,0,0.45)\"\n fillRule=\"evenodd\"\n />\n <rect\n x={rect.x} y={rect.y} width={rect.w} height={rect.h}\n fill=\"none\" stroke=\"#fff\" strokeWidth={2} strokeDasharray=\"8,6\"\n />\n </g>\n );\n}\n\nfunction PendingTextEditor({\n pendingText, color, size, font, bold, italic, underline, scale, onChange, onCommit, onCancel,\n}: {\n pendingText: { x: number; y: number; value: string; editingId?: string };\n color: string;\n size: number;\n font: string;\n bold: boolean;\n italic: boolean;\n underline: boolean;\n scale: number;\n onChange: (value: string) => void;\n onCommit: () => void;\n onCancel: () => void;\n}) {\n const ref = useRef<HTMLTextAreaElement>(null);\n useEffect(() => {\n const id = requestAnimationFrame(() => {\n ref.current?.focus();\n ref.current?.select?.();\n });\n return () => cancelAnimationFrame(id);\n }, []);\n return (\n <div\n style={{\n position: 'absolute',\n left: `${pendingText.x * scale}px`,\n top: `${pendingText.y * scale}px`,\n transform: 'translateY(-2px)',\n zIndex: 5,\n }}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <textarea\n ref={ref}\n value={pendingText.value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onCommit}\n onKeyDown={(e) => {\n if (e.key === 'Escape') { e.preventDefault(); onCancel(); }\n else if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); onCommit(); }\n }}\n placeholder=\"Type then Enter…\"\n rows={1}\n className=\"bg-white/95 border border-blue-400 rounded px-1 py-0.5 outline-none resize-none shadow-md\"\n style={{\n color,\n fontSize: `${size * scale}px`,\n fontFamily: font,\n fontWeight: bold ? 700 : 400,\n fontStyle: italic ? 'italic' : 'normal',\n textDecoration: underline ? 'underline' : undefined,\n minWidth: 80,\n }}\n />\n </div>\n );\n}\n\n// ── helpers ──────────────────────────────────────────────────────────────────\n\nfunction makeShape(\n tool: Tool,\n start: { x: number; y: number },\n end: { x: number; y: number },\n color: string,\n stroke: number,\n rectRadius: number,\n): Annotation | null {\n if (tool === 'rect') {\n const r = normalizeRect(start, end);\n return { id: '', type: 'rect', x: r.x, y: r.y, w: r.w, h: r.h, color, stroke, radius: rectRadius };\n }\n if (tool === 'circle') {\n const r = normalizeRect(start, end);\n return { id: '', type: 'circle', x: r.x, y: r.y, w: r.w, h: r.h, color, stroke };\n }\n if (tool === 'arrow') {\n return { id: '', type: 'arrow', x1: start.x, y1: start.y, x2: end.x, y2: end.y, color, stroke };\n }\n if (tool === 'mosaic') {\n const r = normalizeRect(start, end);\n return { id: '', type: 'mosaic', x: r.x, y: r.y, w: r.w, h: r.h };\n }\n return null;\n}\n\nfunction isTrivial(a: Annotation): boolean {\n if (a.type === 'arrow') return Math.abs(a.x2 - a.x1) < 4 && Math.abs(a.y2 - a.y1) < 4;\n if (a.type === 'draw') return a.points.length < 2;\n if ('w' in a && 'h' in a) return a.w < 4 || a.h < 4;\n return false;\n}\n\nfunction translate(a: Annotation, dx: number, dy: number): Annotation {\n if (a.type === 'arrow') return { ...a, x1: a.x1 + dx, y1: a.y1 + dy, x2: a.x2 + dx, y2: a.y2 + dy };\n if (a.type === 'draw') return { ...a, points: a.points.map(p => ({ x: p.x + dx, y: p.y + dy })) };\n if (a.type === 'text') return { ...a, x: a.x + dx, y: a.y + dy };\n return { ...a, x: a.x + dx, y: a.y + dy } as Annotation;\n}\n\nfunction resize(\n original: Annotation,\n corner: Corner,\n p: { x: number; y: number },\n): Annotation {\n if (original.type === 'arrow') {\n if (corner === 'start') return { ...original, x1: p.x, y1: p.y };\n if (corner === 'end') return { ...original, x2: p.x, y2: p.y };\n return original;\n }\n if (original.type === 'text' || original.type === 'draw') return original;\n const left = original.x;\n const right = original.x + original.w;\n const top = original.y;\n const bottom = original.y + original.h;\n let x1 = left, y1 = top, x2 = right, y2 = bottom;\n if (corner === 'nw') { x1 = p.x; y1 = p.y; }\n if (corner === 'ne') { x2 = p.x; y1 = p.y; }\n if (corner === 'se') { x2 = p.x; y2 = p.y; }\n if (corner === 'sw') { x1 = p.x; y2 = p.y; }\n const r = normalizeRect({ x: x1, y: y1 }, { x: x2, y: y2 });\n return { ...original, x: r.x, y: r.y, w: r.w, h: r.h } as Annotation;\n}\n\nfunction boundingBox(a: Annotation): { x: number; y: number; w: number; h: number } {\n if (a.type === 'arrow') {\n const x = Math.min(a.x1, a.x2);\n const y = Math.min(a.y1, a.y2);\n return { x, y, w: Math.abs(a.x2 - a.x1), h: Math.abs(a.y2 - a.y1) };\n }\n if (a.type === 'draw') {\n if (a.points.length === 0) return { x: 0, y: 0, w: 0, h: 0 };\n let minX = a.points[0].x, maxX = a.points[0].x, minY = a.points[0].y, maxY = a.points[0].y;\n for (const p of a.points) {\n if (p.x < minX) minX = p.x; if (p.x > maxX) maxX = p.x;\n if (p.y < minY) minY = p.y; if (p.y > maxY) maxY = p.y;\n }\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY };\n }\n if (a.type === 'text') {\n const lines = a.text.split('\\n');\n const longest = lines.reduce((m, l) => Math.max(m, l.length), 0);\n return { x: a.x, y: a.y, w: longest * a.size * 0.55, h: lines.length * a.size * 1.2 };\n }\n return { x: a.x, y: a.y, w: a.w, h: a.h };\n}\n\nfunction normalizeRect(a: { x: number; y: number }, b: { x: number; y: number }) {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const w = Math.abs(a.x - b.x);\n const h = Math.abs(a.y - b.y);\n return { x, y, w, h };\n}\n\nfunction withinBounds(a: Annotation, w: number, h: number): boolean {\n const bb = boundingBox(a);\n return bb.x + bb.w > 0 && bb.y + bb.h > 0 && bb.x < w && bb.y < h;\n}\n\nfunction pointsToPath(points: { x: number; y: number }[]): string {\n if (points.length === 0) return '';\n let d = `M ${points[0].x} ${points[0].y}`;\n for (let i = 1; i < points.length; i++) d += ` L ${points[i].x} ${points[i].y}`;\n return d;\n}\n\nfunction applyMosaic(\n ctx: CanvasRenderingContext2D,\n rect: { x: number; y: number; w: number; h: number },\n) {\n const x = Math.round(Math.max(0, rect.x));\n const y = Math.round(Math.max(0, rect.y));\n const w = Math.round(Math.min(ctx.canvas.width - x, rect.w));\n const h = Math.round(Math.min(ctx.canvas.height - y, rect.h));\n if (w < 2 || h < 2) return;\n const data = ctx.getImageData(x, y, w, h);\n const block = MOSAIC_BLOCK;\n for (let by = 0; by < h; by += block) {\n for (let bx = 0; bx < w; bx += block) {\n let r = 0, g = 0, b = 0, a = 0, n = 0;\n const blockW = Math.min(block, w - bx);\n const blockH = Math.min(block, h - by);\n for (let yy = 0; yy < blockH; yy++) {\n for (let xx = 0; xx < blockW; xx++) {\n const i = ((by + yy) * w + (bx + xx)) * 4;\n r += data.data[i]; g += data.data[i + 1]; b += data.data[i + 2]; a += data.data[i + 3];\n n++;\n }\n }\n r = Math.round(r / n); g = Math.round(g / n); b = Math.round(b / n); a = Math.round(a / n);\n for (let yy = 0; yy < blockH; yy++) {\n for (let xx = 0; xx < blockW; xx++) {\n const i = ((by + yy) * w + (bx + xx)) * 4;\n data.data[i] = r; data.data[i + 1] = g; data.data[i + 2] = b; data.data[i + 3] = a;\n }\n }\n }\n }\n ctx.putImageData(data, x, y);\n}\n","/**\n * Preview — windowed PDF viewer app.\n *\n * Consumers stage a PDF via `setPdfPreview({ url, filename, ... })` and then\n * call `openPage('/preview')`. The next Preview window to mount drains the\n * staged data — each window owns its own content, so opening a second Preview\n * never disturbs the first. To swap content in an *already-open* window (e.g.\n * a converting placeholder being replaced by the resolved file), keep the\n * handle returned by `setPdfPreview` and call `.update(next)` on it.\n */\nimport { useState, useEffect, useRef, createContext, useContext } from 'react';\nimport { createPortal } from 'react-dom';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport toast from '../shell/toast';\nimport { WindowTitle, getActiveModalId, registerModalEscapeInterceptor } from '../shell/Modal';\nimport AboutApp from './_about';\nimport ImageAnnotator, { type ImageAnnotatorHandle } from './ImageAnnotator';\n\n/** Slot at the right end of the outer Preview toolbar — each format panel\n * portals its own action buttons (page nav, zoom, layers, download, etc.)\n * here so we render a single toolbar row instead of two stacked. */\nconst ToolbarSlotContext = createContext<HTMLElement | null>(null);\nfunction PanelActions({ children }: { children: React.ReactNode }) {\n const slot = useContext(ToolbarSlotContext);\n return slot ? createPortal(children, slot) : null;\n}\n\n// online-3d-viewer pulls three@0.176, where WebGLRenderer's stencil context\n// attribute defaults to FALSE. Without a stencil buffer the capped section\n// view's mask test always reads zero and the cap never renders. Patch the\n// canvas getContext call once so the WebGL context is created with stencil\n// enabled. Always force stencil:true on webgl context requests — three.js\n// passes stencil:false explicitly when it isn't user-specified, so a\n// \"preserve if already set\" check would skip the path that needs us most.\nlet _stencilContextPatched = false;\nfunction ensureStencilContextAttribute() {\n if (_stencilContextPatched) return;\n if (typeof HTMLCanvasElement === 'undefined') return;\n _stencilContextPatched = true;\n const orig = HTMLCanvasElement.prototype.getContext;\n HTMLCanvasElement.prototype.getContext = function patchedGetContext(\n this: HTMLCanvasElement,\n type: string,\n attrs?: any,\n ) {\n if (type === 'webgl' || type === 'webgl2' || type === 'experimental-webgl') {\n // Force stencil regardless of what the caller asked for.\n attrs = { ...(attrs || {}), stencil: true };\n }\n return (orig as any).call(this, type, attrs);\n } as any;\n // eslint-disable-next-line no-console\n console.info('[Preview] section: canvas getContext patched (force stencil=true)');\n}\n\nconst TITLE_DISPLAY_MAX = 24;\nfunction truncateForTitle(s: string) {\n return s.length > TITLE_DISPLAY_MAX ? `${s.slice(0, TITLE_DISPLAY_MAX - 1)}…` : s;\n}\n\n// Default the worker to the matching unpkg build (mirrors the consumer's\n// installed npm version exactly). Consumers can override by setting\n// pdfjsLib.GlobalWorkerOptions.workerSrc themselves before opening the\n// Preview window.\nif (typeof window !== 'undefined' && !pdfjsLib.GlobalWorkerOptions.workerSrc) {\n pdfjsLib.GlobalWorkerOptions.workerSrc =\n `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/build/pdf.worker.min.mjs`;\n}\n\nexport interface PdfPreviewData {\n /** Object URL or remote URL of the PDF. Blob URLs are revoked when the window unmounts.\n * Leave blank when staging a `converting: true` placeholder; call `handle.update({...})`\n * on the handle returned by `setPdfPreview` once conversion finishes. */\n url?: string;\n /** Display name (and download filename). */\n filename: string;\n /** Renderer to use. Defaults to `'pdf'`. `'dxf'` requires the consumer to\n * have `dxf-viewer` installed (it's an optional peer dep). `'image'`\n * renders an `<img>` for raster screenshots / photos. `'3d'` covers\n * STEP / STL / OBJ / GLTF / 3MF / IGES via the optional\n * `online-3d-viewer` peer dep. */\n kind?: 'pdf' | 'dxf' | 'image' | '3d';\n /** Optional download handler — replaces the built-in \"save URL as filename\" if supplied. */\n onDownload?: () => void;\n /** Optional email handler — only shown when supplied. */\n onEmail?: () => void;\n /** Show a progress placeholder while the consumer fetches/converts the file. */\n converting?: boolean;\n /** Headline shown on the converting placeholder (e.g. \"CONVERTING DWG FILE\"). */\n convertingMessage?: string;\n}\n\nconst EVENT_NAME = 'react-os-shell:pdf-preview-update';\n\n/** Handle returned by `setPdfPreview`. Holds the identity of the staged\n * payload so a later `.update()` only targets the window that picked it up\n * (not every open Preview, which would clobber unrelated windows). */\nexport interface PdfPreviewHandle {\n /** Replace the data shown in the window that consumed this staging.\n * No-op if no window ever consumed it, or if that window has been closed. */\n update(next: PdfPreviewData): void;\n}\n\ninterface PendingStage {\n token: number;\n data: PdfPreviewData;\n}\n\nlet pending: PendingStage | null = null;\nlet nextToken = 0;\n\n/** Stage a PDF for the next Preview window mount. The returned handle's\n * `update()` method swaps content in *that* specific window only — use it\n * to replace a `converting: true` placeholder with the resolved file. */\nexport function setPdfPreview(data: PdfPreviewData): PdfPreviewHandle {\n const token = ++nextToken;\n pending = { token, data };\n return {\n update(next: PdfPreviewData) {\n if (typeof window === 'undefined') return;\n window.dispatchEvent(new CustomEvent(EVENT_NAME, { detail: { token, data: next } }));\n },\n };\n}\n\nexport default function Preview() {\n // One-shot drain: this instance claims whatever was staged and stores the\n // token so it can recognise later `.update()` calls aimed at it. The render\n // phase only PEEKS — under React 18 concurrent rendering a render pass can\n // be discarded and replayed (the first mount of this lazy component\n // suspends on its chunk), and a destructive read here would let the\n // discarded pass swallow the payload, leaving the committed window empty.\n // The stage is cleared in the mount effect below (commit phase) instead.\n const consumedRef = useRef<PendingStage | null | undefined>(undefined);\n if (consumedRef.current === undefined) {\n consumedRef.current = pending;\n }\n useEffect(() => {\n // Claim the stage for real once mounted. The identity check keeps a\n // payload staged *after* our render-phase peek (e.g. a second preview\n // opened in quick succession) available for the window it belongs to.\n if (consumedRef.current !== null && pending === consumedRef.current) {\n pending = null;\n }\n }, []);\n const [data, setData] = useState<PdfPreviewData | null>(consumedRef.current?.data ?? null);\n\n // Only respond to update events whose token matches our claim.\n useEffect(() => {\n const myToken = consumedRef.current?.token;\n if (myToken == null) return;\n const handler = (e: Event) => {\n const detail = (e as CustomEvent<PendingStage>).detail;\n if (!detail || detail.token !== myToken) return;\n setData(prev => {\n if (prev?.url && prev.url !== detail.data.url && prev.url.startsWith('blob:')) {\n URL.revokeObjectURL(prev.url);\n }\n return detail.data;\n });\n };\n window.addEventListener(EVENT_NAME, handler);\n return () => window.removeEventListener(EVENT_NAME, handler);\n }, []);\n\n // Revoke blob URL on unmount.\n useEffect(() => () => {\n if (data?.url?.startsWith('blob:')) URL.revokeObjectURL(data.url);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Window title reflects whatever is loaded — same pattern Spreadsheets uses.\n const titleName = data?.filename ? truncateForTitle(data.filename) : 'Untitled';\n\n const fileRef = useRef<HTMLInputElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n // Slot element for panel-portaled action buttons. Use state (not ref) so the\n // first render that mounts the slot triggers a re-render in panel children.\n const [toolbarSlotEl, setToolbarSlotEl] = useState<HTMLDivElement | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n // Drag-enter/leave fire on every child the cursor crosses, so a single\n // boolean flickers. Track depth with a counter — overlay shows on first\n // enter, clears only when the counter unwinds back to zero.\n const dragDepthRef = useRef(0);\n const handlePick = () => fileRef.current?.click();\n const resetDrag = () => {\n dragDepthRef.current = 0;\n setIsDragging(false);\n };\n // Only the frontmost (active) Preview window should accept drags. With\n // multiple Previews open this prevents the overlay flashing on every\n // window the cursor crosses, and matches the user's expectation that\n // they activate a window first by clicking it.\n const isActiveWindow = (el: HTMLElement) => {\n const myModal = el.closest('[data-modal-id]') as HTMLElement | null;\n if (!myModal) return true; // outside any modal — be permissive\n return getActiveModalId() === myModal.dataset.modalId;\n };\n // If the drag ends outside our component (e.g. dropped onto desktop trash),\n // we never receive `drop` or our outer `dragleave`. Listen on window so\n // any end of any drag clears the overlay. Also wire ESC as an escape hatch.\n useEffect(() => {\n const onWindowDragEnd = () => resetDrag();\n const onWindowDrop = () => resetDrag();\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') resetDrag();\n };\n window.addEventListener('dragend', onWindowDragEnd);\n window.addEventListener('drop', onWindowDrop);\n window.addEventListener('keydown', onKey);\n return () => {\n window.removeEventListener('dragend', onWindowDragEnd);\n window.removeEventListener('drop', onWindowDrop);\n window.removeEventListener('keydown', onKey);\n };\n }, []);\n const ingestFile = (file: File) => {\n const ext = (file.name.split('.').pop() || '').toLowerCase();\n const kind: 'pdf' | 'image' | 'dxf' | '3d' | undefined =\n ext === 'pdf' ? 'pdf'\n : ext === 'dxf' ? 'dxf'\n : ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'avif', 'bmp'].includes(ext) ? 'image'\n : ['stp', 'step', 'stl', 'obj', 'gltf', 'glb', '3mf', 'iges', 'igs', 'ply', 'fbx'].includes(ext) ? '3d'\n : undefined;\n if (!kind) {\n if (ext === 'dwg') toast.error('DWG files need server-side conversion. Convert to PDF or DXF first.');\n else toast.error(`Unsupported file type: .${ext || 'unknown'}`);\n return;\n }\n const url = URL.createObjectURL(file);\n // Local-only update: setPdfPreview stages content for the *next* window\n // to mount — calling it from inside an open window would overwrite that\n // slot and steal the payload from whoever opens next.\n setData(prev => {\n if (prev?.url?.startsWith('blob:') && prev.url !== url) {\n URL.revokeObjectURL(prev.url);\n }\n return { url, filename: file.name, kind };\n });\n };\n const handleFile = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) ingestFile(file);\n if (fileRef.current) fileRef.current.value = '';\n };\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n resetDrag();\n const file = e.dataTransfer.files?.[0];\n if (file) ingestFile(file);\n };\n\n const Toolbar = (\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0\">\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".pdf,.dxf,.jpg,.jpeg,.png,.gif,.webp,.svg,.avif,.bmp,.stp,.step,.stl,.obj,.gltf,.glb,.3mf,.iges,.igs,.ply,.fbx\"\n onChange={handleFile}\n className=\"hidden\"\n />\n <button\n onClick={handlePick}\n className=\"text-xs text-gray-700 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors flex items-center gap-1\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 9.776c.112-.017.227-.026.344-.026h15.812c.117 0 .232.009.344.026m-16.5 0a2.25 2.25 0 00-1.883 2.542l.857 6a2.25 2.25 0 002.227 1.932H19.05a2.25 2.25 0 002.227-1.932l.857-6a2.25 2.25 0 00-1.883-2.542m-16.5 0V6A2.25 2.25 0 016 3.75h3.879a1.5 1.5 0 011.06.44l2.122 2.12a1.5 1.5 0 001.06.44H18A2.25 2.25 0 0120.25 9v.776\" />\n </svg>\n Open\n </button>\n <span className=\"text-[10px] text-gray-400 ml-1\">PDF · DXF · 3D · Images</span>\n {data?.filename && (\n <>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <span className=\"text-xs font-medium text-gray-700 truncate max-w-[200px]\" title={data.filename}>{data.filename}</span>\n </>\n )}\n {/* Panel-specific actions (page nav, zoom, layers, download, …) get\n * portaled into this slot by whichever panel is active. */}\n <div ref={setToolbarSlotEl} className=\"ml-auto flex items-center gap-1 text-xs\" />\n </div>\n );\n\n let body: React.ReactNode;\n if (!data) {\n body = (\n <div className=\"flex flex-1 flex-col items-center justify-center text-gray-500 text-sm gap-3 p-8 text-center\">\n <svg className=\"h-12 w-12 text-gray-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" />\n </svg>\n <p className=\"font-medium text-gray-700\">Drop a file here, or click <button onClick={handlePick} className=\"text-blue-600 hover:underline\">Open</button>.</p>\n <div className=\"text-xs text-gray-500 max-w-sm\">\n <p className=\"font-semibold uppercase tracking-wide text-[10px] text-gray-400 mb-1\">Supported formats</p>\n <ul className=\"space-y-0.5\">\n <li><span className=\"font-mono text-gray-700\">.pdf</span> — multi-page document viewer</li>\n <li><span className=\"font-mono text-gray-700\">.dxf</span> — vector CAD drawings (optional <span className=\"font-mono\">dxf-viewer</span> peer dep)</li>\n <li><span className=\"font-mono text-gray-700\">.stp .step .stl .obj .gltf .glb .3mf .iges</span> — 3D models (optional <span className=\"font-mono\">online-3d-viewer</span> peer dep)</li>\n <li><span className=\"font-mono text-gray-700\">.jpg .jpeg .png .gif .webp .svg .avif .bmp</span> — raster images</li>\n </ul>\n <p className=\"mt-2 text-[11px] text-gray-400 italic\">DWG files need to be converted to PDF or DXF first (server-side).</p>\n </div>\n </div>\n );\n } else if (data.converting || !data.url) {\n body = <ConvertingPanel filename={data.filename} message={data.convertingMessage} />;\n } else if (data.kind === 'dxf') {\n body = <DxfPanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n } else if (data.kind === '3d') {\n body = <StepPanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n } else if (data.kind === 'image') {\n body = <ImagePanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n } else {\n body = <PdfPanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n }\n\n return (\n <div\n className=\"relative flex flex-col h-full\"\n ref={rootRef}\n onDragEnter={(e) => {\n // Only count drags that actually carry files — ignore stray drags\n // (e.g. text selections) so we don't flash the overlay.\n if (!e.dataTransfer?.types?.includes?.('Files')) return;\n // And only the active (frontmost) Preview window responds.\n if (!isActiveWindow(e.currentTarget as HTMLElement)) return;\n e.preventDefault();\n dragDepthRef.current++;\n if (!isDragging) setIsDragging(true);\n }}\n onDragOver={(e) => {\n if (!e.dataTransfer?.types?.includes?.('Files')) return;\n if (!isActiveWindow(e.currentTarget as HTMLElement)) return;\n e.preventDefault();\n }}\n onDragLeave={() => {\n if (dragDepthRef.current > 0) dragDepthRef.current--;\n if (dragDepthRef.current === 0) setIsDragging(false);\n }}\n onDrop={(e) => {\n if (!isActiveWindow(e.currentTarget as HTMLElement)) {\n resetDrag();\n return;\n }\n handleDrop(e);\n }}\n >\n <WindowTitle title={`${titleName} - Preview`} />\n <AboutApp app=\"preview\" />\n {Toolbar}\n <ToolbarSlotContext.Provider value={toolbarSlotEl}>\n <div className=\"flex-1 min-h-0\">{body}</div>\n </ToolbarSlotContext.Provider>\n {isDragging && (\n <div className=\"absolute inset-0 bg-blue-500/15 border-4 border-dashed border-blue-500 pointer-events-none flex items-center justify-center z-20\">\n <div className=\"px-4 py-2 rounded-md bg-blue-600 text-white text-sm font-medium shadow-lg\">\n Drop to open\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction ConvertingPanel({ filename, message }: { filename: string; message?: string }) {\n return (\n <div className=\"flex flex-col items-center justify-center h-full bg-gray-100 gap-4 px-8\">\n <div className=\"flex flex-col items-center gap-3\">\n <svg className=\"h-12 w-12 text-blue-500 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.2\" />\n <path d=\"M22 12a10 10 0 0 1-10 10\" strokeLinecap=\"round\" />\n </svg>\n <div className=\"text-base font-semibold tracking-wide text-gray-700 uppercase\">{message || 'Converting file'}</div>\n <div className=\"text-xs text-gray-400 truncate max-w-md\">{filename}</div>\n </div>\n <div className=\"w-72 h-1.5 rounded-full bg-gray-200 overflow-hidden\">\n <div className=\"h-full w-1/3 bg-blue-500 rounded-full animate-pulse\" style={{ animation: 'preview-bar 1.4s ease-in-out infinite' }} />\n </div>\n <style>{`@keyframes preview-bar { 0% { transform: translateX(-110%); } 100% { transform: translateX(310%); } }`}</style>\n </div>\n );\n}\n\ninterface PdfPanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\nconst ZOOM_PRESETS = [50, 75, 100, 125, 150, 200, 300, 400];\n\n// Trimmed copy of pdf.js's text-layer rules (pdf_viewer.css), under our own\n// class name so a consumer that loads the full viewer CSS doesn't\n// double-apply. The layer is a sheet of transparent spans positioned over\n// the canvas glyphs — that's what makes the rendered page selectable. Span\n// positions are % of page size; font-size derives from\n// --total-scale-factor, which the render effect sets to the viewport scale.\n// The .endOfContent sentinel plus the .selecting toggle keep a\n// drag-selection alive between lines and past the last line (same trick as\n// pdf.js's own TextLayerBuilder).\nconst TEXT_LAYER_CSS = `\n.preview-pdf-textlayer {\n position: absolute;\n inset: 0;\n overflow: clip;\n line-height: 1;\n text-align: initial;\n text-size-adjust: none;\n forced-color-adjust: none;\n transform-origin: 0 0;\n caret-color: CanvasText;\n --min-font-size: 1;\n --text-scale-factor: calc(var(--total-scale-factor, 1) * var(--min-font-size));\n --min-font-size-inv: calc(1 / var(--min-font-size));\n}\n.preview-pdf-textlayer :is(span, br) {\n color: transparent;\n position: absolute;\n white-space: pre;\n cursor: text;\n transform-origin: 0% 0%;\n}\n.preview-pdf-textlayer > :not(.markedContent),\n.preview-pdf-textlayer .markedContent span:not(.markedContent) {\n z-index: 1;\n --font-height: 0;\n font-size: calc(var(--text-scale-factor) * var(--font-height));\n --scale-x: 1;\n --rotate: 0deg;\n transform: rotate(var(--rotate)) scaleX(var(--scale-x)) scale(var(--min-font-size-inv));\n}\n.preview-pdf-textlayer .markedContent {\n display: contents;\n}\n.preview-pdf-textlayer span[role=\"img\"] {\n user-select: none;\n cursor: default;\n}\n.preview-pdf-textlayer ::selection {\n background: rgba(0, 80, 255, 0.25);\n}\n.preview-pdf-textlayer br::selection {\n background: transparent;\n}\n.preview-pdf-textlayer .endOfContent {\n display: block;\n position: absolute;\n inset: 100% 0 0;\n z-index: 0;\n cursor: default;\n user-select: none;\n}\n.preview-pdf-textlayer.selecting .endOfContent {\n top: 0;\n}\n`;\n\nfunction PdfPanel({ url, filename, onDownload, onEmail }: PdfPanelProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const textLayerRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [pdf, setPdf] = useState<pdfjsLib.PDFDocumentProxy | null>(null);\n const [page, setPage] = useState(1);\n const [totalPages, setTotalPages] = useState(0);\n const [scale, setScale] = useState(1);\n // Fit mode is the default — scale stays auto-tracking the container width\n // until the user picks a manual zoom (− / + / dropdown). Re-armed by the\n // Fit toolbar button.\n const [fitMode, setFitMode] = useState(true);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n pdfjsLib.getDocument(url).promise.then(doc => {\n if (cancelled) return;\n setPdf(doc);\n setTotalPages(doc.numPages);\n setLoading(false);\n }).catch(() => {\n if (!cancelled) { toast.error('Failed to load PDF'); setLoading(false); }\n });\n return () => { cancelled = true; };\n }, [url]);\n\n // Auto-fit: re-compute scale from container width whenever fit mode is on,\n // the document changes, the page changes, or the container resizes. Window\n // resize and Modal drag-resize both trigger ResizeObserver. Manual zoom\n // turns this off until the user clicks Fit again.\n useEffect(() => {\n if (!pdf || !fitMode || !containerRef.current) return;\n const fit = () => {\n if (!containerRef.current) return;\n pdf.getPage(page).then(p => {\n const containerW = containerRef.current?.clientWidth || 800;\n const viewport = p.getViewport({ scale: 1 });\n const next = Math.min(Math.max((containerW - 40) / viewport.width, 0.3), 4);\n setScale(prev => (Math.abs(prev - next) < 0.005 ? prev : next));\n });\n };\n fit();\n const ro = new ResizeObserver(fit);\n ro.observe(containerRef.current);\n return () => ro.disconnect();\n }, [pdf, page, fitMode]);\n\n useEffect(() => {\n if (!pdf || !canvasRef.current) return;\n let cancelled = false;\n let task: { cancel: () => void; promise: Promise<void> } | null = null;\n let textLayer: pdfjsLib.TextLayer | null = null;\n pdf.getPage(page).then(p => {\n if (cancelled || !canvasRef.current) return;\n const viewport = p.getViewport({ scale });\n const canvas = canvasRef.current;\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n // Lock the displayed (CSS) size to the viewport. pdf.js stamps inline\n // style.width/height on render and inline values stick across re-renders\n // even when canvas.width shrinks — without this, zoom changes only\n // affect resolution, not visible size.\n canvas.style.width = `${viewport.width}px`;\n canvas.style.height = `${viewport.height}px`;\n const ctx = canvas.getContext('2d')!;\n task = p.render({ canvas, canvasContext: ctx, viewport });\n task.promise.catch(() => {});\n // Selectable text layer — transparent spans over the canvas glyphs.\n // Rebuilt per page/zoom render; pdf.js reads --total-scale-factor for\n // span font-size and the container's own width/height.\n const textEl = textLayerRef.current;\n if (textEl) {\n textEl.replaceChildren();\n textEl.style.setProperty('--total-scale-factor', String(viewport.scale));\n textLayer = new pdfjsLib.TextLayer({\n textContentSource: p.streamTextContent(),\n container: textEl,\n viewport,\n });\n textLayer.render().then(() => {\n if (cancelled) return;\n const end = document.createElement('div');\n end.className = 'endOfContent';\n textEl.append(end);\n }).catch(() => {});\n }\n });\n return () => {\n cancelled = true;\n task?.cancel();\n textLayer?.cancel();\n };\n }, [pdf, page, scale]);\n\n // End a selection drag wherever the pointer is released — the .selecting\n // class is added on pointerdown in the layer itself (see JSX below).\n useEffect(() => {\n const up = () => textLayerRef.current?.classList.remove('selecting');\n window.addEventListener('pointerup', up);\n return () => window.removeEventListener('pointerup', up);\n }, []);\n\n const handlePrint = () => {\n if (!pdf) return;\n const win = window.open('', '_blank');\n if (!win) { toast.error('Allow popups to print'); return; }\n const promises: Promise<string>[] = [];\n for (let i = 1; i <= totalPages; i++) {\n promises.push(pdf.getPage(i).then(p => {\n const vp = p.getViewport({ scale: 2 });\n const c = document.createElement('canvas');\n c.width = vp.width; c.height = vp.height;\n return p.render({ canvas: c, canvasContext: c.getContext('2d')!, viewport: vp }).promise.then(() => c.toDataURL());\n }));\n }\n Promise.all(promises).then(images => {\n win.document.write(`<html><head><title>${filename}</title><style>@media print{body{margin:0}img{width:100%;page-break-after:always}}</style></head><body>`);\n win.document.write(images.map(src => `<img src=\"${src}\"/>`).join(''));\n win.document.write('</body></html>');\n win.document.close();\n setTimeout(() => { win.print(); win.close(); }, 300);\n });\n };\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n // Re-arm fit mode. The auto-fit effect picks the new scale on its next\n // tick once `fitMode` flips to true.\n const fitWidth = () => setFitMode(true);\n\n // Wheel and keyboard page navigation. Only takes the wheel event when\n // the container is at the top/bottom edge — otherwise normal scroll\n // moves through a tall page first, matching native PDF readers.\n const onWheelPage = (e: React.WheelEvent<HTMLDivElement>) => {\n if (!pdf) return;\n if (e.ctrlKey || e.metaKey) return; // browser-zoom shortcut, leave alone\n const el = containerRef.current;\n if (!el) return;\n const atTop = el.scrollTop <= 0;\n const atBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - 1;\n if (e.deltaY > 0 && atBottom && page < totalPages) {\n e.preventDefault();\n setPage(p => Math.min(totalPages, p + 1));\n // Land at the top of the next page so wheel-down keeps reading\n // forward. requestAnimationFrame so the canvas has a tick to\n // resize before we scroll.\n requestAnimationFrame(() => { if (containerRef.current) containerRef.current.scrollTop = 0; });\n } else if (e.deltaY < 0 && atTop && page > 1) {\n e.preventDefault();\n setPage(p => Math.max(1, p - 1));\n requestAnimationFrame(() => {\n if (containerRef.current) containerRef.current.scrollTop = containerRef.current.scrollHeight;\n });\n }\n };\n const onKeyPage = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!pdf) return;\n // Ignore keyboard nav when an input/textarea has focus.\n const tag = (document.activeElement?.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea' || (document.activeElement as HTMLElement)?.isContentEditable) return;\n if (e.key === 'PageDown' || e.key === 'ArrowRight') {\n if (page < totalPages) { e.preventDefault(); setPage(p => Math.min(totalPages, p + 1)); }\n } else if (e.key === 'PageUp' || e.key === 'ArrowLeft') {\n if (page > 1) { e.preventDefault(); setPage(p => Math.max(1, p - 1)); }\n } else if (e.key === 'Home') {\n e.preventDefault(); setPage(1);\n } else if (e.key === 'End') {\n e.preventDefault(); setPage(totalPages);\n }\n };\n\n const btn = 'px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1';\n\n return (\n <div className=\"flex flex-col h-full\">\n <PanelActions>\n <button onClick={() => setPage(p => Math.max(1, p - 1))} disabled={page <= 1} className=\"px-1 py-1 rounded hover:bg-gray-200 disabled:opacity-30 text-gray-600\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 19.5L8.25 12l7.5-7.5\" /></svg>\n </button>\n <span className=\"text-gray-600 font-medium tabular-nums\">{page} / {totalPages}</span>\n <button onClick={() => setPage(p => Math.min(totalPages, p + 1))} disabled={page >= totalPages} className=\"px-1 py-1 rounded hover:bg-gray-200 disabled:opacity-30 text-gray-600\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" /></svg>\n </button>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <button\n onClick={() => { setFitMode(false); setScale(s => Math.max(0.3, Math.round((s - 0.25) * 100) / 100)); }}\n className={btn}\n >−</button>\n <select\n value={fitMode ? 'fit' : (ZOOM_PRESETS.includes(Math.round(scale * 100)) ? Math.round(scale * 100) : 'custom')}\n onChange={e => {\n const v = e.target.value;\n if (v === 'fit') { setFitMode(true); return; }\n if (v !== 'custom') { setFitMode(false); setScale(Number(v) / 100); }\n }}\n className=\"bg-transparent hover:bg-gray-200 rounded px-1 py-1 text-gray-600 tabular-nums cursor-pointer focus:outline-none focus:ring-1 focus:ring-blue-400\"\n title=\"Zoom\"\n >\n <option value=\"fit\">Fit</option>\n {!fitMode && !ZOOM_PRESETS.includes(Math.round(scale * 100)) && (\n <option value=\"custom\">{Math.round(scale * 100)}%</option>\n )}\n {ZOOM_PRESETS.map(p => <option key={p} value={p}>{p}%</option>)}\n </select>\n <button\n onClick={() => { setFitMode(false); setScale(s => Math.min(4, Math.round((s + 0.25) * 100) / 100)); }}\n className={btn}\n >+</button>\n <button\n onClick={fitWidth}\n className={btn + (fitMode ? ' bg-gray-200 text-gray-900' : '')}\n title=\"Fit page width — auto-tracks the window size until you zoom manually\"\n >Fit</button>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <button onClick={handlePrint} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.72 13.829c-.24.03-.48.062-.72.096m.72-.096a42.415 42.415 0 0110.56 0m-10.56 0L6.34 18m10.94-4.171c.24.03.48.062.72.096m-.72-.096L17.66 18m0 0l.229 2.523a1.125 1.125 0 01-1.12 1.227H7.231c-.662 0-1.18-.568-1.12-1.227L6.34 18m11.318 0h1.091A2.25 2.25 0 0021 15.75V9.456c0-1.081-.768-2.015-1.837-2.175a48.055 48.055 0 00-1.913-.247M6.34 18H5.25A2.25 2.25 0 013 15.75V9.456c0-1.081.768-2.015 1.837-2.175a48.041 48.041 0 011.913-.247m10.5 0a48.536 48.536 0 00-10.5 0m10.5 0V3.375c0-.621-.504-1.125-1.125-1.125h-8.25c-.621 0-1.125.504-1.125 1.125v3.659M18 10.5h.008v.008H18V10.5zm-3 0h.008v.008H15V10.5z\" /></svg>\n Print\n </button>\n <button onClick={onDownload ?? handleDefaultDownload} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Download\n </button>\n {onEmail && (\n <button onClick={onEmail} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n Email\n </button>\n )}\n </PanelActions>\n\n <div\n ref={containerRef}\n className=\"flex-1 overflow-auto bg-gray-100 outline-none\"\n // tabIndex makes the scroll container itself focusable so PageUp /\n // PageDown / Arrow keys are captured even when no inner element\n // has focus (e.g. right after the panel mounts). Wheel handler\n // page-flips when the user reaches the top/bottom of a long page.\n tabIndex={0}\n onWheel={onWheelPage}\n onKeyDown={onKeyPage}\n >\n {loading ? (\n <div className=\"flex items-center justify-center h-full text-gray-400 text-sm\">Loading PDF...</div>\n ) : (\n <div className=\"min-h-full flex items-center justify-center p-4\">\n <style>{TEXT_LAYER_CSS}</style>\n <div className=\"relative shadow-lg rounded\">\n <canvas ref={canvasRef} className=\"block rounded\" />\n <div\n ref={textLayerRef}\n className=\"preview-pdf-textlayer\"\n onPointerDown={e => e.currentTarget.classList.add('selecting')}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\ninterface DxfPanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\n// Default font set covering Latin + CJK glyphs, served from jsdelivr's mirror\n// of the dxf-viewer example assets. Without these, any TEXT/MTEXT entities in\n// the drawing render as empty boxes. Consumers can override by setting\n// `window.__REACT_OS_SHELL_DXF_FONTS__` to a different array of TTF/OTF URLs.\nconst DEFAULT_DXF_FONTS: string[] = [\n 'https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/Roboto-LightItalic.ttf',\n 'https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/NotoSansDisplay-SemiCondensedLightItalic.ttf',\n 'https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/NanumGothic-Regular.ttf',\n];\n\ninterface DxfLayer {\n name: string;\n displayName?: string;\n color?: number;\n visible: boolean;\n}\n\n/** AutoCAD drawing/editing commands we recognise (so the muscle-memory\n * user gets a helpful \"viewer is read-only\" echo instead of a generic\n * unknown-command error). Alias → canonical name. */\nconst DXF_EDIT_COMMANDS: Record<string, string> = {\n l: 'LINE', line: 'LINE', pl: 'PLINE', pline: 'PLINE',\n ex: 'EXTEND', extend: 'EXTEND', tr: 'TRIM', trim: 'TRIM',\n e: 'ERASE', erase: 'ERASE', m: 'MOVE', move: 'MOVE',\n co: 'COPY', cp: 'COPY', copy: 'COPY', o: 'OFFSET', offset: 'OFFSET',\n f: 'FILLET', fillet: 'FILLET', cha: 'CHAMFER', chamfer: 'CHAMFER',\n x: 'EXPLODE', explode: 'EXPLODE', mi: 'MIRROR', mirror: 'MIRROR',\n ro: 'ROTATE', rotate: 'ROTATE', sc: 'SCALE', scale: 'SCALE',\n s: 'STRETCH', stretch: 'STRETCH', ar: 'ARRAY', array: 'ARRAY',\n rec: 'RECTANG', rectang: 'RECTANG', rectangle: 'RECTANG',\n c: 'CIRCLE', circle: 'CIRCLE', a: 'ARC', arc: 'ARC',\n el: 'ELLIPSE', ellipse: 'ELLIPSE', t: 'MTEXT', mt: 'MTEXT', mtext: 'MTEXT', text: 'TEXT',\n b: 'BLOCK', block: 'BLOCK', i: 'INSERT', insert: 'INSERT', ha: 'HATCH', hatch: 'HATCH',\n};\n\nconst DXF_CMD_HELP = 'Commands: DI distance · DIM/DLI linear dim · H / V force axis · <number> lock Δ · U undo pick · Z fit · LA layers · Esc exit';\n\nfunction DxfPanel({ url, filename, onDownload, onEmail }: DxfPanelProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<any>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [layers, setLayers] = useState<DxfLayer[]>([]);\n const [showLayers, setShowLayers] = useState(false);\n const [showHint, setShowHint] = useState(true);\n\n // Measurement tool — DXF (2D) edition.\n //\n // Four modes (pill next to the Measure button, or typed commands):\n // - Auto: AutoCAD DIMLINEAR — measures ΔX or ΔY, whichever delta is\n // larger between the two picks.\n // - H / V: force the axis (DIMLINEAR Horizontal / Vertical).\n // - Point: straight-line (Euclidean) distance, AutoCAD DIST.\n //\n // All visuals (markers, line, distance label, snap indicator) are HTML/\n // SVG overlays positioned via camera projection — fixed pixel size, so\n // they don't grow into giant orange blobs when the user zooms in.\n // Snapping (endpoint / node / midpoint / intersection / nearest-on-line)\n // is computed in screen space against a cached list of every line\n // segment and point in the scene (built once per measure session).\n const [measureEnabled, setMeasureEnabled] = useState(false);\n const [measureMode, setMeasureMode] = useState<'point' | 'horizontal' | 'vertical' | 'auto'>('auto');\n const [measureDistance, setMeasureDistance] = useState<number | null>(null);\n /** Axis the current measurement actually resolved to — differs from\n * measureMode when mode is 'auto' (DIMLINEAR picks the dominant axis).\n * Drives the toolbar chip arrow/tooltip. */\n const [measureResolved, setMeasureResolved] = useState<'point' | 'horizontal' | 'vertical' | null>(null);\n /** When set in H or V mode, the second pick's X (H) or Y (V) snaps to\n * the first pick's coord + this value, sign-matched to whichever side\n * of A the user clicked on. The displayed measurement then becomes\n * the perpendicular distance (Δy in H, Δx in V) — useful for \"feature\n * is 30mm horizontal from A; how far is it vertically?\" workflows. */\n const [measureFixedDist, setMeasureFixedDist] = useState<number | null>(null);\n /** Raw text in the fixed-distance input — kept separate so partial\n * edits (e.g. just \"-\") don't clobber the parsed value with NaN. */\n const [measureFixedInput, setMeasureFixedInput] = useState('');\n // Refs that mirror the React state so the main measure effect can read\n // the current values without rebuilding when the user switches mode or\n // changes the fixed distance — picks are preserved across these\n // changes.\n const measureModeRef = useRef(measureMode);\n const measureFixedDistRef = useRef(measureFixedDist);\n useEffect(() => { measureModeRef.current = measureMode; }, [measureMode]);\n useEffect(() => { measureFixedDistRef.current = measureFixedDist; }, [measureFixedDist]);\n /** Exposed by the measure effect so other effects can ask it to redraw\n * using the current refs (e.g. after mode / fixed-distance change). */\n const measureRedrawRef = useRef<(() => void) | null>(null);\n /** Exposed by the measure effect — clears the current picks/markers so a\n * typed command (DI, DIM, …) starts a fresh measurement. */\n const measureResetRef = useRef<(() => void) | null>(null);\n /** Exposed by the measure effect — removes the last pick (command U). */\n const measureUndoRef = useRef<(() => void) | null>(null);\n\n // AutoCAD-style command bar (bottom of the panel). Typing anywhere on\n // the drawing routes keystrokes into the input; Enter/Space executes,\n // Enter on an empty line repeats the last command, Esc cancels.\n const [cmdValue, setCmdValue] = useState('');\n const [cmdEcho, setCmdEcho] = useState<string | null>(null);\n const lastCmdRef = useRef('');\n const cmdInputRef = useRef<HTMLInputElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const measureRef = useRef<{\n /** Effective scene points used for the measurement, at most two.\n * In a fixed-distance scenario, picks[1] is the *locked* position\n * (axis-snapped to A + fixed), not the raw click. */\n picks: { x: number; y: number }[];\n /** Raw second-pick click position, kept separately so we can\n * re-derive picks[1] when measureFixedDist changes without\n * forcing the user to re-pick. */\n rawSecondClick: { x: number; y: number } | null;\n /** Imperative DOM nodes — recreated on each enable. */\n overlay: HTMLDivElement | null;\n svg: SVGSVGElement | null;\n /** Main dim line (B-leg in fixed-distance mode). */\n line: SVGLineElement | null;\n /** Fixed-axis leg (A → R) shown only when measureFixedDist is set. */\n fixedLine: SVGLineElement | null;\n /** Label for the fixed-axis leg. */\n fixedLabel: HTMLDivElement | null;\n /** Dashed extension of the dim-axis through the first pick. */\n refLine: SVGLineElement | null;\n /** AutoCAD-style extension lines from each pick to the dim line. */\n extLineA: SVGLineElement | null;\n extLineB: SVGLineElement | null;\n /** Second dashed ref line — vertical axis, used by V and Auto modes. */\n refLineV: SVGLineElement | null;\n markers: HTMLDivElement[];\n label: HTMLDivElement | null;\n snap: HTMLDivElement | null;\n /** Cached scene-space segment endpoints, flat [ax,ay,bx,by,…] — built\n * once per measure session; used for snap detection on pointer move.\n * Instance transforms (INSERT blocks) are baked in at build time. */\n segs: Float64Array | null;\n /** Cached POINT-entity coords, flat [x,y,…] — node snap targets. */\n nodes: Float64Array | null;\n } | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n let viewer: any = null;\n setLoading(true);\n setError(null);\n setLayers([]);\n\n (async () => {\n let DxfViewer: any;\n try {\n const mod = await import('dxf-viewer');\n DxfViewer = (mod as any).DxfViewer;\n } catch (e) {\n if (!cancelled) {\n setError('dxf-viewer is not installed in this app.');\n setLoading(false);\n }\n return;\n }\n if (cancelled || !containerRef.current) return;\n try {\n // dxf-viewer reads container dimensions in its constructor (with\n // autoResize:true, those become the canvas size). If the Modal is\n // still settling we may be measured as 0×0, breaking aspect math\n // and the WebGL viewport. Wait until the container has a real\n // bounding box before constructing the viewer.\n await new Promise<void>(resolve => {\n const tryStart = () => {\n const r = containerRef.current?.getBoundingClientRect();\n if (r && r.width > 4 && r.height > 4) resolve();\n else requestAnimationFrame(tryStart);\n };\n tryStart();\n });\n if (cancelled || !containerRef.current) return;\n\n // clearColor must be a THREE.Color (Library calls .getHex()).\n let three: any = null;\n try { three = await import(/* @vite-ignore */ 'three' as any); } catch {}\n const ClearColor = three?.Color ?? null;\n const viewerOpts: any = { autoResize: true };\n if (ClearColor) viewerOpts.clearColor = new ClearColor(0xffffff);\n viewer = new DxfViewer(containerRef.current, viewerOpts);\n viewerRef.current = viewer;\n\n const fontUrls = (typeof window !== 'undefined' && (window as any).__REACT_OS_SHELL_DXF_FONTS__)\n || DEFAULT_DXF_FONTS;\n await viewer.Load({ url, fonts: fontUrls, workerFactory: null });\n if (cancelled) return;\n\n // Snapshot layer list — used to render the toggle panel.\n try {\n const list: any[] = viewer.GetLayers?.() ?? [];\n if (Array.isArray(list)) {\n setLayers(list.map(l => ({\n name: l.name,\n displayName: l.displayName ?? l.name,\n color: typeof l.color === 'number' ? l.color : undefined,\n visible: true,\n })));\n }\n } catch {}\n\n // Force-fit using the actual loaded bounds and refresh canvas size.\n const refit = () => {\n try {\n const rect = containerRef.current?.getBoundingClientRect();\n if (rect && rect.width > 0 && rect.height > 0) {\n viewer.SetSize?.(Math.round(rect.width), Math.round(rect.height));\n }\n const bounds = viewer.GetBounds?.();\n const origin = viewer.GetOrigin?.();\n if (bounds && origin) {\n viewer.FitView(\n bounds.minX - origin.x, bounds.maxX - origin.x,\n bounds.minY - origin.y, bounds.maxY - origin.y,\n );\n }\n viewer.Render?.();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] DXF refit failed', err);\n }\n };\n refit();\n requestAnimationFrame(refit);\n setLoading(false);\n } catch (e: any) {\n if (!cancelled) {\n setError(e?.message || 'Failed to render DXF.');\n setLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n try { viewer?.Destroy?.(); } catch {}\n viewerRef.current = null;\n };\n }, [url]);\n\n // Auto-hide the usage hint after a few seconds.\n useEffect(() => {\n if (!showHint || loading) return;\n const t = setTimeout(() => setShowHint(false), 5000);\n return () => clearTimeout(t);\n }, [showHint, loading]);\n\n // ──────────────────────────────────────────────────────────────────────\n // Measurement tool — DXF (2D) edition.\n //\n // All visuals (markers, line, label, extension lines, snap indicator)\n // are HTML / SVG overlays positioned via camera projection — they stay\n // constant size in pixels regardless of zoom, so they never balloon\n // into giant orange blobs as the user zooms in.\n //\n // Snapping is computed in *screen space* against a cached list of every\n // line segment and POINT entity in the dxf-viewer scene. The cache walk\n // must mirror dxf-viewer's GPU data layout exactly: positions are\n // TWO-component (x,y) buffer attributes, long polylines are *indexed*\n // (vertex pairs come from the index buffer), and INSERT block geometry\n // is *instanced* — the per-insert 2×3 affine lives in\n // instanceTransform0/1 (FULL) or instanceTransform (POINT translation)\n // attributes and is applied in the vertex shader, never in matrixWorld.\n // So the builder reads via BufferAttribute.getX/getY, follows the index\n // buffer when present, and bakes every instance transform into the\n // cached world-space coords.\n //\n // Snap priority is AutoCAD-flavoured: a real geometric point beats\n // \"somewhere along a line\" even when the line passes closer to the\n // cursor — intersection/endpoint/node (closest wins, ties to\n // intersection) > midpoint > nearest-on-line, all within an 18 px\n // tolerance. Without the tiering, the projection of the cursor onto a\n // hovered segment is always nearer than the segment's endpoint, which\n // made endpoint snapping nearly impossible.\n //\n // Four modes via an Auto | H | V | Point pill next to Measure (also\n // reachable from the command bar: DIM/DLI, H, V, DI):\n // - Auto: AutoCAD DIMLINEAR — measures along the dominant axis of\n // the two picks (|Δx| ≥ |Δy| → horizontal, else vertical).\n // - H: distance along the X axis (|Δx|). Dim line drawn through\n // pick A horizontally, ending at pick B's projected X.\n // - V: distance along the Y axis (|Δy|). Dim line drawn through\n // pick A vertically, ending at pick B's projected Y.\n // - Point: straight-line (Euclidean) distance between two picks.\n //\n // All dimensions render AutoCAD DIMLINEAR-style — arrow heads at both\n // ends, plus an extension line dropping from the second pick to the\n // dim line in H/V mode.\n //\n // H/V also accept a *fixed-distance* input. When set, the second pick's\n // X (in H) or Y (in V) snaps to the first pick's coord plus that value\n // (signed by which side of A the user clicked), and the displayed\n // measurement becomes the *perpendicular* component — i.e. \"this\n // feature is 30mm horizontally from A; how far is it vertically?\". The\n // chain dim renders both legs: a fixed-value leg from A → R, and the\n // perpendicular measurement leg from R → B.\n //\n // Switching mode or editing the fixed distance preserves the two picks\n // — the overlay just re-renders. The main setup effect therefore\n // intentionally does not depend on measureMode / measureFixedDist; a\n // smaller effect calls measureRedrawRef.current() on those changes.\n // ──────────────────────────────────────────────────────────────────────\n const layersKey = layers.map(l => (l.visible ? '1' : '0')).join('');\n useEffect(() => {\n const v = viewerRef.current;\n if (loading || error || !v) return;\n\n const scene: any = v.GetScene?.();\n const camera: any = v.GetCamera?.();\n const canvas: HTMLCanvasElement | undefined = v.GetCanvas?.();\n if (!scene || !camera || !canvas || !containerRef.current) return;\n\n const teardown = () => {\n const s = measureRef.current;\n if (!s) return;\n if (s.overlay && s.overlay.parentElement) s.overlay.parentElement.removeChild(s.overlay);\n measureRef.current = null;\n };\n\n if (!measureEnabled) {\n teardown();\n setMeasureDistance(null);\n setMeasureResolved(null);\n return;\n }\n\n // ── HTML overlay scaffold ──────────────────────────────────────\n const overlay = document.createElement('div');\n overlay.style.cssText = 'position:absolute;inset:0;pointer-events:none;z-index:5;';\n containerRef.current.appendChild(overlay);\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('style', 'position:absolute;inset:0;width:100%;height:100%;pointer-events:none;');\n // AutoCAD-style arrowhead, applied to the dim line via marker-start /\n // marker-end. orient=\"auto-start-reverse\" makes the same marker point\n // outward at *both* ends, so one definition covers both arrows.\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n const marker = document.createElementNS('http://www.w3.org/2000/svg', 'marker');\n marker.setAttribute('id', 'dxf-measure-arrow');\n marker.setAttribute('viewBox', '0 0 10 10');\n marker.setAttribute('refX', '9');\n marker.setAttribute('refY', '5');\n marker.setAttribute('markerWidth', '6');\n marker.setAttribute('markerHeight', '6');\n marker.setAttribute('orient', 'auto-start-reverse');\n const arrowPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n arrowPath.setAttribute('d', 'M 0 0 L 10 5 L 0 10 z');\n arrowPath.setAttribute('fill', '#ff8800');\n marker.appendChild(arrowPath);\n defs.appendChild(marker);\n svg.appendChild(defs);\n overlay.appendChild(svg);\n\n // Dashed extension of the dim-axis through the first pick. Drawn first\n // so the solid dim line renders on top. Two of them — horizontal and\n // vertical — Auto mode shows both until the second pick resolves the\n // axis, H/V show their own.\n const mkRefLine = () => {\n const el = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n el.setAttribute('stroke', '#ff8800');\n el.setAttribute('stroke-width', '1');\n el.setAttribute('stroke-dasharray', '6,4');\n el.setAttribute('opacity', '0.55');\n el.style.display = 'none';\n svg.appendChild(el);\n return el;\n };\n const refLineEl = mkRefLine();\n const refLineVEl = mkRefLine();\n\n // AutoCAD-style extension lines — thin solid lines from each pick to\n // the dim line. Drawn before the dim line so the dim line + arrows\n // render on top.\n const extLineA = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n extLineA.setAttribute('stroke', '#ff8800');\n extLineA.setAttribute('stroke-width', '1');\n extLineA.setAttribute('opacity', '0.85');\n extLineA.style.display = 'none';\n svg.appendChild(extLineA);\n const extLineB = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n extLineB.setAttribute('stroke', '#ff8800');\n extLineB.setAttribute('stroke-width', '1');\n extLineB.setAttribute('opacity', '0.85');\n extLineB.style.display = 'none';\n svg.appendChild(extLineB);\n\n const lineEl = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n lineEl.setAttribute('stroke', '#ff8800');\n lineEl.setAttribute('stroke-width', '1.5');\n lineEl.setAttribute('stroke-linecap', 'round');\n lineEl.style.display = 'none';\n svg.appendChild(lineEl);\n\n // Second dim line — only used in fixed-distance mode, drawing the\n // A→R \"locked\" segment. Visually identical to lineEl so they read as\n // one continuous AutoCAD chain dim.\n const fixedLineEl = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n fixedLineEl.setAttribute('stroke', '#ff8800');\n fixedLineEl.setAttribute('stroke-width', '1.5');\n fixedLineEl.setAttribute('stroke-linecap', 'round');\n fixedLineEl.style.display = 'none';\n svg.appendChild(fixedLineEl);\n\n // AutoCAD-style snap indicator — one container, three glyphs swapped\n // by setSnapGlyph() based on what was matched: square for endpoint,\n // X for intersection, bowtie/hourglass for nearest-on-line.\n const snapEl = document.createElement('div');\n snapEl.style.cssText = `position:absolute;transform:translate(-50%,-50%);pointer-events:none;display:none;`;\n const SVGNS = 'http://www.w3.org/2000/svg';\n const snapSvg = document.createElementNS(SVGNS, 'svg');\n snapSvg.setAttribute('width', '22');\n snapSvg.setAttribute('height', '22');\n snapSvg.setAttribute('viewBox', '0 0 22 22');\n snapSvg.setAttribute('style', 'overflow:visible;display:block');\n snapEl.appendChild(snapSvg);\n const mkSnapGlyph = (build: (g: SVGGElement) => void): SVGGElement => {\n const g = document.createElementNS(SVGNS, 'g');\n build(g);\n g.style.display = 'none';\n snapSvg.appendChild(g);\n return g;\n };\n // Endpoint — hollow square (filled white, orange stroke)\n const snapGlyphEndpoint = mkSnapGlyph((g) => {\n const r = document.createElementNS(SVGNS, 'rect');\n r.setAttribute('x', '4'); r.setAttribute('y', '4');\n r.setAttribute('width', '14'); r.setAttribute('height', '14');\n r.setAttribute('fill', 'rgba(255,255,255,0.9)');\n r.setAttribute('stroke', '#ff8800');\n r.setAttribute('stroke-width', '1.8');\n g.appendChild(r);\n });\n // Intersection — X (two crossing diagonals)\n const snapGlyphIntersection = mkSnapGlyph((g) => {\n const mkLn = (x1: number, y1: number, x2: number, y2: number) => {\n const ln = document.createElementNS(SVGNS, 'line');\n ln.setAttribute('x1', String(x1)); ln.setAttribute('y1', String(y1));\n ln.setAttribute('x2', String(x2)); ln.setAttribute('y2', String(y2));\n ln.setAttribute('stroke', '#ff8800');\n ln.setAttribute('stroke-width', '2.2');\n ln.setAttribute('stroke-linecap', 'round');\n return ln;\n };\n g.appendChild(mkLn(4, 4, 18, 18));\n g.appendChild(mkLn(18, 4, 4, 18));\n });\n // Line (\"nearest\") — bowtie / hourglass\n const snapGlyphLine = mkSnapGlyph((g) => {\n const poly = document.createElementNS(SVGNS, 'polygon');\n poly.setAttribute('points', '4,4 18,4 4,18 18,18');\n poly.setAttribute('fill', 'rgba(255,255,255,0.9)');\n poly.setAttribute('stroke', '#ff8800');\n poly.setAttribute('stroke-width', '1.8');\n poly.setAttribute('stroke-linejoin', 'round');\n g.appendChild(poly);\n });\n // Midpoint — triangle\n const snapGlyphMidpoint = mkSnapGlyph((g) => {\n const poly = document.createElementNS(SVGNS, 'polygon');\n poly.setAttribute('points', '11,3 19,18 3,18');\n poly.setAttribute('fill', 'rgba(255,255,255,0.9)');\n poly.setAttribute('stroke', '#ff8800');\n poly.setAttribute('stroke-width', '1.8');\n poly.setAttribute('stroke-linejoin', 'round');\n g.appendChild(poly);\n });\n // Node (POINT entity) — circle with an X through it\n const snapGlyphNode = mkSnapGlyph((g) => {\n const c = document.createElementNS(SVGNS, 'circle');\n c.setAttribute('cx', '11'); c.setAttribute('cy', '11'); c.setAttribute('r', '7');\n c.setAttribute('fill', 'rgba(255,255,255,0.9)');\n c.setAttribute('stroke', '#ff8800');\n c.setAttribute('stroke-width', '1.8');\n g.appendChild(c);\n const mkLn = (x1: number, y1: number, x2: number, y2: number) => {\n const ln = document.createElementNS(SVGNS, 'line');\n ln.setAttribute('x1', String(x1)); ln.setAttribute('y1', String(y1));\n ln.setAttribute('x2', String(x2)); ln.setAttribute('y2', String(y2));\n ln.setAttribute('stroke', '#ff8800');\n ln.setAttribute('stroke-width', '1.6');\n ln.setAttribute('stroke-linecap', 'round');\n return ln;\n };\n g.appendChild(mkLn(6.5, 6.5, 15.5, 15.5));\n g.appendChild(mkLn(15.5, 6.5, 6.5, 15.5));\n });\n type SnapType = 'endpoint' | 'intersection' | 'line' | 'midpoint' | 'node';\n const setSnapGlyph = (type: SnapType) => {\n snapGlyphEndpoint.style.display = type === 'endpoint' ? '' : 'none';\n snapGlyphIntersection.style.display = type === 'intersection' ? '' : 'none';\n snapGlyphLine.style.display = type === 'line' ? '' : 'none';\n snapGlyphMidpoint.style.display = type === 'midpoint' ? '' : 'none';\n snapGlyphNode.style.display = type === 'node' ? '' : 'none';\n };\n overlay.appendChild(snapEl);\n\n measureRef.current = {\n picks: [],\n rawSecondClick: null,\n overlay, svg, line: lineEl, fixedLine: fixedLineEl, fixedLabel: null, refLine: refLineEl,\n refLineV: refLineVEl,\n extLineA, extLineB,\n markers: [], label: null, snap: snapEl,\n segs: null,\n nodes: null,\n };\n\n // ── THREE.Vector3 for projection math — plucked from the scene ─\n //\n // We need THREE.Vector3 to project/unproject through the camera, but\n // we must NOT `import('three')`. Under a consumer that installs\n // dxf-viewer without a top-level `three` (e.g. pnpm strict\n // node_modules, where `three` is only a transitive dep of\n // dxf-viewer), the bare import is left external and rejects at\n // runtime — THREE stays null, pxFromScene returns its {0,0} fallback,\n // and the whole measure overlay collapses to a zero-length segment at\n // the origin (EFFICIENT BG#00184). Instead pluck the Vector3\n // constructor from dxf-viewer's own scene/camera (both Object3D-\n // derived, so `.position` is guaranteed to be a Vector3 from the\n // bundled THREE). project/unproject only read camera.projectionMatrix\n // / matrixWorldInverse, so a cross-instance Vector3 is safe here —\n // unlike the 3D Raycaster instanceof case, which is why that path\n // routes through OV's own picking instead.\n const Vector3Ctor: any =\n camera?.position?.constructor ?? scene?.position?.constructor ?? null;\n let ready = false;\n\n // Unproject canvas (CSS) px → scene coords (matches dxf-viewer's\n // private _CanvasToSceneCoord).\n const sceneFromPx = (cx: number, cy: number) => {\n if (!Vector3Ctor) return null;\n const w = canvas.clientWidth, h = canvas.clientHeight;\n const v3 = new Vector3Ctor(cx * 2 / w - 1, -cy * 2 / h + 1, 1).unproject(camera);\n return { x: v3.x, y: v3.y };\n };\n // Project scene coords → canvas (CSS) px.\n const pxFromScene = (sx: number, sy: number) => {\n if (!Vector3Ctor) return { x: 0, y: 0 };\n const v3 = new Vector3Ctor(sx, sy, 0).project(camera);\n const w = canvas.clientWidth, h = canvas.clientHeight;\n return { x: (v3.x + 1) / 2 * w, y: (-v3.y + 1) / 2 * h };\n };\n\n // Build the snap cache. The walk must match dxf-viewer's GPU layout —\n // see the block comment above: 2-component positions read via getX/getY\n // (NOT raw array triplets), index buffer followed for INDEXED_LINES, and\n // per-instance INSERT transforms baked in (they live in instance\n // attributes and are applied in the vertex shader, so matrixWorld is\n // always identity). traverseVisible skips layers hidden before the\n // measure session started. No THREE needed here — every read goes\n // through the BufferAttribute's own getX/getY accessors.\n const MAX_SNAP_SEGS = 400_000;\n (() => {\n try {\n const st = measureRef.current;\n if (!st) return;\n const segXY: number[] = [];\n const nodeXY: number[] = [];\n let truncated = false;\n // Per-instance 2×3 affines [m00, m01, tx, m10, m11, ty] for a\n // geometry; a single identity when the geometry isn't instanced.\n const instanceXforms = (g: any): number[][] => {\n const t0 = g?.attributes?.instanceTransform0;\n const t1 = g?.attributes?.instanceTransform1;\n if (t0 && t1) {\n const out: number[][] = [];\n const n = Math.min(t0.count, t1.count);\n for (let k = 0; k < n; k++) {\n out.push([t0.getX(k), t0.getY(k), t0.getZ(k), t1.getX(k), t1.getY(k), t1.getZ(k)]);\n }\n return out;\n }\n const tp = g?.attributes?.instanceTransform;\n if (tp) {\n const out: number[][] = [];\n for (let k = 0; k < tp.count; k++) out.push([1, 0, tp.getX(k), 0, 1, tp.getY(k)]);\n return out;\n }\n return [[1, 0, 0, 0, 1, 0]];\n };\n const visit = (obj: any) => {\n const isSeg = !!obj?.isLineSegments;\n const isPts = !!obj?.isPoints;\n if (!isSeg && !isPts) return;\n const g = obj.geometry;\n const pos = g?.attributes?.position;\n if (!pos) return;\n const xfs = instanceXforms(g);\n if (isSeg) {\n const idx = g.index;\n const pairCount = Math.floor((idx ? idx.count : pos.count) / 2);\n for (let p = 0; p < pairCount; p++) {\n const ia = idx ? idx.getX(2 * p) : 2 * p;\n const ib = idx ? idx.getX(2 * p + 1) : 2 * p + 1;\n const ax = pos.getX(ia), ay = pos.getY(ia);\n const bx = pos.getX(ib), by = pos.getY(ib);\n if (!Number.isFinite(ax + ay + bx + by)) continue;\n for (const m of xfs) {\n if (segXY.length >= MAX_SNAP_SEGS * 4) { truncated = true; return; }\n const tax = m[0] * ax + m[1] * ay + m[2], tay = m[3] * ax + m[4] * ay + m[5];\n const tbx = m[0] * bx + m[1] * by + m[2], tby = m[3] * bx + m[4] * by + m[5];\n if (tax === tbx && tay === tby) continue; // degenerate\n segXY.push(tax, tay, tbx, tby);\n }\n }\n } else {\n for (let i = 0; i < pos.count; i++) {\n const x = pos.getX(i), y = pos.getY(i);\n if (!Number.isFinite(x + y)) continue;\n for (const m of xfs) {\n nodeXY.push(m[0] * x + m[1] * y + m[2], m[3] * x + m[4] * y + m[5]);\n }\n }\n }\n };\n if (typeof scene.traverseVisible === 'function') scene.traverseVisible(visit);\n else scene.traverse(visit);\n st.segs = new Float64Array(segXY);\n st.nodes = new Float64Array(nodeXY);\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`[Preview] DXF snap cache truncated at ${MAX_SNAP_SEGS} segments — snapping may miss some geometry.`);\n }\n ready = true;\n } catch {}\n })();\n\n // ── Snap detection in screen space ────────────────────────────\n // Tolerance in CSS px from the cursor to a candidate snap target.\n // 18 px is wide enough to feel \"sticky\" without overlapping nearby\n // unrelated features on dense drawings.\n const SNAP_PX = 18;\n // Screen-space segment ↔ segment intersection. Operates directly on\n // the projected endpoints (which dxf-viewer's orthographic camera\n // turns into a linear scene→screen map), so the returned point is\n // already in pixel coords — no extra pxFromScene needed in the hot\n // pairwise loop. Returns the screen-space crossing AND the\n // parametric t along segment A, which we use to recover the\n // scene-space intersection by linear interp on A's scene endpoints.\n const segSegIntersectPx = (\n apx: number, apy: number, bpx: number, bpy: number,\n cpx: number, cpy: number, dpx: number, dpy: number,\n ) => {\n const d = (bpx - apx) * (dpy - cpy) - (bpy - apy) * (dpx - cpx);\n if (Math.abs(d) < 1e-9) return null;\n const t = ((cpx - apx) * (dpy - cpy) - (cpy - apy) * (dpx - cpx)) / d;\n const u = ((cpx - apx) * (bpy - apy) - (cpy - apy) * (bpx - apx)) / d;\n const eps = 1e-4;\n if (t < -eps || t > 1 + eps || u < -eps || u > 1 + eps) return null;\n return { px: apx + t * (bpx - apx), py: apy + t * (bpy - apy), t };\n };\n\n const findSnap = (cx: number, cy: number) => {\n const s = measureRef.current;\n if (!s || !ready || !s.segs) return null;\n // Scene→px affine, derived once per call from three probe points —\n // exact for dxf-viewer's orthographic camera, and far cheaper than\n // a Vector3.project per endpoint per mousemove.\n const o = pxFromScene(0, 0);\n const ex = pxFromScene(1, 0);\n const ey = pxFromScene(0, 1);\n const mxx = ex.x - o.x, mxy = ex.y - o.y;\n const myx = ey.x - o.x, myy = ey.y - o.y;\n const det = mxx * myy - myx * mxy;\n if (!det) return null;\n // Cursor in scene coords (inverse affine) + per-axis scene-space\n // tolerance — a cheap bbox cull before any projection math.\n const csx = ((cx - o.x) * myy - (cy - o.y) * myx) / det;\n const csy = ((cy - o.y) * mxx - (cx - o.x) * mxy) / det;\n const rx = SNAP_PX / (Math.hypot(mxx, mxy) || 1);\n const ry = SNAP_PX / (Math.hypot(myx, myy) || 1);\n const minX = csx - rx, maxX = csx + rx, minY = csy - ry, maxY = csy + ry;\n\n const T2 = SNAP_PX * SNAP_PX;\n type Snap = { sx: number; sy: number; type: 'endpoint' | 'node' | 'midpoint' | 'line' | 'intersection' };\n // Tiered bests — see the block comment up top for the priority\n // rationale (endpoint must be reachable while hovering its own\n // segment, so \"nearest-on-line\" lives in a lower tier).\n let bestPt: Snap | null = null, dPt = T2; // endpoint + node\n let bestMid: Snap | null = null, dMid = T2; // midpoint\n let bestLine: Snap | null = null, dLine = T2; // nearest-on-line\n let bestX: Snap | null = null, dX = T2; // intersection\n const cand: { ax: number; ay: number; bx: number; by: number; apx: number; apy: number; bpx: number; bpy: number }[] = [];\n\n const segs = s.segs;\n for (let i = 0; i < segs.length; i += 4) {\n const ax = segs[i], ay = segs[i + 1], bx = segs[i + 2], by = segs[i + 3];\n if ((ax < minX && bx < minX) || (ax > maxX && bx > maxX) ||\n (ay < minY && by < minY) || (ay > maxY && by > maxY)) continue;\n const apx = o.x + mxx * ax + myx * ay, apy = o.y + mxy * ax + myy * ay;\n const bpx = o.x + mxx * bx + myx * by, bpy = o.y + mxy * bx + myy * by;\n let near = false;\n // Endpoints\n let dx = cx - apx, dy = cy - apy;\n let d2 = dx * dx + dy * dy;\n if (d2 < T2) { near = true; if (d2 < dPt) { dPt = d2; bestPt = { sx: ax, sy: ay, type: 'endpoint' }; } }\n dx = cx - bpx; dy = cy - bpy;\n d2 = dx * dx + dy * dy;\n if (d2 < T2) { near = true; if (d2 < dPt) { dPt = d2; bestPt = { sx: bx, sy: by, type: 'endpoint' }; } }\n // Midpoint\n dx = cx - (apx + bpx) / 2; dy = cy - (apy + bpy) / 2;\n d2 = dx * dx + dy * dy;\n if (d2 < T2) { near = true; if (d2 < dMid) { dMid = d2; bestMid = { sx: (ax + bx) / 2, sy: (ay + by) / 2, type: 'midpoint' }; } }\n // Nearest point on segment (in screen space).\n const sdx = bpx - apx, sdy = bpy - apy;\n const len2 = sdx * sdx + sdy * sdy;\n if (len2 > 0) {\n const t = ((cx - apx) * sdx + (cy - apy) * sdy) / len2;\n if (t > 0 && t < 1) {\n dx = cx - (apx + t * sdx); dy = cy - (apy + t * sdy);\n d2 = dx * dx + dy * dy;\n if (d2 < T2) {\n near = true;\n if (d2 < dLine) { dLine = d2; bestLine = { sx: ax + t * (bx - ax), sy: ay + t * (by - ay), type: 'line' }; }\n }\n }\n }\n if (near) cand.push({ ax, ay, bx, by, apx, apy, bpx, bpy });\n }\n\n // POINT entities — node snaps, same tier as endpoints.\n const nodes = s.nodes;\n if (nodes) {\n for (let i = 0; i < nodes.length; i += 2) {\n const x = nodes[i], y = nodes[i + 1];\n if (x < minX || x > maxX || y < minY || y > maxY) continue;\n const dx = cx - (o.x + mxx * x + myx * y);\n const dy = cy - (o.y + mxy * x + myy * y);\n const d2 = dx * dx + dy * dy;\n if (d2 < dPt) { dPt = d2; bestPt = { sx: x, sy: y, type: 'node' }; }\n }\n }\n\n // Pairwise intersections among the near segments — checked entirely\n // in screen space; the scene-space crossing is recovered by linear\n // interp on segment A (exact for the orthographic camera).\n for (let i = 0; i < cand.length; i++) {\n const A = cand[i];\n for (let j = i + 1; j < cand.length; j++) {\n const B = cand[j];\n const ix = segSegIntersectPx(A.apx, A.apy, A.bpx, A.bpy, B.apx, B.apy, B.bpx, B.bpy);\n if (!ix) continue;\n const dx = cx - ix.px, dy = cy - ix.py;\n const d2 = dx * dx + dy * dy;\n if (d2 >= T2 || d2 >= dX) continue;\n dX = d2;\n bestX = { sx: A.ax + ix.t * (A.bx - A.ax), sy: A.ay + ix.t * (A.by - A.ay), type: 'intersection' };\n }\n }\n\n // Priority: intersection and endpoint/node co-rank, then midpoint,\n // then nearest-on-line. Where two segments share a corner the\n // \"intersection\" lands on the endpoint itself — prefer the endpoint\n // glyph there (AutoCAD shows the square at corners), so the\n // intersection only wins when it's clearly closer (> 1 px² margin).\n const top = bestX && bestPt ? (dX < dPt - 1 ? bestX : bestPt) : (bestX ?? bestPt);\n return top ?? bestMid ?? bestLine;\n };\n\n // ── Marker / label / line rendering (HTML/SVG, fixed-pixel) ──\n const makeMarker = (): HTMLDivElement => {\n const el = document.createElement('div');\n el.style.cssText = `position:absolute;width:10px;height:10px;border-radius:50%;background:#ff8800;border:2px solid #fff;box-shadow:0 0 0 1px rgba(0,0,0,0.25);transform:translate(-50%,-50%);pointer-events:none;`;\n overlay.appendChild(el);\n return el;\n };\n const ensureLabel = () => {\n const s = measureRef.current!;\n if (s.label) return s.label;\n const el = document.createElement('div');\n // Park the label off-screen on creation so it never flashes at (0,0)\n // — callers always set left/top before showing it, but the browser\n // would otherwise lay it out at the overlay's top-left corner the\n // first frame after appendChild.\n el.style.cssText = `position:absolute;left:-9999px;top:-9999px;transform:translate(-50%,-50%);padding:2px 6px;font-size:11px;font-weight:600;font-family:system-ui,-apple-system,sans-serif;background:rgba(255,136,0,0.95);color:#fff;border-radius:4px;white-space:nowrap;box-shadow:0 1px 4px rgba(0,0,0,0.25);pointer-events:none;`;\n overlay.appendChild(el);\n s.label = el;\n return el;\n };\n\n const positionMarker = (el: HTMLDivElement, x: number, y: number) => {\n const p = pxFromScene(x, y);\n el.style.left = `${p.x}px`;\n el.style.top = `${p.y}px`;\n };\n\n // Resolve picks[1] from the raw click + active fixedDist. In a\n // fixed-distance H/V scenario the X (or Y) is snapped to A's coord +\n // fixedDist, sign-matched to which side of A the user clicked, so\n // the marker visually sits at the *locked* position even though the\n // click landed elsewhere. Mutates s.picks[1] in place.\n const reconcileLockedPick = () => {\n const s = measureRef.current;\n if (!s || !s.rawSecondClick || s.picks.length < 2) return;\n const a = s.picks[0];\n const raw = s.rawSecondClick;\n const fixed = measureFixedDistRef.current;\n const mode = measureModeRef.current;\n if (fixed !== null && Number.isFinite(fixed) && (mode === 'horizontal' || mode === 'vertical')) {\n if (mode === 'horizontal') {\n const sign = raw.x >= a.x ? 1 : -1;\n s.picks[1] = { x: a.x + sign * Math.abs(fixed), y: raw.y };\n } else {\n const sign = raw.y >= a.y ? 1 : -1;\n s.picks[1] = { x: raw.x, y: a.y + sign * Math.abs(fixed) };\n }\n } else {\n s.picks[1] = { x: raw.x, y: raw.y };\n }\n };\n\n // Resolve the effective measure mode. 'auto' (AutoCAD DIMLINEAR)\n // measures along the dominant axis of the two picks; everything else\n // passes through. With fewer than two picks auto defaults to\n // horizontal — callers that care about the unresolved state (ref\n // lines) check the raw mode themselves.\n const resolveMode = (a?: { x: number; y: number }, b?: { x: number; y: number }): 'point' | 'horizontal' | 'vertical' => {\n const mode = measureModeRef.current;\n if (mode !== 'auto') return mode;\n if (!a || !b) return 'horizontal';\n return Math.abs(b.x - a.x) >= Math.abs(b.y - a.y) ? 'horizontal' : 'vertical';\n };\n\n // Endpoints of the *main* dim line (always rendered when picks=2).\n // In fixed mode this is the leg from R to B (perpendicular to the\n // fixed axis). Without a fixed distance it's the regular H / V / Point\n // line.\n const computeMainDimEnds = () => {\n const s = measureRef.current!;\n const a = s.picks[0];\n const b = s.picks[1];\n const mode = resolveMode(a, b);\n // Fixed distances only apply in *explicit* H/V — a value left over\n // from H mode must not activate when the user switches to Auto.\n const rawMode = measureModeRef.current;\n const fixed = measureFixedDistRef.current;\n if (fixed !== null && Number.isFinite(fixed) && rawMode === 'horizontal') {\n // Fixed H: main leg is vertical at b.x, from a.y to b.y.\n return { from: { x: b.x, y: a.y }, to: { x: b.x, y: b.y } };\n }\n if (fixed !== null && Number.isFinite(fixed) && rawMode === 'vertical') {\n // Fixed V: main leg is horizontal at b.y, from a.x to b.x.\n return { from: { x: a.x, y: b.y }, to: { x: b.x, y: b.y } };\n }\n if (mode === 'horizontal') return { from: a, to: { x: b.x, y: a.y } };\n if (mode === 'vertical') return { from: a, to: { x: a.x, y: b.y } };\n return { from: a, to: b };\n };\n\n const updateOverlay = () => {\n const s = measureRef.current;\n if (!s) return;\n reconcileLockedPick();\n const rawMode = measureModeRef.current;\n const fixed = measureFixedDistRef.current;\n const fixedActive = fixed !== null && Number.isFinite(fixed) && (rawMode === 'horizontal' || rawMode === 'vertical');\n // Markers\n if (s.markers[0]) positionMarker(s.markers[0], s.picks[0].x, s.picks[0].y);\n if (s.markers[1]) positionMarker(s.markers[1], s.picks[1].x, s.picks[1].y);\n // Reference-axis preview — dashed line(s) across the canvas through\n // the first pick. H/V show their own axis; Auto shows both until\n // the second pick resolves which one the dimension follows.\n const drawRefLine = (el: SVGLineElement | null, dir: { dx: number; dy: number }, visible: boolean) => {\n if (!el) return;\n if (!visible || s.picks.length < 1) { el.style.display = 'none'; return; }\n const a = s.picks[0];\n const w = canvas.clientWidth, h = canvas.clientHeight;\n const screenSpan = Math.hypot(w, h) * 4;\n const ap = pxFromScene(a.x, a.y);\n const probe = pxFromScene(a.x + dir.dx, a.y + dir.dy);\n const pxLen = Math.hypot(probe.x - ap.x, probe.y - ap.y) || 1;\n const sceneStep = screenSpan / pxLen;\n const p0 = pxFromScene(a.x - dir.dx * sceneStep, a.y - dir.dy * sceneStep);\n const p1 = pxFromScene(a.x + dir.dx * sceneStep, a.y + dir.dy * sceneStep);\n el.setAttribute('x1', String(p0.x));\n el.setAttribute('y1', String(p0.y));\n el.setAttribute('x2', String(p1.x));\n el.setAttribute('y2', String(p1.y));\n el.style.display = '';\n };\n let showH = rawMode === 'horizontal';\n let showV = rawMode === 'vertical';\n if (rawMode === 'auto') {\n if (s.picks.length >= 2) {\n const r = resolveMode(s.picks[0], s.picks[1]);\n showH = r === 'horizontal';\n showV = r === 'vertical';\n } else {\n showH = true;\n showV = true;\n }\n }\n drawRefLine(s.refLine, { dx: 1, dy: 0 }, showH);\n drawRefLine(s.refLineV, { dx: 0, dy: 1 }, showV);\n // Dim line + chain dim (if fixed) + extension lines + label\n if (s.picks.length === 2) {\n const a = s.picks[0], b = s.picks[1];\n const mode = resolveMode(a, b);\n const ends = computeMainDimEnds();\n const fp = pxFromScene(ends.from.x, ends.from.y);\n const tp = pxFromScene(ends.to.x, ends.to.y);\n s.line!.setAttribute('x1', String(fp.x));\n s.line!.setAttribute('y1', String(fp.y));\n s.line!.setAttribute('x2', String(tp.x));\n s.line!.setAttribute('y2', String(tp.y));\n s.line!.setAttribute('marker-start', 'url(#dxf-measure-arrow)');\n s.line!.setAttribute('marker-end', 'url(#dxf-measure-arrow)');\n // Hide the main dim line if it's degenerate (zero-length leg —\n // happens e.g. when picks are collinear in fixed-distance mode).\n const mainLen = Math.hypot(tp.x - fp.x, tp.y - fp.y);\n s.line!.style.display = mainLen > 0.5 ? '' : 'none';\n\n // Fixed-axis leg (A → R) — only in fixed mode.\n if (fixedActive && s.fixedLine) {\n const r = mode === 'horizontal' ? { x: b.x, y: a.y } : { x: a.x, y: b.y };\n const ap = pxFromScene(a.x, a.y);\n const rp = pxFromScene(r.x, r.y);\n s.fixedLine.setAttribute('x1', String(ap.x));\n s.fixedLine.setAttribute('y1', String(ap.y));\n s.fixedLine.setAttribute('x2', String(rp.x));\n s.fixedLine.setAttribute('y2', String(rp.y));\n s.fixedLine.setAttribute('marker-start', 'url(#dxf-measure-arrow)');\n s.fixedLine.setAttribute('marker-end', 'url(#dxf-measure-arrow)');\n s.fixedLine.style.display = '';\n // Fixed-leg label — show the user's entered fixed value.\n const fLabel = ensureFixedLabel();\n fLabel.textContent = formatMeasureDistance(Math.abs(fixed));\n const fcx = (ap.x + rp.x) / 2;\n const fcy = (ap.y + rp.y) / 2;\n fLabel.style.left = `${fcx}px`;\n fLabel.style.top = `${fcy}px`;\n const w = canvas.clientWidth, h = canvas.clientHeight;\n fLabel.style.display = (fcx < 0 || fcy < 0 || fcx > w || fcy > h) ? 'none' : '';\n } else {\n if (s.fixedLine) s.fixedLine.style.display = 'none';\n if (s.fixedLabel) s.fixedLabel.style.display = 'none';\n }\n\n // Extension line — drops from second pick to the dim line in\n // free H/V (non-fixed) mode. In fixed mode the chain dim already\n // visually closes the loop, so no extension is needed.\n const extA = s.extLineA!;\n const extB = s.extLineB!;\n if (!fixedActive && mode === 'horizontal' && Math.abs(b.y - a.y) > 1e-9) {\n const p = pxFromScene(b.x, a.y);\n const q = pxFromScene(b.x, b.y);\n extB.setAttribute('x1', String(p.x));\n extB.setAttribute('y1', String(p.y));\n extB.setAttribute('x2', String(q.x));\n extB.setAttribute('y2', String(q.y));\n extB.style.display = '';\n extA.style.display = 'none';\n } else if (!fixedActive && mode === 'vertical' && Math.abs(b.x - a.x) > 1e-9) {\n const p = pxFromScene(a.x, b.y);\n const q = pxFromScene(b.x, b.y);\n extB.setAttribute('x1', String(p.x));\n extB.setAttribute('y1', String(p.y));\n extB.setAttribute('x2', String(q.x));\n extB.setAttribute('y2', String(q.y));\n extB.style.display = '';\n extA.style.display = 'none';\n } else {\n extA.style.display = 'none';\n extB.style.display = 'none';\n }\n // Main-leg label — at the midpoint of the main dim line.\n if (s.label) {\n const cx = (fp.x + tp.x) / 2;\n const cy = (fp.y + tp.y) / 2;\n s.label.style.left = `${cx}px`;\n s.label.style.top = `${cy}px`;\n const w = canvas.clientWidth, h = canvas.clientHeight;\n s.label.style.display = (cx < 0 || cy < 0 || cx > w || cy > h) ? 'none' : '';\n // Hide the main label too when the leg is degenerate (no\n // perpendicular distance to display, so nothing meaningful).\n if (mainLen <= 0.5) s.label.style.display = 'none';\n }\n } else {\n s.line!.style.display = 'none';\n if (s.fixedLine) s.fixedLine.style.display = 'none';\n if (s.fixedLabel) s.fixedLabel.style.display = 'none';\n if (s.extLineA) s.extLineA.style.display = 'none';\n if (s.extLineB) s.extLineB.style.display = 'none';\n }\n };\n\n const ensureFixedLabel = () => {\n const s = measureRef.current!;\n if (s.fixedLabel) return s.fixedLabel;\n const el = document.createElement('div');\n el.style.cssText = `position:absolute;left:-9999px;top:-9999px;transform:translate(-50%,-50%);padding:2px 6px;font-size:11px;font-weight:600;font-family:system-ui,-apple-system,sans-serif;background:rgba(255,136,0,0.75);color:#fff;border-radius:4px;white-space:nowrap;box-shadow:0 1px 4px rgba(0,0,0,0.25);pointer-events:none;`;\n overlay.appendChild(el);\n s.fixedLabel = el;\n return el;\n };\n\n // ── Click-vs-drag + snap on hover ─────────────────────────────\n const DRAG_TOL = 4;\n const DRAG_TIME = 350;\n let downX = 0, downY = 0, downTime = 0, downActive = false, dragging = false;\n let lastSnap: ReturnType<typeof findSnap> = null;\n\n const handlePointerDown = (ev: any) => {\n const d = ev?.detail;\n if (!d || d.domEvent?.button !== 0) return;\n downX = d.canvasCoord.x;\n downY = d.canvasCoord.y;\n downTime = performance.now();\n dragging = false;\n downActive = true;\n };\n\n const handlePointerMove = (ev: PointerEvent) => {\n const rect = canvas.getBoundingClientRect();\n const cx = ev.clientX - rect.left;\n const cy = ev.clientY - rect.top;\n // Drag detection (only matters when a button is down).\n if (downActive) {\n if ((cx - downX) ** 2 + (cy - downY) ** 2 > DRAG_TOL * DRAG_TOL) dragging = true;\n }\n // Snap indicator update — only when the user isn't actively\n // dragging (avoid flicker mid-pan).\n const s = measureRef.current;\n if (!s || !s.snap) return;\n if (downActive && dragging) {\n s.snap.style.display = 'none';\n return;\n }\n lastSnap = findSnap(cx, cy);\n if (lastSnap) {\n const p = pxFromScene(lastSnap.sx, lastSnap.sy);\n s.snap.style.left = `${p.x}px`;\n s.snap.style.top = `${p.y}px`;\n s.snap.style.display = '';\n setSnapGlyph(lastSnap.type);\n } else {\n s.snap.style.display = 'none';\n }\n };\n\n const handlePointerUp = (ev: any) => {\n if (!downActive) return;\n downActive = false;\n const elapsed = performance.now() - downTime;\n if (dragging || elapsed > DRAG_TIME) return;\n // Use the snapped position if we have one, otherwise the raw\n // pointer position from dxf-viewer's event.\n const raw = ev?.detail?.position;\n if (!raw) return;\n // Prefer the snapped position when one is available, otherwise the\n // raw pointer position from dxf-viewer's event.\n const picked = lastSnap\n ? { x: lastSnap.sx, y: lastSnap.sy }\n : { x: raw.x, y: raw.y };\n doPick(picked);\n };\n\n // Recompute the distance label from the current picks + active mode.\n // In fixed-distance mode the reported value is the *perpendicular*\n // component (Δy for H, Δx for V) — the fixed value itself shows on\n // the other dim leg's label.\n const recomputeLabel = () => {\n const s = measureRef.current;\n if (!s || s.picks.length !== 2) return;\n reconcileLockedPick();\n const a = s.picks[0], b = s.picks[1];\n const rawMode = measureModeRef.current;\n const mode = resolveMode(a, b);\n const fixed = measureFixedDistRef.current;\n const fixedActive = fixed !== null && Number.isFinite(fixed) && (rawMode === 'horizontal' || rawMode === 'vertical');\n let dist: number;\n let suffix = '';\n let echo: string;\n // Axis the *displayed* value follows — flips to the perpendicular\n // axis in fixed-distance mode (the chip arrow/tooltip track this).\n let shown: 'point' | 'horizontal' | 'vertical' = mode;\n const adx = Math.abs(b.x - a.x), ady = Math.abs(b.y - a.y);\n if (fixedActive && rawMode === 'horizontal') {\n dist = ady;\n suffix = ' ↕';\n shown = 'vertical';\n echo = `ΔY = ${formatMeasureDistance(ady)} with ΔX locked to ${formatMeasureDistance(Math.abs(fixed))}`;\n } else if (fixedActive && rawMode === 'vertical') {\n dist = adx;\n suffix = ' ↔';\n shown = 'horizontal';\n echo = `ΔX = ${formatMeasureDistance(adx)} with ΔY locked to ${formatMeasureDistance(Math.abs(fixed))}`;\n } else if (mode === 'horizontal') {\n dist = adx;\n suffix = ' ↔';\n echo = `Linear dimension = ${formatMeasureDistance(adx)} (ΔX)`;\n } else if (mode === 'vertical') {\n dist = ady;\n suffix = ' ↕';\n echo = `Linear dimension = ${formatMeasureDistance(ady)} (ΔY)`;\n } else {\n dist = Math.hypot(b.x - a.x, b.y - a.y);\n echo = `Distance = ${formatMeasureDistance(dist)} ΔX = ${formatMeasureDistance(adx)} ΔY = ${formatMeasureDistance(ady)}`;\n }\n // A non-finite distance means a corrupt pick slipped through (it\n // shouldn't — the snap cache filters non-finite coords). Show\n // nothing rather than a \"NaN mm\" label.\n if (!Number.isFinite(dist)) {\n setMeasureDistance(null);\n setMeasureResolved(null);\n if (s.label) s.label.style.opacity = '0';\n return;\n }\n setMeasureDistance(dist);\n setMeasureResolved(shown);\n setCmdEcho(echo);\n const label = ensureLabel();\n label.style.opacity = '1';\n label.textContent = `${formatMeasureDistance(dist)}${suffix}`;\n };\n\n // Expose for the mode / fixed-distance change effect — calling this\n // redraws the overlay using whatever the refs currently hold.\n measureRedrawRef.current = () => {\n recomputeLabel();\n updateOverlay();\n };\n\n // Hide every dim visual that only makes sense with two picks.\n const hideDimVisuals = (s: NonNullable<typeof measureRef.current>) => {\n s.line!.style.display = 'none';\n if (s.fixedLine) s.fixedLine.style.display = 'none';\n if (s.fixedLabel) s.fixedLabel.style.display = 'none';\n if (s.extLineA) s.extLineA.style.display = 'none';\n if (s.extLineB) s.extLineB.style.display = 'none';\n if (s.label) s.label.style.opacity = '0';\n setMeasureDistance(null);\n setMeasureResolved(null);\n };\n\n const resetPicks = () => {\n const s = measureRef.current;\n if (!s) return;\n for (const m of s.markers) m.parentElement?.removeChild(m);\n s.markers = [];\n s.picks = [];\n s.rawSecondClick = null;\n if (s.refLine) s.refLine.style.display = 'none';\n if (s.refLineV) s.refLineV.style.display = 'none';\n hideDimVisuals(s);\n };\n measureResetRef.current = resetPicks;\n\n // Command U — drop the most recent pick, keep the other (if any).\n measureUndoRef.current = () => {\n const s = measureRef.current;\n if (!s || s.picks.length === 0) return;\n s.picks.pop();\n const m = s.markers.pop();\n m?.parentElement?.removeChild(m);\n s.rawSecondClick = null;\n hideDimVisuals(s);\n updateOverlay();\n };\n\n const doPick = (p: { x: number; y: number }) => {\n const s = measureRef.current;\n if (!s) return;\n\n // Third click → start fresh.\n if (s.picks.length === 2) resetPicks();\n\n if (s.picks.length === 0) {\n s.picks.push({ x: p.x, y: p.y });\n s.markers.push(makeMarker());\n } else {\n // Second pick — remember the raw click so we can re-lock if the\n // user later edits the fixed-distance input; reconcileLockedPick\n // (called by recomputeLabel / updateOverlay) writes the effective\n // position into picks[1].\n s.rawSecondClick = { x: p.x, y: p.y };\n s.picks.push({ x: p.x, y: p.y });\n s.markers.push(makeMarker());\n recomputeLabel();\n }\n updateOverlay();\n };\n\n const onKeyDown = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') setMeasureEnabled(false);\n };\n\n // ── Wire it up ────────────────────────────────────────────────\n canvas.style.cursor = 'crosshair';\n try { v.Subscribe?.('pointerdown', handlePointerDown); } catch {}\n try { v.Subscribe?.('pointerup', handlePointerUp); } catch {}\n try { v.Subscribe?.('viewChanged', updateOverlay); } catch {}\n canvas.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('keydown', onKeyDown);\n\n return () => {\n canvas.style.cursor = '';\n try { v.Unsubscribe?.('pointerdown', handlePointerDown); } catch {}\n try { v.Unsubscribe?.('pointerup', handlePointerUp); } catch {}\n try { v.Unsubscribe?.('viewChanged', updateOverlay); } catch {}\n canvas.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('keydown', onKeyDown);\n measureRedrawRef.current = null;\n measureResetRef.current = null;\n measureUndoRef.current = null;\n teardown();\n setMeasureDistance(null);\n setMeasureResolved(null);\n };\n // NOTE: measureMode / measureFixedDist intentionally *not* in deps —\n // switching mode or editing the fixed distance preserves picks and\n // just triggers a redraw via the separate effect below. Layer\n // visibility *is* a dep (via layersKey): toggling a layer rebuilds the\n // snap cache so hidden geometry stops attracting the cursor — at the\n // cost of resetting in-progress picks, which a layer change\n // invalidates anyway.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [measureEnabled, loading, error, layersKey]);\n\n // Redraw the measurement overlay when mode or fixed-distance changes,\n // using the picks that are already in measureRef. The main measure\n // effect exposes `measureRedrawRef.current` for this.\n useEffect(() => {\n measureRedrawRef.current?.();\n }, [measureMode, measureFixedDist]);\n\n const toggleLayer = (name: string) => {\n setLayers(prev => prev.map(l => {\n if (l.name !== name) return l;\n const next = !l.visible;\n try { viewerRef.current?.ShowLayer?.(name, next); } catch {}\n return { ...l, visible: next };\n }));\n };\n\n const setAllLayers = (visible: boolean) => {\n setLayers(prev => prev.map(l => {\n if (l.visible === visible) return l;\n try { viewerRef.current?.ShowLayer?.(l.name, visible); } catch {}\n return { ...l, visible };\n }));\n };\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n const handleResetView = () => {\n try {\n const v = viewerRef.current;\n const bounds = v?.GetBounds?.();\n const origin = v?.GetOrigin?.();\n if (bounds && origin) {\n v.FitView(\n bounds.minX - origin.x, bounds.maxX - origin.x,\n bounds.minY - origin.y, bounds.maxY - origin.y,\n );\n } else {\n v?.FitView?.();\n }\n v?.Render?.();\n } catch {}\n };\n\n // ── AutoCAD-style command bar ───────────────────────────────────────\n // Space and Enter both execute (AutoCAD treats space as enter); Enter\n // on an empty line repeats the last command; Esc clears, then exits\n // the measure tool. Typing anywhere over the drawing routes the\n // keystroke into the input — see the keydown effect below.\n const runCommand = (raw: string) => {\n const exec = raw.trim() || lastCmdRef.current;\n setCmdValue('');\n if (!exec) return;\n const cmd = exec.toLowerCase().split(/\\s+/)[0];\n const remember = () => { lastCmdRef.current = exec; };\n const startMeasure = (mode: typeof measureMode, echo: string) => {\n setMeasureEnabled(true);\n setMeasureMode(mode);\n measureResetRef.current?.();\n setCmdEcho(echo);\n remember();\n };\n // Bare number → lock the axis-aligned Δ of the second pick (H/V).\n if (/^-?(\\d+\\.?\\d*|\\.\\d+)$/.test(cmd)) {\n if (measureEnabled && (measureMode === 'horizontal' || measureMode === 'vertical')) {\n const n = parseFloat(cmd);\n if (n) {\n setMeasureFixedInput(cmd);\n setMeasureFixedDist(n);\n setCmdEcho(`Δ${measureMode === 'horizontal' ? 'X' : 'Y'} locked to ${formatMeasureDistance(Math.abs(n))} — the label shows the perpendicular distance`);\n } else {\n setMeasureFixedInput('');\n setMeasureFixedDist(null);\n setCmdEcho('Fixed distance cleared.');\n }\n } else {\n setCmdEcho('Fixed distances apply in H or V mode — type H or V first.');\n }\n return;\n }\n switch (cmd) {\n case 'di': case 'dist': case 'mea': case 'measuregeom':\n startMeasure('point', 'DIST — click two points; straight-line distance (Esc to exit)');\n break;\n case 'dim': case 'dli': case 'dimlin': case 'dimlinear':\n startMeasure('auto', 'DIMLINEAR — click two points; measures ΔX or ΔY, whichever is larger (H / V to force)');\n break;\n // H / V / AUTO switch the axis without dropping existing picks —\n // same as clicking the pill.\n case 'h': case 'hor': case 'horizontal':\n setMeasureEnabled(true);\n setMeasureMode('horizontal');\n setCmdEcho('Horizontal — ΔX between the two picks');\n remember();\n break;\n case 'v': case 'ver': case 'vertical':\n setMeasureEnabled(true);\n setMeasureMode('vertical');\n setCmdEcho('Vertical — ΔY between the two picks');\n remember();\n break;\n case 'au': case 'auto':\n setMeasureEnabled(true);\n setMeasureMode('auto');\n setCmdEcho('Auto (DIMLINEAR) — measures along the dominant axis of the two picks');\n remember();\n break;\n case 'measure':\n setMeasureEnabled(!measureEnabled);\n setCmdEcho(measureEnabled ? 'Measure off.' : 'Measure on — click two points.');\n remember();\n break;\n case 'u': case 'undo':\n measureUndoRef.current?.();\n setCmdEcho('Last pick removed.');\n remember();\n break;\n case 'z': case 'ze': case 'zoom': case 'fit': case 'zoomextents':\n handleResetView();\n setCmdEcho('Zoom extents.');\n remember();\n break;\n case 'la': case 'layer': case 'layers':\n setShowLayers(s => !s);\n setCmdEcho('Layer panel toggled.');\n remember();\n break;\n case 'off': case 'clear':\n setMeasureFixedDist(null);\n setMeasureFixedInput('');\n measureResetRef.current?.();\n setCmdEcho('Measurement cleared.');\n remember();\n break;\n case '?': case 'help':\n setCmdEcho(DXF_CMD_HELP);\n break;\n default: {\n const editCmd = DXF_EDIT_COMMANDS[cmd];\n if (editCmd) setCmdEcho(`${editCmd} is a drawing command — Preview is a read-only viewer. Measuring: DI, DIM, H, V (? for help)`);\n else setCmdEcho(`Unknown command \"${cmd.toUpperCase()}\" — try DI, DIM, H, V, Z, LA (? for help)`);\n }\n }\n };\n\n // AutoCAD keyboard feel: any printable key typed while this panel's\n // window is active (and no other field is focused) lands in the\n // command input. Focusing during keydown is enough — the browser\n // delivers the character to the newly focused input.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.defaultPrevented || e.metaKey || e.ctrlKey || e.altKey) return;\n if (e.key.length !== 1 || e.key === ' ') return;\n const t = e.target as HTMLElement | null;\n if (t && (t.tagName === 'INPUT' || t.tagName === 'TEXTAREA' || t.isContentEditable)) return;\n const root = rootRef.current;\n if (!root) return;\n const myModal = root.closest('[data-modal-id]') as HTMLElement | null;\n if (myModal && getActiveModalId() !== myModal.dataset.modalId) return;\n cmdInputRef.current?.focus();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, []);\n\n // AutoCAD Esc cascade. The shell closes the topmost window on Escape\n // (capture phase, so neither the command input nor a window-level\n // listener can get there first) — intercept it while there's something\n // to cancel: command-input text first, then the measure tool. A further\n // Esc falls through and closes the window as usual.\n const cmdValueRef = useRef(cmdValue);\n const measureEnabledRef = useRef(measureEnabled);\n useEffect(() => { cmdValueRef.current = cmdValue; }, [cmdValue]);\n useEffect(() => { measureEnabledRef.current = measureEnabled; }, [measureEnabled]);\n useEffect(() => {\n return registerModalEscapeInterceptor(() => {\n const root = rootRef.current;\n if (!root) return false;\n const myModal = root.closest('[data-modal-id]') as HTMLElement | null;\n if (!myModal || getActiveModalId() !== myModal.dataset.modalId) return false;\n if (cmdValueRef.current) {\n setCmdValue('');\n setCmdEcho('*Cancel*');\n return true;\n }\n if (measureEnabledRef.current) {\n setMeasureEnabled(false);\n setCmdEcho('Measure off.');\n return true;\n }\n return false;\n });\n }, []);\n\n const btn = 'px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1';\n const colorHex = (n?: number) => {\n if (typeof n !== 'number') return '#999';\n return '#' + n.toString(16).padStart(6, '0');\n };\n\n return (\n <div ref={rootRef} className=\"flex flex-col h-full\">\n <PanelActions>\n <button\n onClick={() => setShowLayers(s => !s)}\n className={btn + (showLayers ? ' bg-gray-200' : '')}\n title=\"Toggle layer visibility\"\n disabled={layers.length === 0}\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.429 9.75L2.25 12l4.179 2.25m0-4.5l5.571 3 5.571-3m-11.142 0L2.25 7.5 12 2.25l9.75 5.25-4.179 2.25m0 0L21.75 12l-4.179 2.25m0 0l4.179 2.25L12 21.75 2.25 16.5l4.179-2.25m11.142 0l-5.571 3-5.571-3\" /></svg>\n Layers {layers.length > 0 && <span className=\"text-gray-400\">({layers.filter(l => l.visible).length}/{layers.length})</span>}\n </button>\n <button onClick={() => setShowHint(s => !s)} className={btn} title=\"How to navigate\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z\" /></svg>\n </button>\n <button\n onClick={() => setMeasureEnabled(m => !m)}\n className={btn + (measureEnabled ? ' bg-gray-200' : '')}\n title={measureEnabled ? 'Stop measuring (Esc)' : 'Measure distance — click two points on the drawing, or type DI / DIM below'}\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 14.25l6-6 6 6 4.5-4.5M9.75 8.25v3M12.75 11.25v3M15.75 14.25v3\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 18.75h19.5\" />\n </svg>\n Measure\n </button>\n {measureEnabled && (\n <>\n <div className=\"flex items-stretch h-7 rounded border border-gray-200 overflow-hidden text-[11px] font-semibold\">\n <button\n onClick={() => setMeasureMode('auto')}\n className={`px-2 transition-colors ${measureMode === 'auto' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Auto — AutoCAD DIMLINEAR: measures ΔX or ΔY, whichever is larger between the two picks\"\n >\n Auto\n </button>\n <button\n onClick={() => setMeasureMode('horizontal')}\n className={`px-2 transition-colors ${measureMode === 'horizontal' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Horizontal — distance along the X axis between two picks (AutoCAD DIMLINEAR horizontal)\"\n >\n H\n </button>\n <button\n onClick={() => setMeasureMode('vertical')}\n className={`px-2 transition-colors ${measureMode === 'vertical' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Vertical — distance along the Y axis between two picks (AutoCAD DIMLINEAR vertical)\"\n >\n V\n </button>\n <button\n onClick={() => setMeasureMode('point')}\n className={`px-2 transition-colors ${measureMode === 'point' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Point — straight-line (Euclidean) distance between two picks (AutoCAD DIST)\"\n >\n Point\n </button>\n </div>\n {/* Fixed-distance input — locks the second pick's axis-aligned\n coord to (first pick's coord ± entered value). The\n displayed measurement becomes the perpendicular distance.\n Only useful in H or V mode. Sign of the offset follows\n whichever side of the first pick the user clicks on. */}\n {(measureMode === 'horizontal' || measureMode === 'vertical') && (\n <div className=\"flex items-center gap-1\">\n <input\n type=\"number\"\n inputMode=\"decimal\"\n step=\"any\"\n value={measureFixedInput}\n placeholder={measureMode === 'horizontal' ? 'fix Δx' : 'fix Δy'}\n onChange={(e) => {\n const raw = e.target.value;\n setMeasureFixedInput(raw);\n if (raw.trim() === '') setMeasureFixedDist(null);\n else {\n const n = parseFloat(raw);\n setMeasureFixedDist(Number.isFinite(n) && n !== 0 ? n : null);\n }\n }}\n className=\"h-7 w-20 px-1.5 text-[11px] font-mono rounded border border-gray-200 bg-white text-gray-700 focus:outline-none focus:border-orange-400\"\n title=\"Lock the second pick's axis coord to first pick + this value (mm). The reported measurement becomes the perpendicular distance.\"\n />\n {measureFixedDist !== null && (\n <button\n onClick={() => { setMeasureFixedDist(null); setMeasureFixedInput(''); }}\n className=\"text-gray-400 hover:text-gray-600 text-[11px] px-1\"\n title=\"Clear fixed distance\"\n >\n ×\n </button>\n )}\n </div>\n )}\n </>\n )}\n {measureEnabled && measureDistance !== null && (\n <div\n className=\"px-2 py-1 text-[11px] font-mono font-semibold text-orange-600 bg-orange-50 border border-orange-200 rounded whitespace-nowrap\"\n title={\n measureResolved === 'horizontal' ? `Horizontal distance (Δx) between the two picked points${measureMode === 'auto' ? ' — Auto resolved to the X axis' : ''}`\n : measureResolved === 'vertical' ? `Vertical distance (Δy) between the two picked points${measureMode === 'auto' ? ' — Auto resolved to the Y axis' : ''}`\n : 'Straight-line distance between the two picked points'\n }\n >\n {formatMeasureDistance(measureDistance)}\n {measureResolved === 'horizontal' ? ' ↔'\n : measureResolved === 'vertical' ? ' ↕'\n : ''}\n </div>\n )}\n <button onClick={handleResetView} className={btn} title=\"Fit drawing to view\">Fit</button>\n <button onClick={onDownload ?? handleDefaultDownload} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Download\n </button>\n {onEmail && (\n <button onClick={onEmail} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n Email\n </button>\n )}\n </PanelActions>\n <div className=\"relative flex-1 bg-white min-h-0\">\n {/* dxf-viewer overrides container's `position` to `relative` in its\n * constructor, which kills any `inset: 0` sizing. Use explicit\n * width/height: 100% so the container always fills its flex parent. */}\n <div ref={containerRef} style={{ width: '100%', height: '100%' }} />\n\n {showLayers && layers.length > 0 && (\n <div className=\"absolute top-2 right-2 w-64 max-h-[70%] flex flex-col bg-white/95 backdrop-blur border border-gray-200 rounded-md shadow-xl z-10 text-xs\">\n <div className=\"flex items-center justify-between px-2 py-1.5 border-b border-gray-200 bg-gray-50\">\n <span className=\"font-medium text-gray-700\">Layers</span>\n <div className=\"flex items-center gap-1\">\n <button onClick={() => setAllLayers(true)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\">All</button>\n <button onClick={() => setAllLayers(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\">None</button>\n <button onClick={() => setShowLayers(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\" title=\"Close\">×</button>\n </div>\n </div>\n <div className=\"overflow-y-auto py-1\">\n {layers.map(l => (\n <label key={l.name} className=\"flex items-center gap-2 px-2 py-1 hover:bg-gray-100 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={l.visible}\n onChange={() => toggleLayer(l.name)}\n className=\"h-3.5 w-3.5\"\n />\n <span\n className=\"inline-block h-3 w-3 rounded-sm border border-gray-300 shrink-0\"\n style={{ background: colorHex(l.color) }}\n />\n <span className=\"truncate text-gray-700\" title={l.displayName}>{l.displayName || l.name}</span>\n </label>\n ))}\n </div>\n </div>\n )}\n\n {showHint && !loading && !error && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 bg-gray-900/85 text-white text-[11px] px-3 py-1.5 rounded-full shadow-lg flex items-center gap-3 z-10 pointer-events-none\">\n <span className=\"flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5M7.188 2.239l.777 2.897M5.136 7.965l-2.898-.777M13.95 4.05l-2.122 2.122m-5.657 5.656l-2.12 2.122\" /></svg>\n Drag to pan\n </span>\n <span className=\"text-white/40\">•</span>\n <span className=\"flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607zM10.5 7.5v6m3-3h-6\" /></svg>\n Scroll to zoom\n </span>\n <span className=\"text-white/40\">•</span>\n <span>Fit to reset</span>\n <span className=\"text-white/40\">•</span>\n <span>Type <span className=\"font-mono font-semibold\">DI</span> / <span className=\"font-mono font-semibold\">DIM</span> to measure</span>\n </div>\n )}\n\n {loading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-white/80 text-sm text-gray-500\">Loading drawing…</div>\n )}\n {error && (\n <div className=\"absolute inset-0 flex items-center justify-center text-sm text-red-600 px-6 text-center\">{error}</div>\n )}\n </div>\n\n {/* AutoCAD-style command bar. Typing over the drawing focuses the\n * input automatically; Enter/Space runs, Enter on empty repeats,\n * Esc cancels the input then the measure tool. */}\n <div className=\"shrink-0 border-t border-gray-200 bg-gray-50\">\n {cmdEcho && (\n <div className=\"px-2.5 pt-1 text-[11px] font-mono text-gray-500 truncate\" title={cmdEcho}>{cmdEcho}</div>\n )}\n <div className=\"flex items-center gap-1.5 px-2.5 h-7\">\n <span className=\"text-[11px] font-mono font-semibold text-gray-400 select-none\">></span>\n <input\n ref={cmdInputRef}\n value={cmdValue}\n onChange={(e) => setCmdValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n runCommand(cmdValue);\n } else if (e.key === 'Escape') {\n if (cmdValue) {\n // Esc with text: cancel the input only — don't let the\n // window-level handler kill the measure tool too.\n e.stopPropagation();\n setCmdValue('');\n setCmdEcho('*Cancel*');\n } else {\n (e.target as HTMLInputElement).blur();\n }\n }\n }}\n placeholder=\"Type a command — DI, DIM, H, V, Z, LA (? for help)\"\n spellCheck={false}\n autoComplete=\"off\"\n className=\"flex-1 min-w-0 bg-transparent text-[11px] font-mono text-gray-700 focus:outline-none placeholder:text-gray-300\"\n />\n </div>\n </div>\n </div>\n );\n}\n\ninterface StepPanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\n// online-3d-viewer expects an \"external libs\" base URL where it can find the\n// occt-import-js WASM (for STEP/IGES) plus draco/rhino3dm/web-ifc decoders.\n// jsdelivr mirrors the npm package at this path; consumers can override via\n// `window.__REACT_OS_SHELL_O3DV_LIBS__` to self-host (e.g. air-gapped).\nconst DEFAULT_O3DV_LIBS = 'https://cdn.jsdelivr.net/npm/online-3d-viewer@0.18.0/libs/';\n\ninterface TreeNode {\n id: number;\n name: string;\n isMeshNode: boolean;\n meshIndices: number[];\n children: TreeNode[];\n}\n\nfunction buildTree(node: any, depth = 0): TreeNode {\n return {\n id: node.GetId?.() ?? 0,\n name: node.GetName?.() || (depth === 0 ? 'Root' : 'Node'),\n isMeshNode: !!node.IsMeshNode?.(),\n meshIndices: node.GetMeshIndices?.() ?? [],\n children: (node.GetChildNodes?.() ?? []).map((c: any) => buildTree(c, depth + 1)),\n };\n}\n\n// Collect every nodeId in the subtree rooted at `node` (inclusive).\nfunction collectNodeIds(node: TreeNode, out: Set<number>) {\n out.add(node.id);\n for (const c of node.children) collectNodeIds(c, out);\n}\n\n// Hex string (\"#rrggbb\") → RGBColor instance.\nfunction hexToRgb(OV: any, hex: string) {\n const m = /^#?([0-9a-f]{6})$/i.exec(hex);\n const n = m ? parseInt(m[1], 16) : 0;\n return new OV.RGBColor((n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff);\n}\nfunction rgbToHex(c: { r?: number; g?: number; b?: number }) {\n const r = (c.r ?? 0) | 0, g = (c.g ?? 0) | 0, b = (c.b ?? 0) | 0;\n return '#' + [r, g, b].map(v => v.toString(16).padStart(2, '0')).join('');\n}\n\n/** Format a 3D-space distance for the measurement label. STEP files are\n * conventionally in millimetres, so we surface mm with a sensible\n * precision and switch to metres for >= 1000 mm. */\nfunction formatMeasureDistance(mm: number): string {\n // Two decimals to match AutoCAD's dimension readout (e.g. 18.56 mm) —\n // one decimal loses real precision on machined parts.\n if (mm >= 1000) return `${(mm / 1000).toFixed(3)} m`;\n return `${mm.toFixed(2)} mm`;\n}\n\nfunction StepPanel({ url, filename, onDownload, onEmail }: StepPanelProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<any>(null);\n const ovRef = useRef<any>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [showHint, setShowHint] = useState(true);\n\n // Mesh tree + per-node visibility (true = visible).\n const [tree, setTree] = useState<TreeNode | null>(null);\n const [expanded, setExpanded] = useState<Record<number, boolean>>({});\n const [hidden, setHidden] = useState<Set<number>>(new Set());\n\n // Right-panel display settings.\n const [bgColor, setBgColor] = useState('#f5f6f8');\n const [showEdges, setShowEdges] = useState(true);\n const [edgeColor, setEdgeColor] = useState('#000000');\n const [edgeThreshold, setEdgeThreshold] = useState(1);\n\n // Floating panel visibility — default closed so the viewport is unobstructed.\n const [showMeshes, setShowMeshes] = useState(false);\n const [showSettings, setShowSettings] = useState(false);\n // Camera projection — orthographic by default. CAD users expect ortho\n // when first opening a STEP file; perspective is one click away via\n // the toolbar toggle.\n const [perspective, setPerspective] = useState(false);\n\n // Section view (capped clipping plane).\n const [sectionEnabled, setSectionEnabled] = useState(false);\n const [sectionAxis, setSectionAxis] = useState<'x' | 'y' | 'z'>('x');\n const [sectionFlip, setSectionFlip] = useState(false);\n const [sectionPosition, setSectionPosition] = useState(0.5); // 0–1 within bbox\n const [sectionAngle, setSectionAngle] = useState(0); // degrees, 0–180 — rotates the cut plane around a perpendicular axis\n\n // Measurement tool — point picker. Two modes:\n // - 'point': click two points on the model → straight-line distance.\n // - 'perp': click two surfaces → perpendicular gap between the two\n // face planes (the typical CAD \"wall thickness\" measurement).\n // Clicked points + visual artefacts (markers, line, label) live in the\n // ref so the user can orbit the camera between picks without losing\n // anything.\n const [measureEnabled, setMeasureEnabled] = useState(false);\n const [measureMode, setMeasureMode] = useState<'point' | 'perp'>('point');\n const [measureDistance, setMeasureDistance] = useState<number | null>(null);\n const measureRef = useRef<{\n points: any[]; // THREE.Vector3[] — at most 2\n normals: ({ x: number; y: number; z: number } | null)[]; // surface normal at each pick (null if pick missed a face)\n markers: any[]; // small spheres at each point\n line: any | null; // line connecting them\n label: HTMLDivElement | null;\n rafId: number | null; // requestAnimationFrame for label-follows-camera\n } | null>(null);\n\n // Persistent section state — stencil helpers, cap mesh, original material\n // settings — held in a ref so we can mutate the plane in place on slider\n // tick instead of rebuilding every helper mesh.\n const sectionRef = useRef<{\n plane: any;\n capMesh: any;\n helpers: any[];\n materialState: Map<any, { clippingPlanes: any; clipShadows: any }>;\n bbox: any;\n } | null>(null);\n\n // Load model.\n useEffect(() => {\n let cancelled = false;\n let viewer: any = null;\n let resizeObserver: ResizeObserver | null = null;\n setLoading(true);\n setError(null);\n setTree(null);\n setExpanded({});\n setHidden(new Set());\n\n (async () => {\n let OV: any;\n try {\n OV = await import('online-3d-viewer');\n } catch {\n if (!cancelled) {\n setError('online-3d-viewer is not installed in this app. Add it to enable 3D file viewing.');\n setLoading(false);\n }\n return;\n }\n ovRef.current = OV;\n if (cancelled || !containerRef.current) return;\n\n // Wait for container to have a real layout before constructing the\n // viewer — same dance as the DXF panel.\n await new Promise<void>(resolve => {\n const tryStart = () => {\n const r = containerRef.current?.getBoundingClientRect();\n if (r && r.width > 4 && r.height > 4) resolve();\n else requestAnimationFrame(tryStart);\n };\n tryStart();\n });\n if (cancelled || !containerRef.current) return;\n\n try {\n const libsBase = (typeof window !== 'undefined' && (window as any).__REACT_OS_SHELL_O3DV_LIBS__)\n || DEFAULT_O3DV_LIBS;\n OV.SetExternalLibLocation?.(libsBase);\n\n // Must run before EmbeddedViewer creates its canvas so the WebGL\n // context is granted a stencil buffer (needed by the section\n // view's capping technique).\n ensureStencilContextAttribute();\n\n viewer = new OV.EmbeddedViewer(containerRef.current, {\n backgroundColor: new OV.RGBAColor(245, 246, 248, 255),\n defaultColor: new OV.RGBColor(180, 188, 200),\n edgeSettings: new OV.EdgeSettings(true, new OV.RGBColor(0, 0, 0), 1),\n onModelLoaded: () => {\n if (cancelled) return;\n try {\n const model = viewer.GetModel?.();\n const root = model?.GetRootNode?.();\n if (root) {\n const t = buildTree(root);\n setTree(t);\n // Expand top two levels by default.\n const expandIds: Record<number, boolean> = { [t.id]: true };\n for (const c of t.children) expandIds[c.id] = true;\n setExpanded(expandIds);\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] mesh tree extraction failed', err);\n }\n setLoading(false);\n },\n onModelLoadFailed: () => {\n if (!cancelled) {\n setError('Failed to load 3D model.');\n setLoading(false);\n }\n },\n });\n viewerRef.current = viewer;\n\n const inputFile = new OV.InputFile(filename, OV.FileSource.Url, url);\n viewer.LoadModelFromInputFiles([inputFile]);\n\n // Re-size the WebGL canvas whenever the container's box changes —\n // window resize, Modal drag-resize, taskbar repositioning, etc.\n // The OV EmbeddedViewer ships its own `Resize()` that auto-detects\n // the container size; we feature-detect the underlying inner\n // viewer too in case OV's wrapper API changes.\n if (containerRef.current && typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(() => {\n try {\n const v = viewerRef.current as any;\n if (v?.Resize) v.Resize();\n else if (v?.viewer?.Resize) v.viewer.Resize();\n v?.viewer?.Render?.();\n } catch {}\n });\n resizeObserver.observe(containerRef.current);\n }\n } catch (e: any) {\n if (!cancelled) {\n setError(e?.message || 'Failed to load 3D model.');\n setLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n try { resizeObserver?.disconnect(); } catch {}\n try { viewer?.Destroy?.(); } catch {}\n viewerRef.current = null;\n };\n }, [url, filename]);\n\n // Apply per-node visibility by walking the THREE scene's mesh userData. The\n // engine's public `SetMeshesVisibility` is global-only, so we go one level\n // deeper to flip individual `mesh.visible` flags.\n useEffect(() => {\n const v = viewerRef.current;\n if (!v?.viewer) return;\n try {\n const visit = (mesh: any) => {\n if (mesh.userData?.__sectionHelper) return;\n const ud = mesh.userData?.originalMeshInstance ?? mesh.userData;\n const nodeId: number | undefined = ud?.id?.nodeId ?? ud?.nodeId;\n if (typeof nodeId === 'number') {\n mesh.visible = !hidden.has(nodeId);\n }\n };\n v.viewer.mainModel?.EnumerateMeshesAndLines?.(visit);\n v.viewer.mainModel?.EnumerateEdges?.(visit);\n v.viewer.Render?.();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] visibility update failed', err);\n }\n }, [hidden, tree]);\n\n // Apply edge settings.\n useEffect(() => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer) return;\n try {\n v.viewer.SetEdgeSettings(new OV.EdgeSettings(showEdges, hexToRgb(OV, edgeColor), edgeThreshold));\n\n // OV's GenerateEdgeModel walks every mesh in mainModel — including\n // the stencil helpers we add as children of the originals when\n // section view is on. That produces duplicate edge LineSegments\n // (one per helper, on top of the originals) and the new\n // LineBasicMaterials don't carry our clipping plane, so the edges\n // render past the cut. Strip the helper-derived edges and reapply\n // clipping to what's left.\n const s = sectionRef.current;\n if (s) {\n const helperEdges: any[] = [];\n v.viewer.mainModel?.EnumerateEdges?.((edge: any) => {\n if (edge.userData?.__sectionHelper) helperEdges.push(edge);\n });\n for (const e of helperEdges) {\n e.parent?.remove(e);\n e.geometry?.dispose?.();\n e.material?.dispose?.();\n }\n const plane = s.plane;\n const applyMatClip = (mat: any) => {\n if (!mat || s.materialState.has(mat)) return;\n s.materialState.set(mat, { clippingPlanes: mat.clippingPlanes, clipShadows: mat.clipShadows });\n mat.clippingPlanes = [plane];\n mat.clipShadows = true;\n mat.needsUpdate = true;\n };\n v.viewer.mainModel?.EnumerateEdges?.((edge: any) => {\n const mat = edge.material;\n if (Array.isArray(mat)) for (const m of mat) applyMatClip(m);\n else applyMatClip(mat);\n });\n }\n\n v.viewer.Render?.();\n } catch {}\n }, [showEdges, edgeColor, edgeThreshold]);\n\n // Apply background color.\n useEffect(() => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer) return;\n try {\n const c = hexToRgb(OV, bgColor);\n v.viewer.SetBackgroundColor(new OV.RGBAColor(c.r, c.g, c.b, 255));\n v.viewer.Render?.();\n } catch {}\n }, [bgColor]);\n\n // Section view — set / tear down on enable.\n //\n // Capped clipping using the standard three.js stencil technique. The\n // tricky bit is that we can't `import('three')` — it resolves to a\n // different three instance than the one online-3d-viewer bundles\n // (transitive duplicate), which breaks instanceof checks against the\n // renderer's THREE. Workaround: pluck constructors (Mesh, BufferGeometry,\n // BufferAttribute, MeshPhongMaterial) from a sample mesh in the loaded\n // scene — those are guaranteed to be from the renderer's THREE. The\n // stencil/side constants are universal numeric values, so we hardcode\n // them. The plane itself stays duck-typed — three's WebGLClipping just\n // calls `.copy()` on it (reads .normal.x/y/z and .constant).\n useEffect(() => {\n const v = viewerRef.current;\n if (!v?.viewer || loading) return;\n\n const renderer = v.viewer.renderer;\n const scene = v.viewer.scene;\n if (!renderer || !scene) return;\n\n // Tear down any previous state.\n if (sectionRef.current) {\n const s = sectionRef.current;\n for (const [mat, prev] of s.materialState.entries()) {\n mat.clippingPlanes = prev.clippingPlanes;\n mat.clipShadows = prev.clipShadows;\n mat.needsUpdate = true;\n }\n for (const helper of s.helpers) {\n helper.parent?.remove(helper);\n // Don't dispose helper.geometry — it's shared with the original mesh.\n helper.material?.dispose?.();\n }\n if (s.capMesh) {\n scene.remove(s.capMesh);\n s.capMesh.geometry?.dispose?.();\n s.capMesh.material?.dispose?.();\n }\n sectionRef.current = null;\n }\n\n if (!sectionEnabled) {\n renderer.localClippingEnabled = false;\n v.viewer.Render?.();\n return;\n }\n\n const bbox = v.viewer.GetBoundingBox?.(() => true);\n if (!bbox) return;\n\n // Snapshot the mesh list — never traverse-and-mutate.\n const targets: any[] = [];\n v.viewer.mainModel?.EnumerateMeshes?.((mesh: any) => {\n if (!mesh.userData?.__sectionHelper) targets.push(mesh);\n });\n if (!targets.length) {\n renderer.localClippingEnabled = false;\n v.viewer.Render?.();\n return;\n }\n\n // Pluck THREE constructors from a sample mesh (these come from the\n // renderer's THREE, so the renderer recognizes the resulting objects).\n const sample = targets[0];\n const Mesh = sample.constructor;\n const Material = sample.material?.constructor; // MeshPhongMaterial\n const Geometry = sample.geometry?.constructor;\n const BufferAttr = sample.geometry?.attributes?.position?.constructor;\n if (!Mesh || !Material || !Geometry || !BufferAttr) {\n // Fallback to plain clipping if we can't pluck constructors.\n // eslint-disable-next-line no-console\n console.warn('[Preview] section: missing THREE constructors, falling back to no cap');\n }\n\n // Universal three.js / WebGL constants.\n const FrontSide = 0, BackSide = 1, DoubleSide = 2;\n const AlwaysStencilFunc = 519, NotEqualStencilFunc = 517;\n const IncrementWrapStencilOp = 7682, DecrementWrapStencilOp = 7683;\n const ReplaceStencilOp = 7681;\n\n // Verify the WebGL context actually has a stencil buffer — without one\n // every stencil op is a no-op, the cap stays at ref 0 forever, and the\n // cut reads as a hollow shell. If we can't get one, log and skip the\n // cap (clipping still works, just without fill).\n let hasStencil = true;\n try {\n const gl = renderer.getContext?.();\n const attrs = gl?.getContextAttributes?.();\n hasStencil = attrs?.stencil !== false;\n // Force the renderer to clear stencil between frames; without this\n // the helper writes accumulate (or never start at 0) and the cap\n // mask drifts.\n renderer.autoClearStencil = true;\n // eslint-disable-next-line no-console\n console.info('[Preview] section: stencil buffer =', hasStencil, 'targets =', targets.length);\n } catch {}\n\n // Enable local clipping BEFORE we modify material clippingPlanes so the\n // shaders pick up the clipping path on first compile. Setting this\n // afterwards still works (with material.needsUpdate), but doing it\n // early avoids one wasted recompile and is closer to three.js's\n // documented usage pattern.\n renderer.localClippingEnabled = true;\n\n // Duck-typed plane. three.js's WebGLClipping calls `_plane.copy(this)`\n // — that just reads `.normal.x/y/z` and `.constant`, so a plain object\n // works. BUT `Material.copy()` deep-clones a source material's\n // clippingPlanes via `srcPlanes[i].clone()`, so our plane needs a\n // `.clone()` method or material cloning crashes with\n // `t[s].clone is not a function`. The clone returned here is a fresh\n // object with the same shape (so a clone-of-the-clone also works);\n // we always overwrite the cloned material's clippingPlanes back to\n // the shared plane reference afterwards, so this isn't load-bearing\n // for the actual rendering — it just has to not throw.\n const plane: any = {\n normal: { x: 0, y: 0, z: -1 },\n constant: 0,\n };\n plane.clone = function planeClone(this: any) {\n const c: any = {\n normal: { x: this.normal.x, y: this.normal.y, z: this.normal.z },\n constant: this.constant,\n };\n c.clone = planeClone;\n return c;\n };\n const helpers: any[] = [];\n const materialState = new Map<any, { clippingPlanes: any; clipShadows: any }>();\n\n const applyToMaterial = (mat: any) => {\n if (!mat || materialState.has(mat)) return;\n materialState.set(mat, { clippingPlanes: mat.clippingPlanes, clipShadows: mat.clipShadows });\n mat.clippingPlanes = [plane];\n mat.clipShadows = true;\n mat.needsUpdate = true;\n };\n\n for (const mesh of targets) {\n const mat = mesh.material;\n if (Array.isArray(mat)) for (const m of mat) applyToMaterial(m);\n else applyToMaterial(mat);\n\n // Stencil-only helpers per mesh: back-faces increment the stencil,\n // front-faces decrement. Where the running count is non-zero on the\n // cap plane, we're inside the solid → cap renders.\n //\n // We clone the source material rather than `new Material()` so the\n // shader compiles with the same uniform/attribute setup as the\n // existing scene (avoids subtle \"shader fails silently\" cases).\n const sourceMat = Array.isArray(mat) ? mat[0] : mat;\n if (Mesh && hasStencil && sourceMat?.clone) {\n const makeStencil = (side: number, op: number) => {\n const m: any = sourceMat.clone();\n m.depthWrite = false;\n m.depthTest = false;\n m.colorWrite = false;\n m.stencilWrite = true;\n m.stencilFunc = AlwaysStencilFunc;\n m.stencilFail = op;\n m.stencilZFail = op;\n m.stencilZPass = op;\n m.side = side;\n m.transparent = false;\n m.clippingPlanes = [plane];\n m.clipShadows = true;\n m.needsUpdate = true;\n const helper = new Mesh(mesh.geometry, m);\n helper.matrixAutoUpdate = false;\n helper.renderOrder = 1;\n helper.userData.__sectionHelper = true;\n mesh.add(helper);\n helpers.push(helper);\n };\n makeStencil(BackSide, IncrementWrapStencilOp);\n makeStencil(FrontSide, DecrementWrapStencilOp);\n }\n }\n\n // Edges — clip them too so the cut isn't framed by a stale outline.\n v.viewer.mainModel?.EnumerateEdges?.((edge: any) => {\n const mat = edge.material;\n if (Array.isArray(mat)) for (const m of mat) applyToMaterial(m);\n else applyToMaterial(mat);\n });\n\n // Cap quad — sized to the bbox diagonal × 2 so it always covers the cut,\n // built as a manual BufferGeometry quad (4 verts, 2 tris). We clone\n // the source material (same shader as the rest of the scene) instead\n // of `new Material()` so the cap actually receives lighting consistent\n // with the model.\n let capMesh: any = null;\n const sourceMat = (targets[0]?.material && (Array.isArray(targets[0].material) ? targets[0].material[0] : targets[0].material)) as any;\n if (hasStencil && Mesh && Geometry && BufferAttr && sourceMat?.clone) {\n const dx = bbox.max.x - bbox.min.x;\n const dy = bbox.max.y - bbox.min.y;\n const dz = bbox.max.z - bbox.min.z;\n const capSize = Math.max(dx, dy, dz, 1) * 2;\n const half = capSize / 2;\n\n const capGeom: any = new Geometry();\n const positions = new Float32Array([\n -half, -half, 0,\n half, -half, 0,\n half, half, 0,\n -half, half, 0,\n ]);\n const normals = new Float32Array([\n 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1,\n ]);\n capGeom.setAttribute('position', new BufferAttr(positions, 3));\n capGeom.setAttribute('normal', new BufferAttr(normals, 3));\n capGeom.setIndex([0, 1, 2, 0, 2, 3]);\n\n const capMat: any = sourceMat.clone();\n // Match the body's main color — the cap should look like a slice of\n // the same material, not a contrasting fill. The cloned material\n // already carries the source color; we just keep it. Add a low-\n // intensity emissive of the same color so the cap is still visible\n // even on faces facing away from any scene light, without changing\n // its hue.\n const sourceColorHex = (sourceMat.color?.getHex?.() ?? 0xb4bcc8) as number;\n capMat.emissive?.setHex?.(sourceColorHex);\n if ('emissiveIntensity' in capMat) capMat.emissiveIntensity = 0.25;\n capMat.side = DoubleSide;\n capMat.transparent = false;\n capMat.opacity = 1;\n capMat.stencilWrite = true;\n capMat.stencilRef = 0;\n capMat.stencilFunc = NotEqualStencilFunc;\n capMat.stencilFail = ReplaceStencilOp;\n capMat.stencilZFail = ReplaceStencilOp;\n capMat.stencilZPass = ReplaceStencilOp;\n // Don't clip the cap itself by the same plane.\n capMat.clippingPlanes = [];\n // Push the cap a hair toward the camera so it wins z-fights with\n // any model fragments that happen to sit exactly at the plane.\n capMat.polygonOffset = true;\n capMat.polygonOffsetFactor = -1;\n capMat.polygonOffsetUnits = -1;\n capMat.needsUpdate = true;\n\n capMesh = new Mesh(capGeom, capMat);\n capMesh.renderOrder = 2;\n capMesh.userData.__sectionHelper = true;\n scene.add(capMesh);\n }\n\n sectionRef.current = { plane, capMesh, helpers, materialState, bbox };\n // eslint-disable-next-line no-console\n console.info('[Preview] section: helpers =', helpers.length, 'cap =', !!capMesh);\n v.viewer.Render?.();\n }, [sectionEnabled, loading, tree]);\n\n // Section view — update plane orientation/position on axis/flip/angle/slider change.\n useEffect(() => {\n const v = viewerRef.current;\n const s = sectionRef.current;\n if (!v?.viewer || !s || !sectionEnabled) return;\n try {\n const bbox = s.bbox;\n const axisIdx = sectionAxis === 'x' ? 0 : sectionAxis === 'y' ? 1 : 2;\n const min = [bbox.min.x, bbox.min.y, bbox.min.z][axisIdx];\n const max = [bbox.max.x, bbox.max.y, bbox.max.z][axisIdx];\n const t = min + (max - min) * sectionPosition;\n\n // Cut-plane normal = chosen axis rotated through `sectionAngle` around a\n // perpendicular reference axis. At θ=0 every axis matches the original\n // axis-aligned behaviour; sweeping 0 → 360 spins the plane once around\n // the model. `sectionFlip` continues to negate the whole normal.\n const θ = (sectionAngle * Math.PI) / 180;\n const cosθ = Math.cos(θ), sinθ = Math.sin(θ);\n const sign = sectionFlip ? -1 : 1;\n let nx = 0, ny = 0, nz = 0;\n // Each axis rotates around the NEXT axis cyclically (X→Y, Y→Z, Z→X)\n // so all three options sweep in genuinely different planes:\n // X → rotates around Y, sweeping in the X-Z plane\n // Y → rotates around Z, sweeping in the Y-X plane\n // Z → rotates around X, sweeping in the Z-Y plane\n // Earlier attempts kept two axes in the same Y-Z plane (just swapped\n // sin/cos), which collapsed two of the three options to a 90° offset\n // of each other.\n if (sectionAxis === 'x') { nx = sign * cosθ; nz = sign * sinθ; }\n else if (sectionAxis === 'y') { ny = sign * cosθ; nx = sign * sinθ; }\n else { nz = sign * cosθ; ny = sign * sinθ; }\n\n // The plane passes through point P on the chosen-axis line at\n // `sectionPosition` of the bbox extent; the other two coordinates use\n // the bbox centre so the plane stays anchored within the model when it\n // rotates.\n const center = {\n x: (bbox.min.x + bbox.max.x) / 2,\n y: (bbox.min.y + bbox.max.y) / 2,\n z: (bbox.min.z + bbox.max.z) / 2,\n };\n const Px = sectionAxis === 'x' ? t : center.x;\n const Py = sectionAxis === 'y' ? t : center.y;\n const Pz = sectionAxis === 'z' ? t : center.z;\n\n s.plane.normal.x = nx;\n s.plane.normal.y = ny;\n s.plane.normal.z = nz;\n // three.js clips fragments where (normal · p) + constant < 0; the plane\n // equation we want is normal · p = normal · P, so constant = -(normal·P).\n s.plane.constant = -(nx * Px + ny * Py + nz * Pz);\n\n // Re-position the cap mesh on the plane and orient it so its visible\n // face points along the plane normal.\n if (s.capMesh) {\n const cx = center.x, cy = center.y, cz = center.z;\n // Distance from bbox center to plane along the normal.\n const dist = nx * cx + ny * cy + nz * cz + s.plane.constant;\n const px = cx - nx * dist;\n const py = cy - ny * dist;\n const pz = cz - nz * dist;\n s.capMesh.position.set(px, py, pz);\n s.capMesh.lookAt?.(px + nx, py + ny, pz + nz);\n }\n\n v.viewer.Render?.();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] section update failed', err);\n }\n }, [sectionEnabled, sectionAxis, sectionFlip, sectionPosition, sectionAngle]);\n\n // ──────────────────────────────────────────────────────────────────────\n // Measurement tool\n //\n // Click two points on the model; we raycast from the camera, drop a small\n // sphere marker at each hit, draw a line between them, and overlay an\n // HTML distance label that re-projects every animation frame so it\n // tracks as the user orbits the camera. A third click clears and starts\n // a fresh measurement. ESC or toggling the toolbar button off cleans up\n // all visuals.\n //\n // THREE constructors are plucked from a sample mesh in the loaded scene\n // (same trick the section view uses) so we share the renderer's THREE\n // instance. For raycasting we go through OV's own\n // `viewer.GetMeshIntersectionUnderMouse` rather than constructing our\n // own `THREE.Raycaster` from `import('three')` — the top-level `three`\n // hoisted in node_modules is a different version than the one OV\n // bundles, and a Raycaster from one bundle silently fails to intersect\n // meshes from the other.\n // ──────────────────────────────────────────────────────────────────────\n useEffect(() => {\n const v = viewerRef.current;\n if (!v?.viewer || loading || !containerRef.current) return;\n\n const renderer = v.viewer.renderer;\n const scene = v.viewer.scene;\n // NB: don't cache `v.viewer.camera` here. SetProjectionMode (orthographic\n // toggle, called from the projection-default effect right after load)\n // rebuilds the THREE camera and replaces v.viewer.camera with a fresh\n // instance. A captured reference goes stale and the raycaster picks\n // ghost positions. We re-read v.viewer.camera inside doMeasurePick.\n const canvas: HTMLCanvasElement | undefined = renderer?.domElement;\n if (!renderer || !scene || !canvas) return;\n\n // Snapshot a sample mesh to pluck THREE constructors that share the\n // renderer's THREE instance.\n let sampleMesh: any = null;\n v.viewer.mainModel?.EnumerateMeshes?.((m: any) => {\n if (!sampleMesh && !m.userData?.__sectionHelper && !m.userData?.__measureHelper) sampleMesh = m;\n });\n if (!sampleMesh) return;\n\n const Vector3Ctor = sampleMesh.position.constructor;\n const MeshCtor = sampleMesh.constructor;\n const MaterialCtor = (Array.isArray(sampleMesh.material) ? sampleMesh.material[0] : sampleMesh.material)?.constructor;\n const GeometryCtor = sampleMesh.geometry.constructor;\n const BufferAttrCtor = sampleMesh.geometry.attributes?.position?.constructor;\n if (!Vector3Ctor || !MeshCtor || !MaterialCtor || !GeometryCtor || !BufferAttrCtor) return;\n\n // OV renders edges as THREE.LineSegments; pluck its constructor + a\n // line material from the scene so our measurement line uses the same\n // bundled THREE that built the rest of the scene.\n let LineSegmentsCtor: any = null;\n let LineBasicMaterialCtor: any = null;\n scene.traverse((obj: any) => {\n if (LineSegmentsCtor && LineBasicMaterialCtor) return;\n if (!obj?.isLineSegments) return;\n LineSegmentsCtor = obj.constructor;\n const mat = Array.isArray(obj.material) ? obj.material[0] : obj.material;\n if (mat?.constructor) LineBasicMaterialCtor = mat.constructor;\n });\n\n // Tear-down helper, used both on toggle-off and on next-mount cleanup.\n const teardown = () => {\n const s = measureRef.current;\n if (!s) return;\n if (s.rafId !== null) cancelAnimationFrame(s.rafId);\n for (const m of s.markers) {\n scene.remove(m);\n m.geometry?.dispose?.();\n m.material?.dispose?.();\n }\n if (s.line) {\n scene.remove(s.line);\n s.line.geometry?.dispose?.();\n s.line.material?.dispose?.();\n }\n if (s.label && s.label.parentElement) s.label.parentElement.removeChild(s.label);\n measureRef.current = null;\n v.viewer.Render?.();\n };\n\n if (!measureEnabled) {\n teardown();\n setMeasureDistance(null);\n return;\n }\n\n // Initial state for this session.\n measureRef.current = { points: [], normals: [], markers: [], line: null, label: null, rafId: null };\n\n // OV exposes `IntersectionMode.MeshOnly` and a viewer-level\n // `GetMeshIntersectionUnderMouse(mode, {x,y})` that runs the raycast\n // through its bundled THREE — which is what we want, since the loaded\n // model meshes were instantiated from that same bundle.\n const OV = ovRef.current;\n const intersectionMode = OV?.IntersectionMode?.MeshOnly ?? 1;\n\n // Modest sphere size — scales with the model's bbox so it stays\n // visible on tiny and huge models alike.\n const bbox = v.viewer.GetBoundingBox?.(() => true);\n const diag = bbox\n ? Math.sqrt(\n (bbox.max.x - bbox.min.x) ** 2 +\n (bbox.max.y - bbox.min.y) ** 2 +\n (bbox.max.z - bbox.min.z) ** 2,\n )\n : 100;\n const markerRadius = Math.max(diag * 0.005, 0.2);\n\n const makeMarker = (point: any) => {\n // Build a tiny sphere from a 12×8 lat-long mesh — cheap, no helper geom.\n const widthSegs = 16, heightSegs = 12;\n const positions: number[] = [];\n const indices: number[] = [];\n for (let iy = 0; iy <= heightSegs; iy++) {\n const v = iy / heightSegs;\n const phi = v * Math.PI;\n for (let ix = 0; ix <= widthSegs; ix++) {\n const u = ix / widthSegs;\n const theta = u * Math.PI * 2;\n positions.push(\n markerRadius * Math.sin(phi) * Math.cos(theta),\n markerRadius * Math.cos(phi),\n markerRadius * Math.sin(phi) * Math.sin(theta),\n );\n }\n }\n for (let iy = 0; iy < heightSegs; iy++) {\n for (let ix = 0; ix < widthSegs; ix++) {\n const a = iy * (widthSegs + 1) + ix;\n const b = a + widthSegs + 1;\n indices.push(a, b, a + 1, b, b + 1, a + 1);\n }\n }\n const geom = new GeometryCtor();\n geom.setAttribute('position', new BufferAttrCtor(new Float32Array(positions), 3));\n geom.setIndex(indices);\n geom.computeVertexNormals?.();\n const mat: any = new MaterialCtor();\n mat.color?.setHex?.(0xff8800);\n mat.depthTest = false;\n mat.depthWrite = false;\n mat.transparent = true;\n mat.opacity = 0.95;\n const mesh: any = new MeshCtor(geom, mat);\n mesh.position.copy(point);\n mesh.renderOrder = 9999;\n mesh.userData.__measureHelper = true;\n scene.add(mesh);\n return mesh;\n };\n\n // Build a translucent overlay covering every triangle in the picked\n // mesh that's coplanar with the picked face — i.e. the entire flat\n // surface the user clicked. Used in ⊥ mode so the user sees which\n // surface they selected rather than a single point.\n //\n // Two triangles count as part of the same face when:\n // 1. their normals point the same way within ~1.8°, AND\n // 2. their centroids lie within a small band of the picked plane.\n //\n // Returns null for curved surfaces or mis-fitted picks; the caller\n // falls back to the sphere marker so the user always gets *some*\n // visual feedback.\n const buildFaceHighlight = (mesh: any, hit: any): any | null => {\n const geom = mesh?.geometry;\n const posAttr = geom?.attributes?.position;\n if (!geom || !posAttr || !hit?.face?.normal) return null;\n const positions: ArrayLike<number> = posAttr.array;\n const indices: ArrayLike<number> | null = geom.index ? geom.index.array : null;\n\n // Local-space hit data.\n const localPoint = new Vector3Ctor(hit.point.x, hit.point.y, hit.point.z);\n mesh.worldToLocal?.(localPoint);\n const ln = hit.face.normal;\n // Plane equation in local space: ln · X + planeC = 0 (passes through localPoint).\n const planeC = -(ln.x * localPoint.x + ln.y * localPoint.y + ln.z * localPoint.z);\n\n // Tolerance scales with the bbox so tiny parts and huge parts both\n // pick up the same face cleanly.\n geom.computeBoundingBox?.();\n const bb = geom.boundingBox;\n const diag = bb\n ? Math.sqrt((bb.max.x - bb.min.x) ** 2 + (bb.max.y - bb.min.y) ** 2 + (bb.max.z - bb.min.z) ** 2)\n : 100;\n const PLANE_TOL = Math.max(diag * 0.001, 0.005);\n const NORMAL_TOL = 0.9995; // ~1.8°\n\n const triCount = indices ? indices.length / 3 : posAttr.count / 3;\n const matched: number[] = [];\n\n // Bake the world transform into the highlight geometry so we can\n // attach it to the scene directly with no parent-tracking — it\n // stays in place even if the source mesh is later transformed.\n const tmpV = new Vector3Ctor();\n\n for (let t = 0; t < triCount; t++) {\n const ia = indices ? indices[t * 3] : t * 3;\n const ib = indices ? indices[t * 3 + 1] : t * 3 + 1;\n const ic = indices ? indices[t * 3 + 2] : t * 3 + 2;\n const ax = positions[ia * 3], ay = positions[ia * 3 + 1], az = positions[ia * 3 + 2];\n const bx = positions[ib * 3], by = positions[ib * 3 + 1], bz = positions[ib * 3 + 2];\n const cx = positions[ic * 3], cy = positions[ic * 3 + 1], cz = positions[ic * 3 + 2];\n\n const ux = bx - ax, uy = by - ay, uz = bz - az;\n const vx = cx - ax, vy = cy - ay, vz = cz - az;\n let nx = uy * vz - uz * vy;\n let ny = uz * vx - ux * vz;\n let nz = ux * vy - uy * vx;\n const nlen = Math.sqrt(nx * nx + ny * ny + nz * nz);\n if (nlen === 0) continue;\n nx /= nlen; ny /= nlen; nz /= nlen;\n\n // Triangle's normal must align with the picked face normal (front side).\n const ndot = nx * ln.x + ny * ln.y + nz * ln.z;\n if (ndot < NORMAL_TOL) continue;\n\n // Triangle centroid must lie on the picked plane.\n const ccx = (ax + bx + cx) / 3, ccy = (ay + by + cy) / 3, ccz = (az + bz + cz) / 3;\n const dist = Math.abs(ln.x * ccx + ln.y * ccy + ln.z * ccz + planeC);\n if (dist > PLANE_TOL) continue;\n\n // Push all three vertices in world space.\n for (const [vx_, vy_, vz_] of [[ax, ay, az], [bx, by, bz], [cx, cy, cz]]) {\n tmpV.set?.(vx_, vy_, vz_);\n mesh.localToWorld?.(tmpV);\n matched.push(tmpV.x, tmpV.y, tmpV.z);\n }\n }\n\n if (matched.length === 0) return null;\n\n const hgeom = new GeometryCtor();\n hgeom.setAttribute('position', new BufferAttrCtor(new Float32Array(matched), 3));\n hgeom.computeVertexNormals?.();\n\n const hmat: any = new MaterialCtor();\n hmat.color?.setHex?.(0xff8800);\n hmat.transparent = true;\n hmat.opacity = 0.45;\n hmat.depthWrite = false;\n // Pull the overlay slightly toward the camera so it doesn't z-fight\n // with the source surface. Negative offset = closer to viewer in\n // depth.\n hmat.polygonOffset = true;\n hmat.polygonOffsetFactor = -2;\n hmat.polygonOffsetUnits = -2;\n // Render after the model so the see-through colour blends on top.\n const highlight: any = new MeshCtor(hgeom, hmat);\n highlight.renderOrder = 9998;\n highlight.userData.__measureHelper = true;\n scene.add(highlight);\n return highlight;\n };\n\n const drawLine = (a: any, b: any) => {\n const geom = new GeometryCtor();\n geom.setAttribute('position', new BufferAttrCtor(new Float32Array([a.x, a.y, a.z, b.x, b.y, b.z]), 3));\n // LineSegments draws one segment per pair of vertices — with two\n // points that's exactly the line we want. Falls back to the mesh\n // constructor if no edge meshes happened to be in the scene\n // (extremely unlikely for STEP files, which always have edges).\n const LineCtor = LineSegmentsCtor ?? MeshCtor;\n const LineMatCtor = LineBasicMaterialCtor ?? MaterialCtor;\n const mat: any = new LineMatCtor({ color: 0xff8800, depthTest: false, depthWrite: false, transparent: true, opacity: 0.95 });\n const line: any = new LineCtor(geom, mat);\n line.renderOrder = 9998;\n line.userData.__measureHelper = true;\n scene.add(line);\n return line;\n };\n\n const ensureLabel = () => {\n const s = measureRef.current!;\n if (s.label) return s.label;\n const el = document.createElement('div');\n el.style.position = 'absolute';\n // Park off-screen on creation so the label never flashes at (0,0)\n // before updateLabel() positions it.\n el.style.left = '-9999px';\n el.style.top = '-9999px';\n el.style.transform = 'translate(-50%, -50%)';\n el.style.padding = '2px 6px';\n el.style.fontSize = '11px';\n el.style.fontWeight = '600';\n el.style.fontFamily = 'system-ui, -apple-system, sans-serif';\n el.style.background = 'rgba(255, 136, 0, 0.95)';\n el.style.color = '#fff';\n el.style.borderRadius = '4px';\n el.style.pointerEvents = 'none';\n el.style.whiteSpace = 'nowrap';\n el.style.boxShadow = '0 1px 4px rgba(0,0,0,0.25)';\n el.style.zIndex = '5';\n containerRef.current!.appendChild(el);\n s.label = el;\n return el;\n };\n\n const updateLabel = () => {\n const s = measureRef.current;\n if (!s || s.points.length < 2 || !s.label) return;\n // Read camera fresh — see comment in doMeasurePick.\n const camera = v.viewer.camera;\n if (!camera) return;\n const a = s.points[0], b = s.points[1];\n const mid = new Vector3Ctor((a.x + b.x) / 2, (a.y + b.y) / 2, (a.z + b.z) / 2);\n // Project midpoint to screen.\n const projected = mid.clone();\n projected.project?.(camera);\n const rect = canvas.getBoundingClientRect();\n const x = ((projected.x + 1) / 2) * rect.width;\n const y = ((-projected.y + 1) / 2) * rect.height;\n s.label.style.left = `${x}px`;\n s.label.style.top = `${y}px`;\n // Hide if behind the camera (z > 1) OR if the midpoint projects\n // outside the canvas — otherwise transform:translate(-50%,-50%)\n // leaves the label's right edge stuck at the top-left corner\n // showing \"…mm\" after the user orbits the measurement off-screen.\n const offScreen = x < 0 || y < 0 || x > rect.width || y > rect.height;\n s.label.style.opacity = (projected.z > 1 || offScreen) ? '0' : '1';\n };\n\n // Continuous re-projection so the label tracks orbit/pan/zoom — RAF is\n // cheap when the only work is one Vector3.project() and two style\n // assignments.\n const tick = () => {\n const s = measureRef.current;\n if (!s) return;\n updateLabel();\n s.rafId = requestAnimationFrame(tick);\n };\n measureRef.current.rafId = requestAnimationFrame(tick);\n\n // ── Click-vs-drag gating ──\n // We can't simply `stopPropagation()` on pointerdown — that would\n // block OV's orbit controls and pin the camera. Instead, we track\n // each pointer gesture: only treat it as a measurement pick when\n // the pointer barely moved (≤ DRAG_TOL px) between down and up\n // *and* the press was short. Anything longer is a camera drag and\n // we hand it off to OV unmodified.\n const DRAG_TOL = 4; // px of cumulative movement that still counts as a click\n const DRAG_TIME = 350; // ms; longer presses count as a drag even if pointer stayed still\n let downX = 0, downY = 0, downTime = 0, dragging = false, downActive = false;\n\n // Compute the world-space normal at the picked surface. Useful for\n // surface-to-surface distance: if the user picks two roughly-parallel\n // faces, we report the perpendicular distance instead of the raw\n // point-to-point distance.\n const worldNormalFromHit = (hit: any): { x: number; y: number; z: number } | null => {\n const fn = hit?.face?.normal;\n const obj = hit?.object;\n if (!fn || !obj) return null;\n try {\n const local = new Vector3Ctor(fn.x, fn.y, fn.z);\n // `transformDirection` is on three's Vector3 — applies the\n // upper-3x3 of `matrixWorld` and re-normalises.\n local.transformDirection?.(obj.matrixWorld);\n return { x: local.x, y: local.y, z: local.z };\n } catch {\n return { x: fn.x, y: fn.y, z: fn.z };\n }\n };\n\n const doMeasurePick = (ev: PointerEvent) => {\n // Read camera fresh — SetProjectionMode rebuilds it under the hood,\n // see the comment near the start of this effect.\n if (!v.viewer.camera) return;\n const rect = canvas.getBoundingClientRect();\n const mouseCoords = {\n x: ev.clientX - rect.left,\n y: ev.clientY - rect.top,\n };\n const hit = v.viewer.GetMeshIntersectionUnderMouse?.(intersectionMode, mouseCoords);\n if (!hit) return;\n\n const s = measureRef.current!;\n const point = new Vector3Ctor(hit.point.x, hit.point.y, hit.point.z);\n const normal = worldNormalFromHit(hit);\n\n // Third click → start over.\n if (s.points.length === 2) {\n for (const m of s.markers) {\n scene.remove(m);\n m.geometry?.dispose?.();\n m.material?.dispose?.();\n }\n if (s.line) {\n scene.remove(s.line);\n s.line.geometry?.dispose?.();\n s.line.material?.dispose?.();\n }\n if (s.label) s.label.style.opacity = '0';\n s.points = []; s.markers = []; s.line = null;\n s.normals = [];\n setMeasureDistance(null);\n }\n\n s.points.push(point);\n s.normals.push(normal);\n // In ⊥ mode the user is selecting a *surface*, so paint a\n // translucent overlay on the entire coplanar face instead of the\n // single-point sphere marker. Falls back to the sphere if face\n // detection fails (e.g. the user picked a curved surface where no\n // coplanar triangles exist).\n if (measureMode === 'perp') {\n const highlight = buildFaceHighlight(hit.object, hit);\n s.markers.push(highlight ?? makeMarker(point));\n } else {\n s.markers.push(makeMarker(point));\n }\n\n if (s.points.length === 2) {\n const a = s.points[0];\n let b = s.points[1];\n\n let dist: number;\n let suffix = '';\n\n if (measureMode === 'perp') {\n // Perpendicular mode: draw the line *along the surface normal*\n // (i.e. at 90° to surface A), ending on the plane parallel to\n // A passing through B's click point. The endpoint may land\n // inside or outside face B's highlight depending on where the\n // user clicked, but the line itself is unambiguously the\n // perpendicular gap — never the diagonal between two arbitrary\n // click points. Falls back to point-to-point if the first pick\n // missed a face.\n const refN = s.normals[0] ?? s.normals[1];\n if (refN) {\n const len = Math.sqrt(refN.x * refN.x + refN.y * refN.y + refN.z * refN.z) || 1;\n const nx = refN.x / len, ny = refN.y / len, nz = refN.z / len;\n const dx = b.x - a.x, dy = b.y - a.y, dz = b.z - a.z;\n // Signed projection of (b − a) onto n. Sign keeps the\n // perpendicular endpoint on the same side as the second\n // click, so the line visually crosses the gap rather than\n // drawing into the source body.\n const proj = dx * nx + dy * ny + dz * nz;\n const projectedB = new Vector3Ctor(a.x + nx * proj, a.y + ny * proj, a.z + nz * proj);\n // Re-anchor the second endpoint to the perpendicular foot —\n // both the rendered line and the label midpoint follow.\n s.points[1] = projectedB;\n b = projectedB;\n dist = Math.abs(proj);\n suffix = ' ⊥';\n } else {\n const dx = b.x - a.x, dy = b.y - a.y, dz = b.z - a.z;\n dist = Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n } else {\n const dx = b.x - a.x, dy = b.y - a.y, dz = b.z - a.z;\n dist = Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n\n s.line = drawLine(a, b);\n setMeasureDistance(dist);\n const label = ensureLabel();\n label.textContent = `${formatMeasureDistance(dist)}${suffix}`;\n }\n\n v.viewer.Render?.();\n };\n\n const onPointerDown = (ev: PointerEvent) => {\n // Left-button only. Right-click and middle-click are camera-pan/orbit\n // gestures we don't want to interfere with.\n if (ev.button !== 0) return;\n downX = ev.clientX;\n downY = ev.clientY;\n downTime = performance.now();\n dragging = false;\n downActive = true;\n // *No* stopPropagation here — OV needs the event for orbit drag.\n };\n const onPointerMove = (ev: PointerEvent) => {\n if (!downActive) return;\n const dx = ev.clientX - downX, dy = ev.clientY - downY;\n if (dx * dx + dy * dy > DRAG_TOL * DRAG_TOL) dragging = true;\n };\n const onPointerUp = (ev: PointerEvent) => {\n if (ev.button !== 0 || !downActive) return;\n const elapsed = performance.now() - downTime;\n const wasClick = !dragging && elapsed < DRAG_TIME;\n downActive = false;\n if (!wasClick) return; // it was a camera gesture, hand off\n doMeasurePick(ev);\n };\n\n const onKeyDown = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') setMeasureEnabled(false);\n };\n\n canvas.style.cursor = 'crosshair';\n // Bubble phase — OV's orbit-control listeners are also bubble; we\n // don't preempt them since we never call stopPropagation.\n canvas.addEventListener('pointerdown', onPointerDown);\n canvas.addEventListener('pointermove', onPointerMove);\n canvas.addEventListener('pointerup', onPointerUp);\n canvas.addEventListener('pointercancel', onPointerUp);\n window.addEventListener('keydown', onKeyDown);\n\n return () => {\n canvas.style.cursor = '';\n canvas.removeEventListener('pointerdown', onPointerDown);\n canvas.removeEventListener('pointermove', onPointerMove);\n canvas.removeEventListener('pointerup', onPointerUp);\n canvas.removeEventListener('pointercancel', onPointerUp);\n window.removeEventListener('keydown', onKeyDown);\n teardown();\n setMeasureDistance(null);\n };\n }, [measureEnabled, measureMode, loading, tree]);\n\n // Hint timer.\n useEffect(() => {\n if (!showHint || loading) return;\n const t = setTimeout(() => setShowHint(false), 5000);\n return () => clearTimeout(t);\n }, [showHint, loading]);\n\n const toggleNodeVisible = (node: TreeNode) => {\n const ids = new Set<number>();\n collectNodeIds(node, ids);\n setHidden(prev => {\n const next = new Set(prev);\n // If any descendant is currently visible, hide them all; else reveal.\n const anyVisible = [...ids].some(id => !next.has(id));\n for (const id of ids) {\n if (anyVisible) next.add(id);\n else next.delete(id);\n }\n return next;\n });\n };\n\n const toggleExpanded = (id: number) => {\n setExpanded(prev => ({ ...prev, [id]: !prev[id] }));\n };\n\n const fitNode = (node: TreeNode) => {\n // Fit the whole model — fitting to a specific subtree would need its\n // bounds via a custom enumerator; defer that for now.\n handleFit();\n // Future: filter visibility-by-subtree to focus.\n void node;\n };\n\n const handleFit = () => {\n try {\n const v = viewerRef.current;\n const sphere = v?.viewer?.GetBoundingSphere?.(() => true);\n if (sphere) v.viewer.FitSphereToWindow(sphere, true);\n v?.viewer?.Render?.();\n } catch {}\n };\n\n // Switch between perspective and orthographic projection. The viewer keeps\n // the current camera position; just rebuilds the THREE camera under the hood.\n useEffect(() => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer || loading) return;\n try {\n v.viewer.SetProjectionMode(perspective ? OV.ProjectionMode.Perspective : OV.ProjectionMode.Orthographic);\n } catch {}\n }, [perspective, loading]);\n\n // Camera presets — eye/center/up around the model's bounding sphere.\n const setCameraPreset = (preset: 'top' | 'front' | 'side' | 'iso') => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer) return;\n try {\n const sphere = v.viewer.GetBoundingSphere?.(() => true);\n if (!sphere) return;\n const c = sphere.center;\n const r = sphere.radius || 1;\n const dist = r * 3;\n const cx = c.x ?? 0, cy = c.y ?? 0, cz = c.z ?? 0;\n let eye: any, up: any;\n switch (preset) {\n case 'top': eye = new OV.Coord3D(cx, cy, cz + dist); up = new OV.Coord3D(0, 1, 0); break;\n case 'front': eye = new OV.Coord3D(cx, cy - dist, cz); up = new OV.Coord3D(0, 0, 1); break;\n case 'side': eye = new OV.Coord3D(cx + dist, cy, cz); up = new OV.Coord3D(0, 0, 1); break;\n case 'iso':\n default: {\n const k = dist / Math.sqrt(3);\n eye = new OV.Coord3D(cx + k, cy - k, cz + k);\n up = new OV.Coord3D(0, 0, 1);\n break;\n }\n }\n const center = new OV.Coord3D(cx, cy, cz);\n const cam = new OV.Camera(eye, center, up, 45);\n v.viewer.SetCamera(cam);\n v.viewer.AdjustClippingPlanesToSphere?.(sphere);\n v.viewer.Render?.();\n } catch {}\n };\n\n const handleSnapshot = () => {\n try {\n const v = viewerRef.current;\n const size = v?.viewer?.GetCanvasSize?.() ?? { width: 1280, height: 720 };\n const dataUrl = v?.viewer?.GetImageAsDataUrl?.(size.width, size.height, false);\n if (!dataUrl) return;\n const a = document.createElement('a');\n a.href = dataUrl;\n a.download = `${filename.replace(/\\.[^.]+$/, '')}-snapshot.png`;\n a.click();\n } catch {}\n };\n\n const handleResetDisplay = () => {\n setBgColor('#f5f6f8');\n setShowEdges(true);\n setEdgeColor('#000000');\n setEdgeThreshold(1);\n setSectionEnabled(false);\n setSectionAxis('x'); // matches the new default\n setSectionFlip(false);\n setSectionPosition(0.5);\n setSectionAngle(0);\n };\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n const ext = (filename.split('.').pop() || '').toUpperCase();\n\n // ── render helpers ───────────────────────────────────────────────────────\n const renderTreeNode = (node: TreeNode, depth = 0): React.ReactNode => {\n const hasChildren = node.children.length > 0;\n const isExpanded = expanded[node.id] !== false; // default expanded for first two levels\n const isVisible = !hidden.has(node.id);\n return (\n <div key={node.id}>\n <div\n className=\"group flex items-center gap-1 px-1.5 py-1 hover:bg-gray-100 cursor-default text-[12px] text-gray-700\"\n style={{ paddingLeft: `${depth * 12 + 6}px` }}\n >\n {hasChildren ? (\n <button\n onClick={() => toggleExpanded(node.id)}\n className=\"h-4 w-4 shrink-0 flex items-center justify-center text-gray-500 hover:text-gray-900\"\n title={isExpanded ? 'Collapse' : 'Expand'}\n >\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={isExpanded ? 'M19.5 8.25l-7.5 7.5-7.5-7.5' : 'M8.25 4.5l7.5 7.5-7.5 7.5'} />\n </svg>\n </button>\n ) : (\n <span className=\"h-4 w-4 shrink-0 flex items-center justify-center\">\n <span className=\"h-1 w-1 rounded-full bg-gray-400\" />\n </span>\n )}\n <span className={`flex-1 truncate ${isVisible ? '' : 'opacity-40'}`} title={node.name}>{node.name}</span>\n <button\n onClick={() => fitNode(node)}\n className=\"h-4 w-4 shrink-0 text-gray-400 hover:text-gray-900 opacity-0 group-hover:opacity-100 transition-opacity\"\n title=\"Fit to view\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n </svg>\n </button>\n <button\n onClick={() => toggleNodeVisible(node)}\n className=\"h-4 w-4 shrink-0 text-gray-500 hover:text-gray-900\"\n title={isVisible ? 'Hide' : 'Show'}\n >\n {isVisible ? (\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n ) : (\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.98 8.223A10.477 10.477 0 001.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.45 10.45 0 0112 4.5c4.756 0 8.773 3.162 10.065 7.498a10.523 10.523 0 01-4.293 5.774M6.228 6.228L3 3m3.228 3.228l3.65 3.65m7.894 7.894L21 21m-3.228-3.228l-3.65-3.65m0 0a3 3 0 10-4.243-4.243m4.242 4.242L9.88 9.88\" />\n </svg>\n )}\n </button>\n </div>\n {isExpanded && hasChildren && (\n <div>{node.children.map(c => renderTreeNode(c, depth + 1))}</div>\n )}\n </div>\n );\n };\n\n const tBtn = 'h-8 w-8 shrink-0 flex items-center justify-center rounded text-gray-600 hover:bg-gray-200 hover:text-gray-900 transition-colors';\n const tBtnActive = 'h-8 w-8 shrink-0 flex items-center justify-center rounded bg-gray-200 text-gray-900';\n // Wide variant — used for text-labelled buttons (e.g. Perspective /\n // Orthographic) so the label has room to render without being clipped\n // by the fixed 32 px square of `tBtn`.\n const tBtnWide = 'h-8 shrink-0 flex items-center justify-center px-2 rounded text-gray-600 hover:bg-gray-200 hover:text-gray-900 transition-colors';\n const tBtnWideActive = 'h-8 shrink-0 flex items-center justify-center px-2 rounded bg-gray-200 text-gray-900';\n const tBtnSep = 'h-5 w-px bg-gray-300 mx-1';\n\n return (\n <div className=\"flex flex-col h-full bg-white\">\n <PanelActions>\n <button onClick={handleFit} className={tBtn} title=\"Fit to view\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n </svg>\n </button>\n <div className={tBtnSep} />\n <button onClick={() => setCameraPreset('iso')} className={tBtn} title=\"Isometric view\">\n <span className=\"text-[10px] font-semibold\">ISO</span>\n </button>\n <button onClick={() => setCameraPreset('top')} className={tBtn} title=\"Top view\">\n <span className=\"text-[10px] font-semibold\">TOP</span>\n </button>\n <button onClick={() => setCameraPreset('front')} className={tBtn} title=\"Front view\">\n <span className=\"text-[10px] font-semibold\">FRT</span>\n </button>\n <button onClick={() => setCameraPreset('side')} className={tBtn} title=\"Side view\">\n <span className=\"text-[10px] font-semibold\">SDE</span>\n </button>\n <button\n onClick={() => setPerspective(p => !p)}\n className={perspective ? tBtnWideActive : tBtnWide}\n title={perspective ? 'Switch to orthographic view' : 'Switch to perspective view'}\n >\n <span className=\"text-[11px] font-semibold whitespace-nowrap\">{perspective ? 'Perspective' : 'Orthographic'}</span>\n </button>\n <div className={tBtnSep} />\n <button onClick={handleSnapshot} className={tBtn} title=\"Save snapshot as PNG\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.827 6.175A2.31 2.31 0 015.186 7.23c-.38.054-.757.112-1.134.175C2.999 7.58 2.25 8.507 2.25 9.574V18a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9.574c0-1.067-.75-1.994-1.802-2.169a47.865 47.865 0 00-1.134-.175 2.31 2.31 0 01-1.64-1.055l-.822-1.316a2.192 2.192 0 00-1.736-1.039 48.774 48.774 0 00-5.232 0 2.192 2.192 0 00-1.736 1.039l-.821 1.316z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 12.75a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0zM18.75 10.5h.008v.008h-.008V10.5z\" />\n </svg>\n </button>\n <button onClick={() => setShowHint(s => !s)} className={tBtn} title=\"How to navigate\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z\" />\n </svg>\n </button>\n <button\n onClick={() => setMeasureEnabled(m => !m)}\n className={measureEnabled ? tBtnActive : tBtn}\n title={measureEnabled ? 'Stop measuring (Esc)' : 'Measure distance — click two points on the model'}\n >\n {/* Ruler icon */}\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 14.25l6-6 6 6 4.5-4.5M9.75 8.25v3M12.75 11.25v3M15.75 14.25v3\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 18.75h19.5\" />\n </svg>\n </button>\n {measureEnabled && (\n <div className=\"flex items-stretch h-8 rounded border border-gray-200 overflow-hidden\">\n <button\n onClick={() => setMeasureMode('point')}\n className={`px-2 text-[11px] font-semibold transition-colors ${measureMode === 'point' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Point — measure straight-line distance between two picked points\"\n >\n Point\n </button>\n <button\n onClick={() => setMeasureMode('perp')}\n className={`px-2 text-[12px] font-semibold transition-colors ${measureMode === 'perp' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Perpendicular — pick two surfaces and measure the perpendicular gap between them\"\n >\n ⊥\n </button>\n </div>\n )}\n {measureEnabled && measureDistance !== null && (\n <div className=\"px-2 py-1 text-[11px] font-mono font-semibold text-orange-600 bg-orange-50 border border-orange-200 rounded whitespace-nowrap\" title={measureMode === 'perp' ? 'Perpendicular distance between the two picked surfaces' : 'Straight-line distance between the two picked points'}>\n {formatMeasureDistance(measureDistance)}{measureMode === 'perp' ? ' ⊥' : ''}\n </div>\n )}\n <div className={tBtnSep} />\n <button onClick={() => setShowMeshes(s => !s)} className={showMeshes ? tBtnActive : tBtn} title=\"Toggle meshes panel\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\" />\n </svg>\n </button>\n <button onClick={() => setShowSettings(s => !s)} className={showSettings ? tBtnActive : tBtn} title=\"Toggle display panel\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </button>\n <button onClick={onDownload ?? handleDefaultDownload} className={tBtn} title=\"Download original file\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" />\n </svg>\n </button>\n {onEmail && (\n <button onClick={onEmail} className={tBtn} title=\"Email\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" />\n </svg>\n </button>\n )}\n </PanelActions>\n\n {/* Body: viewport with floating Meshes / Model Display panels overlaid */}\n <div className=\"flex-1 flex min-h-0\">\n <div className=\"relative flex-1 min-w-0\" style={{ background: bgColor }}>\n <div ref={containerRef} style={{ width: '100%', height: '100%' }} />\n\n {/* Floating Meshes panel — anchored top-left, mirrors DXF Layers panel */}\n {showMeshes && (\n <div className=\"absolute top-2 left-2 w-64 max-h-[80%] flex flex-col bg-white/95 backdrop-blur border border-gray-200 rounded-md shadow-xl z-10 text-xs\">\n <div className=\"flex items-center justify-between px-2 py-1.5 border-b border-gray-200 bg-gray-50\">\n <span className=\"font-medium text-gray-700\">Meshes</span>\n <button onClick={() => setShowMeshes(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\" title=\"Close\">×</button>\n </div>\n <div className=\"flex-1 overflow-y-auto py-1\">\n {tree ? renderTreeNode(tree) : (\n <div className=\"px-3 py-3 text-[11px] text-gray-500 italic\">{loading ? 'Reading model…' : 'No structure available'}</div>\n )}\n </div>\n {tree && (\n <div className=\"px-3 py-1.5 text-[10px] text-gray-500 border-t border-gray-200\">\n {hidden.size === 0 ? 'All visible' : `${hidden.size} hidden`}\n </div>\n )}\n </div>\n )}\n\n {showHint && !loading && !error && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 bg-gray-900/85 text-white text-[11px] px-3 py-1.5 rounded-full shadow-lg flex items-center gap-3 z-10 pointer-events-none\">\n <span>Drag to rotate</span>\n <span className=\"text-white/40\">•</span>\n <span>Right-click drag to pan</span>\n <span className=\"text-white/40\">•</span>\n <span>Scroll to zoom</span>\n </div>\n )}\n\n {loading && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-white/85 text-sm text-gray-600 gap-2\">\n <svg className=\"h-6 w-6 text-blue-500 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.2\" />\n <path d=\"M22 12a10 10 0 0 1-10 10\" strokeLinecap=\"round\" />\n </svg>\n <span>Loading 3D model…</span>\n {ext === 'STP' || ext === 'STEP' ? <span className=\"text-[10px] text-gray-400\">STEP files load OpenCascade WASM (~5 MB) on first use.</span> : null}\n </div>\n )}\n {error && (\n <div className=\"absolute inset-0 flex items-center justify-center text-sm text-red-600 px-6 text-center bg-white/85\">{error}</div>\n )}\n\n {/* Floating Model Display panel — anchored top-right */}\n {showSettings && (\n <div className=\"absolute top-2 right-2 w-64 max-h-[80%] flex flex-col bg-white/95 backdrop-blur border border-gray-200 rounded-md shadow-xl z-10 text-xs\">\n <div className=\"flex items-center justify-between px-2 py-1.5 border-b border-gray-200 bg-gray-50\">\n <span className=\"font-medium text-gray-700\">Model Display</span>\n <button onClick={() => setShowSettings(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\" title=\"Close\">×</button>\n </div>\n <div className=\"flex-1 overflow-y-auto px-3 py-3 space-y-3 text-[12px] text-gray-700\">\n <label className=\"flex items-center justify-between gap-2\">\n <span>Background Color</span>\n <input type=\"color\" value={bgColor} onChange={(e) => setBgColor(e.target.value)} className=\"h-6 w-10 rounded border border-gray-300 bg-white\" />\n </label>\n <label className=\"flex items-center justify-between gap-2\">\n <span>Show Edges</span>\n <button\n onClick={() => setShowEdges(s => !s)}\n role=\"switch\"\n aria-checked={showEdges}\n className={`relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors ${showEdges ? 'bg-blue-500' : 'bg-gray-300'}`}\n >\n <span className={`inline-block h-4 w-4 rounded-full bg-white shadow-sm transition-transform ${showEdges ? 'translate-x-[18px]' : 'translate-x-0.5'}`} />\n </button>\n </label>\n <label className=\"flex items-center justify-between gap-2\">\n <span className={showEdges ? '' : 'opacity-40'}>Edge Color</span>\n <input\n type=\"color\"\n value={edgeColor}\n onChange={(e) => setEdgeColor(e.target.value)}\n disabled={!showEdges}\n className=\"h-6 w-10 rounded border border-gray-300 bg-white disabled:opacity-40\"\n />\n </label>\n <div className={showEdges ? '' : 'opacity-40 pointer-events-none'}>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Edge Threshold</span>\n <span className=\"text-gray-500 tabular-nums\">{edgeThreshold}°</span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={45}\n step={1}\n value={edgeThreshold}\n onChange={(e) => setEdgeThreshold(Number(e.target.value))}\n className=\"w-full accent-blue-500\"\n />\n </div>\n\n <div className=\"border-t border-gray-200 -mx-3 px-3 pt-3 mt-1\">\n <label className=\"flex items-center justify-between gap-2\">\n <span className=\"font-medium\">Section View</span>\n <button\n onClick={() => setSectionEnabled(s => !s)}\n role=\"switch\"\n aria-checked={sectionEnabled}\n className={`relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors ${sectionEnabled ? 'bg-blue-500' : 'bg-gray-300'}`}\n >\n <span className={`inline-block h-4 w-4 rounded-full bg-white shadow-sm transition-transform ${sectionEnabled ? 'translate-x-[18px]' : 'translate-x-0.5'}`} />\n </button>\n </label>\n\n <div className={sectionEnabled ? 'mt-2 space-y-2' : 'mt-2 space-y-2 opacity-40 pointer-events-none'}>\n {/* Angle — rotates the cut plane around a perpendicular\n reference axis (full 0–360° sweep). Sits above\n Axis + Position because changing it visibly affects\n both, so users find it first. */}\n <div>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Angle</span>\n <span className=\"text-gray-500 tabular-nums\">{sectionAngle}°</span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={180}\n step={1}\n value={sectionAngle}\n onChange={(e) => setSectionAngle(Number(e.target.value))}\n className=\"w-full accent-blue-500\"\n />\n </div>\n\n <div>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Axis</span>\n <button\n onClick={() => setSectionFlip(f => !f)}\n className=\"text-[10px] text-gray-600 hover:text-gray-900 px-1.5 py-0.5 rounded bg-gray-100 hover:bg-gray-200\"\n title=\"Flip section direction\"\n >\n {sectionFlip ? '← flipped' : 'flip →'}\n </button>\n </div>\n <div className=\"grid grid-cols-3 gap-1\">\n {(['x', 'y', 'z'] as const).map(ax => (\n <button\n key={ax}\n onClick={() => setSectionAxis(ax)}\n className={`py-1 rounded text-[11px] font-semibold ${sectionAxis === ax ? 'bg-blue-500 text-white' : 'bg-gray-100 text-gray-700 hover:bg-gray-200'}`}\n >\n {ax.toUpperCase()}\n </button>\n ))}\n </div>\n </div>\n\n <div>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Position</span>\n <span className=\"text-gray-500 tabular-nums\">{Math.round(sectionPosition * 100)}%</span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={sectionPosition}\n onChange={(e) => setSectionPosition(Number(e.target.value))}\n className=\"w-full accent-blue-500\"\n />\n </div>\n\n </div>\n </div>\n </div>\n <div className=\"px-3 py-2 border-t border-gray-200\">\n <button\n onClick={handleResetDisplay}\n className=\"w-full text-[11px] text-gray-700 bg-gray-100 hover:bg-gray-200 rounded py-1.5 transition-colors\"\n >\n Reset to Default\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\ninterface ImagePanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\nfunction ImagePanel({ url, filename, onDownload, onEmail }: ImagePanelProps) {\n const [zoom, setZoom] = useState(1);\n const [error, setError] = useState(false);\n const [annotating, setAnnotating] = useState(false);\n const annotatorRef = useRef<ImageAnnotatorHandle>(null);\n\n // Fetch into a blob URL before triggering the anchor download.\n // The bare-anchor approach (`a.href = url; a.download = …; a.click()`)\n // can fall through to navigation when the server's response headers\n // don't cleanly opt into the download — the browser then loads the\n // image URL into the SPA frame, which clears the Preview state and\n // leaves the user with the empty \"Drop a file here…\" placeholder.\n // Going through fetch → Blob → object URL means the anchor target\n // is always a controlled blob: URL the browser will always save.\n const handleDefaultDownload = async () => {\n // For same-document blob: URLs we can skip the round-trip entirely.\n if (url.startsWith('blob:') || url.startsWith('data:')) {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n return;\n }\n const tryFetch = async (init: RequestInit) => {\n const res = await fetch(url, init);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.blob();\n };\n try {\n let blob: Blob;\n try {\n blob = await tryFetch({ credentials: 'include' });\n } catch {\n // Some media servers reject credentialed requests with an opaque\n // network failure — retry once without cookies before giving up.\n blob = await tryFetch({ credentials: 'omit' });\n }\n const blobUrl = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = blobUrl;\n a.download = filename;\n a.click();\n // Defer revoke so the browser has a tick to start the download.\n setTimeout(() => URL.revokeObjectURL(blobUrl), 1000);\n } catch {\n toast.error(\"Download failed — couldn't reach the file.\");\n }\n };\n\n const btn = 'px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1';\n\n return (\n <div className=\"flex flex-col h-full\">\n <PanelActions>\n {!annotating && (\n <>\n <button onClick={() => setZoom(z => Math.max(0.1, Math.round((z - 0.25) * 100) / 100))} className={btn}>−</button>\n <span className=\"text-gray-500 w-12 text-center tabular-nums\">{Math.round(zoom * 100)}%</span>\n <button onClick={() => setZoom(z => Math.min(8, Math.round((z + 0.25) * 100) / 100))} className={btn}>+</button>\n <button onClick={() => setZoom(1)} className={btn}>1:1</button>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <button onClick={() => setAnnotating(true)} className={btn} title=\"Annotate this image\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125\" /></svg>\n Annotate\n </button>\n </>\n )}\n {annotating && (\n <>\n <button onClick={() => setAnnotating(false)} className={btn} title=\"Back to viewer\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 19.5L8.25 12l7.5-7.5\" /></svg>\n View\n </button>\n <button onClick={() => annotatorRef.current?.copy()} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 00-3.375-3.375h-1.5a1.125 1.125 0 01-1.125-1.125v-1.5a3.375 3.375 0 00-3.375-3.375H9.75\" /></svg>\n Copy\n </button>\n <button onClick={() => annotatorRef.current?.save()} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Save\n </button>\n </>\n )}\n <button onClick={onDownload ?? handleDefaultDownload} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Download\n </button>\n {onEmail && (\n <button onClick={onEmail} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n Email\n </button>\n )}\n </PanelActions>\n {annotating ? (\n <ImageAnnotator ref={annotatorRef} src={url} filename={filename} />\n ) : (\n <div className=\"flex-1 overflow-auto bg-gray-100 flex items-center justify-center p-4\">\n {error ? (\n <div className=\"text-sm text-red-600\">Failed to load image.</div>\n ) : (\n <img\n src={url}\n alt={filename}\n onError={() => setError(true)}\n style={{ transform: `scale(${zoom})`, transformOrigin: 'center center', transition: 'transform 120ms ease' }}\n className=\"max-w-full max-h-full shadow-lg rounded bg-white\"\n />\n )}\n </div>\n )}\n </div>\n );\n}\n"]}
|