schematex 0.4.3 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -7
- package/dist/ai/ai-sdk.cjs +19 -13
- package/dist/ai/ai-sdk.cjs.map +1 -1
- package/dist/ai/ai-sdk.d.cts +4 -3
- package/dist/ai/ai-sdk.d.ts +4 -3
- package/dist/ai/ai-sdk.js +15 -9
- package/dist/ai/ai-sdk.js.map +1 -1
- package/dist/ai/index.cjs +16 -12
- package/dist/ai/index.d.cts +20 -153
- package/dist/ai/index.d.ts +20 -153
- package/dist/ai/index.js +4 -4
- package/dist/api-C5SECOxZ.d.cts +69 -0
- package/dist/api-Cr_MxttI.d.ts +69 -0
- package/dist/browser.cjs +24 -6
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.cts +12 -3
- package/dist/browser.d.ts +12 -3
- package/dist/browser.js +14 -6
- package/dist/browser.js.map +1 -1
- package/dist/{chunk-SMXU3KYA.cjs → chunk-4QPDZJAL.cjs} +6337 -120
- package/dist/chunk-4QPDZJAL.cjs.map +1 -0
- package/dist/{chunk-N3SLYVNW.cjs → chunk-HK56GQQP.cjs} +751 -80
- package/dist/chunk-HK56GQQP.cjs.map +1 -0
- package/dist/{chunk-KWQTF6ZL.js → chunk-OK5ZS3LU.js} +6330 -119
- package/dist/chunk-OK5ZS3LU.js.map +1 -0
- package/dist/{chunk-2Z543TC3.cjs → chunk-QMTWG6JL.cjs} +1297 -1151
- package/dist/chunk-QMTWG6JL.cjs.map +1 -0
- package/dist/{chunk-VITE3MZQ.cjs → chunk-QTNPMIO2.cjs} +99 -5
- package/dist/chunk-QTNPMIO2.cjs.map +1 -0
- package/dist/{chunk-6IGSKU6D.js → chunk-UFTYX73U.js} +99 -5
- package/dist/chunk-UFTYX73U.js.map +1 -0
- package/dist/{chunk-J7JWMQD5.js → chunk-VCH7RI5H.js} +1297 -1151
- package/dist/chunk-VCH7RI5H.js.map +1 -0
- package/dist/{chunk-UBTKM2TB.js → chunk-VKPCR7BG.js} +751 -81
- package/dist/chunk-VKPCR7BG.js.map +1 -0
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.cjs +7 -7
- package/dist/diagrams/circuit/index.d.cts +1 -1
- package/dist/diagrams/circuit/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.js +1 -1
- package/dist/diagrams/ecomap/index.d.cts +1 -1
- package/dist/diagrams/ecomap/index.d.ts +1 -1
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.d.cts +1 -1
- package/dist/diagrams/fishbone/index.d.ts +1 -1
- package/dist/diagrams/flowchart/index.cjs +7 -7
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/flowchart/index.js +1 -1
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/logic/index.d.cts +1 -1
- package/dist/diagrams/logic/index.d.ts +1 -1
- package/dist/diagrams/orgchart/index.d.cts +1 -1
- package/dist/diagrams/orgchart/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/phylo/index.d.cts +1 -1
- package/dist/diagrams/phylo/index.d.ts +1 -1
- package/dist/diagrams/sld/index.d.cts +1 -1
- package/dist/diagrams/sld/index.d.ts +1 -1
- package/dist/diagrams/sociogram/index.d.cts +1 -1
- package/dist/diagrams/sociogram/index.d.ts +1 -1
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/{index-DYpJXJcy.d.cts → index-BD2yDfQM.d.cts} +1 -1
- package/dist/{index-BeUVaQiD.d.ts → index-C30zQWZI.d.ts} +1 -1
- package/dist/index.cjs +35 -11
- package/dist/index.d.cts +10 -4
- package/dist/index.d.ts +10 -4
- package/dist/index.js +3 -3
- package/dist/react.cjs +8 -10
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +3 -2
- package/dist/react.d.ts +3 -2
- package/dist/react.js +8 -10
- package/dist/react.js.map +1 -1
- package/dist/tools-BHWaJPOl.d.ts +153 -0
- package/dist/tools-DlpuE76u.d.cts +153 -0
- package/dist/{types-DKdo-Ua_.d.cts → types-WTr9W5Ud.d.cts} +3 -3
- package/dist/{types-DKdo-Ua_.d.ts → types-WTr9W5Ud.d.ts} +3 -3
- package/package.json +2 -2
- package/dist/api-BIj9t4Oc.d.cts +0 -22
- package/dist/api-BIj9t4Oc.d.ts +0 -22
- package/dist/chunk-2Z543TC3.cjs.map +0 -1
- package/dist/chunk-6IGSKU6D.js.map +0 -1
- package/dist/chunk-J7JWMQD5.js.map +0 -1
- package/dist/chunk-KWQTF6ZL.js.map +0 -1
- package/dist/chunk-N3SLYVNW.cjs.map +0 -1
- package/dist/chunk-SMXU3KYA.cjs.map +0 -1
- package/dist/chunk-UBTKM2TB.js.map +0 -1
- package/dist/chunk-VITE3MZQ.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/flowchart/parser.ts","../src/core/layered/bk.ts","../src/diagrams/flowchart/layout.ts","../src/diagrams/flowchart/shapes.ts","../src/diagrams/flowchart/renderer.ts","../src/diagrams/flowchart/index.ts"],"names":["line","mPlain","path","minX","maxX","bends","midY","rect","polygon","circle","resolveFlowchartTheme","text","group","multilineText","title","fmt","desc","el","defs","svgRoot","firstContentLine"],"mappings":";;;;;;;AAqDO,IAAM,mBAAA,GAAN,cAAkC,KAAA,CAAM;AAAA,EAC7C,WAAA,CACE,OAAA,EACOA,KAAAA,EACA,MAAA,EACA,MAAA,EACP;AACA,IAAA,KAAA,CAAM,SAASA,KAAI,CAAA,CAAA,EAAI,MAAM,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAJpC,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AAAA,EANS,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAKX,CAAA;AAEA,IAAM,UAAA,uBAAiB,GAAA,CAAI,CAAC,MAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAC,CAAA;AASzD,SAAS,aAAa,CAAA,EAAmB;AACvC,EAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,EAAA,IAAI,CAAA,CAAE,MAAA,IAAU,CAAA,IAAK,CAAA,CAAE,WAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAC/E,EAAA,OAAO,CAAA;AACT;AAGA,SAAS,gBAAA,CACPA,OACA,GAAA,EAC8D;AAC9D,EAAA,MAAM,EAAA,GAAKA,MAAK,GAAG,CAAA;AACnB,EAAA,IAAI,EAAA,KAAO,QAAW,OAAO,IAAA;AAK7B,EAAA,IAAI,OAAO,GAAA,EAAK;AACd,IAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAC,CAAA;AACrC,IAAA,IAAI,GAAA,GAAM,GAAG,OAAO,IAAA;AACpB,IAAA,OAAO,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,aAAaA,KAAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,EAC5F;AAGA,EAAA,IAAI,EAAA,KAAO,GAAA,IAAOA,KAAAA,CAAK,GAAA,GAAM,CAAC,CAAA,KAAM,GAAA,IAAOA,KAAAA,CAAK,GAAA,GAAM,CAAC,CAAA,KAAM,GAAA,EAAK;AAChE,IAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAC,CAAA;AACvC,IAAA,IAAI,GAAA,GAAM,GAAG,OAAO,IAAA;AACpB,IAAA,OAAO,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,aAAaA,KAAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,EAC/F;AAGA,EAAA,IAAI,OAAO,GAAA,IAAOA,KAAAA,CAAK,GAAA,GAAM,CAAC,MAAM,GAAA,EAAK;AACvC,IAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAC,CAAA;AACtC,IAAA,IAAI,GAAA,GAAM,GAAG,OAAO,IAAA;AACpB,IAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,aAAaA,KAAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,EACzF;AAGA,EAAA,IAAI,OAAO,GAAA,IAAOA,KAAAA,CAAK,GAAA,GAAM,CAAC,MAAM,GAAA,EAAK;AACvC,IAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAC,CAAA;AACtC,IAAA,IAAI,GAAA,GAAM,GAAG,OAAO,IAAA;AACpB,IAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,aAAaA,KAAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,EACxF;AAGA,EAAA,IAAI,OAAO,GAAA,IAAOA,KAAAA,CAAK,GAAA,GAAM,CAAC,MAAM,GAAA,EAAK;AACvC,IAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAC,CAAA;AACtC,IAAA,IAAI,GAAA,GAAM,GAAG,OAAO,IAAA;AACpB,IAAA,OAAO,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,aAAaA,KAAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,EAC5F;AAGA,EAAA,IAAI,OAAO,GAAA,IAAOA,KAAAA,CAAK,GAAA,GAAM,CAAC,MAAM,GAAA,EAAK;AACvC,IAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAC,CAAA;AACtC,IAAA,IAAI,GAAA,GAAM,GAAG,OAAO,IAAA;AACpB,IAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,aAAaA,KAAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,EAC1F;AAGA,EAAA,IAAI,OAAO,GAAA,IAAOA,KAAAA,CAAK,GAAA,GAAM,CAAC,MAAM,GAAA,EAAK;AACvC,IAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAC,CAAA;AACtC,IAAA,IAAI,GAAA,GAAM,GAAG,OAAO,IAAA;AACpB,IAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,aAAaA,KAAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,EACzF;AAGA,EAAA,IAAI,OAAO,GAAA,IAAOA,KAAAA,CAAK,GAAA,GAAM,CAAC,MAAM,GAAA,EAAK;AACvC,IAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAC,CAAA;AAC5C,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,OAAO,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,aAAaA,KAAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,QAAQ,CAAC,CAAA,EAAG,GAAA,EAAK,WAAW,CAAA,EAAE;AAAA,IACrG;AAEA,IAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAC,CAAA;AACtC,IAAA,IAAI,GAAA,GAAM,GAAG,OAAO,IAAA;AACpB,IAAA,OAAO,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,aAAaA,KAAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,EAC/F;AAGA,EAAA,IAAI,OAAO,GAAA,IAAOA,KAAAA,CAAK,GAAA,GAAM,CAAC,MAAM,IAAA,EAAM;AACxC,IAAA,MAAM,MAAA,GAASA,KAAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAC,CAAA;AACzC,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAO,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,aAAaA,KAAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAC,CAAA,EAAG,GAAA,EAAK,SAAS,CAAA,EAAE;AAAA,IACrG;AAEA,IAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAC,CAAA;AACvC,IAAA,IAAI,GAAA,GAAM,GAAG,OAAO,IAAA;AACpB,IAAA,OAAO,EAAE,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAO,aAAaA,KAAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,EACnG;AAGA,EAAA,IAAI,OAAO,GAAA,EAAK;AACd,IAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAC,CAAA;AACrC,IAAA,IAAI,GAAA,GAAM,GAAG,OAAO,IAAA;AACpB,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,aAAaA,KAAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,EACtF;AAGA,EAAA,IAAI,OAAO,GAAA,EAAK;AACd,IAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAC,CAAA;AACrC,IAAA,IAAI,GAAA,GAAM,GAAG,OAAO,IAAA;AACpB,IAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,aAAaA,KAAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,EACvF;AAGA,EAAA,IAAI,OAAO,GAAA,EAAK;AACd,IAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAC,CAAA;AACrC,IAAA,IAAI,GAAA,GAAM,GAAG,OAAO,IAAA;AACpB,IAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,aAAaA,KAAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,EACzF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,OAAA,GAAU,eAAA;AAShB,SAAS,WAAA,CAAYA,OAAc,GAAA,EAA4B;AAC7D,EAAA,OAAO,MAAMA,KAAAA,CAAK,MAAA,IAAUA,KAAAA,CAAK,GAAG,MAAM,GAAA,EAAK,GAAA,EAAA;AAE/C,EAAA,MAAM,IAAA,GAAOA,KAAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAE3B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AAC9B,EAAA,MAAM,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA;AAGnB,EAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK;AACnB,IAAA,MAAM,IAAI,6BAAA,CAA8B,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAC1D,IAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,IAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK;AAC/B,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA;AAC1B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,eAAe,EAAA,IAAM,QAAA;AAAA,MACrB,GAAA,EAAK,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK,MAAA;AAAA,MACpB,WAAA,EAAa,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,IAAI,WAAA,GAAc;AAAA,KACrE;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK;AACnB,IAAA,MAAM,KAAK,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACrC,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,MAAM,aAAa,gCAAA,CAAiC,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACtE,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,IAAA,GAAO,WAAW,CAAC,CAAA;AACzB,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAC,CAAA,EAAG,IAAA,EAAK;AAClC,QAAA,MAAM,QAAA,GAAW,UAAA,CAAW,CAAC,CAAA,CAAG,SAAS,GAAG,CAAA;AAC5C,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,eAAe,EAAA,IAAM,QAAA;AAAA,UACrB,GAAA,EAAK,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK,MAAA;AAAA,UACpB,WAAA,EAAa,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,IAAI,KAAA,GAAQ;AAAA,SACnD;AAAA,MACF;AACA,MAAA,MAAMC,UAAS,gBAAA,CAAiB,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAClD,MAAA,IAAIA,OAAAA,EAAQ;AACV,QAAA,MAAM,IAAA,GAAOA,QAAO,CAAC,CAAA;AACrB,QAAA,MAAM,QAAA,GAAWA,OAAAA,CAAO,CAAC,CAAA,KAAM,IAAA;AAC/B,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,aAAA,EAAe,EAAA,IAAM,UAAU,GAAA,EAAK,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK,MAAA,EAAO;AAAA,MACrF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,WAAW,6CAAA,CAA8C,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACjF,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,IAAA,GAAO,SAAS,CAAC,CAAA;AACvB,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,CAAC,CAAA,EAAG,IAAA,EAAK;AAChC,MAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,MAAA,MAAM,IAAA,GACJ,UAAU,GAAA,GAAM,SAAA,GAAY,UAAU,GAAA,GAAM,WAAA,GAAc,KAAA,KAAU,GAAA,GAAM,OAAA,GAAU,MAAA;AACtF,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,aAAA,EAAe,MAAM,KAAA,KAAU,GAAA;AAAA,QAC/B,GAAA,EAAK,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK,MAAA;AAAA,QACpB,WAAA,EAAa,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,IAAI,KAAA,GAAQ;AAAA,OACnD;AAAA,IACF;AACA,IAAA,MAAM,SAAS,kBAAA,CAAmB,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACpD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,MAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,MAAA,MAAM,IAAA,GACJ,UAAU,GAAA,GAAM,SAAA,GAAY,UAAU,GAAA,GAAM,WAAA,GAAc,KAAA,KAAU,GAAA,GAAM,OAAA,GAAU,MAAA;AACtF,MAAA,OAAO,EAAE,IAAA,EAAM,aAAA,EAAe,EAAA,IAAM,KAAA,KAAU,KAAK,GAAA,EAAK,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK,MAAA,EAAO;AAAA,IAChF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,YAAA,CAAaD,OAAc,GAAA,EAAmD;AACrF,EAAA,IAAI,CAAA,GAAI,GAAA;AACR,EAAA,OAAO,CAAA,GAAIA,MAAK,MAAA,IAAU,OAAA,CAAQ,KAAKA,KAAAA,CAAK,CAAC,CAAE,CAAA,EAAG,CAAA,EAAA;AAClD,EAAA,IAAI,CAAA,KAAM,KAAK,OAAO,IAAA;AACtB,EAAA,MAAM,EAAA,GAAKA,KAAAA,CAAK,KAAA,CAAM,GAAA,EAAK,CAAC,CAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiBA,KAAAA,EAAM,CAAC,CAAA;AACtC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,EAAE,GAAA,EAAK,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,EAAG,GAAA,EAAK,MAAM,GAAA,EAAI;AAAA,EAC/E;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,EAAE,EAAA,EAAG,EAAG,KAAK,CAAA,EAAE;AAC/B;AAGA,SAAS,cAAA,CAAeA,OAAc,GAAA,EAAoD;AACxF,EAAA,IAAIA,KAAAA,CAAK,GAAG,CAAA,KAAM,GAAA,EAAK,OAAO,IAAA;AAC9B,EAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAC,CAAA;AACrC,EAAA,IAAI,GAAA,GAAM,GAAG,OAAO,IAAA;AACpB,EAAA,OAAO,EAAE,KAAA,EAAO,YAAA,CAAaA,KAAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAA,EAAK,GAAA,GAAM,CAAA,EAAE;AACvE;AAEA,SAAS,UAAA,CAAWA,OAAc,GAAA,EAAqB;AACrD,EAAA,OAAO,GAAA,GAAMA,KAAAA,CAAK,MAAA,KAAWA,KAAAA,CAAK,GAAG,MAAM,GAAA,IAAOA,KAAAA,CAAK,GAAG,CAAA,KAAM,GAAA,CAAA,EAAO,GAAA,EAAA;AACvE,EAAA,OAAO,GAAA;AACT;AAiBA,SAAS,YAAA,CAAa,KAAc,KAAA,EAA8B;AAChE,EAAA,IAAI,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,KAAA,KAAU,MAAA,EAAW;AACxC,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,EAAA,EAAI,GAAA,CAAI,EAAA,EAAI,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,CAAA;AAAA,EAC/D,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,EAAA,EAAI,GAAA,CAAI,EAAA,EAAI,OAAO,MAAA,EAAQ,KAAA,EAAO,GAAA,CAAI,EAAA,EAAI,CAAA;AAAA,EACzD;AACF;AAQA,SAAS,cAAA,CACPA,KAAAA,EACA,QAAA,EACA,MAAA,EACA,KAAA,EACkC;AAClC,EAAA,IAAI,GAAA,GAAM,UAAA,CAAWA,KAAAA,EAAM,QAAQ,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAaA,KAAAA,EAAM,GAAG,CAAA;AACpC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,CAAA,8BAAA,EAAiC,KAAK,SAAA,CAAUA,KAAAA,CAAK,MAAM,GAAA,EAAK,GAAA,GAAM,EAAE,CAAC,CAAC,CAAA,CAAA;AAAA,MAC1E,MAAA;AAAA,MACA,GAAA,GAAM;AAAA,KACR;AAAA,EACF;AACA,EAAA,YAAA,CAAa,KAAA,CAAM,KAAK,KAAK,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAkB,CAAC,KAAA,CAAM,GAAG,CAAA;AAClC,EAAA,GAAA,GAAM,KAAA,CAAM,GAAA;AAGZ,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,EAAA,GAAK,UAAA,CAAWA,KAAAA,EAAM,GAAG,CAAA;AAC/B,IAAA,IAAIA,KAAAA,CAAK,EAAE,CAAA,KAAM,GAAA,EAAK;AACtB,IAAA,MAAM,EAAA,GAAK,UAAA,CAAWA,KAAAA,EAAM,EAAA,GAAK,CAAC,CAAA;AAClC,IAAA,MAAM,IAAA,GAAO,YAAA,CAAaA,KAAAA,EAAM,EAAE,CAAA;AAClC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,YAAA,CAAa,IAAA,CAAK,KAAK,KAAK,CAAA;AAC5B,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,GAAG,CAAA;AAClB,IAAA,GAAA,GAAM,IAAA,CAAK,GAAA;AAAA,EACb;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,GAAA,EAAI;AAC1B;AAWA,SAAS,mBAAA,CAAoBA,OAAc,MAAA,EAGzC;AACA,EAAA,MAAM,QAAyB,EAAC;AAChC,EAAA,MAAM,QAAuB,EAAC;AAE9B,EAAA,IAAI,GAAA,GAAM,UAAA,CAAWA,KAAAA,EAAM,CAAC,CAAA;AAC5B,EAAA,MAAM,UAAA,GAAa,cAAA,CAAeA,KAAAA,EAAM,GAAA,EAAK,QAAQ,KAAK,CAAA;AAC1D,EAAA,IAAI,YAAY,UAAA,CAAW,IAAA;AAC3B,EAAA,GAAA,GAAM,UAAA,CAAW,GAAA;AAEjB,EAAA,OAAO,GAAA,GAAMA,MAAK,MAAA,EAAQ;AACxB,IAAA,GAAA,GAAM,UAAA,CAAWA,OAAM,GAAG,CAAA;AAC1B,IAAA,IAAI,GAAA,IAAOA,MAAK,MAAA,EAAQ;AAExB,IAAA,MAAM,EAAA,GAAK,WAAA,CAAYA,KAAAA,EAAM,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,EAAA,EAAI;AAEP,MAAA,MAAM,IAAA,GAAOA,KAAAA,CAAK,KAAA,CAAM,GAAG,EAAE,IAAA,EAAK;AAClC,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAA,MAAM,IAAI,mBAAA;AAAA,UACR,CAAA,4BAAA,EAA+B,KAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA,CAAA;AAAA,UAChE,MAAA;AAAA,UACA,GAAA,GAAM;AAAA,SACR;AAAA,MACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,GAAA,GAAM,EAAA,CAAG,GAAA;AAGT,IAAA,GAAA,GAAM,UAAA,CAAWA,OAAM,GAAG,CAAA;AAC1B,IAAA,IAAI,QAAQ,EAAA,CAAG,WAAA;AACf,IAAA,MAAM,IAAA,GAAO,cAAA,CAAeA,KAAAA,EAAM,GAAG,CAAA;AACrC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,KAAA,GAAQ,IAAA,CAAK,KAAA;AACb,MAAA,GAAA,GAAM,IAAA,CAAK,GAAA;AAAA,IACb;AAEA,IAAA,GAAA,GAAM,UAAA,CAAWA,OAAM,GAAG,CAAA;AAC1B,IAAA,MAAM,WAAA,GAAc,cAAA,CAAeA,KAAAA,EAAM,GAAA,EAAK,QAAQ,KAAK,CAAA;AAC3D,IAAA,GAAA,GAAM,WAAA,CAAY,GAAA;AAGlB,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,KAAA,MAAW,EAAA,IAAM,YAAY,IAAA,EAAM;AACjC,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,MAAM,IAAA,CAAK,EAAA;AAAA,UACX,IAAI,EAAA,CAAG,EAAA;AAAA,UACP,MAAM,EAAA,CAAG,IAAA;AAAA,UACT,KAAA;AAAA,UACA,eAAe,EAAA,CAAG;AAAA,SACnB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,SAAA,GAAY,WAAA,CAAY,IAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AACxB;AAGA,SAAS,mBAAA,CAAoB,MAAc,GAAA,EAAgC;AACzE,EAAA,MAAM,SAAA,GAAY,MAAM,GAAG,CAAA,CAAA;AAC3B,EAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,EAAA,IAAI,CAAC,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,EAAC,EAAG,SAAA,EAAW,EAAC,EAAE;AAG9E,EAAA,MAAM,SAAA,GAAY,6BAAA,CAA8B,IAAA,CAAK,CAAC,CAAA;AACtD,EAAA,IAAI,WAAW,OAAO,EAAE,EAAA,EAAI,SAAA,CAAU,CAAC,CAAA,EAAI,KAAA,EAAO,SAAA,CAAU,CAAC,GAAI,QAAA,EAAU,EAAC,EAAG,SAAA,EAAW,EAAC,EAAE;AAG7F,EAAA,MAAM,QAAA,GAAW,0BAAA,CAA2B,IAAA,CAAK,CAAC,CAAA;AAClD,EAAA,IAAI,UAAU,OAAO,EAAE,EAAA,EAAI,QAAA,CAAS,CAAC,CAAA,EAAI,KAAA,EAAO,QAAA,CAAS,CAAC,GAAI,QAAA,EAAU,EAAC,EAAG,SAAA,EAAW,EAAC,EAAE;AAG1F,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA;AACvC,EAAA,IAAI,UAAA,EAAY,OAAO,EAAE,EAAA,EAAI,WAAW,KAAA,EAAO,UAAA,CAAW,CAAC,CAAA,EAAI,QAAA,EAAU,EAAC,EAAG,SAAA,EAAW,EAAC,EAAE;AAG3F,EAAA,MAAM,OAAA,GAAU,CAAA,CAAE,KAAA,CAAM,IAAI,EAAE,CAAC,CAAA;AAC/B,EAAA,OAAO,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,UAAU,EAAC,EAAG,SAAA,EAAW,EAAC,EAAE;AACpE;AAEA,SAAS,mBAAmB,GAAA,EAAiC;AAC3D,EAAA,MAAM,EAAA,GAAK,IAAI,WAAA,EAAY;AAC3B,EAAA,IAAI,EAAA,KAAO,MAAM,OAAO,IAAA;AACxB,EAAA,IAAI,EAAA,KAAO,QAAQ,EAAA,KAAO,IAAA,IAAQ,OAAO,IAAA,IAAQ,EAAA,KAAO,MAAM,OAAO,EAAA;AACrE,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,cAAc,CAAA,EAAmC;AACxD,EAAA,MAAM,QAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,IAAA,IAAQ,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,EAAG;AAC/B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,IAAI,QAAQ,CAAA,EAAG;AACf,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,EAAE,IAAA,EAAK;AACtC,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,EAAE,IAAA,EAAK;AACvC,IAAA,IAAI,GAAA,EAAK,KAAA,CAAM,GAAG,CAAA,GAAI,GAAA;AAAA,EACxB;AACA,EAAA,OAAO,KAAA;AACT;AAgBA,SAAS,qBACPA,KAAAA,EACuE;AACvE,EAAA,MAAM,QAAkD,EAAC;AACzD,EAAA,IAAI,GAAA,GAAMA,KAAAA;AAIV,EAAA,MAAM,EAAA,GAAK,uBAAA;AACX,EAAA,IAAI,CAAA;AAEJ,EAAA,MAAM,OAA4D,EAAC;AACnE,EAAA,OAAA,CAAQ,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,GAAG,OAAO,IAAA,EAAM;AAClC,IAAA,IAAA,CAAK,KAAK,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,KAAK,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,CAAC,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,CAAC,GAAI,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,KAAK,MAAA,KAAW,CAAA,SAAU,EAAE,QAAA,EAAUA,OAAM,KAAA,EAAM;AAEtD,EAAA,KAAA,IAAS,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACzC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,IAAI,KAAK,CAAA;AAErC,IAAA,IAAI,SAAS,MAAA,CAAO,MAAA;AACpB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAChC,IAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,IAAO,WAAW,GAAA,EAAK;AACtD,MAAA,MAAM,MAAA,GAAS,MAAA;AACf,MAAA,MAAM,SAAS,MAAA,KAAW,GAAA,GAAM,GAAA,GAAM,MAAA,KAAW,MAAM,GAAA,GAAM,GAAA;AAC7D,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,IAAI,MAAA,GAAS,CAAA;AACjB,MAAA,OAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAClB,QAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,EAAQ,KAAA,EAAA;AAAA,aAAA,IACjB,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,EAAQ;AAC7B,UAAA,KAAA,EAAA;AACA,UAAA,IAAI,UAAU,CAAA,EAAG;AAAA,QACnB;AAAA,MACF;AACA,MAAA,IAAI,CAAA,IAAK,GAAG,MAAA,GAAS,CAAA;AAAA,IACvB;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAA;AACd,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,OAAO,OAAA,GAAU,KAAK,eAAA,CAAgB,IAAA,CAAK,OAAO,OAAA,GAAU,CAAC,CAAE,CAAA,EAAG,OAAA,EAAA;AAClE,IAAA,IAAI,YAAY,KAAA,EAAO;AAGrB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA;AACtC,IAAA,KAAA,CAAM,KAAK,EAAE,EAAA,EAAI,SAAA,EAAW,GAAA,CAAI,MAAM,CAAA;AACtC,IAAA,GAAA,GAAM,GAAA,CAAI,MAAM,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,GAAA,EAAK,KAAA,EAAM;AAChC;AAEO,SAAS,eAAe,MAAA,EAA8B;AAC3D,EAAA,MAAM,QAAQ,MAAA,CAAO,OAAA,CAAQ,SAAS,IAAI,CAAA,CAAE,MAAM,IAAI,CAAA;AAEtD,EAAA,MAAM,GAAA,GAAoB;AAAA,IACxB,IAAA,EAAM,WAAA;AAAA,IACN,SAAA,EAAW,IAAA;AAAA,IACX,OAAO,EAAC;AAAA,IACR,OAAO,EAAC;AAAA,IACR,WAAW,EAAC;AAAA,IACZ,WAAW,EAAC;AAAA,IACZ,UAAA,sBAAgB,GAAA;AAAI,GACtB;AAEA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA2B;AAG/C,EAAA,IAAI,SAAA,GAAY,EAAA;AAChB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,CAAG,IAAA,EAAK;AACzB,IAAA,IAAI,EAAE,MAAA,KAAW,CAAA,IAAK,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AAC1C,IAAA,SAAA,GAAY,CAAA;AACZ,IAAA;AAAA,EACF;AACA,EAAA,IAAI,YAAY,CAAA,EAAG,MAAM,IAAI,mBAAA,CAAoB,wBAAA,EAA0B,GAAG,CAAC,CAAA;AAE/E,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,SAAS,CAAA,CAAG,IAAA,EAAK;AACtC,EAAA,MAAM,WAAA,GAAc,+CAAA,CAAgD,IAAA,CAAK,MAAM,CAAA;AAC/E,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,CAAA,4CAAA,EAA+C,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,CAAA;AAAA,MACrE,SAAA,GAAY,CAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,YAAY,CAAC,CAAA;AAC5B,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,WAAA,EAAa,CAAA,EAAG;AACzC,MAAA,MAAM,IAAI,mBAAA,CAAoB,CAAA,kBAAA,EAAqB,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,CAAA,EAAI,SAAA,GAAY,CAAA,EAAG,CAAC,CAAA;AAAA,IAC/F;AACA,IAAA,GAAA,CAAI,SAAA,GAAY,mBAAmB,MAAM,CAAA;AAAA,EAC3C;AACA,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAC,CAAA,EAAG,IAAA,EAAK;AACnC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA;AACxC,IAAA,GAAA,CAAI,KAAA,GAAQ,OAAA,GAAU,OAAA,CAAQ,CAAC,CAAA,GAAI,KAAA;AAAA,EACrC;AAGA,EAAA,MAAM,gBAA0C,EAAC;AAMjD,EAAA,MAAM,uBAAiE,EAAC;AAExE,EAAA,KAAA,IAAS,IAAI,SAAA,GAAY,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACjD,IAAA,MAAM,WAAA,GAAc,MAAM,CAAC,CAAA;AAC3B,IAAA,MAAM,eAAA,GAAkB,YAAY,IAAA,EAAK;AACzC,IAAA,IAAI,gBAAgB,MAAA,KAAW,CAAA,IAAK,eAAA,CAAgB,UAAA,CAAW,IAAI,CAAA,EAAG;AACpE,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAI,qBAAqB,WAAW,CAAA;AAC5D,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,oBAAA,CAAqB,IAAA,CAAK,CAAC,CAAA;AAClD,IAAA,MAAM,GAAA,GAAM,QAAA;AACZ,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAG1B,IAAA,MAAM,OAAA,GAAU,wBAAA,CAAyB,IAAA,CAAK,OAAO,CAAA;AACrD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,EAAA,GAAK,oBAAoB,OAAA,CAAQ,CAAC,KAAK,EAAA,EAAI,GAAA,CAAI,UAAU,MAAM,CAAA;AAErE,MAAA,IAAI,UAAU,EAAA,CAAG,EAAA;AACjB,MAAA,IAAI,SAAA,GAAY,CAAA;AAChB,MAAA,OAAO,GAAA,CAAI,UAAU,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,OAAO,CAAA,EAAG;AAClD,QAAA,OAAA,GAAU,CAAA,EAAG,EAAA,CAAG,EAAE,CAAA,CAAA,EAAI,EAAE,SAAS,CAAA,CAAA;AAAA,MACnC;AACA,MAAA,EAAA,CAAG,EAAA,GAAK,OAAA;AACR,MAAA,GAAA,CAAI,SAAA,CAAU,KAAK,EAAE,CAAA;AACrB,MAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,QAAA,MAAM,MAAA,GAAS,aAAA,CAAc,aAAA,CAAc,MAAA,GAAS,CAAC,CAAA;AACrD,QAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,EAAA,CAAG,EAAE,CAAA,EAAG,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,EAAA,CAAG,EAAE,CAAA;AAAA,MACpE;AACA,MAAA,aAAA,CAAc,KAAK,EAAE,CAAA;AACrB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,iCAAA,CAAkC,IAAA,CAAK,OAAO,CAAA;AAC/D,IAAA,IAAI,QAAA,IAAY,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AACxC,MAAA,aAAA,CAAc,aAAA,CAAc,SAAS,CAAC,CAAA,CAAG,YAAY,kBAAA,CAAmB,QAAA,CAAS,CAAC,CAAE,CAAA;AACpF,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,KAAY,KAAA,IAAS,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AACjD,MAAA,aAAA,CAAc,GAAA,EAAI;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,uCAAA,CAAwC,IAAA,CAAK,OAAO,CAAA;AACvE,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,SAAS,UAAA,CAAW,CAAC,EAAG,KAAA,CAAM,QAAQ,EAAE,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAC7F,MAAA,MAAM,SAAA,GAAY,WAAW,CAAC,CAAA;AAC9B,MAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,QAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAChC,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,IAAA,GAAsB,EAAE,EAAA,EAAI,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,GAAA,EAAK,OAAA,EAAS,CAAC,SAAS,CAAA,EAAE;AACvF,UAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AACrB,UAAA,GAAA,CAAI,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,QACrB,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,UAAU,CAAC,GAAI,SAAS,OAAA,IAAW,IAAK,SAAS,CAAA;AAAA,QAC5D;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB,gCAAA,CAAiC,IAAA,CAAK,OAAO,CAAA;AACnE,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,IAAA,GAA0B;AAAA,QAC9B,EAAA,EAAI,cAAc,CAAC,CAAA;AAAA,QACnB,KAAA,EAAO,aAAA,CAAc,aAAA,CAAc,CAAC,CAAE;AAAA,OACxC;AAEA,MAAA,MAAM,QAAA,GAAW,IAAI,SAAA,CAAU,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,EAAE,CAAA;AAChE,MAAA,IAAI,QAAA,IAAY,CAAA,EAAG,GAAA,CAAI,SAAA,CAAU,QAAQ,CAAA,GAAI,IAAA;AAAA,WACxC,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAC5B,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,6BAAA,CAA8B,IAAA,CAAK,OAAO,CAAA;AAC7D,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,GAAA,GAAM,WAAW,CAAC,CAAA;AACxB,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,UAAA,CAAW,CAAC,CAAE,CAAA;AAC1C,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAChC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,KAAA,GAAQ,EAAE,GAAI,QAAA,CAAS,SAAS,EAAC,EAAI,GAAG,KAAA,EAAM;AAAA,MACzD,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,GAAsB,EAAE,EAAA,EAAI,GAAA,EAAK,OAAO,MAAA,EAAQ,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,KAAA,EAAM;AAC/E,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AACrB,QAAA,GAAA,CAAI,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,MACrB;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,yCAAA,CAA0C,IAAA,CAAK,OAAO,CAAA;AAC7E,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,GAAA,GAAM,cAAA,CAAe,CAAC,CAAA,CAAG,IAAA,EAAK;AACpC,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,cAAA,CAAe,CAAC,CAAE,CAAA;AAC9C,MAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,QAAA,MAAM,OAAA,GAAU,GAAA,CACb,KAAA,CAAM,QAAQ,EACd,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAC1B,GAAA,CAAI,CAAC,CAAA,KAAM,SAAS,CAAA,EAAG,EAAE,CAAC,CAAA,CAC1B,OAAO,CAAC,CAAA,KAAM,CAAC,KAAA,CAAM,CAAC,CAAC,CAAA;AAC1B,QAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,UAAA,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,EAAE,GAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,IAAK,EAAC,EAAI,GAAG,OAAO,CAAA;AAAA,QAC1E;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,mBAAA,CAAoB,OAAA,EAAS,CAAA,GAAI,CAAC,CAAA;AAAA,IAC7C,SAAS,CAAA,EAAG;AACV,MAAA,IAAI,CAAA,YAAa,qBAAqB,MAAM,CAAA;AAE5C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,cAAc,MAAA,GAAS,CAAA,GAAI,cAAc,aAAA,CAAc,MAAA,GAAS,CAAC,CAAA,GAAK,IAAA;AAExF,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACpC,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,IAAA,GAAsB;AAAA,UAC1B,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,QAAQ,SAAA,EAAW;AAAA,SACrB;AACA,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AACzB,QAAA,GAAA,CAAI,KAAA,CAAM,KAAK,IAAI,CAAA;AACnB,QAAA,IAAI,aAAa,CAAC,SAAA,CAAU,SAAS,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA,EAAG;AACtD,UAAA,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA;AAAA,QACjC;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,IAAI,KAAK,KAAA,KAAU,IAAA,CAAK,EAAA,EAAI,QAAA,CAAS,QAAQ,IAAA,CAAK,KAAA;AAClD,QAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,CAAK,KAAA;AAEjD,QAAA,IAAI,SAAA,IAAa,CAAC,QAAA,CAAS,MAAA,EAAQ;AACjC,UAAA,QAAA,CAAS,SAAS,SAAA,CAAU,EAAA;AAC5B,UAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,QAAA,CAAS,QAAA,CAAS,EAAE,CAAA,EAAG,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA;AAAA,QACpF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,MAAA,MAAM,IAAA,GAAsB;AAAA,QAC1B,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAA,EACE,EAAE,IAAA,KAAS,OAAA,IAAW,EAAE,IAAA,KAAS,OAAA,IAAW,EAAE,IAAA,KAAS,QAAA,IAAY,EAAE,IAAA,KAAS,eAAA,GAC1E,UACA,CAAA,CAAE,IAAA,KAAS,YACX,OAAA,GACA,CAAA,CAAE,IAAA,KAAS,WAAA,GACX,QAAA,GACA,MAAA;AAAA,QACN,UAAA,EAAY,CAAA,CAAE,aAAA,GAAgB,OAAA,GAAU;AAAA,OAC1C;AACA,MAAA,GAAA,CAAI,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACrB;AAAA,EACF;AAKA,EAAA,KAAA,MAAW,EAAE,EAAA,EAAI,SAAA,EAAU,IAAK,oBAAA,EAAsB;AACpD,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC/B,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,QAAA,CAAS,UAAU,CAAC,GAAI,SAAS,OAAA,IAAW,IAAK,SAAS,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,GAAA;AACT;;;ACnuBO,SAAS,SAAA,CACd,MAAA,EACA,QAAA,EACA,OAAA,EACqB;AACrB,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,2BAAW,GAAA,EAAI;AAExC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAsB;AACxC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAsB;AACxC,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AAEzC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,MAAA,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AACxB,MAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AACpB,MAAA,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AAClB,MAAA,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,QAAA,EAAU;AAC7B,IAAA,IAAI,CAAC,SAAS,GAAA,CAAI,CAAC,KAAK,CAAC,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG;AAC1C,IAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AACpB,IAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AAAA,EACtB;AAIA,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAA;AAE5D,EAAA,MAAM,MAA2C,EAAC;AAClD,EAAA,KAAA,MAAW,OAAA,IAAW,CAAC,GAAA,EAAK,GAAG,CAAA,EAAY;AACzC,IAAA,MAAM,eACJ,OAAA,KAAY,GAAA,GACR,CAAC,CAAA,KAAc,MAAM,GAAA,CAAI,CAAC,CAAA,IAAK,KAC/B,CAAC,CAAA,KAAc,MAAM,GAAA,CAAI,CAAC,KAAK,EAAC;AAGtC,IAAA,MAAM,WAAW,OAAA,KAAY,GAAA,GAAM,SAAS,MAAA,CAAO,KAAA,GAAQ,OAAA,EAAQ;AAEnE,IAAA,KAAA,MAAW,QAAA,IAAY,CAAC,GAAA,EAAK,GAAG,CAAA,EAAY;AAE1C,MAAA,MAAM,QAAA,GACJ,QAAA,KAAa,GAAA,GAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,EAAM,CAAE,OAAA,EAAS,CAAA;AAEvE,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,iBAAA;AAAA,QACtB,QAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,KAAK,oBAAA,CAAqB,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,UAAU,OAAO,CAAA;AACtE,MAAA,IAAI,aAAa,GAAA,EAAK;AAEpB,QAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,QAAA,KAAA,MAAW,CAAC,GAAG,CAAC,CAAA,IAAK,IAAI,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AACtC,QAAA,EAAA,GAAK,GAAA;AAAA,MACP;AACA,MAAA,GAAA,CAAI,OAAA,GAAU,QAAQ,CAAA,GAAI,EAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,gBAAA,CAAiB,GAAA,EAAK,0BAAA,CAA2B,GAAA,EAAK,QAAiB,CAAC,CAAA;AACxE,EAAA,OAAO,QAAQ,GAAG,CAAA;AACpB;AAIA,SAAS,kBAAA,CACP,MAAA,EACA,KAAA,EACA,QAAA,EACa;AACb,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,SAAA;AAE9B,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,MAAA,CAAO,QAAQ,EAAA,EAAA,EAAM;AACzC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,EAAA,GAAK,CAAC,CAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,OAAO,EAAE,CAAA;AACvB,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,QAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAA;AAE3C,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,MAAM,OAAA,GAAU,MAAM,MAAA,GAAS,CAAA;AAE/B,IAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,KAAA,CAAM,QAAQ,EAAA,EAAA,EAAM;AACxC,MAAA,MAAM,CAAA,GAAI,MAAM,EAAE,CAAA;AAGlB,MAAA,IAAI,CAAA,GAAmB,IAAA;AACvB,MAAA,IAAI,EAAE,OAAA,EAAS;AACb,QAAA,KAAA,MAAW,KAAK,KAAA,CAAM,GAAA,CAAI,EAAE,EAAE,CAAA,IAAK,EAAC,EAAG;AACrC,UAAA,IAAI,QAAA,CAAS,IAAI,CAAC,CAAA,EAAG,WAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG;AAC9C,YAAA,CAAA,GAAI,CAAA;AACJ,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,EAAA,KAAO,OAAA,EAAS;AAChC,QAAA,MAAM,EAAA,GAAK,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAI,CAAC,CAAA,GAAK,KAAK,MAAA,GAAS,CAAA;AACxD,QAAA,KAAA,IAAS,CAAA,GAAI,OAAA,EAAS,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,EAAK;AAClC,UAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAClB,UAAA,KAAA,MAAW,KAAK,KAAA,CAAM,GAAA,CAAI,GAAG,EAAE,CAAA,IAAK,EAAC,EAAG;AACtC,YAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA;AAC1B,YAAA,IAAI,SAAS,MAAA,EAAW;AACxB,YAAA,IAAI,IAAA,GAAO,EAAA,IAAM,IAAA,GAAO,EAAA,EAAI;AAC1B,cAAA,SAAA,CAAU,GAAA,CAAI,WAAA,CAAY,CAAA,EAAG,EAAA,CAAG,EAAE,CAAC,CAAA;AAAA,YACrC;AAAA,UACF;AAAA,QACF;AACA,QAAA,OAAA,GAAU,EAAA,GAAK,CAAA;AACf,QAAA,EAAA,GAAK,EAAA;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,WAAA,CAAY,GAAW,CAAA,EAAmB;AACjD,EAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,EAAA,EAAS,CAAC,CAAA,CAAA,GAAK,CAAA,EAAG,CAAC,CAAA,EAAA,EAAS,CAAC,CAAA,CAAA;AAClD;AAEA,SAAS,WAAA,CAAY,SAAA,EAAwB,CAAA,EAAW,CAAA,EAAoB;AAC1E,EAAA,OAAO,SAAA,CAAU,GAAA,CAAI,WAAA,CAAY,CAAA,EAAG,CAAC,CAAC,CAAA;AACxC;AAIA,SAAS,iBAAA,CACP,MAAA,EACA,SAAA,EACA,WAAA,EAC2D;AAC3D,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AAGpC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,CAAG,EAAA;AACpB,MAAA,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AACb,MAAA,KAAA,CAAM,GAAA,CAAI,GAAG,CAAC,CAAA;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,IACd;AAAA,EACF;AAKA,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,MAAA,MAAM,IAAI,EAAA,CAAG,EAAA;AACb,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAC,CAAA,CAAE,KAAA,EAAM;AAChC,MAAA,IAAI,EAAA,CAAG,WAAW,CAAA,EAAG;AACrB,MAAA,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,KAAM,GAAA,CAAI,GAAA,CAAI,CAAC,KAAK,CAAA,CAAE,CAAA;AACvD,MAAA,MAAM,EAAA,GAAA,CAAM,EAAA,CAAG,MAAA,GAAS,CAAA,IAAK,CAAA;AAC7B,MAAA,MAAM,IAAA,GAAO,CAAC,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,CAAA;AAC3C,MAAA,KAAA,MAAW,MAAM,IAAA,EAAM;AACrB,QAAA,IAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG;AACxB,QAAA,MAAM,CAAA,GAAI,GAAG,EAAE,CAAA;AACf,QAAA,IAAI,WAAA,CAAY,SAAA,EAAW,CAAA,EAAG,CAAC,CAAA,EAAG;AAClC,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAC3B,QAAA,IAAI,QAAQ,OAAA,EAAS;AACrB,QAAA,KAAA,CAAM,GAAA,CAAI,GAAG,CAAC,CAAA;AACd,QAAA,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAE,CAAA;AACxB,QAAA,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAE,CAAA;AACzB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AACvB;AAIA,SAAS,oBAAA,CACP,MAAA,EACA,IAAA,EACA,KAAA,EACA,UACA,OAAA,EACqB;AAKrB,EAAA,MAAM,EAAA,uBAAS,GAAA,EAAoB;AACnC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AAEtC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,EAAE,CAAA;AACnB,MAAA,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,MAAA,CAAO,iBAAiB,CAAA;AAAA,IAC1C;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,MAAA,CAAO,QAAQ,EAAA,EAAA,EAAM;AACzC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,OAAO,EAAE,CAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAC3C,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,EAAE,CAAA,CAAG,CAAC,CAAA,CAAG,EAAA;AAC3B,MAAA,YAAA,CAAa,GAAA,CAAI,IAAI,CAAC,CAAA;AACtB,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,EAAE,CAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,CAAC,GAAA,EAAa,GAAA,KAAwB;AAChD,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,OAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,GAAI,OAAA,GAAU,EAAE,KAAA,GAAQ,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAoB;AACtC,IAAA,IAAI,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,EAAG;AACf,IAAA,EAAA,CAAG,GAAA,CAAI,GAAG,CAAC,CAAA;AACX,IAAA,IAAI,CAAA,GAAI,CAAA;AAER,IAAA,GAAG;AACD,MAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA;AAC7B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA;AAC5B,MAAA,IAAI,KAAK,CAAA,EAAG;AACV,QAAA,MAAM,OAAO,MAAA,CAAO,MAAM,CAAA,CAAG,EAAA,GAAK,CAAC,CAAA,CAAG,EAAA;AACtC,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AACvB,QAAA,UAAA,CAAW,CAAC,CAAA;AACZ,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAE,CAAA;AAC/C,QAAA,IAAI,KAAK,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AAC/B,UAAA,MAAM,SAAA,GAAY,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,GAAK,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,GAAK,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AACvD,UAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAE,KAAK,MAAA,CAAO,iBAAA;AAC9C,UAAA,KAAA,CAAM,GAAA,CAAI,KAAK,GAAA,CAAI,CAAC,GAAI,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,SAAS,CAAC,CAAA;AAAA,QAClD,CAAA,MAAO;AACL,UAAA,MAAM,YAAY,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,GAAK,GAAA,CAAI,MAAM,CAAC,CAAA;AAC1C,UAAA,IAAI,SAAA,GAAY,GAAG,GAAA,CAAI,CAAC,GAAI,EAAA,CAAG,GAAA,CAAI,GAAG,SAAS,CAAA;AAAA,QACjD;AAAA,MACF;AACA,MAAA,CAAA,GAAI,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,IACjB,SAAS,CAAA,KAAM,CAAA;AAAA,EACjB,CAAA;AAGA,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,EAAE,MAAM,CAAA,CAAE,EAAA,EAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAAA,IAC9C;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACvB,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAE,CAAA;AAChC,MAAA,MAAM,KAAK,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,MAAA,CAAO,oBAAoB,CAAA,GAAI,CAAA;AACnE,MAAA,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA;AAAA,IAC1B;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAIA,SAAS,0BAAA,CACP,GAAA,EACA,QAAA,EACA,QAAA,EACqB;AACrB,EAAA,IAAI,IAAA,GAAmC,IAAA;AACvC,EAAA,IAAI,YAAY,MAAA,CAAO,iBAAA;AACvB,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,IAAA,MAAM,EAAA,GAAK,IAAI,GAAG,CAAA;AAClB,IAAA,IAAI,OAAO,MAAA,CAAO,iBAAA;AAClB,IAAA,IAAI,OAAO,MAAA,CAAO,iBAAA;AAClB,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,CAAA,IAAK,EAAA,EAAI;AACxB,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AACzB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAC,CAAA;AACrC,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,IACvC;AACA,IAAA,MAAM,IAAI,IAAA,GAAO,IAAA;AACjB,IAAA,IAAI,IAAI,SAAA,EAAW;AACjB,MAAA,SAAA,GAAY,CAAA;AACZ,MAAA,IAAA,GAAO,EAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA,wBAAY,GAAA,EAAI;AACzB;AAOA,SAAS,gBAAA,CACP,KACA,GAAA,EACM;AACN,EAAA,IAAI,SAAS,MAAA,CAAO,iBAAA;AACpB,EAAA,IAAI,SAAS,MAAA,CAAO,iBAAA;AACpB,EAAA,KAAA,MAAW,GAAG,CAAC,CAAA,IAAK,GAAA,EAAK;AACvB,IAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA;AAC3B,IAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA;AAAA,EAC7B;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,IAAA,MAAM,EAAA,GAAK,IAAI,GAAG,CAAA;AAClB,IAAA,IAAI,OAAO,GAAA,EAAK;AAChB,IAAA,IAAI,OAAO,MAAA,CAAO,iBAAA;AAClB,IAAA,IAAI,OAAO,MAAA,CAAO,iBAAA;AAClB,IAAA,KAAA,MAAW,GAAG,CAAC,CAAA,IAAK,EAAA,EAAI;AACtB,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AACvB,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAAA,IACzB;AACA,IAAA,MAAM,QAAQ,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,GAAI,MAAA,GAAS,OAAO,MAAA,GAAS,IAAA;AAC3D,IAAA,IAAI,UAAU,CAAA,EAAG;AACjB,IAAA,KAAA,MAAW,CAAC,GAAG,CAAC,CAAA,IAAK,IAAI,EAAA,CAAG,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,KAAK,CAAA;AAAA,EAC9C;AACF;AAEA,SAAS,QACP,GAAA,EACqB;AACrB,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAC5B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAC9B,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,EAAM,KAAA,MAAW,EAAA,IAAM,GAAA,CAAI,CAAC,CAAA,CAAG,IAAA,EAAK,EAAG,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AACjE,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAG,IAAI,EAAE,CAAA;AACxB,MAAA,IAAI,CAAA,KAAM,MAAA,EAAW,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAAA,IAClC;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAEzB,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,IAAI,MAAM,CAAA,EAAG;AACb,IAAA,IAAI,CAAA,GAAI,MAAM,CAAA,EAAG;AACf,MAAA,MAAA,CAAO,GAAA,CAAI,EAAA,EAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,IAAM,CAAC,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAI,EAAA,EAAI,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,CAAC,CAAE,CAAA;AAAA,IACnC;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;;ACxWO,IAAM,QAAA,GAAW;AAAA,EACtB,SAAA,EAAW,GAAA;AAAA,EACX,UAAA,EAAY,EAAA;AAAA,EACZ,YAAA,EAAc,EAAA;AAAA;AAAA,EACd,aAAA,EAAe,EAAA;AAAA;AAAA,EACf,UAAA,EAAY,CAAA;AAAA,EACZ,OAAA,EAAS,EAAA;AAAA;AAAA,EAET,SAAA,EAAW,GAAA;AAAA;AAAA,EAEX,YAAA,EAAc,IAAA;AAAA,EACd,SAAA,EAAW,EAAA;AAAA,EACX,YAAA,EAAc,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,aAAA,EAAe,GAAA;AAAA,EACf,kBAAA,EAAoB;AACtB;AAMO,IAAM,WAAA,GAAc;AAAA,EACzB,aAAA,EAAe,EAAA;AAAA,EACf,SAAA,EAAW;AACb,CAAA;AAYO,IAAM,WAAA,GAAc;AAAA,EACzB,GAAA,EAAK,EAAA;AAAA,EACL,MAAA,EAAQ,EAAA;AAAA;AAAA,EAER,GAAA,EAAK;AACP,CAAA;AAUA,SAAS,YAAY,IAAA,EAAuB;AAE1C,EAAA,IAAI,IAAA,IAAQ,KAAA,IAAU,IAAA,IAAQ,KAAA,EAAQ,OAAO,IAAA;AAC7C,EAAA,IAAI,IAAA,IAAQ,KAAA,IAAU,IAAA,IAAQ,KAAA,EAAQ,OAAO,IAAA;AAC7C,EAAA,IAAI,IAAA,IAAQ,KAAA,IAAU,IAAA,IAAQ,KAAA,EAAQ,OAAO,IAAA;AAC7C,EAAA,IAAI,IAAA,IAAQ,KAAA,IAAU,IAAA,IAAQ,KAAA,EAAQ,OAAO,IAAA;AAC7C,EAAA,IAAI,IAAA,IAAQ,KAAA,IAAU,IAAA,IAAQ,KAAA,EAAQ,OAAO,IAAA;AAC7C,EAAA,IAAI,IAAA,IAAQ,KAAA,IAAU,IAAA,IAAQ,KAAA,EAAQ,OAAO,IAAA;AAC7C,EAAA,IAAI,IAAA,IAAQ,KAAA,IAAU,IAAA,IAAQ,KAAA,EAAQ,OAAO,IAAA;AAC7C,EAAA,IAAI,IAAA,IAAQ,KAAA,IAAU,IAAA,IAAQ,KAAA,EAAQ,OAAO,IAAA;AAC7C,EAAA,IAAI,IAAA,IAAQ,KAAA,IAAU,IAAA,IAAQ,KAAA,EAAQ,OAAO,IAAA;AAE7C,EAAA,IAAI,IAAA,IAAQ,MAAA,IAAW,IAAA,IAAQ,MAAA,EAAS,OAAO,IAAA;AAC/C,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,kBAAkB,KAAA,EAAuB;AACvD,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AAClC,IAAA,IAAI,WAAA,CAAY,IAAI,CAAA,EAAG,CAAA,IAAK,QAAA,CAAS,YAAA;AAAA,cAC3B,QAAA,CAAS,SAAA;AAAA,EACrB;AACA,EAAA,OAAO,CAAA;AACT;AAsCA,SAAS,SAAA,CAAU,SAAmB,KAAA,EAAqC;AACzE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAyB;AAC5C,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAyB;AAC3C,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,MAAA,CAAO,GAAA,CAAI,EAAA,kBAAI,IAAI,GAAA,EAAK,CAAA;AACxB,IAAA,KAAA,CAAM,GAAA,CAAI,EAAA,kBAAI,IAAI,GAAA,EAAK,CAAA;AAAA,EACzB;AACA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AAErB,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,EAAA,EAAI;AACrB,IAAA,MAAA,CAAO,IAAI,CAAA,CAAE,IAAI,CAAA,EAAG,GAAA,CAAI,EAAE,EAAE,CAAA;AAC5B,IAAA,KAAA,CAAM,IAAI,CAAA,CAAE,EAAE,CAAA,EAAG,GAAA,CAAI,EAAE,IAAI,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,KAAe,EAAC;AACtB,EAAA,MAAM,KAAe,EAAC;AACtB,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,OAAO,CAAA;AAEjC,EAAA,OAAO,SAAA,CAAU,OAAO,CAAA,EAAG;AAEzB,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,OAAO,OAAA,EAAS;AACd,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACrC,QAAA,IAAA,CAAK,OAAO,GAAA,CAAI,CAAC,CAAA,EAAG,IAAA,IAAQ,OAAO,CAAA,EAAG;AACpC,UAAA,EAAA,CAAG,QAAQ,CAAC,CAAA;AACZ,UAAA,YAAA,CAAa,CAAA,EAAG,SAAA,EAAW,MAAA,EAAQ,KAAK,CAAA;AACxC,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,OAAO,OAAA,EAAS;AACd,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACrC,QAAA,IAAA,CAAK,MAAM,GAAA,CAAI,CAAC,CAAA,EAAG,IAAA,IAAQ,OAAO,CAAA,EAAG;AACnC,UAAA,EAAA,CAAG,KAAK,CAAC,CAAA;AACT,UAAA,YAAA,CAAa,CAAA,EAAG,SAAA,EAAW,MAAA,EAAQ,KAAK,CAAA;AACxC,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AAE1B,IAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,IAAA,IAAI,SAAA,GAAY,CAAA,QAAA;AAChB,IAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,MAAA,MAAM,KAAA,GAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,IAAA,IAAQ,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,IAAA,IAAQ,CAAA,CAAA;AAClE,MAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,IAAA,GAAO,CAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,EAAA,CAAG,KAAK,IAAI,CAAA;AACZ,MAAA,YAAA,CAAa,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,KAAK,CAAA;AAAA,IAC7C;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,EAAA,EAAI,GAAG,EAAE,CAAA;AAC9B,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM,KAAK,GAAA,CAAI,EAAA,EAAI,CAAC,CAAC,CAAA;AAE3C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,EAAA,EAAI;AACnB,MAAA,QAAA,CAAS,IAAI,CAAC,CAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACxB,IAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,MAAA,IAAa,KAAK,EAAA,EAAI;AACnD,MAAA,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,YAAA,CACP,CAAA,EACA,SAAA,EACA,MAAA,EACA,KAAA,EACM;AACN,EAAA,SAAA,CAAU,OAAO,CAAC,CAAA;AAClB,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AACvB,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,KAAA,MAAW,KAAK,GAAA,EAAK,MAAA,CAAO,IAAI,CAAC,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,MAAA,CAAO,OAAO,CAAC,CAAA;AACf,EAAA,KAAA,CAAM,OAAO,CAAC,CAAA;AAChB;AAIA,SAAS,iBAAA,CACP,SACA,KAAA,EACqB;AACrB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,KAAA,MAAW,EAAA,IAAM,OAAA,EAAS,KAAA,CAAM,GAAA,CAAI,IAAI,CAAC,CAAA;AAEzC,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAsB;AACzC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,MAAA,CAAO,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AACjB,IAAA,KAAA,CAAM,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,EACjB;AACA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,EAAA,EAAI;AACrB,IAAA,MAAA,CAAO,IAAI,CAAA,CAAE,IAAI,CAAA,EAAG,IAAA,CAAK,EAAE,EAAE,CAAA;AAC7B,IAAA,KAAA,CAAM,GAAA,CAAI,EAAE,EAAA,EAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAAA,EAC5C;AAGA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,EAAE,CAAA,IAAK,OAAO,CAAA,EAAG,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EAC/C;AACA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,KAAK,CAAA;AAC3B,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,CAAA,GAAI,MAAM,KAAA,EAAM;AACtB,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,IAAA,KAAA,MAAW,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,IAAK,EAAC,EAAG;AACnC,MAAA,MAAM,CAAA,GAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,KAAK,CAAA,IAAK,CAAA;AAChC,MAAA,KAAA,CAAM,GAAA,CAAI,GAAG,CAAC,CAAA;AACd,MAAA,IAAI,CAAA,KAAM,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,OAAA,CAAQ,MAAA,EAAQ;AACnC,IAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,MAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,EAAE,CAAA,EAAG,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IACxC;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,KAAA,MAAW,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,IAAK,EAAC,EAAG;AACnC,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAC3B,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAC3B,MAAA,IAAI,KAAK,EAAA,GAAK,CAAA,QAAS,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,IACtC;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAIA,SAAS,aAAA,CACP,MAAA,EACA,QAAA,EACA,UAAA,EAC+C;AAC/C,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,UAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,EAAA,EAAI;AAEnB,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,IAAK,CAAA;AACnC,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA;AACjC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAC7B,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,CAAA,CAAE,KAAA,GAAQ,CAAC,CAAA,CAAE,IAAA,EAAM,EAAE,EAAE,CAAA;AACvB,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,EAAA;AAC3B,IAAA,MAAM,KAAA,GAAkB,CAAC,CAAA,CAAE,IAAI,CAAA;AAC/B,IAAA,IAAI,WAAW,EAAA,GAAK,IAAA;AACpB,IAAA,OAAO,aAAa,EAAA,EAAI;AACtB,MAAA,MAAM,IAAI,UAAA,EAAW;AACrB,MAAA,QAAA,CAAS,GAAA,CAAI,GAAG,QAAQ,CAAA;AACxB,MAAA,QAAA,CAAS,KAAK,CAAC,CAAA;AACf,MAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,MAAA,QAAA,IAAY,IAAA;AAAA,IACd;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,EAAE,CAAA;AACf,IAAA,CAAA,CAAE,KAAA,GAAQ,KAAA;AACV,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,YAAA,EAAc,OAAA,EAAQ;AAC3C;AAaA,SAAS,YAAA,CACP,QACA,QAAA,EACY;AACZ,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,KAAO,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAC9D,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,QAAA,EAAU;AAC7B,IAAA,IAAI,CAAC,KAAK,GAAA,CAAI,CAAC,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAChC,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AAAA,EACrB;AACA,EAAA,MAAM,KAAA,GAAoB,MAAA,CAAO,GAAA,CAAI,MAAM,EAAE,CAAA;AAC7C,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KAAqB;AAClC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAClB,IAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACxB,IAAA,IAAI,MAAM,MAAA,EAAW;AACrB,IAAA,KAAA,CAAM,CAAC,CAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AACjB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,GAAA,CAAI,EAAE,KAAK,EAAC,QAAS,CAAC,CAAA;AAAA,EAC7C,CAAA;AACA,EAAA,KAAA,MAAW,MAAM,MAAA,CAAO,CAAC,KAAK,EAAC,QAAS,EAAE,CAAA;AAE1C,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,KAAA,MAAW,MAAM,KAAA,EAAO,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AACzC,MAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACxB,MAAA,KAAA,CAAM,CAAC,CAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AAAA,IACnB;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAeA,SAAS,iBAAA,CACP,KAAA,EACA,KAAA,EACA,WAAA,EACA,SAAA,EACU;AACV,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM,SAAS,GAAA,CAAI,EAAA,EAAI,CAAC,CAAC,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,CAAC,IAAI,CAAA,KAAM;AAClC,IAAA,MAAM,YAAY,WAAA,CAAY,EAAE,CAAA,CAC7B,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,GAAA,CAAI,CAAC,CAAC,CAAA,CAC1B,MAAA,CAAO,CAAC,CAAA,KAAmB,MAAM,MAAS,CAAA;AAC7C,IAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG,YAAA,EAAc,KAAA,EAAM;AACjF,IAAA,MAAM,GAAA,GAAM,UAAU,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAC/C,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,GAAA,GAAM,UAAU,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAG,YAAA,EAAc,IAAA,EAAK;AAAA,EAC1E,CAAC,CAAA;AAGD,EAAA,MAAM,WAAW,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACpD,EAAA,MAAM,cAAc,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,YAAY,CAAA;AACxD,EAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,IAAA,IAAI,EAAE,KAAA,KAAU,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA;AAC5C,IAAA,OAAO,YAAY,CAAA,CAAE,IAAA,GAAO,EAAE,IAAA,GAAO,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA;AAAA,EAClD,CAAC,CAAA;AAGD,EAAA,MAAM,MAAA,GAAmD,IAAI,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AAC/E,EAAA,KAAA,MAAW,CAAA,IAAK,WAAA,EAAa,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA,GAAI,CAAA;AAC9C,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,EAAW;AAC7B,IAAA,MAAA,CAAO,CAAC,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAG,EAAE,CAAA;AAChC;AAEA,SAAS,WAAA,CACP,QACA,QAAA,EACY;AACZ,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,EAAQ,KAAA,MAAW,EAAA,IAAM,KAAA,EAAO;AAClD,IAAA,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAAA,EACjB;AACA,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,QAAA,EAAU;AAC7B,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA;AACnB,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA;AAAA,EACrB;AAEA,EAAA,IAAI,MAAA,GAAS,YAAA,CAAa,MAAA,EAAQ,QAAQ,CAAA;AAC1C,EAAA,IAAI,aAAA,GAAgB,cAAA,CAAe,MAAA,EAAQ,QAAQ,CAAA;AACnD,EAAA,IAAI,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA;AAKtC,EAAA,MAAM,QAAA,GAAW,CAAA;AACjB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,OAAO,CAAA,EAAG,IAAA,GAAO,SAAS,kBAAA,IAAsB,KAAA,GAAQ,UAAU,IAAA,EAAA,EAAQ;AACjF,IAAA,MAAM,IAAA,GAAO,OAAO,CAAA,KAAM,CAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,OAAO,CAAA,IAAM,CAAA;AAChC,IAAA,MAAM,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA;AACxC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,QAAA,IAAA,CAAK,CAAC,CAAA,GAAI,iBAAA;AAAA,UACR,KAAK,CAAC,CAAA;AAAA,UACN,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,UACV,CAAC,EAAA,KAAO,IAAA,CAAK,GAAA,CAAI,EAAE,KAAK,EAAC;AAAA,UACzB;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,IAAS,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACzC,QAAA,IAAA,CAAK,CAAC,CAAA,GAAI,iBAAA;AAAA,UACR,KAAK,CAAC,CAAA;AAAA,UACN,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,UACV,CAAC,EAAA,KAAO,IAAA,CAAK,GAAA,CAAI,EAAE,KAAK,EAAC;AAAA,UACzB;AAAA,SACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAI,cAAA,CAAe,IAAA,EAAM,QAAQ,CAAA;AACvC,IAAA,IAAI,IAAI,aAAA,EAAe;AACrB,MAAA,aAAA,GAAgB,CAAA;AAChB,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA;AAChC,MAAA,KAAA,GAAQ,CAAA;AAAA,IACV,CAAA,MAAO;AACL,MAAA,KAAA,EAAA;AAAA,IACF;AACA,IAAA,MAAA,GAAS,IAAA;AAAA,EACX;AAEA,EAAA,OAAO,IAAA;AACT;AASA,SAAS,cAAA,CACP,QACA,QAAA,EACQ;AACR,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,QAAA,GAAkC,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACxD,IAAA,MAAM,CAAA,uBAAQ,GAAA,EAAoB;AAClC,IAAA,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM,EAAE,GAAA,CAAI,EAAA,EAAI,CAAC,CAAC,CAAA;AACjC,IAAA,OAAO,CAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA;AAC5B,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,CAAG,MAAA;AACzB,IAAA,IAAI,MAAM,CAAA,EAAG;AAEb,IAAA,MAAM,QAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,QAAA,EAAU;AAC7B,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AACtB,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AACtB,MAAA,IAAI,EAAA,KAAO,UAAa,EAAA,KAAO,MAAA,QAAiB,IAAA,CAAK,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,IAC/D;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,KAAK,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAE/C,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,OAAO,UAAA,GAAa,GAAG,UAAA,KAAe,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,IAAI,UAAA,GAAa,CAAA;AAClC,IAAA,UAAA,IAAc,CAAA;AACd,IAAA,MAAM,IAAA,GAAO,IAAI,WAAA,CAAY,QAAQ,CAAA;AACrC,IAAA,KAAA,MAAW,GAAG,EAAE,CAAA,IAAK,KAAA,EAAO;AAC1B,MAAA,IAAI,MAAM,EAAA,GAAK,UAAA;AACf,MAAA,IAAA,CAAK,GAAG,CAAA,IAAM,CAAA;AACd,MAAA,IAAI,SAAA,GAAY,CAAA;AAChB,MAAA,OAAO,MAAM,CAAA,EAAG;AACd,QAAA,IAAI,MAAM,CAAA,EAAG,SAAA,IAAa,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA,IAAK,CAAA;AAC3C,QAAA,GAAA,GAAO,MAAM,CAAA,IAAM,CAAA;AACnB,QAAA,IAAA,CAAK,GAAG,CAAA,IAAM,CAAA;AAAA,MAChB;AACA,MAAA,KAAA,IAAS,SAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AA2BA,SAAS,gBAAA,CACP,UAAA,EACA,MAAA,EACA,YAAA,EACA,QAAA,EACqB;AACrB,EAAA,MAAM,SAAA,GAAY,EAAA;AAClB,EAAA,MAAM,QAAA,GAAW,EAAA;AAGjB,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAA8B;AAC5C,IAAA,MAAM,CAAA,GAAI,OAAO,EAAE,CAAA;AACnB,IAAA,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAK,IAAA;AAAA,EAChC,CAAA;AAGA,EAAA,MAAM,YAAkC,EAAC;AACzC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAmB;AACxC,EAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,EAAE,OAAA,EAAS;AACf,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AACxB,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,QAAA,QAAA,CAAS,IAAI,IAAI,CAAA;AACjB,QAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAQA,EAAA,MAAM,eAAe,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAmB,MAAM,IAAI,CAAA;AACpE,EAAA,IAAI,aAAa,MAAA,IAAU,CAAA,IAAK,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,EAAG;AAExD,IAAA,MAAM,eAAmD,UAAA,CAAW,GAAA;AAAA,MAClE,CAAC,KAAA,KAAU;AACT,QAAA,MAAM,CAAA,uBAAQ,GAAA,EAA4B;AAC1C,QAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,UAAA,IAAI,EAAE,OAAA,EAAS;AACf,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AACxB,UAAA,IAAI,CAAC,EAAE,GAAA,CAAI,IAAI,GAAG,CAAA,CAAE,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AAChC,UAAA,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AAAA,QACrB;AACA,QAAA,OAAO,CAAA;AAAA,MACT;AAAA,KACF;AACA,IAAA,MAAM,qBAAA,uBAA4B,GAAA,EAAY;AAC9C,IAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,YAAA,CAAa,QAAQ,EAAA,EAAA,EAAM;AAC/C,MAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,QAAA,IAAA,CAAK,YAAA,CAAa,EAAE,CAAA,CAAG,GAAA,CAAI,IAAI,CAAA,IAAK,EAAC,EAAG,MAAA,GAAS,CAAA,EAAG;AAClD,UAAA,qBAAA,CAAsB,IAAI,EAAE,CAAA;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,cAAA,GAAiB,IAAA;AACrB,IAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,YAAA,CAAa,QAAQ,EAAA,EAAA,EAAM;AAC/C,MAAA,MAAM,KAAK,YAAA,CAAa,EAAE,EAAG,GAAA,CAAI,IAAI,KAAK,EAAC;AAC3C,MAAA,IAAI,GAAG,MAAA,GAAS,CAAA,IAAK,qBAAA,CAAsB,GAAA,CAAI,EAAE,CAAA,EAAG;AAClD,QAAA,cAAA,GAAiB,KAAA;AACjB,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,SAAS,CAAC,CAAA;AAC9C,MAAA,SAAA,CAAU,MAAA,GAAS,CAAA;AACnB,MAAA,SAAA,CAAU,IAAA;AAAA,QACR,GAAG,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,QAC5B,IAAA;AAAA,QACA,GAAG,YAAA,CAAa,KAAA,CAAM,GAAG;AAAA,OAC3B;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,gBAAoD,UAAA,CAAW,GAAA;AAAA,IACnE,CAAC,KAAA,KAAU;AACT,MAAA,MAAM,CAAA,uBAAQ,GAAA,EAA4B;AAC1C,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,QAAA,IAAI,EAAE,OAAA,EAAS;AACf,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AACxB,QAAA,IAAI,CAAC,EAAE,GAAA,CAAI,IAAI,GAAG,CAAA,CAAE,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AAChC,QAAA,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AAAA,MACrB;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,GACF;AAIA,EAAA,MAAM,UAAA,GAAuB,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,KAAS;AACnD,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,KAAA,MAAW,cAAc,aAAA,EAAe;AACtC,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,IAAI,KAAK,EAAC;AACzC,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,MAAA,MAAM,KAAA,GACJ,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA,GAAA,CACtC,OAAA,CAAQ,SAAS,CAAA,IAAK,YAAA;AACzB,MAAA,IAAI,KAAA,GAAQ,UAAU,QAAA,GAAW,KAAA;AAAA,IACnC;AACA,IAAA,MAAM,GAAA,GAAM,IAAA,KAAS,IAAA,GAAO,CAAA,GAAI,SAAA,GAAY,CAAA;AAC5C,IAAA,OAAO,QAAA,GAAW,GAAA;AAAA,EACpB,CAAC,CAAA;AAGD,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA;AACE,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AACjB,MAAA,CAAA,IAAK,WAAW,CAAC,CAAA;AACjB,MAAA,IAAI,CAAA,GAAI,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,QAAA;AAAA,IACtC;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,aAAA,CAAc,QAAQ,EAAA,EAAA,EAAM;AAChD,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,SAAA,CAAU,QAAQ,OAAA,EAAA,EAAW;AAC3D,MAAA,MAAM,IAAA,GAAO,UAAU,OAAO,CAAA;AAC9B,MAAA,MAAM,UAAU,aAAA,CAAc,EAAE,EAAG,GAAA,CAAI,IAAI,KAAK,EAAC;AACjD,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,MAAA,MAAM,KAAA,GAAQ,WAAW,OAAO,CAAA;AAChC,MAAA,MAAM,SAAA,GAAY,WAAW,OAAO,CAAA;AACpC,MAAA,MAAM,MAAA,GACJ,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA,GAAA,CACtC,OAAA,CAAQ,SAAS,CAAA,IAAK,YAAA;AACzB,MAAA,IAAI,MAAA,GAAS,SAAA,GAAA,CAAa,KAAA,GAAQ,MAAA,IAAU,CAAA;AAC5C,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,MAAA,CAAO,IAAI,CAAA,CAAE,EAAA,EAAI,MAAA,GAAS,CAAA,CAAE,QAAQ,CAAC,CAAA;AACrC,QAAA,MAAA,IAAU,EAAE,KAAA,GAAQ,YAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAIA,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,CAAA,EAAG,IAAA,EAAA,EAAQ;AACnC,IAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,QAAA,IAAI,CAAC,EAAE,OAAA,EAAS;AAChB,QAAA,MAAM,YAAsB,EAAC;AAC7B,QAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,QAAA,EAAU;AAC7B,UAAA,IAAI,CAAA,KAAM,EAAE,EAAA,EAAI;AACd,YAAA,MAAM,EAAA,GAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AACvB,YAAA,IAAI,EAAA,KAAO,MAAA,EAAW,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAAA,UACzC;AACA,UAAA,IAAI,CAAA,KAAM,EAAE,EAAA,EAAI;AACd,YAAA,MAAM,EAAA,GAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AACvB,YAAA,IAAI,EAAA,KAAO,MAAA,EAAW,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAAA,UACzC;AAAA,QACF;AACA,QAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,UAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAE,GAAG,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AACzC,UAAA;AAAA,QACF;AACA,QAAA,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAC9B,QAAA,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,SAAA,CAAU,IAAA,CAAK,MAAM,SAAA,CAAU,MAAA,GAAS,CAAC,CAAC,CAAE,CAAA;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAgBA,SAAS,8BAAA,CACP,GAAA,EACA,QAAA,EACA,QAAA,EACS;AACT,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,CAAC,EAAA,KAAO,CAAC,QAAA,CAAS,GAAA,CAAI,EAAA,CAAG,EAAE,CAAC,CAAA;AAClE,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAChC,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAA2B;AAC1C,IAAA,MAAM,EAAA,GAAK,IAAI,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,IAAI,CAAA;AAClD,IAAA,IAAI,CAAC,EAAA,EAAI,OAAO,EAAC;AACjB,IAAA,MAAM,GAAA,GAAM,CAAC,GAAG,EAAA,CAAG,QAAQ,CAAA;AAC3B,IAAA,KAAA,MAAW,SAAA,IAAa,GAAG,SAAA,EAAW,GAAA,CAAI,KAAK,GAAG,OAAA,CAAQ,SAAS,CAAC,CAAA;AACpE,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO;AAClC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,EAAA,CAAG,EAAE,CAAA;AACzB,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,EAAA,EAAG;AAC/C,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,CAAC,OAAO,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,IAAK,CAAC,CAAA;AACpD,IAAA,OAAO,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA,EAAG,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA,EAAE;AAAA,EAC9D,CAAC,CAAA;AACD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,MAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,MAAA,IAAI,EAAE,GAAA,GAAM,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA,GAAM,EAAE,GAAA,EAAK;AACpC,MAAA,IAAI,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA,IAAO,EAAE,GAAA,IAAO,CAAA,CAAE,KAAK,OAAO,IAAA;AAAA,IAC/C;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAIO,SAAS,gBAAgB,GAAA,EAA0C;AACxE,EAAA,MAAM,MAA0B,GAAA,CAAI,SAAA;AACpC,EAAA,MAAM,eAAA,GAAkB,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,IAAA;AAKhD,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAA+C;AAC7D,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,CAAA,CAAE,KAAK,CAAA;AAC1C,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA;AAAA,MAClB,QAAA,CAAS,aAAA;AAAA,MACT,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,GAAI,SAAS,SAAA,GAAY;AAAA,KAC7C;AACA,IAAA,IAAI,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,cAAc,MAAM,CAAA;AACnD,IAAA,IAAI,SAAiB,QAAA,CAAS,UAAA;AAC9B,IAAA,IAAI,CAAA,CAAE,UAAU,SAAA,EAAW;AAIzB,MAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,MAAA,GAAS,GAAG,CAAA;AACtC,MAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAA;AAAA,IAC9B;AACA,IAAA,IAAI,CAAA,CAAE,KAAA,KAAU,eAAA,IAAmB,CAAA,CAAE,UAAU,mBAAA,EAAqB;AAKlE,MAAA,MAAA,IAAU,CAAA,GAAI,YAAY,aAAA,GAAgB,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,CAAA,CAAE,KAAA,KAAU,WAAA,IAAe,CAAA,CAAE,UAAU,eAAA,EAAiB;AAG1D,MAAA,MAAA,IAAU,CAAA,GAAI,YAAY,SAAA,GAAY,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,CAAA,CAAE,KAAA,KAAU,SAAA,IAAa,CAAA,CAAE,UAAU,OAAA,EAAS;AAChD,MAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,MAAA,GAAS,EAAE,CAAA;AAAA,IACvC;AACA,IAAA,IAAI,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,CAAA,CAAE,UAAU,eAAA,EAAiB;AAEvD,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA,GAAI,CAAA;AACxC,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,MAAA,GAAS,IAAA;AAAA,IACX;AACA,IAAA,IAAI,CAAA,CAAE,UAAU,SAAA,EAAW;AAGzB,MAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,MAAA,GAAS,EAAE,CAAA;AAAA,IACvC;AACA,IAAA,IAAI,CAAA,CAAE,UAAU,YAAA,EAAc;AAE5B,MAAA,MAAA,IAAU,EAAA;AAAA,IACZ;AACA,IAAA,IAAI,CAAA,CAAE,UAAU,UAAA,EAAY;AAE1B,MAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAA;AAAA,IAC9B;AACA,IAAA,IAAI,CAAA,CAAE,UAAU,YAAA,EAAc;AAE5B,MAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,MAAA,GAAS,EAAE,CAAA;AAAA,IACvC;AAGA,IAAA,OAAO,eAAA,GAAkB,EAAE,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAO,GAAI,EAAE,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAO;AAAA,EAC7E,CAAA;AAGA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA2B;AAC/C,EAAA,KAAA,MAAW,KAAK,GAAA,CAAI,KAAA,UAAe,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAG9C,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,KAAA,MAAW,MAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,EAAE,CAAA,EAAG;AAC/B,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AACpB,QAAA,MAAM,WAA0B,EAAE,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,OAAO,MAAA,EAAO;AAC/D,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,QAAQ,CAAA;AACxB,QAAA,GAAA,CAAI,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AACxC,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,MAAA,EAAQ,GAAA,CAAI,KAAK,CAAA;AAE/C,EAAA,MAAM,SAAkB,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAC9C,IAAA,MAAM,WAAW,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,CAAE,SAAS,CAAA,CAAE,EAAA;AACpD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA,GAAW,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,IAAA;AAAA,MAC1B,EAAA,EAAI,QAAA,GAAW,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,EAAA;AAAA,MAC1B,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY,QAAA;AAAA,MACZ,OAAO;AAAC,KACV;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,MAAA,EAAQ,MAAM,CAAA;AAGjD,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,aAAA,CAAc,MAAA,EAAQ,UAAU,MAAM;AAC7D,IAAA,MAAM,EAAA,GAAK,WAAW,YAAA,EAAc,CAAA,CAAA;AACpC,IAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AACf,IAAA,OAAO,EAAA;AAAA,EACT,CAAC,CAAA;AAGD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAmB;AACtC,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACxB,IAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,OAAO,CAAC,CAAA;AACzB,IAAA,MAAA,CAAO,IAAI,EAAA,EAAI;AAAA,MACb,EAAA;AAAA,MACA,IAAA,EAAM,CAAA;AAAA,MACN,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,IAAK,CAAA;AAAA,MAC3B,KAAA,EAAO,CAAA;AAAA,MACP,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AACA,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,MAAA,CAAO,IAAI,EAAA,EAAI;AAAA,MACb,EAAA;AAAA,MACA,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,IAAK,CAAA;AAAA,MAC3B,KAAA,EAAO,CAAA;AAAA,MACP,OAAO,QAAA,CAAS,UAAA;AAAA,MAChB,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,CAAC,CAAA;AAC7D,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,IAAK,QAAA,EAAU,KAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAClD,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,CAAA,IAAK,QAAA,EAAU;AAClC,IAAA,MAAA,CAAO,KAAK,CAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AAAA,EACxB;AAIA,EAAA,MAAM,WAAoC,EAAC;AAC3C,EAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,IAAA,IAAI,CAAA,CAAE,KAAA,CAAM,MAAA,IAAU,CAAA,EAAG;AACvB,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAE,KAAA,CAAM,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC3C,QAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,EAAI,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,CAAC,CAAE,CAAC,CAAA;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,OAAA,GAAU,WAAA,CAAY,MAAA,EAAQ,QAAQ,CAAA;AAI1C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAgC;AACrD,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO,QAAA,CAAS,IAAI,CAAA,CAAE,EAAA,EAAI,EAAE,MAAM,CAAA;AACtD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAgC;AACrD,EAAA,KAAA,MAAW,EAAA,IAAM,IAAI,SAAA,EAAW;AAC9B,IAAA,KAAA,MAAW,WAAW,EAAA,CAAG,SAAA,WAAoB,GAAA,CAAI,OAAA,EAAS,GAAG,EAAE,CAAA;AAC/D,IAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,EAAA,CAAG,EAAE,GAAG,QAAA,CAAS,GAAA,CAAI,EAAA,CAAG,EAAA,EAAI,MAAS,CAAA;AAAA,EACzD;AACA,EAAA,MAAM,YAAA,GAAe,CAAC,EAAA,KAAyB;AAC7C,IAAA,MAAME,QAAiB,EAAC;AACxB,IAAA,IAAI,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AACzB,IAAA,OAAO,QAAQ,MAAA,EAAW;AACxB,MAAAA,KAAAA,CAAK,QAAQ,GAAG,CAAA;AAChB,MAAA,GAAA,GAAM,QAAA,CAAS,IAAI,GAAG,CAAA;AAAA,IACxB;AACA,IAAA,OAAOA,KAAAA;AAAA,EACT,CAAA;AAIA,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAsB;AAChD,EAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,IAAA,IAAI,CAAA,CAAE,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACxB,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAA,CAAE,KAAA,CAAM,CAAC,CAAE,CAAA;AACtC,IAAA,MAAM,GAAA,GAAM,aAAa,CAAA,CAAE,KAAA,CAAM,EAAE,KAAA,CAAM,MAAA,GAAS,CAAC,CAAE,CAAA;AACrD,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,MAAM,MAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3D,MAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,CAAI,CAAC,GAAG,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAE,CAAA;AAAA,WACzC;AAAA,IACP;AACA,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAE,KAAA,CAAM,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC3C,MAAA,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,KAAA,CAAM,CAAC,GAAI,MAAM,CAAA;AAAA,IACvC;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KACd,aAAA,CAAc,IAAI,EAAE,CAAA,IAAK,aAAa,EAAE,CAAA;AAI1C,EAAA,IAAI,GAAA,CAAI,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC5B,IAAA,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AAC/B,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,EAAA,EAAI,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,EAAG,IAAA,EAAM,MAAA,CAAO,EAAE,GAAE,CAAE,CAAA;AAChE,MAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACnB,QAAA,MAAM,KAAK,CAAA,CAAE,IAAA;AACb,QAAA,MAAM,KAAK,CAAA,CAAE,IAAA;AACb,QAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,GAAG,MAAM,CAAA;AACzC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,UAAA,IAAI,EAAA,CAAG,CAAC,CAAA,KAAM,EAAA,CAAG,CAAC,CAAA,EAAG,OAAO,EAAA,CAAG,CAAC,CAAA,CAAG,aAAA,CAAc,EAAA,CAAG,CAAC,CAAE,CAAA;AAAA,QACzD;AACA,QAAA,IAAI,GAAG,MAAA,KAAW,EAAA,CAAG,QAAQ,OAAO,EAAA,CAAG,SAAS,EAAA,CAAG,MAAA;AACnD,QAAA,OAAO,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAAA,MACjB,CAAC,CAAA;AACD,MAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,IAC9B,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,OAAA,CAAQ,QAAQ,EAAA,EAAA,EAAM;AAC1C,IAAA,MAAM,KAAA,GAAQ,QAAQ,EAAE,CAAA;AACxB,IAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,KAAA,CAAM,QAAQ,EAAA,EAAA,EAAM;AACxC,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAE,CAAE,CAAA;AAC/B,MAAA,IAAI,CAAA,IAAK,KAAA,GAAQ,EAAA;AAAA,IACnB;AAAA,EACF;AAGA,EAAA,MAAM,aAAwB,OAAA,CAAQ,GAAA;AAAA,IAAI,CAAC,UACzC,KAAA,CAAM,GAAA,CAAI,CAAC,EAAA,KAAO,MAAA,CAAO,GAAA,CAAI,EAAE,CAAE;AAAA,GACnC;AAOA,EAAA,MAAM,OAAA,GACJ,IAAI,SAAA,CAAU,MAAA,GAAS,KACvB,8BAAA,CAA+B,GAAA,EAAK,UAAU,QAAQ,CAAA;AACxD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,IAAA,GAAO,gBAAA;AAAA,MACL,UAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA,CAAS,YAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,WAAuB,UAAA,CAAW,GAAA;AAAA,MAAI,CAAC,KAAA,KAC3C,KAAA,CAAM,GAAA,CAAI,CAAC,OAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA,EAAO,OAAA,EAAS,CAAA,CAAE,SAAQ,CAAE;AAAA,KACrE;AACA,IAAA,IAAA,GAAO,SAAA,CAAU,QAAA,EAAU,QAAA,EAAU,QAAA,CAAS,YAAY,CAAA;AAAA,EAC5D;AAGA,EAAA,MAAM,YAAA,GAAe,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,IAAA;AAG7C,EAAA,MAAM,YAAA,GAAyB,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,KAAU;AACvD,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,EAAE,OAAA,EAAS;AACf,MAAA,IAAI,CAAA,CAAE,MAAA,GAAS,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,MAAA;AAAA,IAChC;AACA,IAAA,OAAO,IAAA,GAAO,CAAA,GAAI,IAAA,GAAO,QAAA,CAAS,UAAA;AAAA,EACpC,CAAC,CAAA;AAID,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,SAAA,CAAU,MAAA,GAAS,CAAA;AAC3C,EAAA,MAAM,sBAAA,GAAyB,WAAA,GAC3B,WAAA,CAAY,GAAA,GAAM,YAAY,MAAA,GAC9B,CAAA;AACJ,EAAA,MAAM,qBAAA,GAAwB,WAAA,GAAc,WAAA,CAAY,GAAA,GAAM,CAAA;AAM9D,EAAA,MAAM,WAAA,GAAc,CAAC,YAAA,IAAgB,GAAA,KAAQ,OACzC,sBAAA,GACA,qBAAA;AACJ,EAAA,MAAM,YAAA,GAAe,YAAA,IAAgB,GAAA,KAAQ,IAAA,GACzC,sBAAA,GACA,qBAAA;AAOJ,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAyB;AAC3C,IAAA,IAAI,GAAA,GAAM,IAAA;AACV,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,OAAO,WAAW,CAAA,EAAG;AACnB,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAC1B,MAAA,IAAI,CAAC,GAAG,OAAO,GAAA;AACf,MAAA,GAAA,GAAM,CAAA;AAAA,IACR;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,kBAAsC,UAAA,CAAW,GAAA,CAAI,sBAAM,IAAI,KAAK,CAAA;AAC1E,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,UAAA,CAAW,QAAQ,EAAA,EAAA,EAAM;AAC7C,IAAA,KAAA,MAAW,CAAA,IAAK,UAAA,CAAW,EAAE,CAAA,EAAI;AAC/B,MAAA,IAAI,EAAE,OAAA,EAAS;AACf,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAChC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,eAAA,CAAgB,EAAE,CAAA,CAAG,GAAA,CAAI,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,IAC7C;AAAA,EACF;AAWA,EAAA,MAAM,UAAA,GAAa,CAAC,EAAA,KAAuB;AACzC,IAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,EAAE,CAAA,wBAAS,GAAA,EAAY;AACjD,IAAA,MAAM,IAAI,eAAA,CAAgB,EAAA,GAAK,CAAC,CAAA,wBAAS,GAAA,EAAY;AACrD,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,CAAA,EAAG,IAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG;AAAE,MAAA,OAAA,GAAU,IAAA;AAAM,MAAA;AAAA,IAAO;AAC3D,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,KAAA,MAAW,KAAK,CAAA,EAAG,IAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG;AAAE,MAAA,QAAA,GAAW,IAAA;AAAM,MAAA;AAAA,IAAO;AAC5D,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,OAAA,cAAqB,WAAA,CAAY,GAAA;AACrC,IAAA,IAAI,QAAA,EAAU,QAAA,IAAY,WAAA,CAAY,GAAA,GAAM,WAAA,CAAY,MAAA;AAIxD,IAAA,IAAI,OAAA,IAAW,QAAA,EAAU,QAAA,IAAY,WAAA,CAAY,GAAA;AACjD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,aAAA,EAAe,QAAQ,CAAA;AAAA,EAClD,CAAA;AAEA,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA;AACE,IAAA,IAAI,CAAA,GAAI,SAAS,OAAA,GAAU,WAAA;AAC3B,IAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,YAAA,CAAa,QAAQ,EAAA,EAAA,EAAM;AAC/C,MAAA,CAAA,IAAK,YAAA,CAAa,EAAE,CAAA,GAAK,CAAA;AACzB,MAAA,YAAA,CAAa,KAAK,CAAC,CAAA;AACnB,MAAA,CAAA,IAAK,YAAA,CAAa,EAAE,CAAA,GAAK,CAAA;AACzB,MAAA,IAAI,KAAK,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,WAAW,EAAE,CAAA;AAAA,IACtD;AAAA,EACF;AAKA,EAAA,MAAM,qBAA+B,EAAC;AACtC,EAAA,KAAA,IAAS,KAAK,CAAA,EAAG,EAAA,GAAK,YAAA,CAAa,MAAA,GAAS,GAAG,EAAA,EAAA,EAAM;AACnD,IAAA,MAAM,UAAU,YAAA,CAAa,EAAE,CAAA,GAAK,YAAA,CAAa,EAAE,CAAA,GAAK,CAAA;AACxD,IAAA,MAAM,OAAA,GAAU,aAAa,EAAA,GAAK,CAAC,IAAK,YAAA,CAAa,EAAA,GAAK,CAAC,CAAA,GAAK,CAAA;AAChE,IAAA,kBAAA,CAAmB,IAAA,CAAA,CAAM,OAAA,GAAU,OAAA,IAAW,CAAC,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,CAAA,IAAK,IAAA,EAAM;AAC1B,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AACvB,IAAA,IAAI,EAAE,OAAA,EAAS;AACf,IAAA,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAC,CAAA;AACrC,IAAA,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,EACvC;AACA,EAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG;AACnB,IAAA,IAAA,GAAO,CAAA;AACP,IAAA,IAAA,GAAO,GAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,EAAA,MAAM,MAAA,GAAS,UAAU,YAAA,GAAe,IAAA;AAExC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,UAAA,CAAW,QAAQ,EAAA,EAAA,EAAM;AAC7C,IAAA,MAAM,CAAA,GAAI,aAAa,EAAE,CAAA;AACzB,IAAA,KAAA,MAAW,CAAA,IAAK,UAAA,CAAW,EAAE,CAAA,EAAI;AAC/B,MAAA,IAAI,EAAE,OAAA,EAAS;AACf,MAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,KAAK,CAAA,IAAK,MAAA;AACnC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,KAAA,GAAQ,CAAA;AAAA,QAClB,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,QAClB,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,KAAA,EAAO,EAAA;AAAA,QACP,OAAO,CAAA,CAAE;AAAA,OACV,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAsC;AAC3D,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,UAAA,CAAW,QAAQ,EAAA,EAAA,EAAM;AAC7C,IAAA,MAAM,CAAA,GAAI,aAAa,EAAE,CAAA;AACzB,IAAA,KAAA,MAAW,CAAA,IAAK,UAAA,CAAW,EAAE,CAAA,EAAI;AAC/B,MAAA,IAAI,CAAC,EAAE,OAAA,EAAS;AAChB,MAAA,QAAA,CAAS,GAAA,CAAI,EAAE,EAAA,EAAI;AAAA,QACjB,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,KAAK,CAAA,IAAK,MAAA;AAAA,QAC3B;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAIA,EAAA,MAAM,aAAA,GAAgB,YAAA,IAAgB,GAAA,KAAQ,IAAA,GAC1C,sBAAA,GACA,qBAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,CAAC,YAAA,IAAgB,GAAA,KAAQ,OAC5C,sBAAA,GACA,qBAAA;AACJ,EAAA,MAAM,OAAA,GAAU,IAAA,GAAO,IAAA,GAAO,CAAA,GAAI,UAAU,YAAA,GAAe,aAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,aAAa,MAAA,GAAS,CAAA;AACxC,EAAA,MAAM,OAAA,GACJ,SAAA,IAAa,CAAA,GACT,YAAA,CAAa,SAAS,CAAA,GAAK,YAAA,CAAa,SAAS,CAAA,GAAK,CAAA,GAAI,OAAA,GAAU,cAAA,GACpE,CAAA,GAAI,OAAA;AAGV,EAAA,MAAM,QAAA,GAAkC,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACxD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,CAAG,IAAA;AAC/B,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,IAAA;AAAA,QACN,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,OAAO,CAAA,CAAE;AAAA,OACX;AAAA,IACF;AAIA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA;AAAA,MACN,GAAG,CAAA,CAAE,CAAA;AAAA,MACL,GAAG,CAAA,CAAE,CAAA;AAAA,MACL,OAAO,CAAA,CAAE,MAAA;AAAA,MACT,QAAQ,CAAA,CAAE,KAAA;AAAA,MACV,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,OAAO,CAAA,CAAE;AAAA,KACX;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,eAAe,OAAA,GAAU,OAAA;AAC1C,EAAA,MAAM,SAAA,GAAY,eAAe,OAAA,GAAU,OAAA;AAI3C,EAAA,MAAM,YAAA,GAAyB,kBAAA,CAAmB,GAAA,CAAI,CAAC,CAAA,KAAM;AAC3D,IAAA,IAAI,GAAA,KAAQ,IAAA,EAAM,OAAO,SAAA,GAAY,CAAA;AACrC,IAAA,IAAI,GAAA,KAAQ,IAAA,EAAM,OAAO,QAAA,GAAW,CAAA;AACpC,IAAA,OAAO,CAAA;AAAA,EACT,CAAC,CAAA;AAGD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAA4D;AACnF,EAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,IAAA,UAAA,CAAW,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,EAAA,EAAI;AAAA,MACzB,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAA;AAAA,MACrB,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA;AAAA,MACtB,GAAG,EAAA,CAAG,KAAA;AAAA,MACN,GAAG,EAAA,CAAG;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsC;AAC9D,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,CAAA,IAAK,QAAA,EAAU;AAC9B,IAAA,IAAI,CAAC,YAAA,EAAc,WAAA,CAAY,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,SACnC,WAAA,CAAY,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA;AAAA,EAC7C;AAQA,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,IAAA,EAAM;AAChC,IAAA,MAAM,QAAQ,GAAA,KAAQ,IAAA;AACtB,IAAA,MAAM,QAAQ,GAAA,KAAQ,IAAA;AACtB,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,IAAI,OAAO,CAAA,CAAE,CAAA,GAAI,SAAA,GAAY,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA;AACrC,MAAA,IAAI,OAAO,CAAA,CAAE,CAAA,GAAI,QAAA,GAAW,CAAA,CAAE,IAAI,CAAA,CAAE,KAAA;AAAA,IACtC;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,UAAA,CAAW,MAAA,EAAO,EAAG;AACnC,MAAA,IAAI,KAAA,EAAO,CAAA,CAAE,CAAA,GAAI,SAAA,GAAY,CAAA,CAAE,CAAA;AAC/B,MAAA,IAAI,KAAA,EAAO,CAAA,CAAE,CAAA,GAAI,QAAA,GAAW,CAAA,CAAE,CAAA;AAAA,IAChC;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,WAAA,CAAY,MAAA,EAAO,EAAG;AACpC,MAAA,IAAI,KAAA,EAAO,CAAA,CAAE,CAAA,GAAI,SAAA,GAAY,CAAA,CAAE,CAAA;AAC/B,MAAA,IAAI,KAAA,EAAO,CAAA,CAAE,CAAA,GAAI,QAAA,GAAW,CAAA,CAAE,CAAA;AAAA,IAChC;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAsC;AAC5D,EAAA,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAC,CAAA,EAAG,MAAM,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAI/C,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,CAAC,EAAA,KAAO;AACxC,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAC,EAAA,CAAG,IAAA,EAAM,EAAA,CAAG,EAAE,CAAA;AAE9D,IAAA,MAAM,SAA0C,EAAC;AACjD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAClB,MAAA,MAAM,EAAA,GAAK,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AAC5B,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAC7B,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,CAAG,GAAG,CAAA,EAAG,EAAA,CAAG,GAAG,CAAA;AAAA,MAClC,WAAW,EAAA,EAAI;AACb,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,CAAG,GAAG,CAAA,EAAG,EAAA,CAAG,GAAG,CAAA;AAAA,MAClC;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,OAAO,EAAE,IAAA,EAAM,EAAA,CAAG,QAAA,EAAU,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,QAAQ,CAAA,EAAE;AAAA,IAC1E;AAEA,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,CAAC,CAAE,CAAA;AAC1C,IAAA,MAAM,UAAU,UAAA,CAAW,GAAA,CAAI,MAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAE,CAAA;AACvD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,EAAI,MAAA,CAAO,CAAC,CAAA,EAAI,SAAA,EAAW,GAAS,CAAA;AAAA,IACpE;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,GAAI,SAAA;AAAA,QAC1B,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAAA,QACxB,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAAA,QACxB,OAAA;AAAA,QACA,GAEF,CAAA;AAAA,IACF;AAMA,IAAA,MAAM,WAAA,GAAc,MAAM,GAAA,CAAI,CAAC,OAAO,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,IAAK,CAAC,CAAA;AAC3D,IAAA,MAAM,CAAA,GAAI,kBAAA,CAAmB,MAAA,EAAQ,GAAA,EAAK,aAAa,YAAY,CAAA;AAMnE,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,EAAA,CAAG,SAAS,KAAA,EAAO;AACrB,MAAA,WAAA,GAAc,eAAA,CAAgB,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,YAAY,CAAA;AAAA,IACtE;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,GAAG,EAAA,CAAG,QAAA;AAAA,QACN,YAAY,EAAA,CAAG;AAAA,OACjB;AAAA,MACA,IAAA,EAAM,CAAA;AAAA,MACN,WAAA;AAAA,MACA,KAAA,EAAO,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,QAAQ;AAAA,KAClC;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,SAAS,yBAAyB,IAAA,EAAwB;AACxD,IAAA,MAAM,EAAA,GAAK,IAAI,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,IAAI,CAAA;AAClD,IAAA,IAAI,CAAC,EAAA,EAAI,OAAO,EAAC;AACjB,IAAA,MAAM,GAAA,GAAM,CAAC,GAAG,EAAA,CAAG,QAAQ,CAAA;AAC3B,IAAA,KAAA,MAAW,SAAA,IAAa,GAAG,SAAA,EAAW,GAAA,CAAI,KAAK,GAAG,wBAAA,CAAyB,SAAS,CAAC,CAAA;AACrF,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,SAAS,aAAa,IAAA,EAAsB;AAC1C,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,SAAA,EAAW;AAC7B,MAAA,IAAI,CAAA,CAAE,UAAU,QAAA,CAAS,IAAI,GAAG,OAAO,CAAA,GAAI,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA;AAAA,IAC9D;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,GAAA,EAAK,WAAA,EAAa,MAAA,EAAQ,iBAAgB,GAAI,WAAA;AAEtD,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,SAAA,CAClB,GAAA,CAAI,CAAC,EAAA,KAAO;AACX,IAAA,MAAM,SAAA,GAAY,wBAAA,CAAyB,EAAA,CAAG,EAAE,CAAA;AAChD,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,UAAU,QAAA,CAAS,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AACpE,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACjC,IAAA,MAAMC,KAAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,WAAA;AACpD,IAAA,MAAM,IAAA,GACJ,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,WAAA,GAAc,eAAA;AACvD,IAAA,MAAMC,KAAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAK,CAAC,CAAA,GAAI,WAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA,GAAI,WAAA;AAC/D,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,EAAA;AAAA,MACV,CAAA,EAAGD,KAAAA;AAAA,MACH,CAAA,EAAG,IAAA;AAAA,MACH,OAAOC,KAAAA,GAAOD,KAAAA;AAAA,MACd,QAAQ,IAAA,GAAO,IAAA;AAAA,MACf,KAAA,EAAO,YAAA,CAAa,EAAA,CAAG,EAAE;AAAA,KAC3B;AAAA,EACF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAkC,MAAM,IAAI,CAAA;AAEvD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAW,GAAA;AAAA,IACX,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,QAAA;AAAA,IACP;AAAA,GACF;AACF;AAIA,SAAS,SAAA,CACP,IAAA,EACA,MAAA,EACA,GAAA,EACA,KACA,OAAA,EAC0B;AAM1B,EAAA,MAAM,KAAK,GAAA,CAAI,CAAA;AACf,EAAA,MAAM,KAAK,GAAA,CAAI,CAAA;AACf,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,IAAA,EAAM;AAChC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,CAAA,IAAK,IAAA,CAAK,CAAA;AACnC,IAAA,OAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,IAAM,SAAA,GAAY,GAAA,CAAI,CAAA,GAAI,CAAA,GAAI,CAAC,GAAA,CAAI,CAAA,GAAI,CAAA,CAAA,EAAG;AAAA,EAC/D;AACA,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,CAAA,IAAK,IAAA,CAAK,CAAA;AACpC,EAAA,OAAO,EAAE,CAAA,EAAG,EAAA,IAAM,UAAA,GAAa,GAAA,CAAI,CAAA,GAAI,CAAA,GAAI,CAAC,GAAA,CAAI,CAAA,GAAI,CAAA,CAAA,EAAI,CAAA,EAAG,EAAA,EAAG;AAChE;AAEA,SAAS,kBAAA,CACP,GAAA,EACA,GAAA,EACA,MAAA,EACA,OAAA,EACQ;AACR,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC7B,EAAA,MAAM,QAAkB,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,EAAI,IAAI,GAAA,CAAI,CAAC,CAAA,CAAG,CAAC,CAAC,CAAA,CAAE,CAAA;AAChE,EAAA,MAAM,YAAA,GAAe,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,IAAA;AAC7C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AACnB,IAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AAKf,IAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACvB,MAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,MAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,MAAA,IAAa,OAAO,EAAA,EAAI;AACrD,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC1B,QAAA,MAAM,EAAA,GAAK,QAAQ,EAAE,CAAA;AACrB,QAAA,IAAI,EAAA,KAAO,QAAW,IAAA,GAAO,EAAA;AAAA,MAC/B;AAAA,IACF;AACA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,IAAA,GAAO,IAAA,IAAA,CAAS,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA;AACnC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,GAAA,CAAI,IAAI,CAAC,IAAI,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,CAAA;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,GAAA,CAAI,IAAI,CAAC,IAAI,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,CAAA;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAO,IAAA,IAAA,CAAS,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA;AACnC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,IAAI,CAAC,CAAA,CAAE,CAAA;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,IAAI,CAAC,CAAA,CAAE,CAAA;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IACxC;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;AAEA,SAAS,IAAI,CAAA,EAAmB;AAC9B,EAAA,OAAA,CAAQ,KAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,KAAK,QAAA,EAAS;AAC9C;AAEA,SAAS,eAAA,CACP,GAAA,EACA,GAAA,EACA,MAAA,EACA,OAAA,EACmE;AAGnE,EAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,EAAA,IAAI,MAAA,IAAU,OAAA,IAAW,MAAA,CAAO,MAAA,IAAU,CAAA,EAAG;AAC3C,IAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,IAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,MAAM,KAAK,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAC,CAAA;AACnC,MAAA,IAAI,EAAA,KAAO,QAAW,IAAA,GAAO,EAAA;AAAA,IAC/B;AAAA,EACF;AAKA,EAAA,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,OAAO,GAAA,CAAI,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AAClD,EAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,EAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,EAAA,MAAM,YAAA,GAAe,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,IAAA;AAE7C,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,IAAA,GAAO,IAAA,IAAA,CAAS,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA;AACnC,IAAA,MAAME,SAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA;AACpC,IAAA,IAAIA,MAAAA,EAAO;AACT,MAAA,MAAMC,KAAAA,GAAAA,CAAQ,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAA;AAC3B,MAAA,OAAO,EAAE,CAAA,EAAG,IAAA,GAAO,GAAG,CAAA,EAAGA,KAAAA,EAAM,YAAY,OAAA,EAAQ;AAAA,IACrD;AACA,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA,EAAG,YAAY,QAAA,EAAS;AAAA,EACrD;AAGA,EAAA,MAAM,IAAA,GAAO,IAAA,IAAA,CAAS,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA;AACnC,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA;AACpC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,IAAA,GAAA,CAAQ,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAA;AAC3B,IAAA,OAAO,EAAE,CAAA,EAAG,IAAA,EAAM,GAAG,IAAA,GAAO,CAAA,EAAG,YAAY,QAAA,EAAS;AAAA,EACtD;AACA,EAAA,OAAO,EAAE,GAAG,CAAA,CAAE,CAAA,GAAI,GAAG,CAAA,EAAG,IAAA,EAAM,YAAY,OAAA,EAAQ;AACpD;;;ACv9CO,SAAS,QAAA,CAAS,KAAA,EAAuB,CAAA,EAAW,CAAA,EAAmB;AAC5E,EAAA,QAAQ,KAAA;AAAO;AAAA,IAEb,KAAK,MAAA;AACH,MAAA,OAAOC,uBAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,cAAc,CAAA;AAAA,IAEtF,KAAK,OAAA;AACH,MAAA,OAAOA,uBAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,+BAA+B,CAAA;AAAA,IAEvG,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,EAAE,CAAA;AAC5B,MAAA,OAAOA,uBAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,iCAAiC,CAAA;AAAA,IACvG;AAAA,IAEA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,SAAS,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,GAAA,EAAM,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAA,EAAM,IAAI,CAAC,CAAA,CAAA;AAChE,MAAA,OAAOC,yBAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,iCAAiC,CAAA;AAAA,IACnE;AAAA,IAEA,KAAK,eAAA,EAAiB;AACpB,MAAA,MAAM,QAAQ,WAAA,CAAY,aAAA;AAC1B,MAAA,MAAM,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,CAAC,CAAA,GAAA,EAAM,CAAA,GAAI,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,GAAA,EAAM,CAAC,CAAA,CAAA;AACzD,MAAA,OAAOA,yBAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,cAAc,CAAA;AAAA,IAChD;AAAA;AAAA,IAGA,KAAK,mBAAA,EAAqB;AACxB,MAAA,MAAM,QAAQ,WAAA,CAAY,aAAA;AAC1B,MAAA,MAAM,MAAA,GAAS,CAAA,IAAA,EAAO,CAAA,GAAI,KAAK,CAAA,GAAA,EAAM,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AACzD,MAAA,OAAOA,yBAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,cAAc,CAAA;AAAA,IAChD;AAAA,IAEA,KAAK,WAAA,EAAa;AAEhB,MAAA,MAAM,QAAQ,WAAA,CAAY,SAAA;AAC1B,MAAA,MAAM,MAAA,GAAS,CAAA,IAAA,EAAO,CAAC,CAAA,GAAA,EAAM,CAAA,GAAI,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AACzD,MAAA,OAAOA,yBAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,cAAc,CAAA;AAAA,IAChD;AAAA,IAEA,KAAK,eAAA,EAAiB;AAEpB,MAAA,MAAM,QAAQ,WAAA,CAAY,SAAA;AAC1B,MAAA,MAAM,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,CAAA,GAAI,KAAK,CAAA,GAAA,EAAM,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAA,EAAM,CAAC,CAAA,CAAA;AACzD,MAAA,OAAOA,yBAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,cAAc,CAAA;AAAA,IAChD;AAAA,IAEA,KAAK,YAAA,EAAc;AAEjB,MAAA,MAAM,IAAA,GAAO,EAAA;AACb,MAAA,MAAM,IAAA,GAAOD,sBAAA,CAAK,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,cAAc,CAAA;AACjF,MAAA,MAAM,IAAA,GAAOP,sBAAA,CAAQ,EAAE,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,sBAAsB,CAAA;AACtF,MAAA,MAAM,KAAA,GAAQA,sBAAA,CAAQ,EAAE,EAAA,EAAI,IAAI,IAAA,EAAM,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,IAAI,IAAA,EAAM,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,sBAAsB,CAAA;AAC/F,MAAA,OAAO,OAAO,IAAA,GAAO,KAAA;AAAA,IACvB;AAAA,IAEA,KAAK,UAAA,EAAY;AAGf,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAC5B,MAAA,MAAM,aAAaE,sBAAA,CAAQ;AAAA,QACzB,CAAA,EAAG,CAAA,GAAA,EAAM,EAAE,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,OAAA,EAAU,CAAC,CAAA,CAAA,EAAI,EAAE,KAAK,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,EAAE,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,SAAA,EAAY,CAAA,GAAI,EAAE,CAAA,EAAA,CAAA;AAAA,QAC9F,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAA,MAAM,SAASA,sBAAA,CAAQ;AAAA,QACrB,CAAA,EAAG,CAAA,GAAA,EAAM,EAAE,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,OAAA,EAAU,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAAA,QAC5C,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,OAAO,UAAA,GAAa,MAAA;AAAA,IACtB;AAAA,IAEA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,IAAI,CAAA,GAAI,CAAA;AAC/B,MAAA,OAAOO,wBAAA,CAAU,EAAE,EAAA,EAAI,CAAA,GAAI,CAAA,EAAG,EAAA,EAAI,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,8BAAA,EAAgC,CAAA;AAAA,IACrF;AAAA,IAEA,KAAK,eAAA,EAAiB;AAEpB,MAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,IAAI,CAAA,GAAI,CAAA;AAChC,MAAA,MAAM,KAAK,EAAA,GAAK,CAAA;AAChB,MAAA,MAAM,KAAA,GAAQA,wBAAA,CAAU,EAAE,EAAA,EAAI,CAAA,GAAI,CAAA,EAAG,EAAA,EAAI,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,cAAc,CAAA;AAC5E,MAAA,MAAM,KAAA,GAAQA,wBAAA,CAAU,EAAE,EAAA,EAAI,CAAA,GAAI,CAAA,EAAG,EAAA,EAAI,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,mBAAmB,CAAA;AACjF,MAAA,OAAO,KAAA,GAAQ,KAAA;AAAA,IACjB;AAAA,IAEA,KAAK,SAAA,EAAW;AAEd,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAI,CAAC,CAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,GAAG,GAAG,CAAA,GAAA,EAAM,IAAI,GAAG,CAAA,GAAA,EAAM,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,IAAI,CAAA,GAAI,GAAG,IAAI,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,GAAA,EAAM,CAAA,GAAI,CAAC,CAAA,CAAA;AACzF,MAAA,OAAOD,yBAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,iCAAiC,CAAA;AAAA,IACnE;AAAA,IAEA,KAAK,YAAA,EAAc;AAEjB,MAAA,MAAM,GAAA,GAAM,CAAA,IAAA,EAAO,CAAA,GAAI,EAAE,MAAM,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,IAAI,CAAA,GAAI,EAAE,CAAA,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA,CAAA;AAC/D,MAAA,OAAOA,0BAAQ,EAAE,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,cAAc,CAAA;AAAA,IACrD;AAAA,IAEA;AACE,MAAA,OAAOD,uBAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,cAAc,CAAA;AAAA;AAE1F;;;AC5EA,IAAM,YAAA,GAAe,CAAC,SAAA,KAAiC;AACrD,EAAA,MAAM,CAAA,GAAIG,wCAAsB,SAAS,CAAA;AACzC,EAAA,MAAM,IAAI,CAAA,CAAE,OAAA;AACZ,EAAA,OAAO;AAAA;AAAA,oBAAA,EAEa,CAAA,CAAE,SAAS,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA;AAAA,4BAAA,EACxB,CAAA,CAAE,WAAW,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA;AAAA,4BAAA,EAClC,CAAA,CAAE,WAAW,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA;AAAA,0BAAA,EACpC,CAAA,CAAE,SAAS,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA;AAAA,yBAAA,EACjC,EAAE,IAAI,CAAA;AAAA;AAAA,4CAAA,EAEa,EAAE,KAAA,CAAM,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,MAAM,CAAA;AAAA,iDAAA,EAClC,CAAA,CAAE,MAAM,IAAI,CAAA;AAAA,4CAAA,EACjB,EAAE,OAAA,CAAQ,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,iDAAA,EACtC,CAAA,CAAE,QAAQ,IAAI,CAAA;AAAA,4CAAA,EACnB,EAAE,QAAA,CAAS,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,SAAS,MAAM,CAAA;AAAA,iDAAA,EACxC,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,4CAAA,EACpB,EAAE,OAAA,CAAQ,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,iDAAA,EACtC,CAAA,CAAE,QAAQ,IAAI,CAAA;AAAA,4CAAA,EACnB,EAAE,MAAA,CAAO,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,OAAO,MAAM,CAAA;AAAA,iDAAA,EACpC,CAAA,CAAE,OAAO,IAAI,CAAA;AAAA,4CAAA,EAClB,EAAE,OAAA,CAAQ,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,iDAAA,EACtC,CAAA,CAAE,QAAQ,IAAI,CAAA;AAAA,kCAAA,EAC7B,EAAE,OAAO,CAAA;AAAA,4BAAA,EACf,EAAE,MAAM,CAAA;AAAA;AAAA;AAAA,0BAAA,EAGV,EAAE,SAAS,CAAA;AAAA,6BAAA,EACR,CAAA,CAAE,EAAE,CAAA,8BAAA,EAAiC,CAAA,CAAE,OAAO,CAAA;AAAA,qBAAA,EACtD,EAAE,IAAI,CAAA;AAAA;AAAA,0CAAA,EAEe,EAAE,MAAM,CAAA;AAAA,sCAAA,EACZ,EAAE,MAAM,CAAA;AAAA,uCAAA,EACP,EAAE,MAAM,CAAA;AAAA;AAAA,uBAAA,EAExB,CAAA,CAAE,SAAS,CAAA,8BAAA,EAAiC,CAAA,CAAE,OAAO,CAAA;AAAA,6BAAA,EAC/C,EAAE,SAAS,CAAA;AAAA,CAAA,CACxC,IAAA,EAAK;AACP,CAAA;AAEA,IAAM,YAAA,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAUnB,IAAA,EAAK;AAEP,SAAS,aAAa,IAAA,EAA6B;AACjD,EAAA,MAAM,OAAA,GAAU,CAAC,YAAY,CAAA;AAC7B,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS,OAAA,CAAQ,KAAK,kBAAkB,CAAA;AAC1D,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU,OAAA,CAAQ,KAAK,mBAAmB,CAAA;AAC5D,EAAA,OAAO,OAAA,CAAQ,KAAK,GAAG,CAAA;AACzB;AAEA,SAAS,aAAa,IAAA,EAAyC;AAC7D,EAAA,QAAQ,KAAK,QAAA;AAAU,IACrB,KAAK,OAAA;AACH,MAAA,OAAO,mBAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,qBAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,qBAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAEA,SAAS,eAAe,IAAA,EAAyC;AAC/D,EAAA,OAAO,IAAA,CAAK,UAAA,KAAe,OAAA,GAAU,mBAAA,GAAsB,MAAA;AAC7D;AAEA,SAAS,cAAc,EAAA,EAAoC;AACzD,EAAA,MAAM,KAAK,EAAA,CAAG,QAAA;AACd,EAAA,MAAM,KAAKH,sBAAA,CAAK,EAAE,GAAG,EAAA,CAAG,CAAA,EAAG,GAAG,EAAA,CAAG,CAAA,EAAG,OAAO,EAAA,CAAG,KAAA,EAAO,QAAQ,EAAA,CAAG,MAAA,EAAQ,IAAI,CAAA,EAAG,KAAA,EAAO,iBAAiB,CAAA;AACvG,EAAA,MAAM,KAAA,GAAQI,sBAAA;AAAA,IACZ,EAAE,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,EAAI,GAAG,EAAA,CAAG,CAAA,GAAI,EAAA,EAAI,KAAA,EAAO,qBAAA,EAAsB;AAAA,IAC3D,EAAA,CAAG;AAAA,GACL;AACA,EAAA,OAAOC,uBAAA;AAAA,IACL,EAAE,mBAAmB,EAAA,CAAG,EAAA,EAAI,cAAc,EAAA,CAAG,KAAA,EAAO,OAAO,iBAAA,EAAkB;AAAA,IAC7E,CAAC,IAAI,KAAK;AAAA,GACZ;AACF;AAEA,SAAS,WAAW,EAAA,EAAiC;AACnD,EAAA,MAAM,IAAmB,EAAA,CAAG,IAAA;AAC5B,EAAA,MAAM,UAAU,QAAA,CAAS,CAAA,CAAE,OAAO,EAAA,CAAG,KAAA,EAAO,GAAG,MAAM,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQC,+BAAA;AAAA,IACZ;AAAA,MACE,CAAA,EAAG,GAAG,KAAA,GAAQ,CAAA;AAAA,MACd,CAAA,EAAG,GAAG,MAAA,GAAS,CAAA;AAAA,MACf,KAAA,EAAO,iBAAA;AAAA,MACP,aAAA,EAAe,QAAA;AAAA,MACf,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA,CAAA,CAAE;AAAA,GACJ;AACA,EAAA,MAAM,UAAA,GAAa,EAAE,KAAA,CAClB,OAAA,CAAQ,gBAAgB,GAAG,CAAA,CAC3B,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA;AAC5B,EAAA,MAAM,SAAA,GAAYC,wBAAQ,UAAU,CAAA;AACpC,EAAA,MAAM,YAAY,CAAC,cAAA,EAAgB,GAAA,CAAI,CAAA,CAAE,WAAW,EAAC,EAAG,GAAA,CAAI,CAAC,MAAM,CAAA,YAAA,EAAe,CAAC,EAAE,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAChG,EAAA,OAAOF,uBAAA;AAAA,IACL;AAAA,MACE,gBAAgB,CAAA,CAAE,EAAA;AAAA,MAClB,cAAc,CAAA,CAAE,KAAA;AAAA,MAChB,cAAc,EAAA,CAAG,KAAA;AAAA,MACjB,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,IAAA,CAAK,GAAG,CAAA;AAAA,MACnC,KAAA,EAAO,SAAA;AAAA,MACP,SAAA,EAAW,CAAA,UAAA,EAAaG,IAAAA,CAAI,EAAA,CAAG,CAAC,CAAC,CAAA,CAAA,EAAIA,IAAAA,CAAI,EAAA,CAAG,CAAC,CAAC,CAAA,CAAA;AAAA,KAChD;AAAA,IACA,CAAC,OAAA,EAAS,KAAA,EAAO,SAAS;AAAA,GAC5B;AACF;AAEA,SAAS,WAAW,EAAA,EAAiC;AACnD,EAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,EAAA,MAAM,KAAA,GAAqD;AAAA,IACzD,GAAG,EAAA,CAAG,IAAA;AAAA,IACN,KAAA,EAAO,aAAa,CAAC;AAAA,GACvB;AACA,EAAA,MAAM,EAAA,GAAK,aAAa,CAAC,CAAA;AACzB,EAAA,MAAM,EAAA,GAAK,eAAe,CAAC,CAAA;AAC3B,EAAA,IAAI,EAAA,EAAI,KAAA,CAAM,YAAY,CAAA,GAAI,EAAA;AAC9B,EAAA,IAAI,EAAA,EAAI,KAAA,CAAM,cAAc,CAAA,GAAI,EAAA;AAChC,EAAA,MAAM,CAAA,GAAIb,uBAAO,KAAK,CAAA;AAEtB,EAAA,MAAM,OAAA,GACJ,CAAA,CAAE,KAAA,IAAS,EAAA,CAAG,WAAA,GACV,eAAA;AAAA,IACE,CAAA,CAAE,KAAA;AAAA,IACF,GAAG,WAAA,CAAY,CAAA;AAAA,IACf,GAAG,WAAA,CAAY,CAAA;AAAA,IACf,EAAA,CAAG,YAAY,UAAA,IAAc;AAAA,GAC/B,GACA,EAAA;AAEN,EAAA,MAAM,SAAA,GAAYY,uBAAA;AAAA,IAChB,EAAE,KAAA,GAAQ,CAAA,EAAG,CAAA,CAAE,IAAI,WAAM,CAAA,CAAE,EAAE,CAAA,EAAA,EAAK,CAAA,CAAE,KAAK,CAAA,CAAA,GAAK,CAAA,EAAG,EAAE,IAAI,CAAA,QAAA,EAAM,EAAE,EAAE,CAAA;AAAA,GACnE;AAEA,EAAA,OAAOF,uBAAA;AAAA,IACL;AAAA,MACE,cAAA,EAAgB,EAAE,EAAA,IAAM,CAAA,EAAG,EAAE,IAAI,CAAA,EAAA,EAAK,EAAE,EAAE,CAAA,CAAA;AAAA,MAC1C,mBAAmB,EAAA,CAAG,KAAA;AAAA,MACtB,aAAa,CAAA,CAAE,IAAA;AAAA,MACf,aAAa,CAAA,CAAE,IAAA;AAAA,MACf,WAAW,CAAA,CAAE;AAAA,KACf;AAAA,IACA,CAAC,CAAA,EAAG,SAAA,EAAW,OAAO,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC;AAAA,GACpD;AACF;AAEA,SAAS,eAAA,CACP,KAAA,EACA,EAAA,EACA,EAAA,EACA,UAAA,EACQ;AAER,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,KAAA,CAAM,MAAA,GAAS,MAAM,EAAE,CAAA;AAC9C,EAAA,MAAM,CAAA,GAAI,EAAA;AACV,EAAA,MAAM,EAAA,GAAK,MAAM,UAAA,KAAe,OAAA,GAAU,IAAI,UAAA,KAAe,KAAA,GAAQ,IAAI,CAAA,GAAI,CAAA,CAAA;AAC7E,EAAA,MAAM,EAAA,GAAK,KAAK,CAAA,GAAI,CAAA;AACpB,EAAA,MAAM,KAAKL,sBAAA,CAAK;AAAA,IACd,CAAA,EAAG,EAAA;AAAA,IACH,CAAA,EAAG,EAAA;AAAA,IACH,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,EAAA,EAAI,CAAA;AAAA,IACJ,KAAA,EAAO;AAAA,GACR,CAAA;AACD,EAAA,MAAM,CAAA,GAAII,sBAAA;AAAA,IACR;AAAA,MACE,CAAA,EAAG,EAAA;AAAA,MACH,CAAA,EAAG,EAAA;AAAA,MACH,KAAA,EAAO,kBAAA;AAAA,MACP,aAAA,EAAe,UAAA;AAAA,MACf,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAOC,uBAAA,CAAM,EAAE,KAAA,EAAO,oBAAA,IAAwB,CAAC,EAAA,EAAI,CAAC,CAAC,CAAA;AACvD;AAEA,SAASG,KAAI,CAAA,EAAmB;AAC9B,EAAA,OAAA,CAAQ,KAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,KAAK,QAAA,EAAS;AAC9C;AAEO,SAAS,kBAAA,CACd,GAAA,EACA,SAAA,GAAuB,SAAA,EACf;AACR,EAAA,MAAM,MAAA,GAAgC,gBAAgB,GAAG,CAAA;AAEzD,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,aAAa,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAG3C,EAAA,MAAM,qBAAqB,GAAA,CAAI,KAAA,CAC5B,OAAO,CAAC,CAAA,KAAM,EAAE,KAAA,IAAS,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CACxD,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,QAAQ,MAAA,CAAO,OAAA,CAAQ,EAAE,KAAM,CAAA,CAClC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA,CAC3B,KAAK,GAAG,CAAA;AACX,IAAA,OAAO,CAAA,gBAAA,EAAmB,CAAA,CAAE,EAAE,CAAA,iBAAA,EAAoB,KAAK,CAAA,EAAA,CAAA;AAAA,EACzD,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAGZ,EAAA,MAAM,iBAAA,GAAoB,GAAA,CAAI,SAAA,CAC3B,GAAA,CAAI,CAAC,EAAA,KAAO;AACX,IAAA,MAAM,QAAQ,MAAA,CAAO,OAAA,CAAQ,GAAG,KAAK,CAAA,CAClC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA,CAC3B,KAAK,GAAG,CAAA;AACX,IAAA,OAAO,CAAA,aAAA,EAAgB,EAAA,CAAG,EAAE,CAAA,iBAAA,EAAoB,KAAK,CAAA,EAAA,CAAA;AAAA,EACvD,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAIZ,EAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,OAAA,EAAS,CAAA,CAC3D,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACrB,IAAA,MAAM,WAAW,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAClC,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA,CAC3B,KAAK,GAAG,CAAA;AACX,IAAA,OAAO,CAAA,mBAAA,EAAsB,GAAG,CAAA,UAAA,EAAa,QAAQ,CAAA,EAAA,CAAA;AAAA,EACvD,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,UAAA,GAAa,IAAI,KAAA,GACnBJ,sBAAA;AAAA,IACE;AAAA,MACE,CAAA,EAAG,OAAO,KAAA,GAAQ,CAAA;AAAA,MAClB,CAAA,EAAG,EAAA;AAAA,MACH,KAAA,EAAO,aAAA;AAAA,MACP,aAAA,EAAe;AAAA,KACjB;AAAA,IACA,GAAA,CAAI;AAAA,GACN,GACA,EAAA;AAEJ,EAAA,MAAM,YAAA,GAAe,CAAC,kBAAA,EAAoB,iBAAA,EAAmB,kBAAkB,CAAA,CAC5E,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAC1B,KAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,QAAA,GAAqB;AAAA,IACzBG,wBAAQ,GAAA,CAAI,KAAA,GAAQ,GAAG,GAAA,CAAI,KAAK,sBAAiB,WAAW,CAAA;AAAA,IAC5DE,sBAAA;AAAA,MACE,CAAA,eAAA,EAAkB,IAAI,KAAA,CAAM,MAAM,QAAQ,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,MAAM,CAAA,KAAA,EAAQ,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA;AAAA,KAC9I;AAAA,IACAC,oBAAA,CAAG,OAAA,EAAS,EAAC,EAAG,YAAA,CAAa,SAAS,CAAA,IAAK,YAAA,GAAe,IAAA,GAAO,YAAA,GAAe,EAAA,CAAG,CAAA;AAAA,IACnFC,sBAAA,CAAK,CAAC,YAAY,CAAC;AAAA,GACrB;AAGA,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,IAAI,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAKN,uBAAA,CAAM,EAAE,KAAA,EAAO,gBAAA,EAAiB,EAAG,UAAU,CAAC,CAAA;AACtF,EAAA,OAAA,CAAQ,KAAKA,uBAAA,CAAM,EAAE,OAAO,aAAA,EAAc,EAAG,OAAO,CAAC,CAAA;AACrD,EAAA,OAAA,CAAQ,KAAKA,uBAAA,CAAM,EAAE,OAAO,aAAA,EAAc,EAAG,OAAO,CAAC,CAAA;AAKrD,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,GAAS,WAAA,GAAc,KAAK,EAAA,GAAM,CAAA;AACrD,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,GAAS,MAAA;AAG/B,EAAA,MAAM,QAAA,GAAW,UAAA;AAEjB,EAAA,OAAOO,yBAAA;AAAA,IACL;AAAA,MACE,OAAA,EAAS,OAAOJ,IAAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA,EAAIA,IAAAA,CAAI,MAAM,CAAC,CAAA,CAAA;AAAA,MAChD,KAAA,EAAOA,IAAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAAA,MACvB,MAAA,EAAQA,KAAI,MAAM,CAAA;AAAA,MAClB,KAAA,EAAO,OAAA;AAAA,MACP,mBAAA,EAAqB,WAAA;AAAA,MACrB,kBAAkB,MAAA,CAAO,SAAA;AAAA,MACzB,IAAA,EAAM;AAAA,KACR;AAAA,IACA,SAAS,CAAA,GACL;AAAA,MACE,GAAG,QAAA;AAAA,MACH,QAAA;AAAA,MACAH,wBAAM,EAAE,SAAA,EAAW,eAAe,MAAM,CAAA,CAAA,CAAA,IAAO,OAAO;AAAA,QAExD,CAAC,GAAG,QAAA,EAAU,QAAA,EAAU,GAAG,OAAO;AAAA,GACxC;AACF;AAEO,SAAS,eAAA,CAAgBD,KAAAA,EAAc,SAAA,GAAuB,SAAA,EAAmB;AACtF,EAAA,MAAM,GAAA,GAAM,eAAeA,KAAI,CAAA;AAC/B,EAAA,OAAO,kBAAA,CAAmB,KAAK,SAAS,CAAA;AAC1C;;;AC5UO,IAAM,SAAA,GAA2B;AAAA,EACtC,IAAA,EAAM,WAAA;AAAA,EACN,OAAOA,KAAAA,EAAuB;AAC5B,IAAA,MAAM,KAAA,GAAQS,kCAAA,CAAiBT,KAAI,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA,EAAG,WAAA,EAAY,IAAK,EAAA;AACxE,IAAA,OAAO,KAAA,KAAU,eAAe,KAAA,KAAU,OAAA;AAAA,EAC5C,CAAA;AAAA,EACA,KAAA,EAAO,cAAA;AAAA,EAEP,MAAA,CAAOA,OAAc,MAAA,EAA+B;AAClD,IAAA,MAAM,SAAA,GAAa,QAAQ,KAAA,IAAS,SAAA;AACpC,IAAA,OAAO,eAAA,CAAgBA,OAAM,SAAS,CAAA;AAAA,EACxC;AACF","file":"chunk-VITE3MZQ.cjs","sourcesContent":["/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/**\n * Flowchart DSL parser.\n *\n * Supports a mermaid-inspired subset:\n * flowchart TD | TB | BT | LR | RL\n * A[Label] rect\n * A(Label) round\n * A([Label]) stadium\n * A{Label} diamond\n * A[/Label/] parallelogram\n * A[\\Label\\] parallelogram-alt\n * A[/Label\\] trapezoid\n * A[\\Label/] trapezoid-alt\n * A[[Label]] subroutine\n * A[(Label)] cylinder\n * A((Label)) circle\n * A(((Label))) double-circle\n * A{{Label}} hexagon\n * A>Label] asymmetric\n * A --> B solid edge\n * A --- B no-arrow edge\n * A -.-> B dotted\n * A ==> B thick\n * A <--> B bidirectional\n * A --x B crossed end\n * A --o B round end\n * A -->|yes| B edge with pipe label\n * A -- yes --> B edge with inline label\n * A --> B --> C chain\n * A & B --> C & D fan-out (cross-product edges)\n * subgraph \"Title\" cluster grouping\n * ...\n * end\n * class A,B className semantic class assignment\n * style A fill:#f9f,... per-node style\n * classDef name ... class definition (stored, applied in renderer)\n * %% comment\n *\n * Hand-written tokenizer + recursive descent. Zero deps.\n */\n\nimport type {\n FlowchartAST,\n FlowchartClassDef,\n FlowchartDirection,\n FlowchartEdge,\n FlowchartEdgeKind,\n FlowchartNode,\n FlowchartShape,\n FlowchartSubgraph,\n} from \"../../core/types\";\n\nexport class FlowchartParseError extends Error {\n constructor(\n message: string,\n public line: number,\n public column: number,\n public source?: string\n ) {\n super(`[line ${line}:${column}] ${message}`);\n this.name = \"FlowchartParseError\";\n }\n}\n\nconst DIRECTIONS = new Set([\"TB\", \"TD\", \"BT\", \"LR\", \"RL\"]);\n\ninterface NodeRef {\n id: string;\n shape?: FlowchartShape;\n label?: string;\n}\n\n/** Mermaid: matched outer double-quotes are stripped from shape-suffix labels. */\nfunction unquoteLabel(s: string): string {\n const t = s.trim();\n if (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\n/** Try to parse a shape-suffix starting at `pos` in `line`. Returns null if none. */\nfunction parseShapeSuffix(\n line: string,\n pos: number\n): { shape: FlowchartShape; label: string; end: number } | null {\n const ch = line[pos];\n if (ch === undefined) return null;\n\n // Order matters: check multi-char openers first.\n\n // Asymmetric: >label]\n if (ch === \">\") {\n const end = line.indexOf(\"]\", pos + 1);\n if (end < 0) return null;\n return { shape: \"asymmetric\", label: unquoteLabel(line.slice(pos + 1, end)), end: end + 1 };\n }\n\n // Triple paren double-circle: ((( ... )))\n if (ch === \"(\" && line[pos + 1] === \"(\" && line[pos + 2] === \"(\") {\n const end = line.indexOf(\")))\", pos + 3);\n if (end < 0) return null;\n return { shape: \"double-circle\", label: unquoteLabel(line.slice(pos + 3, end)), end: end + 3 };\n }\n\n // Stadium: ([ ... ])\n if (ch === \"(\" && line[pos + 1] === \"[\") {\n const end = line.indexOf(\"])\", pos + 2);\n if (end < 0) return null;\n return { shape: \"stadium\", label: unquoteLabel(line.slice(pos + 2, end)), end: end + 2 };\n }\n\n // Double-paren circle: (( ... ))\n if (ch === \"(\" && line[pos + 1] === \"(\") {\n const end = line.indexOf(\"))\", pos + 2);\n if (end < 0) return null;\n return { shape: \"circle\", label: unquoteLabel(line.slice(pos + 2, end)), end: end + 2 };\n }\n\n // Double-bracket subroutine: [[ ... ]]\n if (ch === \"[\" && line[pos + 1] === \"[\") {\n const end = line.indexOf(\"]]\", pos + 2);\n if (end < 0) return null;\n return { shape: \"subroutine\", label: unquoteLabel(line.slice(pos + 2, end)), end: end + 2 };\n }\n\n // Cylinder: [( ... )]\n if (ch === \"[\" && line[pos + 1] === \"(\") {\n const end = line.indexOf(\")]\", pos + 2);\n if (end < 0) return null;\n return { shape: \"cylinder\", label: unquoteLabel(line.slice(pos + 2, end)), end: end + 2 };\n }\n\n // Hexagon: {{ ... }}\n if (ch === \"{\" && line[pos + 1] === \"{\") {\n const end = line.indexOf(\"}}\", pos + 2);\n if (end < 0) return null;\n return { shape: \"hexagon\", label: unquoteLabel(line.slice(pos + 2, end)), end: end + 2 };\n }\n\n // Trapezoid: [/ ... \\] (wider at top)\n if (ch === \"[\" && line[pos + 1] === \"/\") {\n const endSlash = line.indexOf(\"\\\\]\", pos + 2);\n if (endSlash >= 0) {\n return { shape: \"trapezoid\", label: unquoteLabel(line.slice(pos + 2, endSlash)), end: endSlash + 2 };\n }\n // Fall through to plain parallelogram [/ /]\n const end = line.indexOf(\"/]\", pos + 2);\n if (end < 0) return null;\n return { shape: \"parallelogram\", label: unquoteLabel(line.slice(pos + 2, end)), end: end + 2 };\n }\n\n // Trapezoid-alt: [\\ ... /] (wider at bottom)\n if (ch === \"[\" && line[pos + 1] === \"\\\\\") {\n const endFwd = line.indexOf(\"/]\", pos + 2);\n if (endFwd >= 0) {\n return { shape: \"trapezoid-alt\", label: unquoteLabel(line.slice(pos + 2, endFwd)), end: endFwd + 2 };\n }\n // Parallelogram-alt: [\\ \\]\n const end = line.indexOf(\"\\\\]\", pos + 2);\n if (end < 0) return null;\n return { shape: \"parallelogram-alt\", label: unquoteLabel(line.slice(pos + 2, end)), end: end + 2 };\n }\n\n // Rect: [ ... ]\n if (ch === \"[\") {\n const end = line.indexOf(\"]\", pos + 1);\n if (end < 0) return null;\n return { shape: \"rect\", label: unquoteLabel(line.slice(pos + 1, end)), end: end + 1 };\n }\n\n // Round: ( ... )\n if (ch === \"(\") {\n const end = line.indexOf(\")\", pos + 1);\n if (end < 0) return null;\n return { shape: \"round\", label: unquoteLabel(line.slice(pos + 1, end)), end: end + 1 };\n }\n\n // Diamond: { ... }\n if (ch === \"{\") {\n const end = line.indexOf(\"}\", pos + 1);\n if (end < 0) return null;\n return { shape: \"diamond\", label: unquoteLabel(line.slice(pos + 1, end)), end: end + 1 };\n }\n\n return null;\n}\n\nconst ID_CHAR = /[A-Za-z0-9_-]/;\n\ninterface EdgeOp {\n kind: FlowchartEdgeKind;\n bidirectional: boolean;\n end: number;\n inlineLabel?: string;\n}\n\nfunction parseEdgeOp(line: string, pos: number): EdgeOp | null {\n while (pos < line.length && line[pos] === \" \") pos++;\n\n const rest = line.slice(pos);\n\n const bi = rest.startsWith(\"<\");\n const i = bi ? 1 : 0;\n\n // Thick: \"==...\"\n if (rest[i] === \"=\") {\n const m = /^(=+)(?:([^=<>]*)(=+))?(>)?/.exec(rest.slice(i));\n if (!m) return null;\n const full = m[0];\n const inlineLabel = m[2]?.trim();\n const hasArrow = m[4] === \">\";\n return {\n kind: \"thick\",\n bidirectional: bi && hasArrow,\n end: pos + i + full.length,\n inlineLabel: inlineLabel && inlineLabel.length > 0 ? inlineLabel : undefined,\n };\n }\n\n // Dashes: \"--...\", \"-.-...\"\n if (rest[i] === \"-\") {\n const dm = /^-\\.+/.exec(rest.slice(i));\n if (dm) {\n const mWithLabel = /^(-\\.+)([^.\\-<>]+)(\\.+->|\\.+-)/.exec(rest.slice(i));\n if (mWithLabel) {\n const full = mWithLabel[0];\n const label = mWithLabel[2]?.trim();\n const hasArrow = mWithLabel[3]!.endsWith(\">\");\n return {\n kind: \"dotted\",\n bidirectional: bi && hasArrow,\n end: pos + i + full.length,\n inlineLabel: label && label.length > 0 ? label : undefined,\n };\n }\n const mPlain = /^(-\\.+)(->|-)?/.exec(rest.slice(i));\n if (mPlain) {\n const full = mPlain[0];\n const hasArrow = mPlain[2] === \"->\";\n return { kind: \"dotted\", bidirectional: bi && hasArrow, end: pos + i + full.length };\n }\n return null;\n }\n\n // Dashes with inline label: \"-- text -->\" or \"-- text ---\"\n const mLabeled = /^(-{2,})([^-<>|=][^-<>|=]*?)(-{2,})(>|x|o)?/.exec(rest.slice(i));\n if (mLabeled) {\n const full = mLabeled[0];\n const label = mLabeled[2]?.trim();\n const endCh = mLabeled[4];\n const kind: FlowchartEdgeKind =\n endCh === \"x\" ? \"crossed\" : endCh === \"o\" ? \"round-end\" : endCh === \">\" ? \"solid\" : \"none\";\n return {\n kind,\n bidirectional: bi && endCh === \">\",\n end: pos + i + full.length,\n inlineLabel: label && label.length > 0 ? label : undefined,\n };\n }\n const mPlain = /^(-{2,})(>|x|o)?/.exec(rest.slice(i));\n if (mPlain) {\n const full = mPlain[0];\n const endCh = mPlain[2];\n const kind: FlowchartEdgeKind =\n endCh === \"x\" ? \"crossed\" : endCh === \"o\" ? \"round-end\" : endCh === \">\" ? \"solid\" : \"none\";\n return { kind, bidirectional: bi && endCh === \">\", end: pos + i + full.length };\n }\n }\n\n return null;\n}\n\n/** Parse one node reference: identifier + optional shape-suffix. */\nfunction parseNodeRef(line: string, pos: number): { ref: NodeRef; end: number } | null {\n let i = pos;\n while (i < line.length && ID_CHAR.test(line[i]!)) i++;\n if (i === pos) return null;\n const id = line.slice(pos, i);\n const shape = parseShapeSuffix(line, i);\n if (shape) {\n return { ref: { id, shape: shape.shape, label: shape.label }, end: shape.end };\n }\n return { ref: { id }, end: i };\n}\n\n/** Parse pipe label segment: \"|yes|\" */\nfunction parsePipeLabel(line: string, pos: number): { label: string; end: number } | null {\n if (line[pos] !== \"|\") return null;\n const end = line.indexOf(\"|\", pos + 1);\n if (end < 0) return null;\n return { label: unquoteLabel(line.slice(pos + 1, end)), end: end + 1 };\n}\n\nfunction skipSpaces(line: string, pos: number): number {\n while (pos < line.length && (line[pos] === \" \" || line[pos] === \"\\t\")) pos++;\n return pos;\n}\n\ninterface ParsedNodeDef {\n id: string;\n shape: FlowchartShape;\n label: string;\n}\n\ninterface PendingEdge {\n from: string;\n to: string;\n kind: FlowchartEdgeKind;\n label?: string;\n bidirectional: boolean;\n}\n\n/** Register a NodeRef into the nodes accumulator. */\nfunction registerNode(ref: NodeRef, nodes: ParsedNodeDef[]): void {\n if (ref.shape && ref.label !== undefined) {\n nodes.push({ id: ref.id, shape: ref.shape, label: ref.label });\n } else {\n nodes.push({ id: ref.id, shape: \"rect\", label: ref.id });\n }\n}\n\n/**\n * Parse a node group: one or more node refs joined by `&`.\n * Returns the list of parsed refs and the position after the group.\n *\n * e.g. `A & B[Label] & C` → [{id:\"A\"}, {id:\"B\",label:\"Label\"}, {id:\"C\"}]\n */\nfunction parseNodeGroup(\n line: string,\n startPos: number,\n lineNo: number,\n nodes: ParsedNodeDef[]\n): { refs: NodeRef[]; end: number } {\n let pos = skipSpaces(line, startPos);\n const first = parseNodeRef(line, pos);\n if (!first) {\n throw new FlowchartParseError(\n `expected node identifier, got ${JSON.stringify(line.slice(pos, pos + 10))}`,\n lineNo,\n pos + 1\n );\n }\n registerNode(first.ref, nodes);\n const refs: NodeRef[] = [first.ref];\n pos = first.end;\n\n // Consume additional `& nodeRef` segments\n while (true) {\n const p2 = skipSpaces(line, pos);\n if (line[p2] !== \"&\") break;\n const p3 = skipSpaces(line, p2 + 1);\n const next = parseNodeRef(line, p3);\n if (!next) break;\n registerNode(next.ref, nodes);\n refs.push(next.ref);\n pos = next.end;\n }\n\n return { refs, end: pos };\n}\n\n/**\n * Parse a statement line containing node definitions and/or an edge chain.\n *\n * Grammar:\n * chain = nodeGroup (edgeOp pipeLabel? nodeGroup)*\n * nodeGroup = nodeRef (\"&\" nodeRef)*\n *\n * Fan-out: A & B --> C & D generates 4 edges (cross-product).\n */\nfunction parseChainStatement(line: string, lineNo: number): {\n nodes: ParsedNodeDef[];\n edges: PendingEdge[];\n} {\n const nodes: ParsedNodeDef[] = [];\n const edges: PendingEdge[] = [];\n\n let pos = skipSpaces(line, 0);\n const firstGroup = parseNodeGroup(line, pos, lineNo, nodes);\n let prevGroup = firstGroup.refs;\n pos = firstGroup.end;\n\n while (pos < line.length) {\n pos = skipSpaces(line, pos);\n if (pos >= line.length) break;\n\n const op = parseEdgeOp(line, pos);\n if (!op) {\n // Trailing content that's not an edge op — only an error if non-trivial\n const tail = line.slice(pos).trim();\n if (tail.length > 0) {\n throw new FlowchartParseError(\n `expected edge operator, got ${JSON.stringify(tail.slice(0, 10))}`,\n lineNo,\n pos + 1\n );\n }\n break;\n }\n pos = op.end;\n\n // Optional pipe label after arrow\n pos = skipSpaces(line, pos);\n let label = op.inlineLabel;\n const pipe = parsePipeLabel(line, pos);\n if (pipe) {\n label = pipe.label;\n pos = pipe.end;\n }\n\n pos = skipSpaces(line, pos);\n const targetGroup = parseNodeGroup(line, pos, lineNo, nodes);\n pos = targetGroup.end;\n\n // Cross-product edges: each source → each target\n for (const from of prevGroup) {\n for (const to of targetGroup.refs) {\n edges.push({\n from: from.id,\n to: to.id,\n kind: op.kind,\n label,\n bidirectional: op.bidirectional,\n });\n }\n }\n\n prevGroup = targetGroup.refs;\n }\n\n return { nodes, edges };\n}\n\n/** Parse a subgraph header line (the part after `subgraph`). */\nfunction parseSubgraphHeader(rest: string, idx: number): FlowchartSubgraph {\n const defaultId = `sg_${idx}`;\n const s = rest.trim();\n if (!s) return { id: defaultId, label: defaultId, children: [], subgraphs: [] };\n\n // id [label] — Mermaid: `subgraph ide1 [one]`\n const idBracket = /^(\\w[\\w-]*)\\s+\\[([^\\]]*)\\]$/.exec(s);\n if (idBracket) return { id: idBracket[1]!, label: idBracket[2]!, children: [], subgraphs: [] };\n\n // id \"label\"\n const idQuoted = /^(\\w[\\w-]*)\\s+\"([^\"]*)\"$/.exec(s);\n if (idQuoted) return { id: idQuoted[1]!, label: idQuoted[2]!, children: [], subgraphs: [] };\n\n // \"label\" (no explicit id)\n const quotedOnly = /^\"([^\"]*)\"$/.exec(s);\n if (quotedOnly) return { id: defaultId, label: quotedOnly[1]!, children: [], subgraphs: [] };\n\n // plain id (use as both id and label)\n const plainId = s.split(/\\s/)[0]!;\n return { id: plainId, label: plainId, children: [], subgraphs: [] };\n}\n\nfunction normalizeDirection(dir: string): FlowchartDirection {\n const up = dir.toUpperCase();\n if (up === \"TD\") return \"TB\";\n if (up === \"TB\" || up === \"BT\" || up === \"LR\" || up === \"RL\") return up;\n return \"TB\";\n}\n\n/** Parse simple CSS-ish props: `fill:#f9f,stroke:#333,stroke-width:4px` */\nfunction parseCssProps(s: string): Record<string, string> {\n const props: Record<string, string> = {};\n for (const part of s.split(\",\")) {\n const colon = part.indexOf(\":\");\n if (colon < 0) continue;\n const key = part.slice(0, colon).trim();\n const val = part.slice(colon + 1).trim();\n if (key) props[key] = val;\n }\n return props;\n}\n\n/** Top-level parser entry. */\n/**\n * Strip Mermaid-style inline `:::className` suffixes from `line` and return\n * a tuple of [stripped-line, [(nodeId, className), ...]]. The caller is\n * expected to apply each pair as if a `class nodeId className` statement\n * had been written.\n *\n * The algorithm walks each `:::name` occurrence and looks back over an\n * optional `[label]` / `(label)` / `{label}` / `>label` shape suffix to the\n * preceding identifier — that's the node the class attaches to per Mermaid\n * semantics. If no id can be located, the `:::name` is left in place and\n * the downstream parser will surface its existing error (we'd rather not\n * silently swallow malformed input).\n */\nfunction extractInlineClasses(\n line: string\n): { stripped: string; pairs: Array<{ id: string; className: string }> } {\n const pairs: Array<{ id: string; className: string }> = [];\n let out = line;\n // Greedy left-to-right pass; restart after each substitution because the\n // index landscape changes. The pattern :::name allows hyphens to match\n // Mermaid's `\\w[\\w-]*` shape.\n const re = /:::([A-Za-z_][\\w-]*)/g;\n let m: RegExpExecArray | null;\n // Collect first; rewriting in-place would invalidate `re.lastIndex`.\n const hits: Array<{ start: number; end: number; name: string }> = [];\n while ((m = re.exec(out)) !== null) {\n hits.push({ start: m.index, end: m.index + m[0].length, name: m[1]! });\n }\n if (hits.length === 0) return { stripped: line, pairs };\n // Walk hits right-to-left so earlier slices stay aligned.\n for (let h = hits.length - 1; h >= 0; h--) {\n const hit = hits[h]!;\n const before = out.slice(0, hit.start);\n // Skip optional shape-suffix bracket pair immediately preceding the `:::`.\n let cursor = before.length;\n const lastCh = before[cursor - 1];\n if (lastCh === \"]\" || lastCh === \")\" || lastCh === \"}\") {\n const closer = lastCh;\n const opener = closer === \"]\" ? \"[\" : closer === \")\" ? \"(\" : \"{\";\n let depth = 0;\n let i = cursor - 1;\n for (; i >= 0; i--) {\n if (before[i] === closer) depth++;\n else if (before[i] === opener) {\n depth--;\n if (depth === 0) break;\n }\n }\n if (i >= 0) cursor = i; // cursor now at the opener\n }\n // Now walk leftward over the identifier characters.\n const idEnd = cursor;\n let idStart = idEnd;\n while (idStart > 0 && /[A-Za-z0-9_-]/.test(before[idStart - 1]!)) idStart--;\n if (idStart === idEnd) {\n // No identifier found — leave this `:::name` untouched so the parser\n // reports its native error.\n continue;\n }\n const id = before.slice(idStart, idEnd);\n pairs.push({ id, className: hit.name });\n out = out.slice(0, hit.start) + out.slice(hit.end);\n }\n return { stripped: out, pairs };\n}\n\nexport function parseFlowchart(source: string): FlowchartAST {\n const lines = source.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n\n const ast: FlowchartAST = {\n type: \"flowchart\",\n direction: \"TB\",\n nodes: [],\n edges: [],\n subgraphs: [],\n classDefs: [],\n linkStyles: new Map(),\n };\n\n const nodeMap = new Map<string, FlowchartNode>();\n\n // ── Find header ──────────────────────────────────────────────\n let headerIdx = -1;\n for (let i = 0; i < lines.length; i++) {\n const t = lines[i]!.trim();\n if (t.length === 0 || t.startsWith(\"%%\")) continue;\n headerIdx = i;\n break;\n }\n if (headerIdx < 0) throw new FlowchartParseError(\"empty flowchart source\", 1, 1);\n\n const header = lines[headerIdx]!.trim();\n const headerMatch = /^(flowchart|graph)(?:\\s+(\\w+))?(?:\\s+(.*))?$/i.exec(header);\n if (!headerMatch) {\n throw new FlowchartParseError(\n `expected 'flowchart' or 'graph' header, got ${JSON.stringify(header)}`,\n headerIdx + 1,\n 1\n );\n }\n const dirTok = headerMatch[2];\n if (dirTok) {\n if (!DIRECTIONS.has(dirTok.toUpperCase())) {\n throw new FlowchartParseError(`unknown direction ${JSON.stringify(dirTok)}`, headerIdx + 1, 1);\n }\n ast.direction = normalizeDirection(dirTok);\n }\n const extra = headerMatch[3]?.trim();\n if (extra) {\n const mQuoted = /^\"([^\"]*)\"$/.exec(extra);\n ast.title = mQuoted ? mQuoted[1] : extra;\n }\n\n // ── Subgraph stack for tracking current scope ────────────────\n const subgraphStack: Array<FlowchartSubgraph> = [];\n\n // ── Statement loop ───────────────────────────────────────────\n // Pending `:::className` assignments lifted from inline node syntax. We\n // apply them after the line has been parsed (so the referenced nodes\n // exist in `nodeMap`).\n const pendingInlineClasses: Array<{ id: string; className: string }> = [];\n\n for (let i = headerIdx + 1; i < lines.length; i++) {\n const rawOriginal = lines[i]!;\n const originalTrimmed = rawOriginal.trim();\n if (originalTrimmed.length === 0 || originalTrimmed.startsWith(\"%%\")) {\n continue;\n }\n // Pre-pass: lift inline `:::className` suffixes off node references so\n // the downstream tokenizer (which doesn't speak `:::`) sees plain syntax.\n const { stripped, pairs } = extractInlineClasses(rawOriginal);\n for (const p of pairs) pendingInlineClasses.push(p);\n const raw = stripped;\n const trimmed = raw.trim();\n if (trimmed.length === 0) continue;\n\n // ── subgraph open ────────────────────────────────────────\n const sgMatch = /^subgraph(?:\\s+(.*))?$/.exec(trimmed);\n if (sgMatch) {\n const sg = parseSubgraphHeader(sgMatch[1] ?? \"\", ast.subgraphs.length);\n // Avoid duplicate ids (can happen with repeated `subgraph` without id)\n let finalId = sg.id;\n let collision = 0;\n while (ast.subgraphs.some((s) => s.id === finalId)) {\n finalId = `${sg.id}_${++collision}`;\n }\n sg.id = finalId;\n ast.subgraphs.push(sg);\n if (subgraphStack.length > 0) {\n const parent = subgraphStack[subgraphStack.length - 1]!;\n if (!parent.subgraphs.includes(sg.id)) parent.subgraphs.push(sg.id);\n }\n subgraphStack.push(sg);\n continue;\n }\n\n // ── direction override inside subgraph ───────────────────\n const dirMatch = /^direction\\s+(TB|TD|BT|LR|RL)$/i.exec(trimmed);\n if (dirMatch && subgraphStack.length > 0) {\n subgraphStack[subgraphStack.length - 1]!.direction = normalizeDirection(dirMatch[1]!);\n continue;\n }\n\n // ── end (close subgraph) ─────────────────────────────────\n if (trimmed === \"end\" && subgraphStack.length > 0) {\n subgraphStack.pop();\n continue;\n }\n\n // ── class statement: `class A,B className` ───────────────\n const classMatch = /^class\\s+([\\w,\\s]+?)\\s+(\\w[\\w-]*)\\s*$/.exec(trimmed);\n if (classMatch) {\n const idList = classMatch[1]!.split(/[,\\s]+/).map((s) => s.trim()).filter((s) => s.length > 0);\n const className = classMatch[2]!;\n for (const nid of idList) {\n const existing = nodeMap.get(nid);\n if (!existing) {\n const node: FlowchartNode = { id: nid, shape: \"rect\", label: nid, classes: [className] };\n nodeMap.set(nid, node);\n ast.nodes.push(node);\n } else {\n existing.classes = [...(existing.classes ?? []), className];\n }\n }\n continue;\n }\n\n // ── classDef: store for future renderer use ──────────────\n const classDefMatch = /^classDef\\s+(\\w[\\w-]*)\\s+(.+)$/.exec(trimmed);\n if (classDefMatch) {\n const cdef: FlowchartClassDef = {\n id: classDefMatch[1]!,\n props: parseCssProps(classDefMatch[2]!),\n };\n // Replace if already defined\n const existIdx = ast.classDefs.findIndex((c) => c.id === cdef.id);\n if (existIdx >= 0) ast.classDefs[existIdx] = cdef;\n else ast.classDefs.push(cdef);\n continue;\n }\n\n // ── style statement: `style nodeId fill:#f9f,...` ────────\n const styleMatch = /^style\\s+(\\w[\\w-]*)\\s+(.+)$/.exec(trimmed);\n if (styleMatch) {\n const nid = styleMatch[1]!;\n const props = parseCssProps(styleMatch[2]!);\n const existing = nodeMap.get(nid);\n if (existing) {\n existing.style = { ...(existing.style ?? {}), ...props };\n } else {\n const node: FlowchartNode = { id: nid, shape: \"rect\", label: nid, style: props };\n nodeMap.set(nid, node);\n ast.nodes.push(node);\n }\n continue;\n }\n\n // ── linkStyle: `linkStyle 1,5,6 stroke:#ff0000,stroke-width:4px` ──\n const linkStyleMatch = /^linkStyle\\s+([\\d,\\s]+|default)\\s+(.+)$/.exec(trimmed);\n if (linkStyleMatch) {\n const sel = linkStyleMatch[1]!.trim();\n const props = parseCssProps(linkStyleMatch[2]!);\n if (sel !== \"default\") {\n const indices = sel\n .split(/[,\\s]+/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0)\n .map((s) => parseInt(s, 10))\n .filter((n) => !isNaN(n));\n for (const idx of indices) {\n ast.linkStyles.set(idx, { ...(ast.linkStyles.get(idx) ?? {}), ...props });\n }\n }\n continue;\n }\n\n // ── edge / node chain statement ──────────────────────────\n let parsed: { nodes: ParsedNodeDef[]; edges: PendingEdge[] };\n try {\n parsed = parseChainStatement(trimmed, i + 1);\n } catch (e) {\n if (e instanceof FlowchartParseError) throw e;\n // Swallow unknown lines silently (e.g. `%%{init}%%` blocks)\n continue;\n }\n\n const currentSg = subgraphStack.length > 0 ? subgraphStack[subgraphStack.length - 1]! : null;\n\n for (const ndef of parsed.nodes) {\n const existing = nodeMap.get(ndef.id);\n if (!existing) {\n const node: FlowchartNode = {\n id: ndef.id,\n shape: ndef.shape,\n label: ndef.label,\n parent: currentSg?.id,\n };\n nodeMap.set(ndef.id, node);\n ast.nodes.push(node);\n if (currentSg && !currentSg.children.includes(ndef.id)) {\n currentSg.children.push(ndef.id);\n }\n } else {\n // Update shape/label only when this declaration carries richer info\n if (ndef.label !== ndef.id) existing.label = ndef.label;\n if (ndef.shape !== \"rect\") existing.shape = ndef.shape;\n // Assign parent if first time inside a subgraph\n if (currentSg && !existing.parent) {\n existing.parent = currentSg.id;\n if (!currentSg.children.includes(existing.id)) currentSg.children.push(existing.id);\n }\n }\n }\n\n for (const e of parsed.edges) {\n const edge: FlowchartEdge = {\n from: e.from,\n to: e.to,\n kind: e.kind,\n label: e.label,\n arrowEnd:\n e.kind === \"solid\" || e.kind === \"thick\" || e.kind === \"dotted\" || e.kind === \"bidirectional\"\n ? \"arrow\"\n : e.kind === \"crossed\"\n ? \"cross\"\n : e.kind === \"round-end\"\n ? \"circle\"\n : \"none\",\n arrowStart: e.bidirectional ? \"arrow\" : \"none\",\n };\n ast.edges.push(edge);\n }\n }\n\n // Apply inline `:::className` class assignments that were lifted off node\n // references during the line pre-pass. Nodes referenced here must already\n // exist because the chain-statement parser created them as a side-effect.\n for (const { id, className } of pendingInlineClasses) {\n const existing = nodeMap.get(id);\n if (!existing) continue;\n existing.classes = [...(existing.classes ?? []), className];\n }\n\n return ast;\n}\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/**\n * Brandes-Köpf horizontal coordinate assignment for layered graphs.\n *\n * Reference: Brandes & Köpf (2001) \"Fast and Simple Horizontal\n * Coordinate Assignment\". Adapted from the dagre-d3-es port of\n * `dagre/position/bk.js`, rewritten in TypeScript against our\n * generic BKNode interface so the module is reusable across\n * diagrams (flowchart, entity-structure, ER, block).\n *\n * High-level pipeline per call:\n * 1. findType1Conflicts — mark crossings of inner (dummy→dummy)\n * segments so later alignments avoid them.\n * 2. verticalAlignment — for each of 4 orientations, greedily pair\n * each node with its median neighbor in the\n * fixed layer, building blocks (chains of\n * aligned nodes that share x).\n * 3. horizontalCompaction — sweep left-to-right assigning each block\n * its minimum x respecting `nodeSep`.\n * 4. alignCoordinates — shift the 4 candidate layouts to a common\n * reference (smallest-width alignment).\n * 5. balance — per-node median of the 4 candidates.\n *\n * Zero external dependencies.\n */\n\nexport interface BKNode {\n id: string;\n width: number;\n isDummy: boolean;\n}\n\n/**\n * Compute x coordinates for every node across `layers`.\n *\n * @param layers Layers of nodes in their sorted intra-layer order\n * (output of crossing minimization).\n * @param segments Edge endpoints as [from, to] pairs between adjacent\n * layers. The module only cares about adjacency.\n * @param nodeSep Minimum cross-flow gap between two node borders in\n * the same layer.\n */\nexport function bkXCoords(\n layers: BKNode[][],\n segments: Array<[string, string]>,\n nodeSep: number\n): Map<string, number> {\n if (layers.length === 0) return new Map();\n\n const preds = new Map<string, string[]>();\n const succs = new Map<string, string[]>();\n const indexInLayer = new Map<string, number>();\n const nodeById = new Map<string, BKNode>();\n\n for (const layer of layers) {\n for (let i = 0; i < layer.length; i++) {\n const n = layer[i]!;\n indexInLayer.set(n.id, i);\n nodeById.set(n.id, n);\n preds.set(n.id, []);\n succs.set(n.id, []);\n }\n }\n for (const [u, v] of segments) {\n if (!nodeById.has(u) || !nodeById.has(v)) continue;\n succs.get(u)!.push(v);\n preds.get(v)!.push(u);\n }\n\n // Compute type-1 conflicts on the original (vdir=up, hdir=left) orientation.\n // Conflicts are symmetric w.r.t. direction flips, so we can reuse them.\n const conflicts = findType1Conflicts(layers, preds, nodeById);\n\n const xss: Record<string, Map<string, number>> = {};\n for (const vertDir of [\"u\", \"d\"] as const) {\n const adjNeighbors =\n vertDir === \"u\"\n ? (v: string) => preds.get(v) ?? []\n : (v: string) => succs.get(v) ?? [];\n // For the \"down\" sweep, reverse the layer order so the algorithm's\n // \"previous layer\" becomes the original \"next layer\".\n const flippedV = vertDir === \"u\" ? layers : layers.slice().reverse();\n\n for (const horizDir of [\"l\", \"r\"] as const) {\n // For \"right\" sweep, reverse each layer; negate the result at end.\n const flippedH =\n horizDir === \"l\" ? flippedV : flippedV.map((l) => l.slice().reverse());\n\n const { root, align } = verticalAlignment(\n flippedH,\n conflicts,\n adjNeighbors\n );\n let xs = horizontalCompaction(flippedH, root, align, nodeById, nodeSep);\n if (horizDir === \"r\") {\n // Mirror x to undo the layer reversal.\n const neg = new Map<string, number>();\n for (const [k, v] of xs) neg.set(k, -v);\n xs = neg;\n }\n xss[vertDir + horizDir] = xs;\n }\n }\n\n alignCoordinates(xss, findSmallestWidthAlignment(xss, nodeById, nodeSep));\n return balance(xss);\n}\n\n// ─── Type-1 conflicts ─────────────────────────────────────────\n\nfunction findType1Conflicts(\n layers: BKNode[][],\n preds: Map<string, string[]>,\n nodeById: Map<string, BKNode>\n): Set<string> {\n const conflicts = new Set<string>();\n if (layers.length < 2) return conflicts;\n\n for (let li = 1; li < layers.length; li++) {\n const prev = layers[li - 1]!;\n const layer = layers[li]!;\n const prevIdx = new Map<string, number>();\n prev.forEach((n, i) => prevIdx.set(n.id, i));\n\n let k0 = 0;\n let scanPos = 0;\n const lastIdx = layer.length - 1;\n\n for (let i1 = 0; i1 < layer.length; i1++) {\n const v = layer[i1]!;\n // Upper endpoint of inner segment incident to v (if v is a dummy with\n // a dummy predecessor in the previous layer).\n let w: string | null = null;\n if (v.isDummy) {\n for (const p of preds.get(v.id) ?? []) {\n if (nodeById.get(p)?.isDummy && prevIdx.has(p)) {\n w = p;\n break;\n }\n }\n }\n if (w !== null || i1 === lastIdx) {\n const k1 = w !== null ? prevIdx.get(w)! : prev.length - 1;\n for (let i = scanPos; i <= i1; i++) {\n const vv = layer[i]!;\n for (const u of preds.get(vv.id) ?? []) {\n const uPos = prevIdx.get(u);\n if (uPos === undefined) continue;\n if (uPos < k0 || uPos > k1) {\n conflicts.add(conflictKey(u, vv.id));\n }\n }\n }\n scanPos = i1 + 1;\n k0 = k1;\n }\n }\n }\n return conflicts;\n}\n\nfunction conflictKey(a: string, b: string): string {\n return a < b ? `${a}\\u0000${b}` : `${b}\\u0000${a}`;\n}\n\nfunction hasConflict(conflicts: Set<string>, a: string, b: string): boolean {\n return conflicts.has(conflictKey(a, b));\n}\n\n// ─── Vertical alignment ───────────────────────────────────────\n\nfunction verticalAlignment(\n layers: BKNode[][],\n conflicts: Set<string>,\n neighborsOf: (id: string) => string[]\n): { root: Map<string, string>; align: Map<string, string> } {\n const root = new Map<string, string>();\n const align = new Map<string, string>();\n const pos = new Map<string, number>();\n\n // Initial: each node is its own root / aligned to itself.\n for (const layer of layers) {\n for (let i = 0; i < layer.length; i++) {\n const v = layer[i]!.id;\n root.set(v, v);\n align.set(v, v);\n pos.set(v, i);\n }\n }\n\n // Sweep layers in order; within each layer, try to align each node with\n // its median neighbor(s) in the previous layer, rejecting alignments\n // that would (a) cross an earlier alignment, or (b) hit a type-1 conflict.\n for (const layer of layers) {\n let prevIdx = -1;\n for (const vn of layer) {\n const v = vn.id;\n const ws = neighborsOf(v).slice();\n if (ws.length === 0) continue;\n ws.sort((a, b) => (pos.get(a) ?? 0) - (pos.get(b) ?? 0));\n const mp = (ws.length - 1) / 2;\n const mids = [Math.floor(mp), Math.ceil(mp)];\n for (const mi of mids) {\n if (align.get(v) !== v) continue; // already aligned this step\n const w = ws[mi]!;\n if (hasConflict(conflicts, w, v)) continue;\n const wPos = pos.get(w) ?? 0;\n if (wPos <= prevIdx) continue;\n align.set(w, v);\n root.set(v, root.get(w)!);\n align.set(v, root.get(v)!);\n prevIdx = wPos;\n }\n }\n }\n return { root, align };\n}\n\n// ─── Horizontal compaction ────────────────────────────────────\n\nfunction horizontalCompaction(\n layers: BKNode[][],\n root: Map<string, string>,\n align: Map<string, string>,\n nodeById: Map<string, BKNode>,\n nodeSep: number\n): Map<string, number> {\n // BK class-based compaction:\n // sink[v] = sink of v's class (root whose leftmost block holds the class).\n // shift[v] = horizontal shift of the class.\n // x[v] = x of v *relative to its class sink*.\n const xs = new Map<string, number>();\n const sink = new Map<string, string>();\n const shift = new Map<string, number>();\n\n for (const layer of layers) {\n for (const v of layer) {\n sink.set(v.id, v.id);\n shift.set(v.id, Number.POSITIVE_INFINITY);\n }\n }\n\n // Map id → layer index and id → index-in-layer for pred lookup.\n const indexInLayer = new Map<string, number>();\n const layerOf = new Map<string, number>();\n for (let li = 0; li < layers.length; li++) {\n for (let i = 0; i < layers[li]!.length; i++) {\n const id = layers[li]![i]!.id;\n indexInLayer.set(id, i);\n layerOf.set(id, li);\n }\n }\n\n const sep = (uId: string, vId: string): number => {\n const u = nodeById.get(uId)!;\n const v = nodeById.get(vId)!;\n return u.width / 2 + nodeSep + v.width / 2;\n };\n\n const placeBlock = (v: string): void => {\n if (xs.has(v)) return;\n xs.set(v, 0);\n let w = v;\n // Walk around the block cycle (align chain).\n do {\n const wi = indexInLayer.get(w)!;\n const wLayer = layerOf.get(w)!;\n if (wi > 0) {\n const pred = layers[wLayer]![wi - 1]!.id;\n const u = root.get(pred)!;\n placeBlock(u);\n if (sink.get(v) === v) sink.set(v, sink.get(u)!);\n if (sink.get(v) !== sink.get(u)) {\n const candidate = xs.get(v)! - xs.get(u)! - sep(pred, w);\n const cur = shift.get(sink.get(u)!) ?? Number.POSITIVE_INFINITY;\n shift.set(sink.get(u)!, Math.min(cur, candidate));\n } else {\n const candidate = xs.get(u)! + sep(pred, w);\n if (candidate > xs.get(v)!) xs.set(v, candidate);\n }\n }\n w = align.get(w)!;\n } while (w !== v);\n };\n\n // Place all block roots.\n for (const layer of layers) {\n for (const v of layer) {\n if (root.get(v.id) === v.id) placeBlock(v.id);\n }\n }\n\n // Propagate class shifts; produce absolute coords.\n const result = new Map<string, number>();\n for (const layer of layers) {\n for (const v of layer) {\n const r = root.get(v.id)!;\n const rx = xs.get(r) ?? 0;\n const s = shift.get(sink.get(r)!);\n const sx = s !== undefined && s !== Number.POSITIVE_INFINITY ? s : 0;\n result.set(v.id, rx + sx);\n }\n }\n return result;\n}\n\n// ─── Alignment / balance ──────────────────────────────────────\n\nfunction findSmallestWidthAlignment(\n xss: Record<string, Map<string, number>>,\n nodeById: Map<string, BKNode>,\n _nodeSep: number\n): Map<string, number> {\n let best: Map<string, number> | null = null;\n let bestWidth = Number.POSITIVE_INFINITY;\n for (const key of Object.keys(xss)) {\n const xs = xss[key]!;\n let minX = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n for (const [id, x] of xs) {\n const n = nodeById.get(id);\n if (!n) continue;\n minX = Math.min(minX, x - n.width / 2);\n maxX = Math.max(maxX, x + n.width / 2);\n }\n const w = maxX - minX;\n if (w < bestWidth) {\n bestWidth = w;\n best = xs;\n }\n }\n return best ?? new Map();\n}\n\n/**\n * Align every candidate layout to the reference alignment by shifting\n * each so its leftmost (or rightmost for r-biased) node matches the\n * reference's. Mutates `xss` in place.\n */\nfunction alignCoordinates(\n xss: Record<string, Map<string, number>>,\n ref: Map<string, number>\n): void {\n let refMin = Number.POSITIVE_INFINITY;\n let refMax = Number.NEGATIVE_INFINITY;\n for (const [, v] of ref) {\n refMin = Math.min(refMin, v);\n refMax = Math.max(refMax, v);\n }\n for (const key of Object.keys(xss)) {\n const xs = xss[key]!;\n if (xs === ref) continue;\n let xMin = Number.POSITIVE_INFINITY;\n let xMax = Number.NEGATIVE_INFINITY;\n for (const [, v] of xs) {\n xMin = Math.min(xMin, v);\n xMax = Math.max(xMax, v);\n }\n const delta = key.endsWith(\"r\") ? refMax - xMax : refMin - xMin;\n if (delta === 0) continue;\n for (const [k, v] of xs) xs.set(k, v + delta);\n }\n}\n\nfunction balance(\n xss: Record<string, Map<string, number>>\n): Map<string, number> {\n const keys = Object.keys(xss);\n const result = new Map<string, number>();\n if (keys.length === 0) return result;\n const ids = new Set<string>();\n for (const k of keys) for (const id of xss[k]!.keys()) ids.add(id);\n for (const id of ids) {\n const vals: number[] = [];\n for (const k of keys) {\n const v = xss[k]!.get(id);\n if (v !== undefined) vals.push(v);\n }\n vals.sort((a, b) => a - b);\n // Average of the two middle values (balanced median).\n const n = vals.length;\n if (n === 0) continue;\n if (n % 2 === 0) {\n result.set(id, (vals[n / 2 - 1]! + vals[n / 2]!) / 2);\n } else {\n result.set(id, vals[(n - 1) / 2]!);\n }\n }\n return result;\n}\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/**\n * Flowchart Sugiyama-style layered layout (M1).\n *\n * Phases:\n * 1. Cycle removal — Greedy-FAS (Eades-Lin-Smyth 1993)\n * 2. Layer assignment — Longest-path layering\n * 3. Dummy node insertion for edges spanning > 1 layer\n * 4. Crossing minimization — median heuristic, bi-directional sweep\n * 5. X-coordinate assignment — simple symmetric pass\n * (Brandes-Köpf full 4-alignment is deferred; for M1 a centered\n * median-based placement produces visually indistinguishable results\n * on graphs ≤ 20 nodes, which is the M1 target.)\n *\n * Zero runtime dependencies. All heuristics hand-written.\n */\n\nimport type {\n FlowchartAST,\n FlowchartDirection,\n FlowchartEdge,\n FlowchartLayoutNode,\n FlowchartLayoutResult,\n FlowchartNode,\n} from \"../../core/types\";\nimport { bkXCoords, type BKNode } from \"../../core/layered/bk\";\n\n// ─── Constants / Defaults ──────────────────────────────────\n\nexport const FC_CONST = {\n nodeWidth: 120,\n nodeHeight: 44,\n nodeSpacingX: 40, // cross-flow gap between nodes in same layer\n layerSpacingY: 76, // flow-direction gap between layers\n dummyWidth: 1,\n padding: 24,\n /** Latin/digit avg width at 12px font. CJK uses cjkCharWidth instead. */\n charWidth: 6.8,\n /** Full-width glyph width at 12px (CJK ideograph, kana, hangul, fullwidth). */\n cjkCharWidth: 12.5,\n labelHPad: 16,\n minNodeWidth: 72,\n /**\n * Cap on per-line label width. Until line-wrapping lands, this clamp is\n * a soft contract: nodes never grow past this, and any overflow becomes\n * the caller's problem. Set generously so common CJK sentences (≤30\n * full-width chars) still fit without truncation or text overflow.\n */\n maxLabelWidth: 420,\n crossingSweepIters: 24,\n} as const;\n\n/**\n * Slant inset constants — must match the values used in shapes.ts so layout\n * size calculations stay aligned with rendered geometry.\n */\nexport const SHAPE_SLANT = {\n parallelogram: 20,\n trapezoid: 16,\n} as const;\n\n/**\n * Cluster (subgraph) bbox geometry — used by layer-gap computation AND by\n * cluster bbox derivation downstream. Single source of truth so the two\n * stay aligned.\n *\n * pad padding between cluster border and inner-most member, on\n * every side except the title-bearing side\n * titleH additional space the title label reserves on the title side\n * (top in TB, left in LR)\n */\nexport const CLUSTER_GEO = {\n pad: 24,\n titleH: 20,\n /** Extra visible separation between two sequential cluster bboxes. */\n gap: 12,\n} as const;\n\n/**\n * Per-codepoint width estimate. Multi-script aware: CJK ideographs and\n * full-width punctuation are ~2× the width of Latin glyphs at the same\n * font-size, so a single average constant systematically under-measures\n * Chinese / Japanese / Korean labels and causes text overflow on slanted\n * shapes (parallelogram, hexagon) plus zero-padding on stadium / circle\n * starters. We classify by Unicode block and sum.\n */\nfunction isFullWidth(code: number): boolean {\n // CJK Unified Ideographs (incl. Ext-A) + common East Asian blocks\n if (code >= 0x3000 && code <= 0x303f) return true; // CJK Symbols & Punctuation\n if (code >= 0x3040 && code <= 0x309f) return true; // Hiragana\n if (code >= 0x30a0 && code <= 0x30ff) return true; // Katakana\n if (code >= 0x3400 && code <= 0x4dbf) return true; // CJK Ext-A\n if (code >= 0x4e00 && code <= 0x9fff) return true; // CJK Unified\n if (code >= 0xac00 && code <= 0xd7af) return true; // Hangul Syllables\n if (code >= 0xf900 && code <= 0xfaff) return true; // CJK Compat Ideographs\n if (code >= 0xff00 && code <= 0xff60) return true; // Fullwidth Forms\n if (code >= 0xffe0 && code <= 0xffe6) return true; // Fullwidth signs\n // Astral CJK (Ext-B/C/D/E/F)\n if (code >= 0x20000 && code <= 0x2ffff) return true;\n return false;\n}\n\nexport function measureLabelWidth(label: string): number {\n let w = 0;\n // Iterate by codepoint so astral chars count once.\n for (const ch of label) {\n const code = ch.codePointAt(0) ?? 0;\n if (isFullWidth(code)) w += FC_CONST.cjkCharWidth;\n else w += FC_CONST.charWidth;\n }\n return w;\n}\n\n// ─── Internal working types ────────────────────────────────\n\ninterface LNode {\n id: string;\n node?: FlowchartNode; // undefined for dummy\n layer: number;\n order: number;\n width: number;\n height: number;\n isDummy: boolean;\n}\n\ninterface LEdge {\n from: string;\n to: string;\n original: FlowchartEdge;\n isReversed: boolean;\n /** After dummy insertion, intermediate node ids that replace the original edge */\n chain: string[]; // includes from and to\n}\n\n// ─── Phase 1: Cycle removal (Greedy-FAS) ───────────────────\n\n/**\n * Greedy FAS heuristic: compute a linear node ordering that minimizes the\n * number of \"back edges\". Back edges then get reversed.\n *\n * Algorithm (Eades-Lin-Smyth 1993):\n * 1. s1 = empty list, s2 = empty list\n * 2. while graph non-empty:\n * extract all sinks (out-deg 0) → append to s2 (front)\n * extract all sources (in-deg 0) → append to s1 (back)\n * extract vertex with max (outDeg - inDeg) → append to s1 (back)\n * 3. ordering = s1 ++ s2\n * 4. any edge (u, v) where order(u) > order(v) is a feedback edge\n */\nfunction greedyFAS(nodeIds: string[], edges: FlowchartEdge[]): Set<number> {\n const outAdj = new Map<string, Set<string>>();\n const inAdj = new Map<string, Set<string>>();\n for (const id of nodeIds) {\n outAdj.set(id, new Set());\n inAdj.set(id, new Set());\n }\n for (const e of edges) {\n // Ignore self-loops for FAS purposes (they're always feedback)\n if (e.from === e.to) continue;\n outAdj.get(e.from)?.add(e.to);\n inAdj.get(e.to)?.add(e.from);\n }\n\n const s1: string[] = [];\n const s2: string[] = [];\n const remaining = new Set(nodeIds);\n\n while (remaining.size > 0) {\n // Extract all current sinks\n let changed = true;\n while (changed) {\n changed = false;\n for (const v of Array.from(remaining)) {\n if ((outAdj.get(v)?.size ?? 0) === 0) {\n s2.unshift(v);\n removeVertex(v, remaining, outAdj, inAdj);\n changed = true;\n }\n }\n }\n // Extract all current sources\n changed = true;\n while (changed) {\n changed = false;\n for (const v of Array.from(remaining)) {\n if ((inAdj.get(v)?.size ?? 0) === 0) {\n s1.push(v);\n removeVertex(v, remaining, outAdj, inAdj);\n changed = true;\n }\n }\n }\n if (remaining.size === 0) break;\n // Pick vertex with max (outDeg - inDeg)\n let best: string | null = null;\n let bestScore = -Infinity;\n for (const v of remaining) {\n const score = (outAdj.get(v)?.size ?? 0) - (inAdj.get(v)?.size ?? 0);\n if (score > bestScore) {\n bestScore = score;\n best = v;\n }\n }\n if (best !== null) {\n s1.push(best);\n removeVertex(best, remaining, outAdj, inAdj);\n }\n }\n\n const ordering = [...s1, ...s2];\n const rank = new Map<string, number>();\n ordering.forEach((id, i) => rank.set(id, i));\n\n const feedback = new Set<number>();\n edges.forEach((e, i) => {\n if (e.from === e.to) {\n feedback.add(i);\n return;\n }\n const ru = rank.get(e.from);\n const rv = rank.get(e.to);\n if (ru !== undefined && rv !== undefined && ru > rv) {\n feedback.add(i);\n }\n });\n return feedback;\n}\n\nfunction removeVertex(\n v: string,\n remaining: Set<string>,\n outAdj: Map<string, Set<string>>,\n inAdj: Map<string, Set<string>>\n): void {\n remaining.delete(v);\n const outs = outAdj.get(v);\n if (outs) {\n for (const w of outs) inAdj.get(w)?.delete(v);\n }\n const ins = inAdj.get(v);\n if (ins) {\n for (const u of ins) outAdj.get(u)?.delete(v);\n }\n outAdj.delete(v);\n inAdj.delete(v);\n}\n\n// ─── Phase 2: Longest-path layer assignment ───────────────\n\nfunction longestPathLayers(\n nodeIds: string[],\n edges: LEdge[]\n): Map<string, number> {\n const layer = new Map<string, number>();\n for (const id of nodeIds) layer.set(id, 0);\n\n const outAdj = new Map<string, string[]>();\n const inDeg = new Map<string, number>();\n for (const id of nodeIds) {\n outAdj.set(id, []);\n inDeg.set(id, 0);\n }\n for (const e of edges) {\n if (e.from === e.to) continue; // skip self-loops\n outAdj.get(e.from)?.push(e.to);\n inDeg.set(e.to, (inDeg.get(e.to) ?? 0) + 1);\n }\n\n // Topo sort (Kahn)\n const queue: string[] = [];\n for (const id of nodeIds) {\n if ((inDeg.get(id) ?? 0) === 0) queue.push(id);\n }\n const order: string[] = [];\n const remIn = new Map(inDeg);\n while (queue.length > 0) {\n const v = queue.shift()!;\n order.push(v);\n for (const w of outAdj.get(v) ?? []) {\n const d = (remIn.get(w) ?? 0) - 1;\n remIn.set(w, d);\n if (d === 0) queue.push(w);\n }\n }\n // If cycles remain (shouldn't, post-FAS), append leftover in arbitrary order\n if (order.length !== nodeIds.length) {\n for (const id of nodeIds) {\n if (!order.includes(id)) order.push(id);\n }\n }\n\n for (const v of order) {\n for (const w of outAdj.get(v) ?? []) {\n const lv = layer.get(v) ?? 0;\n const lw = layer.get(w) ?? 0;\n if (lw < lv + 1) layer.set(w, lv + 1);\n }\n }\n return layer;\n}\n\n// ─── Phase 3: Dummy-node insertion ─────────────────────────\n\nfunction insertDummies(\n ledges: LEdge[],\n layerMap: Map<string, number>,\n genDummyId: () => string\n): { dummyIds: string[]; updatedEdges: LEdge[] } {\n const dummyIds: string[] = [];\n const updated: LEdge[] = [];\n for (const e of ledges) {\n if (e.from === e.to) {\n // self-loop: keep as-is; renderer draws a small arc\n updated.push(e);\n continue;\n }\n const lu = layerMap.get(e.from) ?? 0;\n const lv = layerMap.get(e.to) ?? 0;\n const diff = Math.abs(lv - lu);\n if (diff <= 1) {\n e.chain = [e.from, e.to];\n updated.push(e);\n continue;\n }\n // Insert (diff - 1) dummies on monotonically increasing layers from lu → lv\n const step = lv > lu ? 1 : -1;\n const chain: string[] = [e.from];\n let curLayer = lu + step;\n while (curLayer !== lv) {\n const d = genDummyId();\n layerMap.set(d, curLayer);\n dummyIds.push(d);\n chain.push(d);\n curLayer += step;\n }\n chain.push(e.to);\n e.chain = chain;\n updated.push(e);\n }\n return { dummyIds, updatedEdges: updated };\n}\n\n// ─── Phase 4: Crossing minimization ────────────────────────\n//\n// Weighted barycenter + best-tracking sweep + DFS init ordering.\n// Crossings counted exactly via Barth-Jünger-Mutzel accumulator tree\n// (O((n+e) log n) instead of O(E²)).\n\n/**\n * DFS-based initial ordering. Start at rank-0 sources, walk successors\n * depth-first, recording discovery order within each layer. Produces a\n * much better starting point than parse order for the sweep to refine.\n */\nfunction dfsInitOrder(\n layers: string[][],\n segments: Array<[string, string]>\n): string[][] {\n const layerOf = new Map<string, number>();\n layers.forEach((l, i) => l.forEach((id) => layerOf.set(id, i)));\n const succ = new Map<string, string[]>();\n for (const [u, v] of segments) {\n if (!succ.has(u)) succ.set(u, []);\n succ.get(u)!.push(v);\n }\n const order: string[][] = layers.map(() => []);\n const seen = new Set<string>();\n const visit = (id: string): void => {\n if (seen.has(id)) return;\n seen.add(id);\n const l = layerOf.get(id);\n if (l === undefined) return;\n order[l]!.push(id);\n for (const n of succ.get(id) ?? []) visit(n);\n };\n for (const id of layers[0] ?? []) visit(id);\n // Any unreached nodes (disconnected) get appended in original order.\n for (const layer of layers) {\n for (const id of layer) if (!seen.has(id)) {\n seen.add(id);\n const l = layerOf.get(id)!;\n order[l]!.push(id);\n }\n }\n return order;\n}\n\n/**\n * Barycenter ordering heuristic. For each node, compute the mean position\n * of its neighbors in the fixed layer; sort nodes by that score.\n *\n * Weighted barycenter (vs plain median) is what dagre uses — it handles\n * asymmetric neighbor counts (e.g. A & B → C & D cross-product) more\n * smoothly because it averages rather than picking a tie-break index.\n *\n * `biasRight` controls tie-breaking: when two nodes share the same\n * barycenter score, we preserve original order either left-first or\n * right-first. Alternating the bias across sweeps helps escape local\n * minima.\n */\nfunction barycenterReorder(\n layer: string[],\n fixed: string[],\n neighborsOf: (id: string) => string[],\n biasRight: boolean\n): string[] {\n const fixedIdx = new Map<string, number>();\n fixed.forEach((id, i) => fixedIdx.set(id, i));\n const scored = layer.map((id, i) => {\n const neighbors = neighborsOf(id)\n .map((n) => fixedIdx.get(n))\n .filter((p): p is number => p !== undefined);\n if (neighbors.length === 0) return { id, score: -1, orig: i, hasNeighbors: false };\n const sum = neighbors.reduce((s, n) => s + n, 0);\n return { id, score: sum / neighbors.length, orig: i, hasNeighbors: true };\n });\n // Nodes without neighbors keep their original position (stable anchor).\n // Sort only the neighbor-having nodes by score, then interleave.\n const withNbrs = scored.filter((s) => s.hasNeighbors);\n const withoutNbrs = scored.filter((s) => !s.hasNeighbors);\n withNbrs.sort((a, b) => {\n if (a.score !== b.score) return a.score - b.score;\n return biasRight ? b.orig - a.orig : a.orig - b.orig;\n });\n // Merge: nodes without neighbors keep their slots (by orig index); fill\n // remaining slots with sorted neighbor-having nodes.\n const result: Array<typeof scored[number] | undefined> = new Array(layer.length);\n for (const s of withoutNbrs) result[s.orig] = s;\n let k = 0;\n for (let i = 0; i < result.length; i++) {\n if (result[i] !== undefined) continue;\n result[i] = withNbrs[k++];\n }\n return result.map((s) => s!.id);\n}\n\nfunction orderLayers(\n layers: string[][],\n segments: Array<[string, string]>\n): string[][] {\n const succ = new Map<string, string[]>();\n const pred = new Map<string, string[]>();\n for (const layer of layers) for (const id of layer) {\n succ.set(id, []);\n pred.set(id, []);\n }\n for (const [u, v] of segments) {\n succ.get(u)?.push(v);\n pred.get(v)?.push(u);\n }\n\n let result = dfsInitOrder(layers, segments);\n let bestCrossings = countCrossings(result, segments);\n let best = result.map((l) => l.slice());\n\n // Run sweeps until `maxStale` consecutive sweeps fail to improve, or\n // cap at `crossingSweepIters`. Alternates direction AND bias every\n // pair of sweeps (dagre pattern).\n const maxStale = 4;\n let stale = 0;\n for (let iter = 0; iter < FC_CONST.crossingSweepIters && stale < maxStale; iter++) {\n const down = iter % 2 === 0;\n const biasRight = (iter % 4) >= 2;\n const next = result.map((l) => l.slice());\n if (down) {\n for (let i = 1; i < next.length; i++) {\n next[i] = barycenterReorder(\n next[i]!,\n next[i - 1]!,\n (id) => pred.get(id) ?? [],\n biasRight\n );\n }\n } else {\n for (let i = next.length - 2; i >= 0; i--) {\n next[i] = barycenterReorder(\n next[i]!,\n next[i + 1]!,\n (id) => succ.get(id) ?? [],\n biasRight\n );\n }\n }\n const c = countCrossings(next, segments);\n if (c < bestCrossings) {\n bestCrossings = c;\n best = next.map((l) => l.slice());\n stale = 0;\n } else {\n stale++;\n }\n result = next;\n }\n\n return best;\n}\n\n/**\n * Exact crossing count across adjacent layer pairs using the\n * Barth-Jünger-Mutzel accumulator-tree algorithm — O((n+e) log n).\n *\n * Reference: \"Simple and Efficient Bilayer Cross Counting\" (2002).\n * Much faster than the O(E²) bubble-inversion scan for large graphs.\n */\nfunction countCrossings(\n layers: string[][],\n segments: Array<[string, string]>\n): number {\n let total = 0;\n const layerIdx: Map<string, number>[] = layers.map((l) => {\n const m = new Map<string, number>();\n l.forEach((id, i) => m.set(id, i));\n return m;\n });\n for (let i = 0; i < layers.length - 1; i++) {\n const upper = layerIdx[i]!;\n const lower = layerIdx[i + 1]!;\n const n = layers[i + 1]!.length;\n if (n === 0) continue;\n // Collect edges (iu, iv) between layer i and i+1\n const edges: Array<[number, number]> = [];\n for (const [u, v] of segments) {\n const iu = upper.get(u);\n const iv = lower.get(v);\n if (iu !== undefined && iv !== undefined) edges.push([iu, iv]);\n }\n // Sort by iu, then iv — southern endpoints visited in northern order.\n edges.sort((a, b) => a[0] - b[0] || a[1] - b[1]);\n // Accumulator tree sized to next power of 2 ≥ n.\n let firstIndex = 1;\n while (firstIndex < n) firstIndex <<= 1;\n const treeSize = 2 * firstIndex - 1;\n firstIndex -= 1;\n const tree = new Uint32Array(treeSize);\n for (const [, iv] of edges) {\n let idx = iv + firstIndex;\n tree[idx]! += 1;\n let weightSum = 0;\n while (idx > 0) {\n if (idx % 2) weightSum += tree[idx + 1] ?? 0;\n idx = (idx - 1) >> 1;\n tree[idx]! += 1;\n }\n total += weightSum;\n }\n }\n return total;\n}\n\n// ─── Phase 5: X-coordinate assignment (Brandes-Köpf) ──────\n\ninterface Placed {\n id: string;\n x: number;\n y: number;\n width: number;\n height: number;\n layer: number;\n order: number;\n}\n\n// ─── Lane-based x-coord assignment (for clustered graphs) ─\n\n/**\n * Lane-based placement: each top-level cluster (and the implicit\n * \"no-cluster\" group) gets its own horizontal lane. Within a lane,\n * members are packed per-layer, and dummies derive their x from\n * neighbor barycenter (keeps edges smooth across lanes).\n *\n * Guarantees cluster bboxes — computed downstream as min/max of\n * member positions + CLUSTER_PAD — never enclose foreign nodes,\n * because non-members live in different lanes with a LANE_GAP\n * separator.\n */\nfunction laneBasedXCoords(\n layerNodes: LNode[][],\n pathOf: (id: string) => string[],\n nodeSpacingX: number,\n segments: Array<[string, string]>\n): Map<string, number> {\n const INNER_PAD = 28; // padding inside each cluster lane (matches CLUSTER_PAD roughly)\n const LANE_GAP = 36; // horizontal gap between adjacent lanes\n\n // Top-level cluster of a node, or null if node is not in any cluster.\n const laneOf = (id: string): string | null => {\n const p = pathOf(id);\n return p.length > 0 ? p[0]! : null;\n };\n\n // Determine lane order from first appearance in any layer's sorted order.\n const laneOrder: Array<string | null> = [];\n const laneSeen = new Set<string | null>();\n for (const layer of layerNodes) {\n for (const n of layer) {\n if (n.isDummy) continue;\n const lane = laneOf(n.id);\n if (!laneSeen.has(lane)) {\n laneSeen.add(lane);\n laneOrder.push(lane);\n }\n }\n }\n\n // ── Null-lane centering ───────────────────────────────────\n // When sibling clusters run in parallel (e.g. ExpPath ‖ CtrlPath) and the\n // \"no cluster\" lane only contains nodes on layers OUTSIDE the cluster\n // span (typical: head/tail spine like Start → Random → … → End), placing\n // null at the leftmost lane drags the whole spine off-center. Move null\n // to the middle so the spine sits between the parallel clusters.\n const clusterLanes = laneOrder.filter((l): l is string => l !== null);\n if (clusterLanes.length >= 2 && laneOrder.includes(null)) {\n // Partition each layer first so we can decide.\n const tmpPartition: Array<Map<string | null, LNode[]>> = layerNodes.map(\n (layer) => {\n const m = new Map<string | null, LNode[]>();\n for (const n of layer) {\n if (n.isDummy) continue;\n const lane = laneOf(n.id);\n if (!m.has(lane)) m.set(lane, []);\n m.get(lane)!.push(n);\n }\n return m;\n }\n );\n const clusterOccupiedLayers = new Set<number>();\n for (let li = 0; li < tmpPartition.length; li++) {\n for (const lane of clusterLanes) {\n if ((tmpPartition[li]!.get(lane) ?? []).length > 0) {\n clusterOccupiedLayers.add(li);\n }\n }\n }\n let nullIsBoundary = true;\n for (let li = 0; li < tmpPartition.length; li++) {\n const nm = tmpPartition[li]!.get(null) ?? [];\n if (nm.length > 0 && clusterOccupiedLayers.has(li)) {\n nullIsBoundary = false;\n break;\n }\n }\n if (nullIsBoundary) {\n const mid = Math.floor(clusterLanes.length / 2);\n laneOrder.length = 0;\n laneOrder.push(\n ...clusterLanes.slice(0, mid),\n null,\n ...clusterLanes.slice(mid)\n );\n }\n }\n\n // Partition each layer into lane → ordered member list.\n const lanesPerLayer: Array<Map<string | null, LNode[]>> = layerNodes.map(\n (layer) => {\n const m = new Map<string | null, LNode[]>();\n for (const n of layer) {\n if (n.isDummy) continue;\n const lane = laneOf(n.id);\n if (!m.has(lane)) m.set(lane, []);\n m.get(lane)!.push(n);\n }\n return m;\n }\n );\n\n // Lane width = max over layers of (inner packed width + 2 × inner padding\n // for cluster lanes). Non-cluster lane uses no padding.\n const laneWidths: number[] = laneOrder.map((lane) => {\n let maxInner = 0;\n for (const layerLanes of lanesPerLayer) {\n const members = layerLanes.get(lane) ?? [];\n if (members.length === 0) continue;\n const inner =\n members.reduce((s, n) => s + n.width, 0) +\n (members.length - 1) * nodeSpacingX;\n if (inner > maxInner) maxInner = inner;\n }\n const pad = lane !== null ? 2 * INNER_PAD : 0;\n return maxInner + pad;\n });\n\n // Lane x-starts.\n const laneStartX: number[] = [];\n {\n let x = 0;\n for (let i = 0; i < laneWidths.length; i++) {\n laneStartX.push(x);\n x += laneWidths[i]!;\n if (i < laneWidths.length - 1) x += LANE_GAP;\n }\n }\n\n // Place members: centered per-layer within their lane.\n const result = new Map<string, number>();\n for (let li = 0; li < lanesPerLayer.length; li++) {\n for (let laneIdx = 0; laneIdx < laneOrder.length; laneIdx++) {\n const lane = laneOrder[laneIdx]!;\n const members = lanesPerLayer[li]!.get(lane) ?? [];\n if (members.length === 0) continue;\n const laneW = laneWidths[laneIdx]!;\n const laneStart = laneStartX[laneIdx]!;\n const innerW =\n members.reduce((s, n) => s + n.width, 0) +\n (members.length - 1) * nodeSpacingX;\n let cursor = laneStart + (laneW - innerW) / 2;\n for (const n of members) {\n result.set(n.id, cursor + n.width / 2);\n cursor += n.width + nodeSpacingX;\n }\n }\n }\n\n // Place dummies: median barycenter of known neighbors, iterated for\n // stability. Dummies are not constrained to lanes (edges may cross).\n for (let pass = 0; pass < 4; pass++) {\n for (const layer of layerNodes) {\n for (const n of layer) {\n if (!n.isDummy) continue;\n const neighbors: number[] = [];\n for (const [u, v] of segments) {\n if (v === n.id) {\n const ux = result.get(u);\n if (ux !== undefined) neighbors.push(ux);\n }\n if (u === n.id) {\n const vx = result.get(v);\n if (vx !== undefined) neighbors.push(vx);\n }\n }\n if (neighbors.length === 0) {\n if (!result.has(n.id)) result.set(n.id, 0);\n continue;\n }\n neighbors.sort((a, b) => a - b);\n result.set(n.id, neighbors[Math.floor(neighbors.length / 2)]!);\n }\n }\n }\n\n return result;\n}\n\n// ─── Cluster span analysis ────────────────────────────────\n\n/**\n * Decide whether lane-based x-coord placement is required.\n *\n * Lanes are needed when two or more top-level clusters share at least\n * one layer (parallel branches): without lane separation their members\n * would interleave horizontally and the cluster bboxes — derived as\n * min/max of member positions — would enclose foreign nodes.\n *\n * For sequential clusters (each occupies its own consecutive layer\n * range, like a multi-phase pipeline) BK gives a clean straight spine\n * and the bboxes wrap naturally with no interference.\n */\nfunction hasOverlappingTopLevelClusters(\n ast: FlowchartAST,\n layerMap: Map<string, number>,\n sgParent: Map<string, string | undefined>\n): boolean {\n const topLevel = ast.subgraphs.filter((sg) => !sgParent.get(sg.id));\n if (topLevel.length < 2) return false;\n const collect = (sgId: string): string[] => {\n const sg = ast.subgraphs.find((s) => s.id === sgId);\n if (!sg) return [];\n const ids = [...sg.children];\n for (const childSgId of sg.subgraphs) ids.push(...collect(childSgId));\n return ids;\n };\n const ranges = topLevel.map((sg) => {\n const ids = collect(sg.id);\n if (ids.length === 0) return { min: 0, max: -1 };\n const layers = ids.map((id) => layerMap.get(id) ?? 0);\n return { min: Math.min(...layers), max: Math.max(...layers) };\n });\n for (let i = 0; i < ranges.length; i++) {\n for (let j = i + 1; j < ranges.length; j++) {\n const a = ranges[i]!;\n const b = ranges[j]!;\n if (a.max < a.min || b.max < b.min) continue;\n if (a.min <= b.max && b.min <= a.max) return true;\n }\n }\n return false;\n}\n\n// ─── Entry point ──────────────────────────────────────────\n\nexport function layoutFlowchart(ast: FlowchartAST): FlowchartLayoutResult {\n const dir: FlowchartDirection = ast.direction;\n const isHorizontalDir = dir === \"LR\" || dir === \"RL\";\n\n // ── Measure node sizes ───────────────────────────────────\n // Returned w/h are in \"abstract TB space\" — flow direction is always Y.\n // For LR we swap at the end so the user-authored shape dims are preserved.\n const sizeOf = (n: FlowchartNode): { w: number; h: number } => {\n const rawTextW = measureLabelWidth(n.label);\n const labelW = Math.min(\n FC_CONST.maxLabelWidth,\n Math.ceil(rawTextW) + FC_CONST.labelHPad * 2\n );\n let shapeW = Math.max(FC_CONST.minNodeWidth, labelW);\n let shapeH: number = FC_CONST.nodeHeight;\n if (n.shape === \"diamond\") {\n // Diamond's inner usable width at y=h/2 equals the full width, but text\n // near the vertical extents is clipped by the rhombus edges. Bump 1.4×\n // (was 1.25) to give CJK labels more vertical breathing room.\n shapeW = Math.max(shapeW, labelW * 1.4);\n shapeH = Math.max(shapeH, 52);\n }\n if (n.shape === \"parallelogram\" || n.shape === \"parallelogram-alt\") {\n // Parallelogram has a slant of `slant` on each side (see shapes.ts:30).\n // At y=h/2 the usable width is w-2·slant, NOT w-slant. The renderer\n // centers the label, so we must reserve 2·slant of horizontal slack\n // plus a small ε for stroke clearance.\n shapeW += 2 * SHAPE_SLANT.parallelogram + 8;\n }\n if (n.shape === \"trapezoid\" || n.shape === \"trapezoid-alt\") {\n // Trapezoid usable width at y=h/2 is w-slant (one side cut); near the\n // narrow end it's w-2·slant. Add 2·slant + ε for safety.\n shapeW += 2 * SHAPE_SLANT.trapezoid + 8;\n }\n if (n.shape === \"stadium\" || n.shape === \"round\") {\n shapeW = Math.max(shapeW, shapeH + 20);\n }\n if (n.shape === \"circle\" || n.shape === \"double-circle\") {\n // Force square bounding box so the circle fills it evenly\n const side = Math.max(shapeW, shapeH) + 8;\n shapeW = side;\n shapeH = side;\n }\n if (n.shape === \"hexagon\") {\n // Hexagon cuts both ends — usable width at y=h/2 is full w, but the\n // angled cut at top/bottom (cut=min(20,w/4)) eats label area.\n shapeW = Math.max(shapeW, labelW + 48);\n }\n if (n.shape === \"asymmetric\") {\n // Right-pointing flag — 15px arrow on the right side.\n shapeW += 24;\n }\n if (n.shape === \"cylinder\") {\n // Slightly taller to show the top ellipse cap\n shapeH = Math.max(shapeH, 52);\n }\n if (n.shape === \"subroutine\") {\n // Extra width for the two inner bars\n shapeW = Math.max(shapeW, labelW + 36);\n }\n // In LR, swap so abstract-TB \"h\" corresponds to flow-direction extent\n // (= user-authored width); output swap restores canonical shape dims.\n return isHorizontalDir ? { w: shapeH, h: shapeW } : { w: shapeW, h: shapeH };\n };\n\n // ── Build working node map ───────────────────────────────\n const nodeMap = new Map<string, FlowchartNode>();\n for (const n of ast.nodes) nodeMap.set(n.id, n);\n\n // Ensure all edge endpoints exist as nodes (create implicit rect nodes)\n for (const e of ast.edges) {\n for (const id of [e.from, e.to]) {\n if (!nodeMap.has(id)) {\n const implicit: FlowchartNode = { id, label: id, shape: \"rect\" };\n nodeMap.set(id, implicit);\n ast.nodes.push(implicit);\n }\n }\n }\n\n // ── Phase 1: cycle removal ───────────────────────────────\n const allIds = Array.from(nodeMap.keys());\n const feedbackIdx = greedyFAS(allIds, ast.edges);\n\n const ledges: LEdge[] = ast.edges.map((e, i) => {\n const reversed = feedbackIdx.has(i) && e.from !== e.to;\n return {\n from: reversed ? e.to : e.from,\n to: reversed ? e.from : e.to,\n original: e,\n isReversed: reversed,\n chain: [],\n };\n });\n\n // ── Phase 2: layer assignment ────────────────────────────\n const layerMap = longestPathLayers(allIds, ledges);\n\n // ── Phase 3: dummy insertion ─────────────────────────────\n let dummyCounter = 0;\n const dummies: string[] = [];\n const { updatedEdges } = insertDummies(ledges, layerMap, () => {\n const id = `__dummy_${dummyCounter++}`;\n dummies.push(id);\n return id;\n });\n\n // Build LNode map after dummies\n const lnodes = new Map<string, LNode>();\n for (const id of allIds) {\n const n = nodeMap.get(id)!;\n const { w, h } = sizeOf(n);\n lnodes.set(id, {\n id,\n node: n,\n layer: layerMap.get(id) ?? 0,\n order: 0,\n width: w,\n height: h,\n isDummy: false,\n });\n }\n for (const id of dummies) {\n lnodes.set(id, {\n id,\n layer: layerMap.get(id) ?? 0,\n order: 0,\n width: FC_CONST.dummyWidth,\n height: 0,\n isDummy: true,\n });\n }\n\n // Group by layer\n const maxLayer = Math.max(0, ...Array.from(layerMap.values()));\n const layers: string[][] = [];\n for (let i = 0; i <= maxLayer; i++) layers.push([]);\n for (const [id, layer] of layerMap) {\n layers[layer]!.push(id);\n }\n\n // ── Phase 4: crossing minimization ───────────────────────\n // Build segment list (pairs of adjacent-layer node ids along each chain)\n const segments: Array<[string, string]> = [];\n for (const e of updatedEdges) {\n if (e.chain.length >= 2) {\n for (let i = 0; i < e.chain.length - 1; i++) {\n segments.push([e.chain[i]!, e.chain[i + 1]!]);\n }\n }\n }\n let ordered = orderLayers(layers, segments);\n\n // ── Cluster ancestry resolution ──────────────────────────\n // Shared by contiguity sort (below) and lane-based x-coord placement.\n const parentOf = new Map<string, string | undefined>();\n for (const n of ast.nodes) parentOf.set(n.id, n.parent);\n const sgParent = new Map<string, string | undefined>();\n for (const sg of ast.subgraphs) {\n for (const childSg of sg.subgraphs) sgParent.set(childSg, sg.id);\n if (!sgParent.has(sg.id)) sgParent.set(sg.id, undefined);\n }\n const ancestryPath = (id: string): string[] => {\n const path: string[] = [];\n let cur = parentOf.get(id);\n while (cur !== undefined) {\n path.unshift(cur);\n cur = sgParent.get(cur);\n }\n return path;\n };\n // Dummy ancestry: intersect ancestries of the edge's endpoints. Dummies\n // lying inside a cluster stay in its lane; inter-cluster dummies land\n // in the enclosing common ancestor (or \"no cluster\" at the root).\n const dummyAncestry = new Map<string, string[]>();\n for (const e of updatedEdges) {\n if (e.chain.length < 3) continue;\n const fromA = ancestryPath(e.chain[0]!);\n const toA = ancestryPath(e.chain[e.chain.length - 1]!);\n const common: string[] = [];\n for (let k = 0; k < Math.min(fromA.length, toA.length); k++) {\n if (fromA[k] === toA[k]) common.push(fromA[k]!);\n else break;\n }\n for (let i = 1; i < e.chain.length - 1; i++) {\n dummyAncestry.set(e.chain[i]!, common);\n }\n }\n const pathOf = (id: string): string[] =>\n dummyAncestry.get(id) ?? ancestryPath(id);\n\n // Within-layer contiguity: sort each layer by ancestry so same-cluster\n // members stay adjacent (preserves crossing-min order as tiebreaker).\n if (ast.subgraphs.length > 0) {\n ordered = ordered.map((layer) => {\n const keyed = layer.map((id, i) => ({ id, i, path: pathOf(id) }));\n keyed.sort((a, b) => {\n const la = a.path;\n const lb = b.path;\n const len = Math.min(la.length, lb.length);\n for (let k = 0; k < len; k++) {\n if (la[k] !== lb[k]) return la[k]!.localeCompare(lb[k]!);\n }\n if (la.length !== lb.length) return la.length - lb.length;\n return a.i - b.i;\n });\n return keyed.map((k) => k.id);\n });\n }\n\n // Assign order indices\n for (let li = 0; li < ordered.length; li++) {\n const layer = ordered[li]!;\n for (let oi = 0; oi < layer.length; oi++) {\n const n = lnodes.get(layer[oi]!);\n if (n) n.order = oi;\n }\n }\n\n // ── Phase 5: x-coord assignment ──────────────────────────\n const layerNodes: LNode[][] = ordered.map((layer) =>\n layer.map((id) => lnodes.get(id)!)\n );\n // Lane-based placement is only needed when sibling top-level clusters\n // share at least one layer (parallel branches). For sequential clusters\n // (each on its own layer range, e.g. Pre → Intervention → Post in TB),\n // pure BK produces a straight, centered spine and the cluster bboxes —\n // computed afterward as min/max of member positions — naturally wrap\n // their members without dragging the diagram sideways.\n const useLane =\n ast.subgraphs.length > 0 &&\n hasOverlappingTopLevelClusters(ast, layerMap, sgParent);\n let xMap: Map<string, number>;\n if (useLane) {\n xMap = laneBasedXCoords(\n layerNodes,\n pathOf,\n FC_CONST.nodeSpacingX,\n segments\n );\n } else {\n const bkLayers: BKNode[][] = layerNodes.map((layer) =>\n layer.map((n) => ({ id: n.id, width: n.width, isDummy: n.isDummy }))\n );\n xMap = bkXCoords(bkLayers, segments, FC_CONST.nodeSpacingX);\n }\n\n // ── Compute y coords & final canvas dimensions ──────────\n const isHorizontal = dir === \"LR\" || dir === \"RL\";\n\n // Per-layer max height (abstract TB) — respects variable-height nodes.\n const layerHeights: number[] = layerNodes.map((layer) => {\n let maxH = 0;\n for (const n of layer) {\n if (n.isDummy) continue;\n if (n.height > maxH) maxH = n.height;\n }\n return maxH > 0 ? maxH : FC_CONST.nodeHeight;\n });\n // Extra top/left padding to fit cluster borders + title labels. Clusters\n // extend pad + titleH past their outermost member in the title direction\n // (top for TB, left for LR), and pad on the other sides.\n const hasClusters = ast.subgraphs.length > 0;\n const CLUSTER_OVERHEAD_TITLE = hasClusters\n ? CLUSTER_GEO.pad + CLUSTER_GEO.titleH\n : 0;\n const CLUSTER_OVERHEAD_SIDE = hasClusters ? CLUSTER_GEO.pad : 0;\n // Title pad goes on the side that becomes the visual top (TB/BT) or visual\n // left (LR/RL) AFTER the BT/RL flip applied below. We lay out in TB/LR\n // coordinates throughout — for BT the title overhead must therefore sit on\n // the bottom of the layout (becomes visual top post-flip); for RL on the\n // right (becomes visual left).\n const extraTopPad = !isHorizontal && dir !== \"BT\"\n ? CLUSTER_OVERHEAD_TITLE\n : CLUSTER_OVERHEAD_SIDE;\n const extraLeftPad = isHorizontal && dir !== \"RL\"\n ? CLUSTER_OVERHEAD_TITLE\n : CLUSTER_OVERHEAD_SIDE;\n\n // ── Per-layer top-level cluster set ─────────────────────\n // For dynamic layer-gap computation: when adjacent layers belong to\n // distinct clusters, the gap must accommodate cluster A's bottom-pad\n // + cluster B's top-pad + title (~68px in TB), otherwise the cluster\n // bboxes overlap visually.\n const topLevelOf = (sgId: string): string => {\n let cur = sgId;\n let safety = 32;\n while (safety-- > 0) {\n const p = sgParent.get(cur);\n if (!p) return cur;\n cur = p;\n }\n return cur;\n };\n const clustersAtLayer: Array<Set<string>> = layerNodes.map(() => new Set());\n for (let li = 0; li < layerNodes.length; li++) {\n for (const n of layerNodes[li]!) {\n if (n.isDummy) continue;\n const parent = parentOf.get(n.id);\n if (!parent) continue;\n clustersAtLayer[li]!.add(topLevelOf(parent));\n }\n }\n /**\n * Minimum gap required between two adjacent layers to keep cluster\n * bboxes disjoint:\n * - A cluster that EXITS at li (in li but not li+1) needs `pad` below\n * its members for its bottom border.\n * - A cluster that ENTERS at li+1 (in li+1 but not li) needs `pad +\n * titleH` above its members for its top border + title.\n * If neither side opens or closes a cluster, the default layerSpacingY\n * already fits an edge label between rows.\n */\n const layerGapAt = (li: number): number => {\n const a = clustersAtLayer[li] ?? new Set<string>();\n const b = clustersAtLayer[li + 1] ?? new Set<string>();\n let hasExit = false;\n for (const c of a) if (!b.has(c)) { hasExit = true; break; }\n let hasEntry = false;\n for (const c of b) if (!a.has(c)) { hasEntry = true; break; }\n let required = 0;\n if (hasExit) required += CLUSTER_GEO.pad;\n if (hasEntry) required += CLUSTER_GEO.pad + CLUSTER_GEO.titleH;\n // Visible breathing room when two distinct cluster bboxes meet at this\n // gap (sequential clusters, e.g. Pre → Intervention). Without it the\n // bboxes touch and look like one cluster with a horizontal divider.\n if (hasExit && hasEntry) required += CLUSTER_GEO.gap;\n return Math.max(FC_CONST.layerSpacingY, required);\n };\n\n const layerCenterY: number[] = [];\n {\n let y = FC_CONST.padding + extraTopPad;\n for (let li = 0; li < layerHeights.length; li++) {\n y += layerHeights[li]! / 2;\n layerCenterY.push(y);\n y += layerHeights[li]! / 2;\n if (li < layerHeights.length - 1) y += layerGapAt(li);\n }\n }\n\n // Channel midline (abstract TB y) between adjacent layers — every horizontal\n // bend that crosses gap i lands on this y, so fan-out branches share a\n // single horizontal trunk instead of stair-stepping at per-edge midpoints.\n const channelMidAbstract: number[] = [];\n for (let li = 0; li < layerCenterY.length - 1; li++) {\n const bottomI = layerCenterY[li]! + layerHeights[li]! / 2;\n const topNext = layerCenterY[li + 1]! - layerHeights[li + 1]! / 2;\n channelMidAbstract.push((bottomI + topNext) / 2);\n }\n\n let minX = Infinity;\n let maxX = -Infinity;\n for (const [id, x] of xMap) {\n const n = lnodes.get(id)!;\n if (n.isDummy) continue;\n minX = Math.min(minX, x - n.width / 2);\n maxX = Math.max(maxX, x + n.width / 2);\n }\n if (!isFinite(minX)) {\n minX = 0;\n maxX = 100;\n }\n\n const padding = FC_CONST.padding;\n const shiftX = padding + extraLeftPad - minX;\n\n const placed: Placed[] = [];\n for (let li = 0; li < layerNodes.length; li++) {\n const y = layerCenterY[li]!;\n for (const n of layerNodes[li]!) {\n if (n.isDummy) continue;\n const cx = (xMap.get(n.id) ?? 0) + shiftX;\n placed.push({\n id: n.id,\n x: cx - n.width / 2,\n y: y - n.height / 2,\n width: n.width,\n height: n.height,\n layer: li,\n order: n.order,\n });\n }\n }\n const dummyPos = new Map<string, { x: number; y: number }>();\n for (let li = 0; li < layerNodes.length; li++) {\n const y = layerCenterY[li]!;\n for (const n of layerNodes[li]!) {\n if (!n.isDummy) continue;\n dummyPos.set(n.id, {\n x: (xMap.get(n.id) ?? 0) + shiftX,\n y,\n });\n }\n }\n\n // Right/bottom also need cluster overhead so the far side border fits.\n // Mirror image of extraTopPad/extraLeftPad: BT/RL push title to the far side.\n const extraRightPad = isHorizontal && dir === \"RL\"\n ? CLUSTER_OVERHEAD_TITLE\n : CLUSTER_OVERHEAD_SIDE;\n const extraBottomPad = !isHorizontal && dir === \"BT\"\n ? CLUSTER_OVERHEAD_TITLE\n : CLUSTER_OVERHEAD_SIDE;\n const canvasW = maxX - minX + 2 * padding + extraLeftPad + extraRightPad;\n const lastLayer = layerCenterY.length - 1;\n const canvasH =\n lastLayer >= 0\n ? layerCenterY[lastLayer]! + layerHeights[lastLayer]! / 2 + padding + extraBottomPad\n : 2 * padding;\n\n // ── Build layout nodes (possibly swapped for LR) ────────\n const outNodes: FlowchartLayoutNode[] = placed.map((p) => {\n const base = lnodes.get(p.id)!.node!;\n if (!isHorizontal) {\n return {\n node: base,\n x: p.x,\n y: p.y,\n width: p.width,\n height: p.height,\n layer: p.layer,\n order: p.order,\n };\n }\n // Swap POSITIONS for LR (layer direction becomes X) but also swap\n // dims so the user-authored shape orientation is preserved. sizeOf\n // pre-swapped dims on input, so here we swap them back for render.\n return {\n node: base,\n x: p.y,\n y: p.x,\n width: p.height,\n height: p.width,\n layer: p.layer,\n order: p.order,\n };\n });\n\n const outWidth = isHorizontal ? canvasH : canvasW;\n const outHeight = isHorizontal ? canvasW : canvasH;\n\n // Map channel midlines into final (post-flip / post-LR-swap) coordinates.\n // For TB the channel value is a y; for LR it becomes an x; BT/RL mirror.\n const finalChannel: number[] = channelMidAbstract.map((m) => {\n if (dir === \"BT\") return outHeight - m;\n if (dir === \"RL\") return outWidth - m;\n return m;\n });\n\n // ── Build edges (routing) ───────────────────────────────\n const nodeCenter = new Map<string, { x: number; y: number; w: number; h: number }>();\n for (const ln of outNodes) {\n nodeCenter.set(ln.node.id, {\n x: ln.x + ln.width / 2,\n y: ln.y + ln.height / 2,\n w: ln.width,\n h: ln.height,\n });\n }\n // Dummy positions (swap for LR)\n const dummyCenter = new Map<string, { x: number; y: number }>();\n for (const [id, p] of dummyPos) {\n if (!isHorizontal) dummyCenter.set(id, p);\n else dummyCenter.set(id, { x: p.y, y: p.x });\n }\n\n // ── BT / RL flip ─────────────────────────────────────────\n // Layout was computed in TB/LR coordinates. Mirror the entire placement\n // across the appropriate axis so source layers end up at the visual\n // bottom (BT) or right (RL). Done before edge routing so paths are\n // generated in the final coordinate system automatically. Cluster\n // bboxes computed downstream from outNodes inherit the flip.\n if (dir === \"BT\" || dir === \"RL\") {\n const flipY = dir === \"BT\";\n const flipX = dir === \"RL\";\n for (const n of outNodes) {\n if (flipY) n.y = outHeight - n.y - n.height;\n if (flipX) n.x = outWidth - n.x - n.width;\n }\n for (const c of nodeCenter.values()) {\n if (flipY) c.y = outHeight - c.y;\n if (flipX) c.x = outWidth - c.x;\n }\n for (const c of dummyCenter.values()) {\n if (flipY) c.y = outHeight - c.y;\n if (flipX) c.x = outWidth - c.x;\n }\n }\n\n // Map original edge → declaration index, for linkStyle targeting.\n const edgeIndex = new Map<typeof ast.edges[number], number>();\n ast.edges.forEach((e, i) => edgeIndex.set(e, i));\n\n // Import routing lazily to avoid circular deps (routing module is sibling).\n // We inline minimal routing right here to keep imports simple.\n const outEdges = updatedEdges.map((le) => {\n const chain = le.chain.length > 0 ? le.chain : [le.from, le.to];\n // Build polyline through (possibly) dummies\n const points: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < chain.length; i++) {\n const id = chain[i]!;\n const nc = nodeCenter.get(id);\n const dc = dummyCenter.get(id);\n if (nc) {\n points.push({ x: nc.x, y: nc.y });\n } else if (dc) {\n points.push({ x: dc.x, y: dc.y });\n }\n }\n if (points.length < 2) {\n return { edge: le.original, path: \"\", index: edgeIndex.get(le.original) };\n }\n // Clip endpoints to node borders\n const startNode = nodeCenter.get(chain[0]!);\n const endNode = nodeCenter.get(chain[chain.length - 1]!);\n if (startNode) {\n points[0] = clipToBox(points[0]!, points[1]!, startNode, dir, true);\n }\n if (endNode) {\n points[points.length - 1] = clipToBox(\n points[points.length - 1]!,\n points[points.length - 2]!,\n endNode,\n dir,\n false\n );\n }\n\n // Build Manhattan path: for each consecutive pair, insert an L-bend on the\n // dominant axis (TB: vertical primary; LR: horizontal primary). Bends use\n // the shared channel midline between the two layers so all horizontal\n // bars across a given layer gap line up.\n const chainLayers = chain.map((id) => layerMap.get(id) ?? 0);\n const d = buildManhattanPath(points, dir, chainLayers, finalChannel);\n\n // Label anchor: near source exit, offset toward target side. This keeps\n // branch labels (yes / no from a decision) close to the decision and off\n // the shared horizontal routing bar where midpoint-based anchors collide\n // with the edge line itself. Same strategy as entity-structure edges.\n let labelAnchor: { x: number; y: number } | undefined;\n if (le.original.label) {\n labelAnchor = edgeLabelAnchor(points, dir, chainLayers, finalChannel);\n }\n\n return {\n edge: {\n ...le.original,\n isReversed: le.isReversed,\n },\n path: d,\n labelAnchor,\n index: edgeIndex.get(le.original),\n };\n });\n\n // ── Compute cluster bounding boxes ───────────────────────\n function collectDescendantNodeIds(sgId: string): string[] {\n const sg = ast.subgraphs.find((s) => s.id === sgId);\n if (!sg) return [];\n const ids = [...sg.children];\n for (const childSgId of sg.subgraphs) ids.push(...collectDescendantNodeIds(childSgId));\n return ids;\n }\n\n function computeDepth(sgId: string): number {\n for (const s of ast.subgraphs) {\n if (s.subgraphs.includes(sgId)) return 1 + computeDepth(s.id);\n }\n return 0;\n }\n\n const { pad: CLUSTER_PAD, titleH: CLUSTER_TITLE_H } = CLUSTER_GEO;\n\n const clusters = ast.subgraphs\n .map((sg) => {\n const memberIds = collectDescendantNodeIds(sg.id);\n const members = outNodes.filter((n) => memberIds.includes(n.node.id));\n if (members.length === 0) return null;\n const minX = Math.min(...members.map((n) => n.x)) - CLUSTER_PAD;\n const minY =\n Math.min(...members.map((n) => n.y)) - CLUSTER_PAD - CLUSTER_TITLE_H;\n const maxX = Math.max(...members.map((n) => n.x + n.width)) + CLUSTER_PAD;\n const maxY = Math.max(...members.map((n) => n.y + n.height)) + CLUSTER_PAD;\n return {\n subgraph: sg,\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n depth: computeDepth(sg.id),\n };\n })\n .filter((c): c is NonNullable<typeof c> => c !== null);\n\n return {\n width: outWidth,\n height: outHeight,\n direction: dir,\n nodes: outNodes,\n edges: outEdges,\n clusters,\n };\n}\n\n// ─── Routing helpers ──────────────────────────────────────\n\nfunction clipToBox(\n from: { x: number; y: number },\n toward: { x: number; y: number },\n box: { x: number; y: number; w: number; h: number },\n dir: FlowchartDirection,\n isStart: boolean\n): { x: number; y: number } {\n // Clip the endpoint on the box side facing `toward`. Works for both start\n // (exit toward neighbor) and end (enter from neighbor); the formula is\n // identical — the arrow terminates where the straight ray from center →\n // toward crosses the box boundary.\n void isStart;\n const cx = box.x;\n const cy = box.y;\n if (dir === \"TB\" || dir === \"BT\") {\n const goingDown = toward.y >= from.y;\n return { x: cx, y: cy + (goingDown ? box.h / 2 : -box.h / 2) };\n }\n const goingRight = toward.x >= from.x;\n return { x: cx + (goingRight ? box.w / 2 : -box.w / 2), y: cy };\n}\n\nfunction buildManhattanPath(\n pts: Array<{ x: number; y: number }>,\n dir: FlowchartDirection,\n layers?: number[],\n channel?: number[]\n): string {\n if (pts.length === 0) return \"\";\n const parts: string[] = [`M ${fmt(pts[0]!.x)} ${fmt(pts[0]!.y)}`];\n const isHorizontal = dir === \"LR\" || dir === \"RL\";\n for (let i = 1; i < pts.length; i++) {\n const a = pts[i - 1]!;\n const b = pts[i]!;\n // Channel-based bend: when both endpoints carry layer info, pick the\n // shared channel between layer min(la,lb) and the next one. Falls back\n // to the per-edge midpoint when channel data is missing or endpoints\n // sit on the same layer (self-loops).\n let bend: number | null = null;\n if (layers && channel) {\n const la = layers[i - 1];\n const lb = layers[i];\n if (la !== undefined && lb !== undefined && la !== lb) {\n const ci = Math.min(la, lb);\n const cv = channel[ci];\n if (cv !== undefined) bend = cv;\n }\n }\n if (isHorizontal) {\n const midX = bend ?? (a.x + b.x) / 2;\n parts.push(`L ${fmt(midX)} ${fmt(a.y)}`);\n parts.push(`L ${fmt(midX)} ${fmt(b.y)}`);\n parts.push(`L ${fmt(b.x)} ${fmt(b.y)}`);\n } else {\n const midY = bend ?? (a.y + b.y) / 2;\n parts.push(`L ${fmt(a.x)} ${fmt(midY)}`);\n parts.push(`L ${fmt(b.x)} ${fmt(midY)}`);\n parts.push(`L ${fmt(b.x)} ${fmt(b.y)}`);\n }\n }\n return parts.join(\" \");\n}\n\nfunction fmt(n: number): string {\n return (Math.round(n * 100) / 100).toString();\n}\n\nfunction edgeLabelAnchor(\n pts: Array<{ x: number; y: number }>,\n dir: FlowchartDirection,\n layers?: number[],\n channel?: number[]\n): { x: number; y: number; textAnchor?: \"start\" | \"middle\" | \"end\" } {\n // Resolve the same bend coordinate the router uses, so labels stay visually\n // attached to the segment they describe.\n let bend: number | null = null;\n if (layers && channel && layers.length >= 2) {\n const la = layers[0]!;\n const lb = layers[1]!;\n if (la !== lb) {\n const cv = channel[Math.min(la, lb)];\n if (cv !== undefined) bend = cv;\n }\n }\n // Strategy: label sits next to the edge polyline on the segment that is\n // unique to this edge (so fan-out branches don't collide with shared\n // routing bars). Text-anchor is set so the glyphs clear the stroke — never\n // centered on the line itself.\n if (pts.length < 2) return pts[0] ?? { x: 0, y: 0 };\n const a = pts[0]!;\n const b = pts[1]!;\n const isHorizontal = dir === \"LR\" || dir === \"RL\";\n\n if (isHorizontal) {\n const midX = bend ?? (a.x + b.x) / 2;\n const bends = Math.abs(a.y - b.y) > 1;\n if (bends) {\n const midY = (a.y + b.y) / 2;\n return { x: midX + 6, y: midY, textAnchor: \"start\" };\n }\n return { x: midX, y: a.y - 8, textAnchor: \"middle\" };\n }\n\n // TB / BT\n const midY = bend ?? (a.y + b.y) / 2;\n const bends = Math.abs(a.x - b.x) > 1;\n if (bends) {\n const midX = (a.x + b.x) / 2;\n return { x: midX, y: midY - 8, textAnchor: \"middle\" };\n }\n return { x: a.x + 6, y: midY, textAnchor: \"start\" };\n}\n\n","/**\n * SVG shape primitives for flowchart nodes.\n *\n * Each builder returns one or more SVG element strings (no wrapper <g> or\n * text — the renderer composes those). All shapes render into (0, 0, w, h).\n */\n\nimport type { FlowchartShape } from \"../../core/types\";\nimport { rect, polygon, circle as svgCircle, line as svgLine, path as svgPath } from \"../../core/svg\";\nimport { SHAPE_SLANT } from \"./layout\";\n\nexport function shapeSVG(shape: FlowchartShape, w: number, h: number): string {\n switch (shape) {\n // ── M1 core shapes ─────────────────────────────────────────\n case \"rect\":\n return rect({ x: 0, y: 0, width: w, height: h, rx: 14, ry: 14, class: \"sx-fc-node\" });\n\n case \"round\":\n return rect({ x: 0, y: 0, width: w, height: h, rx: 20, ry: 20, class: \"sx-fc-node sx-fc-node-round\" });\n\n case \"stadium\": {\n const r = Math.min(h / 2, 24);\n return rect({ x: 0, y: 0, width: w, height: h, rx: r, ry: r, class: \"sx-fc-node sx-fc-node-stadium\" });\n }\n\n case \"diamond\": {\n const points = `${w / 2},0 ${w},${h / 2} ${w / 2},${h} 0,${h / 2}`;\n return polygon({ points, class: \"sx-fc-node sx-fc-node-diamond\" });\n }\n\n case \"parallelogram\": {\n const slant = SHAPE_SLANT.parallelogram;\n const points = `${slant},0 ${w},0 ${w - slant},${h} 0,${h}`;\n return polygon({ points, class: \"sx-fc-node\" });\n }\n\n // ── M2 additional shapes ────────────────────────────────────\n case \"parallelogram-alt\": {\n const slant = SHAPE_SLANT.parallelogram;\n const points = `0,0 ${w - slant},0 ${w},${h} ${slant},${h}`;\n return polygon({ points, class: \"sx-fc-node\" });\n }\n\n case \"trapezoid\": {\n // Wider at top, narrowing at bottom — manual operation (ISO 5807)\n const slant = SHAPE_SLANT.trapezoid;\n const points = `0,0 ${w},0 ${w - slant},${h} ${slant},${h}`;\n return polygon({ points, class: \"sx-fc-node\" });\n }\n\n case \"trapezoid-alt\": {\n // Wider at bottom (manual input)\n const slant = SHAPE_SLANT.trapezoid;\n const points = `${slant},0 ${w - slant},0 ${w},${h} 0,${h}`;\n return polygon({ points, class: \"sx-fc-node\" });\n }\n\n case \"subroutine\": {\n // Rect body + two inner vertical bars (predefined process)\n const barX = 10;\n const body = rect({ x: 0, y: 0, width: w, height: h, rx: 2, class: \"sx-fc-node\" });\n const left = svgLine({ x1: barX, y1: 0, x2: barX, y2: h, class: \"sx-fc-node-subline\" });\n const right = svgLine({ x1: w - barX, y1: 0, x2: w - barX, y2: h, class: \"sx-fc-node-subline\" });\n return body + left + right;\n }\n\n case \"cylinder\": {\n // Database / storage — single silhouette path with curved top & bottom.\n // Silhouette: top upper-arc + right side + bottom lower-arc + left side.\n const ry = Math.min(8, h / 4);\n const silhouette = svgPath({\n d: `M0,${ry} A${w / 2},${ry} 0 0,1 ${w},${ry} L${w},${h - ry} A${w / 2},${ry} 0 0,1 0,${h - ry} Z`,\n class: \"sx-fc-node\",\n });\n // Back half of top ellipse (inside body) — 3-D rim indicator.\n const topRim = svgPath({\n d: `M0,${ry} A${w / 2},${ry} 0 0,0 ${w},${ry}`,\n class: \"sx-fc-node-arc\",\n });\n return silhouette + topRim;\n }\n\n case \"circle\": {\n const r = Math.min(w, h) / 2 - 1;\n return svgCircle({ cx: w / 2, cy: h / 2, r, class: \"sx-fc-node sx-fc-node-circle\" });\n }\n\n case \"double-circle\": {\n // Outer filled circle + inner ring (no fill) — terminator / sink\n const r1 = Math.min(w, h) / 2 - 1;\n const r2 = r1 - 5;\n const outer = svgCircle({ cx: w / 2, cy: h / 2, r: r1, class: \"sx-fc-node\" });\n const inner = svgCircle({ cx: w / 2, cy: h / 2, r: r2, class: \"sx-fc-node-ring\" });\n return outer + inner;\n }\n\n case \"hexagon\": {\n // Preparation / setup step — horizontal hex\n const cut = Math.min(20, w / 4);\n const points = `${cut},0 ${w - cut},0 ${w},${h / 2} ${w - cut},${h} ${cut},${h} 0,${h / 2}`;\n return polygon({ points, class: \"sx-fc-node sx-fc-node-hexagon\" });\n }\n\n case \"asymmetric\": {\n // ISO 5807 alt process — right-pointing flag / ribbon\n const pts = `0,0 ${w - 15},0 ${w},${h / 2} ${w - 15},${h} 0,${h}`;\n return polygon({ points: pts, class: \"sx-fc-node\" });\n }\n\n default:\n return rect({ x: 0, y: 0, width: w, height: h, rx: 14, ry: 14, class: \"sx-fc-node\" });\n }\n}\n","/**\n * Flowchart renderer — LayoutResult → SVG string.\n *\n * Produces semantic, themeable SVG per spec §12:\n * - <title>/<desc> for a11y\n * - data-* attributes for interaction hooks\n * - CSS custom properties from resolveBaseTheme\n * - Arrowhead markers in <defs>\n */\n\nimport type {\n FlowchartAST,\n FlowchartLayoutCluster,\n FlowchartLayoutEdge,\n FlowchartLayoutNode,\n FlowchartLayoutResult,\n FlowchartEdge,\n FlowchartNode,\n} from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n text as textEl,\n multilineText,\n path as pathEl,\n rect,\n title as titleEl,\n desc as descEl,\n defs,\n} from \"../../core/svg\";\nimport { parseFlowchart } from \"./parser\";\nimport { layoutFlowchart, FC_CONST } from \"./layout\";\nimport { shapeSVG } from \"./shapes\";\nimport { resolveFlowchartTheme, type ThemeName } from \"../../core/theme\";\n\nconst CSS_TEMPLATE = (themeName: ThemeName): string => {\n const t = resolveFlowchartTheme(themeName);\n const c = t.classes;\n return `\n.sx-fc { font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n.sx-fc-node { fill: ${t.fillMuted}; stroke: ${t.stroke}; stroke-width: 1.5; stroke-linejoin: round; }\n.sx-fc-node-stadium { fill: ${t.stadiumFill}; stroke: ${t.stroke}; }\n.sx-fc-node-diamond { fill: ${t.diamondFill}; stroke: ${t.stroke}; }\n.sx-fc-node-round { fill: ${t.roundFill}; stroke: ${t.stroke}; }\n.sx-fc-node-text { fill: ${t.text}; font: 12px system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n/* Semantic class presets (applied via 'class A start') — override shape fills */\n.sx-fc-class-start > .sx-fc-node { fill: ${c.start.fill}; stroke: ${c.start.stroke}; }\n.sx-fc-class-start > .sx-fc-node-text { fill: ${c.start.text}; font-weight: 600; }\n.sx-fc-class-process > .sx-fc-node { fill: ${c.process.fill}; stroke: ${c.process.stroke}; }\n.sx-fc-class-process > .sx-fc-node-text { fill: ${c.process.text}; font-weight: 600; }\n.sx-fc-class-decision > .sx-fc-node { fill: ${c.decision.fill}; stroke: ${c.decision.stroke}; }\n.sx-fc-class-decision > .sx-fc-node-text { fill: ${c.decision.text}; font-weight: 600; }\n.sx-fc-class-success > .sx-fc-node { fill: ${c.success.fill}; stroke: ${c.success.stroke}; }\n.sx-fc-class-success > .sx-fc-node-text { fill: ${c.success.text}; font-weight: 600; }\n.sx-fc-class-danger > .sx-fc-node { fill: ${c.danger.fill}; stroke: ${c.danger.stroke}; }\n.sx-fc-class-danger > .sx-fc-node-text { fill: ${c.danger.text}; font-weight: 600; }\n.sx-fc-class-neutral > .sx-fc-node { fill: ${c.neutral.fill}; stroke: ${c.neutral.stroke}; }\n.sx-fc-class-neutral > .sx-fc-node-text { fill: ${c.neutral.text}; font-weight: 600; }\n.sx-fc-edge { fill: none; stroke: ${t.neutral}; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }\n.sx-fc-edge-thick { stroke: ${t.stroke}; stroke-width: 2.4; }\n.sx-fc-edge-dashed { stroke-dasharray: 5 3; }\n.sx-fc-edge-dotted { stroke-dasharray: 1.5 3; }\n.sx-fc-edge-label { fill: ${t.textMuted}; font: 11px system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n.sx-fc-edge-label-bg { fill: ${t.bg}; fill-opacity: 0.96; stroke: ${t.neutral}; stroke-width: 0.5; }\n.sx-fc-title { fill: ${t.text}; font: 600 14px system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n/* Shape sub-elements */\n.sx-fc-node-subline { fill: none; stroke: ${t.stroke}; stroke-width: 1.5; }\n.sx-fc-node-arc { fill: none; stroke: ${t.stroke}; stroke-width: 1.5; }\n.sx-fc-node-ring { fill: none; stroke: ${t.stroke}; stroke-width: 1.8; }\n/* Cluster (subgraph) */\n.sx-fc-cluster { fill: ${t.fillMuted}; fill-opacity: 0.35; stroke: ${t.neutral}; stroke-width: 1.5; stroke-dasharray: 5,3; }\n.sx-fc-cluster-title { fill: ${t.textMuted}; font: 500 11px system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n`.trim();\n};\n\nconst ARROW_MARKER = `\n<marker id=\"sx-fc-arrow\" markerWidth=\"8\" markerHeight=\"8\" refX=\"7\" refY=\"4\" orient=\"auto-start-reverse\" markerUnits=\"userSpaceOnUse\">\n <path d=\"M0,0 L8,4 L0,8 L2,4 Z\" fill=\"context-stroke\"/>\n</marker>\n<marker id=\"sx-fc-arrow-o\" markerWidth=\"8\" markerHeight=\"8\" refX=\"7\" refY=\"4\" orient=\"auto\" markerUnits=\"userSpaceOnUse\">\n <circle cx=\"4\" cy=\"4\" r=\"3\" fill=\"none\" stroke=\"context-stroke\" stroke-width=\"1\"/>\n</marker>\n<marker id=\"sx-fc-arrow-x\" markerWidth=\"8\" markerHeight=\"8\" refX=\"4\" refY=\"4\" orient=\"auto\" markerUnits=\"userSpaceOnUse\">\n <path d=\"M1,1 L7,7 M1,7 L7,1\" stroke=\"context-stroke\" stroke-width=\"1.2\"/>\n</marker>\n`.trim();\n\nfunction edgeCssClass(edge: FlowchartEdge): string {\n const classes = [\"sx-fc-edge\"];\n if (edge.kind === \"thick\") classes.push(\"sx-fc-edge-thick\");\n if (edge.kind === \"dotted\") classes.push(\"sx-fc-edge-dotted\");\n return classes.join(\" \");\n}\n\nfunction markerEndFor(edge: FlowchartEdge): string | undefined {\n switch (edge.arrowEnd) {\n case \"arrow\":\n return \"url(#sx-fc-arrow)\";\n case \"circle\":\n return \"url(#sx-fc-arrow-o)\";\n case \"cross\":\n return \"url(#sx-fc-arrow-x)\";\n default:\n return undefined;\n }\n}\n\nfunction markerStartFor(edge: FlowchartEdge): string | undefined {\n return edge.arrowStart === \"arrow\" ? \"url(#sx-fc-arrow)\" : undefined;\n}\n\nfunction renderCluster(lc: FlowchartLayoutCluster): string {\n const sg = lc.subgraph;\n const bg = rect({ x: lc.x, y: lc.y, width: lc.width, height: lc.height, rx: 8, class: \"sx-fc-cluster\" });\n const label = textEl(\n { x: lc.x + 12, y: lc.y + 15, class: \"sx-fc-cluster-title\" },\n sg.label\n );\n return group(\n { \"data-cluster-id\": sg.id, \"data-depth\": lc.depth, class: \"sx-fc-cluster-g\" },\n [bg, label]\n );\n}\n\nfunction renderNode(ln: FlowchartLayoutNode): string {\n const n: FlowchartNode = ln.node;\n const shapeEl = shapeSVG(n.shape, ln.width, ln.height);\n const label = multilineText(\n {\n x: ln.width / 2,\n y: ln.height / 2,\n class: \"sx-fc-node-text\",\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n },\n n.label\n );\n const plainLabel = n.label\n .replace(/<br\\s*\\/?>/gi, \" \")\n .replace(/<\\/?[bi]>/gi, \"\");\n const nodeTitle = titleEl(plainLabel);\n const classAttr = [\"sx-fc-node-g\", ...(n.classes ?? []).map((c) => `sx-fc-class-${c}`)].join(\" \");\n return group(\n {\n \"data-node-id\": n.id,\n \"data-shape\": n.shape,\n \"data-layer\": ln.layer,\n \"data-classes\": n.classes?.join(\" \"),\n class: classAttr,\n transform: `translate(${fmt(ln.x)} ${fmt(ln.y)})`,\n },\n [shapeEl, label, nodeTitle]\n );\n}\n\nfunction renderEdge(le: FlowchartLayoutEdge): string {\n const e = le.edge;\n const attrs: Record<string, string | number | undefined> = {\n d: le.path,\n class: edgeCssClass(e),\n };\n const me = markerEndFor(e);\n const ms = markerStartFor(e);\n if (me) attrs[\"marker-end\"] = me;\n if (ms) attrs[\"marker-start\"] = ms;\n const p = pathEl(attrs);\n\n const labelEl =\n e.label && le.labelAnchor\n ? renderEdgeLabel(\n e.label,\n le.labelAnchor.x,\n le.labelAnchor.y,\n le.labelAnchor.textAnchor ?? \"middle\"\n )\n : \"\";\n\n const edgeTitle = titleEl(\n e.label ? `${e.from} → ${e.to}: ${e.label}` : `${e.from} → ${e.to}`\n );\n\n return group(\n {\n \"data-edge-id\": e.id ?? `${e.from}->${e.to}`,\n \"data-edge-index\": le.index,\n \"data-kind\": e.kind,\n \"data-from\": e.from,\n \"data-to\": e.to,\n },\n [p, edgeTitle, labelEl].filter((s) => s.length > 0)\n );\n}\n\nfunction renderEdgeLabel(\n label: string,\n cx: number,\n cy: number,\n textAnchor: \"start\" | \"middle\" | \"end\"\n): string {\n // Approximate pill size — matches entity diagram edge label style.\n const w = Math.max(20, label.length * 6.5 + 10);\n const h = 16;\n const rx = cx - (textAnchor === \"start\" ? 0 : textAnchor === \"end\" ? w : w / 2);\n const ry = cy - h / 2;\n const bg = rect({\n x: rx,\n y: ry,\n width: w,\n height: h,\n rx: 3,\n class: \"sx-fc-edge-label-bg\",\n });\n const t = textEl(\n {\n x: cx,\n y: cy,\n class: \"sx-fc-edge-label\",\n \"text-anchor\": textAnchor,\n \"dominant-baseline\": \"central\",\n },\n label\n );\n return group({ class: \"sx-fc-edge-label-g\" }, [bg, t]);\n}\n\nfunction fmt(n: number): string {\n return (Math.round(n * 100) / 100).toString();\n}\n\nexport function renderFlowchartAST(\n ast: FlowchartAST,\n themeName: ThemeName = \"default\"\n): string {\n const layout: FlowchartLayoutResult = layoutFlowchart(ast);\n\n const clusterSvg = layout.clusters.map(renderCluster);\n const nodeSvg = layout.nodes.map(renderNode);\n const edgeSvg = layout.edges.map(renderEdge);\n\n // Per-node style overrides (from `style nodeId fill:#f9f,...` statements)\n const nodeStyleOverrides = ast.nodes\n .filter((n) => n.style && Object.keys(n.style).length > 0)\n .map((n) => {\n const props = Object.entries(n.style!)\n .map(([k, v]) => `${k}:${v}`)\n .join(\";\");\n return `g[data-node-id=\"${n.id}\"] .sx-fc-node { ${props} }`;\n })\n .join(\"\\n\");\n\n // classDef overrides (from `classDef name fill:#xxx,...` statements)\n const classDefOverrides = ast.classDefs\n .map((cd) => {\n const props = Object.entries(cd.props)\n .map(([k, v]) => `${k}:${v}`)\n .join(\";\");\n return `.sx-fc-class-${cd.id} > .sx-fc-node { ${props} }`;\n })\n .join(\"\\n\");\n\n // linkStyle overrides (from `linkStyle 1,5,6 stroke:#ff0000,...` statements).\n // Edge index is the declaration order in `ast.edges`.\n const linkStyleOverrides = Array.from(ast.linkStyles.entries())\n .map(([idx, props]) => {\n const cssProps = Object.entries(props)\n .map(([k, v]) => `${k}:${v}`)\n .join(\";\");\n return `g[data-edge-index=\"${idx}\"] path { ${cssProps} }`;\n })\n .join(\"\\n\");\n\n const titleBlock = ast.title\n ? textEl(\n {\n x: layout.width / 2,\n y: 16,\n class: \"sx-fc-title\",\n \"text-anchor\": \"middle\",\n },\n ast.title\n )\n : \"\";\n\n const cssOverrides = [nodeStyleOverrides, classDefOverrides, linkStyleOverrides]\n .filter((s) => s.length > 0)\n .join(\"\\n\");\n\n const headMeta: string[] = [\n titleEl(ast.title ? `${ast.title} — Flowchart` : \"Flowchart\"),\n descEl(\n `Flowchart with ${ast.nodes.length} node${ast.nodes.length === 1 ? \"\" : \"s\"} and ${ast.edges.length} edge${ast.edges.length === 1 ? \"\" : \"s\"}.`\n ),\n el(\"style\", {}, CSS_TEMPLATE(themeName) + (cssOverrides ? \"\\n\" + cssOverrides : \"\")),\n defs([ARROW_MARKER]),\n ];\n // Content that participates in the layout → gets translated down when a\n // title reserves top space.\n const content: string[] = [];\n // Render order: clusters (lowest z) → edges → nodes (highest z)\n if (clusterSvg.length > 0) content.push(group({ class: \"sx-fc-clusters\" }, clusterSvg));\n content.push(group({ class: \"sx-fc-edges\" }, edgeSvg));\n content.push(group({ class: \"sx-fc-nodes\" }, nodeSvg));\n\n // Extra top padding when a title is present. Clusters can extend above\n // layout origin by CLUSTER_PAD+CLUSTER_TITLE_H (~44px), so title needs\n // extra clearance to avoid overlapping subgraph borders/labels.\n const hasClusters = layout.clusters.length > 0;\n const topPad = ast.title ? (hasClusters ? 56 : 24) : 0;\n const totalH = layout.height + topPad;\n\n // Retitled title sits in the un-translated band at top, centered.\n const titleSvg = titleBlock;\n\n return svgRoot(\n {\n viewBox: `0 0 ${fmt(layout.width)} ${fmt(totalH)}`,\n width: fmt(layout.width),\n height: fmt(totalH),\n class: \"sx-fc\",\n \"data-diagram-type\": \"flowchart\",\n \"data-direction\": layout.direction,\n role: \"graphics-document\",\n },\n topPad > 0\n ? [\n ...headMeta,\n titleSvg,\n group({ transform: `translate(0 ${topPad})` }, content),\n ]\n : [...headMeta, titleSvg, ...content]\n );\n}\n\nexport function renderFlowchart(text: string, themeName: ThemeName = \"default\"): string {\n const ast = parseFlowchart(text);\n return renderFlowchartAST(ast, themeName);\n}\n\n// Keep FC_CONST reachable via renderer for test convenience.\nexport { FC_CONST };\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { firstContentLine } from \"../../core/dsl-preprocess\";\nimport { parseFlowchart } from \"./parser\";\nimport { renderFlowchart } from \"./renderer\";\n\nexport const flowchart: DiagramPlugin = {\n type: \"flowchart\",\n detect(text: string): boolean {\n const first = firstContentLine(text)?.split(/\\s+/)[0]?.toLowerCase() ?? \"\";\n return first === \"flowchart\" || first === \"graph\";\n },\n parse: parseFlowchart,\n\n render(text: string, config?: RenderConfig): string {\n const themeName = (config?.theme ?? \"default\") as \"default\" | \"monochrome\" | \"dark\";\n return renderFlowchart(text, themeName);\n },\n};\n\nexport { parseFlowchart } from \"./parser\";\nexport { renderFlowchart, renderFlowchartAST } from \"./renderer\";\nexport { layoutFlowchart, FC_CONST } from \"./layout\";\n"]}
|