@weasel-js/diagram 1.14.1 → 1.14.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 +3 -1
- package/dist/{chunk-TBG6DFB2.js → chunk-AXL4JQBM.js} +3 -3
- package/dist/{chunk-TBG6DFB2.js.map → chunk-AXL4JQBM.js.map} +1 -1
- package/dist/{chunk-ZWXM5F4I.js → chunk-DE7UILJA.js} +14 -5
- package/dist/{chunk-ZWXM5F4I.js.map → chunk-DE7UILJA.js.map} +1 -1
- package/dist/{chunk-VB6HUKNG.js → chunk-FDCODMFW.js} +186 -35
- package/dist/chunk-FDCODMFW.js.map +1 -0
- package/dist/{chunk-62SMY45E.js → chunk-GR2DK4S2.js} +5 -5
- package/dist/{chunk-62SMY45E.js.map → chunk-GR2DK4S2.js.map} +1 -1
- package/dist/{chunk-5VNPLOIX.js → chunk-IYUU5KUY.js} +3 -3
- package/dist/{chunk-5VNPLOIX.js.map → chunk-IYUU5KUY.js.map} +1 -1
- package/dist/effect-audio.js +3 -3
- package/dist/effect.js +6 -6
- package/dist/index.d.ts +2 -2
- package/dist/index.js +8 -8
- package/dist/layout.d.ts +1 -1
- package/dist/{layout.entry-Ca6pVvqo.d.ts → layout.entry-CbmGuqE-.d.ts} +6 -1
- package/dist/layout.js +2 -2
- package/package.json +11 -11
- package/dist/chunk-VB6HUKNG.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/group.ts","../src/containers/trait.ts","../src/containers/titlePose.ts","../src/containers/containerLayout.ts","../src/containers/laneStack.ts","../src/containers/layouts.ts","../src/labelTrait.ts","../src/label.ts","../src/keyedIndex.ts","../src/labelDragLayer.ts","../src/edgeLabel.ts","../src/theme/themes.ts","../src/theme/types.ts","../src/theme/resolve.ts","../src/offPage/trait.ts","../src/offPage/tag.ts","../src/selfLoop.ts","../src/hops/draw.ts","../src/routers.ts","../src/edge.ts","../src/bodyRelayout.ts","../src/dataTypes.ts","../src/containers/regionSpecs.ts","../src/dataColors.ts","../src/dataStyles.ts","../src/edgeId.ts","../src/offPage/split.ts","../src/dataPages.ts","../src/groupTree.ts","../src/graph.ts","../src/rowStyle.ts","../src/marks.ts","../src/dataContainers.ts","../src/dataContainerPlace.ts","../src/dataGroups.ts","../src/dataEdges.ts","../src/fromData.ts"],"names":["traitOf","createTransformOp","AUTO_POSE_DESCRIPTOR","center","translatePoseViaDescriptor","pageName","facing","PathBuilder","polylineFromPoints","stubTip","endOf","sizes","out","wireLabels","LINE"],"mappings":";;;;;;AAkCA,SAAS,QAAQ,IAAA,EAAyD;AACxE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,IAAA;AACtD,EAAA,MAAM,KAAA,GAAS,KAAiC,iBAAiB,CAAA;AACjE,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,WAAY,KAAA,GAAoC,IAAA;AAC5F;AAGO,SAAS,eAAe,IAAA,EAA8C;AAC3E,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAI,CAAA,EAAG,KAAA;AAC7B,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,WAAY,KAAA,GAAyB,IAAA;AACjF;AAGO,SAAS,gBAAgB,IAAA,EAA+C;AAC7E,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAI,CAAA,EAAG,MAAA;AAC9B,EAAA,OAAO,WAAW,IAAA,IAAQ,OAAO,WAAW,QAAA,IAAY,IAAA,IAAQ,SAAU,MAAA,GAA2B,IAAA;AACvG;AAmBO,SAAS,eAAA,CAAuB,IAAA,GAAgC,EAAC,EAA6B;AACnG,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAa,oBAAA;AACnC,EAAA,OAAO,CAAC,MAAM,IAAA,KAAS;AACrB,IAAA,MAAM,KAAA,GAAQ,eAAe,IAAI,CAAA;AACjC,IAAA,IAAI,KAAA,KAAU,MAAM,OAAO,IAAA;AAC3B,IAAA,IAAI,EAAA,GAAK,QAAA;AACT,IAAA,IAAI,EAAA,GAAK,QAAA;AACT,IAAA,IAAI,EAAA,GAAK,CAAA,QAAA;AACT,IAAA,IAAI,EAAA,GAAK,CAAA,QAAA;AACT,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG,MAAgC,CAAA;AACnG,MAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,CAAA,CAAE,CAAC,CAAA;AACrB,MAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,CAAA,CAAE,CAAC,CAAA;AACrB,MAAA,EAAA,GAAK,KAAK,GAAA,CAAI,EAAA,EAAI,CAAA,CAAE,CAAA,GAAI,EAAE,KAAK,CAAA;AAC/B,MAAA,EAAA,GAAK,KAAK,GAAA,CAAI,EAAA,EAAI,CAAA,CAAE,CAAA,GAAI,EAAE,MAAM,CAAA;AAAA,IAClC;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,GAAG,OAAO,IAAA;AACjC,IAAA,OAAO,SAAS,UAAA,CAAW,SAAA,CAAU,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAI,KAAA,EAAO,EAAA,GAAK,EAAA,EAAI,QAAQ,EAAA,GAAK,EAAA,IAAM,KAAK,CAAA,EAAG,KAAK,IAAI,CAAA;AAAA,EAC3G,CAAA;AACF;AAIO,SAAS,SAAA,CACd,OACA,KAAA,EACyD;AACzD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,OAAO,KAAA,CAAM,KAAA;AAC/C,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,IAAI,KAAA,CAAM,QAAA,IAAY,KAAK,KAAK,CAAA;AACtD,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,OAAO,IAAA,GAAO,CAAA;AAAA,IACjC,CAAA,EAAG,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,GAAA;AAAA,IACnB,OAAO,KAAA,GAAQ,IAAA;AAAA,IACf,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAM,KAAA,CAAM;AAAA,GAC3C;AACF;AAMO,SAAS,gBAAA,CAAwB,IAAA,GAAgC,EAAC,EAA6B;AACpG,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAa,oBAAA;AACnC,EAAA,OAAO,CAAC,MAAM,IAAA,KAAS;AACrB,IAAA,MAAM,MAAA,GAAS,gBAAgB,IAAI,CAAA;AACnC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW,OAAO,IAAA;AACjD,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,EAAA;AACnC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,MAAA,EAAQ,CAAA,IAAK,CAAA,CAAA,GAAK,IAAA,CAAK,IAAI,GAAA,CAAI,KAAA;AACzF,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,EAAQ,CAAA,IAAK,CAAA,CAAA,GAAK,IAAA,CAAK,IAAI,GAAA,CAAI,MAAA;AAC1F,IAAA,OAAO,0BAAA,CAA2B,KAAK,IAAA,EAAM,CAAA,GAAI,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAA;AAAA,EAC7E,CAAA;AACF;AAGO,IAAM,aAAA,GAAgB;AAEtB,IAAM,cAAA,GAAiB;AAGvB,IAAM,oBAAoB,eAAA;AAE1B,IAAM,qBAAqB,gBAAA;;;ACtGlC,SAASA,SAAQ,IAAA,EAAyD;AACxE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,IAAA;AACtD,EAAA,MAAM,KAAA,GAAS,KAAiC,iBAAiB,CAAA;AACjE,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,WAAY,KAAA,GAAoC,IAAA;AAC5F;AAGO,SAAS,mBAAmB,IAAA,EAAkD;AACnF,EAAA,MAAM,CAAA,GAAIA,QAAAA,CAAQ,IAAI,CAAA,EAAG,SAAA;AACzB,EAAA,OAAO,CAAA,KAAM,QAAQ,OAAO,CAAA,KAAM,YAAY,OAAQ,CAAA,CAAuB,IAAA,KAAS,QAAA,GACjF,CAAA,GACD,IAAA;AACN;AAIO,SAAS,cAAc,IAAA,EAA8C;AAC1E,EAAA,IAAI,kBAAA,CAAmB,IAAI,CAAA,EAAG,IAAA,KAAS,QAAQ,OAAO,MAAA;AACtD,EAAA,OAAOA,QAAAA,CAAQ,IAAI,CAAA,EAAG,OAAA;AACxB;AAGO,IAAM,SAAA,GAAY,CAAC,WAAA,KAAgC,CAAA,EAAG,WAAW,CAAA,MAAA;AAGjE,SAAS,SAAA,CAAU,QAAa,MAAA,EAAiD;AACtF,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,IAAA;AACjC,EAAA,OAAO,OAAO,IAAA,KAAS,KAAA,GACnB,EAAE,CAAA,EAAG,OAAO,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,OAAO,MAAA,CAAO,KAAA,EAAO,QAAQ,IAAA,CAAK,GAAA,CAAI,OAAO,IAAA,EAAM,MAAA,CAAO,MAAM,CAAA,KAC5F,EAAE,CAAA,EAAG,OAAO,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,OAAO,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA,EAAG,MAAA,EAAQ,OAAO,MAAA,EAAO;AACpG;AAGO,SAAS,OAAA,CAAQ,QAAa,MAAA,EAA0C;AAC7E,EAAA,MAAM,CAAA,GAAI,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAA;AAClC,EAAA,IAAI,CAAA,KAAM,IAAA,EAAM,OAAO,EAAE,GAAG,MAAA,EAAO;AACnC,EAAA,OAAO,OAAQ,IAAA,KAAS,KAAA,GACpB,EAAE,CAAA,EAAG,OAAO,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,QAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,CAAE,MAAA,KACtF,EAAE,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,OAAO,MAAA,CAAO,KAAA,GAAQ,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAA,EAAO;AACjG;;;ACnEO,SAAS,SAAA,CAAU,QAAa,MAAA,EAA+C;AACpF,EAAA,MAAM,CAAA,GAAI,UAAU,MAAA,EAAQ,MAAM,KAAK,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,CAAA,EAAE;AAC9D,EAAA,IAAI,QAAQ,IAAA,KAAS,MAAA,EAAQ,OAAO,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,GAAG,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,MAAA,EAAQ,EAAE,MAAA,EAAO;AACvF,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AAC3B,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAC5B,EAAA,OAAO,EAAE,GAAG,EAAA,GAAK,CAAA,CAAE,SAAS,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,CAAE,KAAA,GAAQ,GAAG,KAAA,EAAO,CAAA,CAAE,QAAQ,MAAA,EAAQ,CAAA,CAAE,OAAO,QAAA,EAAU,CAAC,IAAA,CAAK,EAAA,GAAK,CAAA,EAAE;AAC/G;AAGO,SAAS,YAAA,CAAa,MAAyC,MAAA,EAA+C;AACnH,EAAA,OAAO,SAAA,CAAU,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU,MAAM,CAAA;AACjF;ACAA,IAAM,MAAA,GAAS,CAAC,CAAA,MAAiB,EAAE,GAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,GAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,SAAS,CAAA,EAAE,CAAA;AAGxE,SAAS,UAAA,CACd,SAAA,EACA,QAAA,EACA,MAAA,EACuB;AACvB,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAsB;AACtC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,EAAA,KAAO,SAAA,CAAU,SAAA,CAAU,EAAE,CAAC,CAAA;AACnE,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,IAAI,SAAA,CAAU,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAC,CAAA;AAC9E,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,sBAAA,CAAuB,IAAA,GAA+B,EAAC,EAA6B;AAClG,EAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,EAAE,UAAA,EAAY,CAAC,YAAY,OAAA,CAAQ,CAAC,KAAK,IAAA,EAAK;AAAA,IACpD,YAAY,CAAC,SAAA,EAAW,aAAa,UAAA,CAAW,SAAA,EAAW,UAAU,MAAM,CAAA;AAAA,IAC3E,cAAA,EAAgB,CAAC,UAAA,EAAY,SAAA,EAAW,YAAY,CAAC,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAM,MAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,IAAI,GAAG,CAAA;AAAA,IACzG,WAAA,EAAa,sBAAM,IAAI,GAAA,EAAI;AAAA,IAC3B,YAAY,CAAC,UAAA,EAAY,WAAW,OAAA,EAAS,MAAA,KAAW,CAAC,iBAAA,CAA4B;AAAA,MACnF,IAAI,OAAA,CAAQ,EAAA;AAAA,MAAI,MAAM,OAAA,CAAQ,UAAA;AAAA,MAAY,EAAA,EAAI,MAAA,EAAQ,IAAA,IAAQ,OAAA,CAAQ,IAAA;AAAA,MAAM,KAAA,EAAO;AAAA,KACpF,CAAC,CAAA;AAAA,IACF,WAAW,SAAA,EAAW;AACpB,MAAA,MAAM,IAAI,SAAA,CAAU,MAAA;AACpB,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,CAAA,EAAG,MAAM,CAAA;AAC9B,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAG,IAAA,CAAK,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,EAAE,CAAA,EAAG,KAAA,EAAO,KAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,IAClG;AAAA,GACF;AACF;ACnBO,IAAM,gBAAA,GAAmB;AAEzB,IAAM,aAAA,GAAgB;AAKtB,IAAM,UAAA,GAAa,CAAC,IAAA,EAAiB,IAAA,GAAO,gBAAA,MAChD,EAAE,IAAA,EAAM,IAAA,KAAS,GAAA,GAAM,MAAA,GAAS,KAAA,EAAO,IAAA,EAAK;AAGxC,SAAS,YAAA,CACd,IAAA,EACA,MAAA,EACA,MAAA,EACA,KAAA,EACuB;AACvB,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AACnC,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAsB;AACtC,EAAA,IAAI,EAAA,GAAK,IAAA,KAAS,GAAA,GAAM,MAAA,CAAO,IAAI,MAAA,CAAO,CAAA;AAC1C,EAAA,KAAA,MAAW,EAAE,EAAA,EAAI,IAAA,EAAK,IAAK,KAAA,EAAO;AAChC,IAAA,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,IAAA,KAAS,GAAA,GACjB,EAAE,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAK,GACpD,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAC1D,IAAA,EAAA,IAAM,IAAA;AAAA,EACR;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,gBAAgB,IAAA,EAAkD;AAChF,EAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AACjB,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,UAAU,CAAA;AAC/C,EAAA,MAAM,QAAQ,CAAC,CAAA,KAA0C,SAAS,GAAA,GAAM,CAAA,CAAE,SAAS,CAAA,CAAE,KAAA;AACrF,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAiB,IAAA,KAAS,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,EAAE,KAAA,GAAQ,CAAA;AAClF,EAAA,MAAM,OAAA,GAAU,CAAC,SAAA,EAA4B,QAAA,EAA2B,IAAA,KACtE,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,SAAA,CAAU,UAAU,EAAE,CAAA,IAAK,CAAA,CAAE,EAAA,KAAO,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,GAAI,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AACpH,EAAA,MAAM,QAAQ,CAAC,KAAA,KAA2B,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,CAAE,IAAI,IAAA,EAAM,KAAA,CAAM,CAAA,CAAE,IAAI,GAAE,CAAE,CAAA;AAC9F,EAAA,MAAM,YAAY,CAAC,SAAA,EAA4B,UAA2B,KAAA,EAA8B,MAAA,GAAS,UAAU,MAAA,KAAW;AACpI,IAAA,IAAI,QAAA,CAAS,KAAK,CAAC,CAAA,KAAM,EAAE,EAAA,KAAO,SAAA,CAAU,UAAU,EAAE,CAAC,GAAG,KAAA,CAAM,GAAA,CAAI,UAAU,SAAA,CAAU,EAAE,GAAG,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAC,CAAA;AACxH,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,SAAA,EAA4B,QAAA,EAA2B,KAAA,KAAoD;AAC1H,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAK,CAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3E,IAAA,MAAM,MAAA,GAAS,IAAA,KAAS,GAAA,GAAM,EAAE,GAAG,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,KAAA,KAAU,EAAE,GAAG,SAAA,CAAU,MAAA,EAAQ,OAAO,KAAA,EAAM;AAC3G,IAAA,OAAO,EAAE,KAAA,EAAO,SAAA,CAAU,SAAA,EAAW,QAAA,EAAU,YAAA,CAAa,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,KAAK,CAAA,EAAG,MAAM,GAAG,MAAA,EAAO;AAAA,EAC5G,CAAA;AACA,EAAA,MAAM,QAAA,GAAW,CAAC,SAAA,EAA4B,QAAA,EAA2B,SAAe,KAAA,KAAkB;AACxG,IAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,WAAW,QAAA,EAAU,OAAA,CAAQ,EAAE,CAAC,CAAA;AAC5D,IAAA,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,CAAA,EAAG,EAAE,EAAA,EAAI,OAAA,CAAQ,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,CAAA;AACpE,IAAA,OAAO,YAAA,CAAa,IAAA,EAAM,SAAA,CAAU,MAAA,EAAQ,QAAQ,KAAK,CAAA;AAAA,EAC3D,CAAA;AACA,EAAA,MAAM,OAAA,GAAmD,CAAC,SAAA,EAAW,QAAA,EAAU,SAAS,MAAA,KAAW;AACjG,IAAA,IAAI,MAAA,KAAW,IAAA,EAAM,uBAAO,IAAI,GAAA,EAAI;AACpC,IAAA,MAAM,QAAQ,QAAA,CAAS,SAAA,EAAW,UAAU,OAAA,EAAU,MAAA,CAAO,KAA2B,KAAK,CAAA;AAC7F,IAAA,KAAA,CAAM,MAAA,CAAO,QAAQ,EAAE,CAAA;AACvB,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,UAAA,CAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,MAAM,CAAA,GAAI,IAAA,KAAS,GAAA,GAAM,OAAA,CAAQ,IAAI,OAAA,CAAQ,CAAA;AAC7C,QAAA,IAAI,IAAA,GAAO,IAAA;AACX,QAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,UAAA,IAAI,SAAS,IAAA,IAAQ,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,GAAI,CAAC,GAAG,IAAA,GAAO,CAAA;AAAA,QAC9F;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACF;AAAA,IAEA,UAAA,CAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAW,QAAQ,CAAC,CAAA;AAChD,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,MAAA,IAAI,SAAS,MAAA,EAAW;AACtB,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AAC5E,QAAA,IAAA,CAAK,OAAO,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,MACvD;AACA,MAAA,OAAO,SAAA,CAAU,WAAW,QAAA,EAAU,YAAA,CAAa,MAAM,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,KAAK,CAAC,CAAA;AAAA,IAC3F,CAAA;AAAA,IAEA,cAAA,CAAe,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS;AAC3C,MAAA,MAAM,QAAQ,OAAA,CAAQ,SAAA,EAAW,QAAA,EAAU,OAAA,CAAQ,EAAE,CAAA,CAAE,MAAA;AACvD,MAAA,MAAM,OAAO,EAAE,EAAA,EAAI,QAAQ,EAAA,EAAI,IAAA,EAAM,QAAQ,IAAA,EAAK;AAClD,MAAA,MAAM,UAAU,EAAC;AACjB,MAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,IAAS,KAAA,EAAO,KAAA,EAAA,EAAS;AAC3C,QAAA,MAAM,IAAA,GAAO,SAAS,SAAA,EAAW,QAAA,EAAU,MAAM,KAAK,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA;AACtE,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAE,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA,EAAG,GAAG,IAAA,CAAK,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,IAAK,IAAA,EAAM,EAAE,KAAA,EAAM,EAAG,CAAA;AAAA,MAC7G;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,WAAA,EAAa,OAAA;AAAA,IAEb,UAAA,CAAW,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ;AAC/C,MAAA,MAAM,MAAY,EAAC;AACnB,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,SAAA,EAAW,QAAA,EAAU,SAAS,MAAM,CAAA;AAC1D,MAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACzB,QAAA,IAAI,EAAA,KAAO,MAAA,KAAc,EAAA,CAAG,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,CAAA,IAAK,EAAA,CAAG,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,EAAI;AAChE,UAAA,GAAA,CAAI,IAAA,CAAKC,iBAAAA,CAA4B,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,YAAA,EAAc,CAAC,CAAA;AAAA,QAC3F;AAAA,MACF;AACA,MAAA,GAAA,CAAI,KAAKA,iBAAAA,CAA4B;AAAA,QACnC,IAAI,OAAA,CAAQ,EAAA;AAAA,QAAI,MAAM,OAAA,CAAQ,UAAA;AAAA,QAAY,EAAA,EAAI,MAAA,EAAQ,IAAA,IAAQ,OAAA,CAAQ,IAAA;AAAA,QAAM,KAAA,EAAO;AAAA,OACpF,CAAC,CAAA;AACF,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAA,EAAQ,CAAC,SAAA,EAAW,QAAA,KAAa,OAAA,CAAQ,WAAW,QAAA,EAAU,OAAA,CAAQ,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA,IAC1F,MAAA,EAAQ,CAAC,SAAA,EAAW,QAAA,KAAa,OAAA,CAAQ,WAAW,QAAA,EAAU,OAAA,CAAQ,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA,IAE1F,WAAW,SAAA,EAAW;AACpB,MAAA,MAAM,IAAI,SAAA,CAAU,MAAA;AACpB,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,CAAA,EAAG,MAAM,CAAA;AAC9B,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAG,IAAA,CAAK,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,EAAE,CAAA,EAAG,KAAA,EAAO,KAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,IAClG,CAAA;AAAA,IAEA,WAAA,EAAa,MAAM;AAAC,GACtB;AACF;;;AC9IO,IAAM,gBAAA,GAAoC,EAAE,IAAA,EAAM,KAAA,EAAO,MAAM,EAAA;AAE/D,IAAM,gBAAA,GAAmB;AAGzB,IAAM,UAAA,GAAa,CAAC,IAAA,MACxB,EAAE,IAAA,EAAM,SAAS,GAAA,GAAM,MAAA,GAAS,KAAA,EAAO,IAAA,EAAM,gBAAA,EAAiB;AAG1D,IAAM,wBAAA,GAA2B;AAEjC,IAAM,wBAAA,GAA2B;AAEjC,IAAM,2BAAA,GAA8B;AAEpC,IAAM,wBAAA,GAA2B;AAEjC,IAAM,2BAAA,GAA8B;AAGpC,IAAM,iBAAA,GAAwE,OAAO,MAAA,CAAO;AAAA,EACjG,CAAC,wBAAwB,GAAG,uBAAuB,EAAE,MAAA,EAAQ,kBAAkB,CAAA;AAAA,EAC/E,CAAC,wBAAwB,GAAG,gBAAgB,EAAE,IAAA,EAAM,KAAK,CAAA;AAAA,EACzD,CAAC,2BAA2B,GAAG,gBAAgB,EAAE,IAAA,EAAM,KAAK,CAAA;AAAA,EAC5D,CAAC,wBAAwB,GAAG,sBAAA,CAAuB,EAAE,MAAA,EAAQ,UAAA,CAAW,GAAG,CAAA,EAAG,CAAA;AAAA,EAC9E,CAAC,2BAA2B,GAAG,sBAAA,CAAuB,EAAE,MAAA,EAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACnF,CAAC;AAIM,SAAS,cAAA,CAAe,IAAA,EAAqB,IAAA,GAAkB,GAAA,EAAkD;AACtH,EAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,OAAO,EAAE,MAAA,EAAQ,IAAA,KAAS,GAAA,GAAM,wBAAA,GAA2B,2BAAA,EAA6B,MAAA,EAAQ,UAAA,CAAW,IAAI,CAAA,EAAE;AACtI,EAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,OAAO,EAAE,MAAA,EAAQ,IAAA,KAAS,GAAA,GAAM,wBAAA,GAA2B,2BAAA,EAA6B,MAAA,EAAQ,UAAA,CAAW,IAAI,CAAA,EAAE;AACtI,EAAA,OAAO,EAAE,MAAA,EAAQ,wBAAA,EAA0B,MAAA,EAAQ,gBAAA,EAAiB;AACtE;;;ACRO,IAAM,eAAA,GAAgC,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,CAAA;AAG3D,SAAS,eAAe,IAAA,EAA8C;AAC3E,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,IAAA;AACtD,EAAA,MAAM,QAAS,IAAA,CAA+B,OAAA;AAC9C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,UAAU,OAAO,IAAA;AACxD,EAAA,MAAM,QAAS,KAAA,CAA8B,KAAA;AAC7C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,UAAU,OAAO,IAAA;AACxD,EAAA,OAAO,IAAA,IAAQ,QAAS,KAAA,GAAyB,IAAA;AACnD;ACbO,SAAS,eAAA,CACd,IAAA,GAAgC,EAAC,EACyE;AAC1G,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAaC,oBAAAA;AAEnC,EAAA,OAAO,CAAC,MAAM,IAAA,KAAS;AACrB,IAAA,MAAM,KAAA,GAAQ,eAAe,IAAI,CAAA;AACjC,IAAA,IAAI,KAAA,KAAU,MAAM,OAAO,IAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,IAAQ,IAAA;AAC9B,IAAA,IAAI,IAAA,KAAS,MAAM,OAAO,IAAA;AAE1B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAC3C,IAAA,MAAMC,OAAAA,GAAS,WAAA,CAAY,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAC9C,IAAA,IAAIA,OAAAA,KAAW,MAAM,OAAO,IAAA;AAE5B,IAAA,OAAOC,0BAAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACLD,OAAAA,CAAO,CAAA,IAAK,MAAA,CAAO,CAAA,GAAI,OAAO,KAAA,GAAQ,CAAA,CAAA;AAAA,MACtCA,OAAAA,CAAO,CAAA,IAAK,MAAA,CAAO,CAAA,GAAI,OAAO,MAAA,GAAS,CAAA,CAAA;AAAA,MACvC;AAAA,KACF;AAAA,EACF,CAAA;AACF;AAGO,IAAM,aAAA,GAAgB;AAItB,IAAM,oBAAoB,eAAA;ACxD1B,SAAS,UAAA,CAAc,KAA2C,KAAA,EAAgC;AACvG,EAAA,MAAM,QAAQ,kBAAA,EAAsB;AACpC,EAAA,OAAO,MAAM;AACX,IAAA,MAAM,MAAM,GAAA,EAAI;AAChB,IAAA,OAAO,QAAQ,MAAA,GAAY,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,EACzD,CAAA;AACF;AASO,SAAS,SAAS,KAAA,EAAyE;AAChG,EAAA,MAAM,UAAyC,EAAC;AAChD,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,IAAA,IAAI,CAAA,CAAE,MAAM,MAAA,CAAO,QAAQ,KAAK,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA,UAAW,IAAA,CAAK,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,SAC5E,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACpB,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,IAAA,EAAM,SAAA,CAAkB,CAAA,EAAG,OAAO,GAAG,MAAA,EAAO;AACvD;AAIO,SAAS,YAAA,CAAa,KAAA,EAAiB,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAA6B;AAC7G,EAAA,MAAM,CAAA,GAAI,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AACzB,EAAA,IAAI,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,KAAK,GAAG,OAAO,IAAA;AACjC,EAAA,MAAM,CAAA,GAAI,IAAA,IAAQ,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,QAAQ,CAAA,CAAE,GAAA,CAAI,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAC5E,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,KAAA,CAAM,MAAM,CAAA;AAC9B,EAAA,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,CAAC,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AAAE,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EAAG,CAAC,CAAA;AAC/E,EAAA,OAAO,MAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AACnC;;;AChBO,IAAM,mBAAA,GAAsB;AAG5B,IAAM,0BAAA,GAA6B,SAAS,mBAAmB,CAAA;AAU/D,SAAS,eAAe,GAAA,EAAoE;AACjG,EAAA,MAAM,UAAU,GAAA,EAAK,OAAA;AACrB,EAAA,OAAO,OAAA,KAAY,MAAA,IAAa,OAAO,OAAA,CAAQ,OAAA,KAAY,YAAY,OAAO,OAAA,CAAQ,MAAA,KAAW,QAAA,GAC7F,OAAA,GAAU,IAAA;AAChB;AAWO,IAAM,gBAAgB,CAAC,KAAA,EAAwC,SAAiB,MAAA,KACrF,CAAC,MAAM,QAAA,CAAS,OAAO,CAAA,IAAK,CAAC,MAAM,QAAA,CAAS,MAAM,KAAK,CAAC,KAAA,CAAM,SAAS,OAAO,CAAA;AAYzE,UAAU,cAAA,CACf,OAAwC,KAAA,EACf;AACzB,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,gBAAA,EAAiB,EAAG;AAC3C,IAAA,MAAM,KAAA,GAAQ,eAAe,IAAI,CAAA;AACjC,IAAA,IAAI,UAAU,IAAA,EAAM;AACpB,IAAA,MAAM,OAAO,IAAA,CAAK,SAAA;AAClB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AAC/C,IAAA,MAAM,MAAA,GAAS,KAAK,CAAC,CAAA;AACrB,IAAA,IAAI,UAAU,MAAA,IAAa,CAAC,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,EAAG;AAC/C,IAAA,IAAI,aAAA,CAAc,KAAA,EAAO,IAAA,CAAK,EAAA,EAAI,MAAM,CAAA,EAAG,MAAM,EAAE,OAAA,EAAS,IAAA,CAAK,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAM;AAAA,EACrF;AACF;AAGO,UAAU,gBAAgB,KAAA,EAAkE;AACjG,EAAA,KAAA,MAAW,EAAE,OAAA,EAAS,MAAA,EAAO,IAAK,cAAA,CAAe,KAAK,CAAA,EAAG;AACvD,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,KAAA,EAAgB,MAAM,GAAG,IAAA,IAAQ,IAAA;AAC5D,IAAA,IAAI,SAAS,IAAA,EAAM;AACnB,IAAA,MAAM,GAAA,GAAMD,qBAAqB,SAAA,CAAU,YAAA,CAAa,OAAgB,KAAA,CAAM,GAAA,CAAI,OAAO,CAAU,CAAC,CAAA;AACpG,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,IAAA,EAAK;AAAA,EACrC;AACF;AAEA,IAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,EAAA,KAAa,GAAG,CAAA,IAAK,CAAA,CAAE,CAAA,IAAK,EAAA,CAAG,CAAA,IAAK,CAAA,CAAE,IAAI,CAAA,CAAE,KAAA,IAAS,GAAG,CAAA,IAAK,CAAA,CAAE,KAAK,EAAA,CAAG,CAAA,IAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA;AAK9G,IAAM,OAAA,uBAAc,OAAA,EAA8E;AAElG,SAAS,aAAa,KAAA,EAAiB;AACrC,EAAA,IAAI,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAC7B,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,KAAA,GAAQ,UAAA;AAAA,MACN,MAAO,OAAO,KAAA,CAAM,UAAA,KAAe,aAAa,CAAC,KAAA,CAAM,UAAA,EAAY,CAAA,GAAI,MAAA;AAAA,MACvE,MAAM;AACJ,QAAA,MAAM,MAAA,GAAS,CAAC,GAAG,eAAA,CAAgB,KAAK,CAAC,CAAA;AACzC,QAAA,OAAO;AAAA,UACL,MAAA;AAAA,UACA,KAAA,EAAO,SAAS,MAAA,CAAO,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,GAAE,KAAM;AAAA,YACzC,KAAK,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,GAAI,EAAE,KAAK,CAAA;AAAA,YAAG,KAAK,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,GAAI,EAAE,MAAM,CAAA;AAAA,YAC1D,KAAK,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,GAAI,EAAE,KAAK,CAAA;AAAA,YAAG,KAAK,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,GAAI,EAAE,MAAM;AAAA,WAClD,CAAC;AAAA,SACb;AAAA,MACF;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,QAAA,CAAS,OAAiB,EAAA,EAAoC;AACrE,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAK,CAAA,EAAE;AAClC,EAAA,MAAM,IAAA,GAAO,KAAA,IAAS,YAAA,CAAa,KAAA,CAAM,KAAA,EAAO,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA;AACtE,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,IAAA,EAAM,OAAO,gBAAgB,KAAK,CAAA;AACjD,EAAA,OAAO,KAAK,GAAA,CAAI,CAAC,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAE,CAAA;AACzC;AAGO,SAAS,UAAA,CAAW,OAAiB,EAAA,EAA+B;AACzE,EAAA,IAAI,KAAA,GAA6B,IAAA;AACjC,EAAA,KAAA,MAAW,EAAE,SAAS,MAAA,EAAQ,GAAA,MAAS,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA,EAAG;AAC1D,IAAA,IAAI,KAAA,CAAM,KAAK,EAAE,CAAA,UAAW,EAAE,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,MAAA,EAAO;AAAA,EACnE;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,yBAAA,CAA0B,OAAiB,MAAA,EAAgC;AAClF,EAAA,MAAM,SAAA,GAAY,CAAC,MAAA,KAAkE;AACnF,IAAA,MAAM,MAA0B,EAAC;AACjC,IAAA,KAAA,MAAW,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,MAAS,MAAA,EAAQ;AAC7C,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,EAAA,EAAI,OAAA;AAAA,QACJ,QAAA,EAAU,IAAA;AAAA,QACV,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAG,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,GAAG,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,MAAA,EAAQ,IAAI,MAAA,EAAO;AAAA,QAChF,MAAA;AAAA,QACA,QAAA,EAAU,WAAA;AAAA,QACV,YAAA,EAAc,CAAC,SAAS,CAAA;AAAA,QACxB,IAAA,EAAM,OAAO,EAAE,cAAA,EAAgB,EAAE,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,MAAA,EAAO,EAAyB;AAAA,OAC9F,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,mBAAA;AAAA,IACJ,OAAA,EAAS,MAAM,SAAA,CAAU,eAAA,CAAgB,KAAK,CAAC,CAAA;AAAA,IAC/C,SAAA,EAAW,CAAC,MAAA,EAAQ,EAAA,EAAI,OAAO,SAAA,CAAU,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAC;AAAA,GAC5E;AACF;AAKO,SAAS,cAAA,CACd,KAAA,EACA,IAAA,GAAgC,EAAC,EACX;AACtB,EAAA,OAAO,sBAAA;AAAA,IACL,mBAAA;AAAA,IACA,qBAAA;AAAA,IACA,CAAC,yBAAA,CAA0B,KAAA,EAAO,IAAA,CAAK,MAAA,IAAU,MAAM,CAAC;AAAA,GAC1D;AACF;ACnJO,IAAM,YAAA,GAAe,CAAC,IAAA,MAAoD,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,IAAA,CAAK,QAAA,GAAW,CAAA,EAAE;AAGjH,IAAM,YAAA,GAAe,EAAE,UAAA,EAAY,YAAA,EAAc,UAAU,EAAA;AAE3D,IAAM,KAAA,GAAQ,GAAA;AAErB,IAAM,WAAA,GAA4B,aAAa,YAAY,CAAA;AAC3D,IAAM,UAAA,GAAa,SAAA;AAIZ,SAAS,SAAA,CAAU,IAAA,EAAc,KAAA,EAAqB,OAAA,EAA6D;AACxH,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,IAAY,WAAA,CAAY,QAAA;AAC3C,EAAA,OAAO,EAAE,KAAA,EAAO,OAAA,KAAY,MAAA,GAAY,QAAQ,IAAA,EAAM,KAAK,CAAA,CAAE,KAAA,GAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,GAAO,KAAA,EAAO,QAAQ,IAAA,EAAK;AAChH;AAeO,SAAS,aAAA,CACd,MAAA,EAAgB,IAAA,EAAc,IAAA,EACU;AACxC,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,WAAA;AAC5B,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,GAAG,MAAM,CAAA,MAAA,CAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,IAAA,EAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,SAAA,CAAU,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA,EAAE;AAAA,IAC5D,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,CAAK,SAAS,eAAA,EAAgB;AAAA,MAChD,IAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,EAAM,EAAE,KAAA,EAAO,EAAE,OAAO,IAAA,CAAK,IAAA,IAAQ,YAAW;AAAE,KACpD;AAAA,IACA,SAAA,EAAW,CAAC,MAAe,CAAA;AAAA,IAC3B,UAAA,EAAY;AAAA,GACd;AACF;AAOO,SAAS,kBAAA,CAAmB,OAAwC,EAAA,EAAqB;AAC9F,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,EAAW,CAAA;AAClC,EAAA,IAAI,SAAS,MAAA,IAAa,cAAA,CAAe,IAAI,CAAA,KAAM,MAAM,OAAO,KAAA;AAChE,EAAA,MAAM,IAAA,GAAQ,KAAK,IAAA,CAA4B,IAAA;AAC/C,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,KAAK,IAAA,EAAK,KAAM,IAAI,OAAO,KAAA;AAC3D,EAAA,KAAA,CAAM,OAAO,EAAW,CAAA;AACxB,EAAA,OAAO,IAAA;AACT;AAGO,IAAM,yBAAA,GAA4B;AAYzC,SAAS,SAAA,CAAU,MAA8B,EAAA,EAAyD;AACxG,EAAA,IAAI,IAAA,KAAS,MAAA,IAAa,EAAA,KAAO,MAAA,EAAW,OAAO,IAAA;AAEnD,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,KAAU,MAAA,GAAY,OAAO,UAAA,CAAW,IAAA,CAAK,OAAO,EAAE,CAAA;AACzE,EAAA,IAAI,KAAA,KAAU,IAAA,EAAM,OAAO,KAAA,CAAM,MAAA;AACjC,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,GAAc,EAAE,CAAA;AAChC,EAAA,MAAM,OAAO,EAAA,IAAM,IAAA,GAAO,SAAY,IAAA,CAAK,KAAA,EAAO,IAAI,EAAE,CAAA;AACxD,EAAA,OAAO,SAAS,MAAA,IAAa,aAAA,CAAc,IAAI,CAAA,KAAM,OAAO,EAAA,GAAM,IAAA;AACpE;AAEA,SAAS,YAAA,CAAa,MAAA,EAAgB,GAAA,EAAoB,IAAA,EAA0D;AAClH,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,GAAA,CAAI,IAAA;AAChC,EAAA,IAAI,UAAU,MAAA,EAAW;AACzB,EAAA,MAAM,OAAA,GAAU,GAAG,MAAM,CAAA,MAAA,CAAA;AACzB,EAAA,IAAI,KAAA,CAAM,GAAA,CAAI,OAAgB,CAAA,KAAM,MAAA,EAAW;AAC7C,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,MAAe,CAAA;AACtC,IAAA,IAAI,SAAS,MAAA,EAAW;AACxB,IAAA,KAAA,CAAM,GAAA,CAAI,aAAA,CAAc,MAAA,EAAQ,EAAA,EAAI;AAAA,MAClC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,GAAI,KAAK,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,KAAA,KAAU,EAAC;AAAA,MAC1C,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI;AAAC,KACtD,CAAU,CAAA;AAAA,EACb;AACA,EAAA,QAAA,EAAU,UAAU,OAAO,CAAA;AAC7B;AASO,SAAS,mBAAA,CAAoB,IAAA,GAA6B,EAAC,EAAW;AAC3E,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,KAAW,CAAC,QAAgB,GAAA,KAAuB,YAAA,CAAa,MAAA,EAAQ,GAAA,EAAK,IAAI,CAAA,CAAA;AACrG,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,yBAAA;AAAA,IACJ,KAAA,EAAO,iBAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,QAAA,EAAU,CAAC,OAAA,EAAS,aAAA,EAAe,UAAU,CAAA;AAAA,IAC7C,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAC3B,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ,WAAA;AAAA,MACR,GAAA,CAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,MAAM,CAAA,GAAI,MAAA;AACV,QAAA,MAAM,QAAQ,CAAA,EAAG,KAAA;AACjB,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,MAAM,OAAA,GAAU,cAAA,CAAe,CAAA,CAAE,UAA+C,CAAA;AAChF,QAAA,MAAM,MAAA,GAAS,OAAA,EAAS,MAAA,IAAU,SAAA,CAAU,MAAM,KAAK,CAAA;AACvD,QAAA,IAAI,WAAW,IAAA,EAAM;AACrB,QAAA,MAAM,GAAA,GAAM,EAAE,KAAA,EAAO,SAAA,EAAW,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,IAAS,IAAA,EAAK;AAC7F,QAAA,MAAA,CAAO,QAAQ,GAAG,CAAA;AAAA,MACpB;AAAA,KACF;AAAA,IACA,OAAA,EAAS,CAAC,IAAA,EAAM,EAAA,KAAQ,SAAA,CAAU,MAAM,EAAE,CAAA,KAAM,IAAA,GAAO,IAAA,GAAO,oBAAA,CAAqB;AAAA,GACrF;AACF;AAEA,IAAM,SAAS,aAAA,CAAc,CAAC,WAAW,MAAA,KAAW,eAAA,IAAmB,WAAW,iBAAiB,CAAA;AAG5F,SAAS,oBAAA,CAAqB,WAAmB,yBAAA,EAA2C;AACjG,EAAA,OAAO,EAAE,IAAA,EAAM,EAAE,MAAM,aAAA,EAAe,MAAA,EAAQ,EAAE,MAAA,EAAQ,MAAA,EAAO,EAAE,EAAG,UAAU,IAAA,EAAM,EAAE,IAAI,CAAA,EAAG,QAAQ,gBAAe,EAAE;AACxH;;;ACjKA,IAAM,IAAA,GAAO,EAAE,MAAA,EAAQ,YAAA,EAAc,MAAM,EAAA,EAAG;AAE9C,IAAM,GAAA,GAAM,SAAA;AACZ,IAAM,KAAA,GAAsB;AAAA,EAC1B,EAAA,EAAI,OAAA;AAAA,EACJ,IAAA,EAAM,OAAA;AAAA,EACN,KAAA,EAAO;AAAA,IACL,SAAS,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,GAAA,EAAI;AAAA,IACzD,QAAQ,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,GAAA,EAAI;AAAA,IACxD,OAAO,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,IAC7D,UAAU,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,GAAA,EAAI;AAAA,IAC1D,SAAS,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,GAAA,EAAI;AAAA,IACzD,UAAU,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,GAAA;AAAI,GAC5D;AAAA,EACA,WAAA,EAAa,SAAA;AAAA,EACb,MAAM,EAAE,MAAA,EAAQ,WAAW,KAAA,EAAO,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EACxD,KAAA,EAAO,EAAE,IAAA,EAAM,GAAA,EAAI;AAAA,EACnB,SAAA,EAAW,EAAE,IAAA,EAAM,wBAAA,EAA0B,QAAQ,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,CAAA,EAAG,IAAA,EAAM,CAAC,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,EAC9G,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAW,IAAA,EAAM,GAAA,EAAK,WAAA,EAAa,CAAA,EAAE;AAAA,IACxE,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,SAAA,EAAW,MAAA,EAAQ,WAAW,IAAA,EAAM,GAAA,EAAK,aAAa,CAAA,EAAE;AAAA,MAChE,EAAE,MAAM,SAAA,EAAW,MAAA,EAAQ,WAAW,IAAA,EAAM,GAAA,EAAK,aAAa,CAAA;AAAE;AAClE,GACF;AAAA,EACA,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS;AACjG,CAAA;AAGA,IAAM,UAAA,GAAa,SAAA;AACnB,IAAM,KAAA,GAAsB;AAAA,EAC1B,EAAA,EAAI,OAAA;AAAA,EACJ,IAAA,EAAM,OAAA;AAAA,EACN,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,GAAA,EAAI;AAAA,IAClF,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,GAAA,EAAI;AAAA,IACjF,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,GAAA,EAAI;AAAA,IAC/E,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,GAAA,EAAI;AAAA,IACnF,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,GAAA,EAAI;AAAA,IAClF,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,GAAA;AAAI,GACrF;AAAA,EACA,WAAA,EAAa,SAAA;AAAA,EACb,MAAM,EAAE,MAAA,EAAQ,WAAW,KAAA,EAAO,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EACxD,KAAA,EAAO,EAAE,IAAA,EAAM,UAAA,EAAW;AAAA,EAC1B,SAAA,EAAW,EAAE,IAAA,EAAM,2BAAA,EAA6B,QAAQ,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,CAAA,EAAG,IAAA,EAAM,CAAC,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,EACjH,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,EAAE,IAAA,EAAM,2BAAA,EAA6B,QAAQ,2BAAA,EAA6B,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,CAAA,EAAE;AAAA,IAClH,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,4BAAA,EAA8B,MAAA,EAAQ,6BAA6B,IAAA,EAAM,SAAA,EAAW,aAAa,CAAA,EAAE;AAAA,MAC3G,EAAE,MAAM,wBAAA,EAA0B,MAAA,EAAQ,6BAA6B,IAAA,EAAM,SAAA,EAAW,aAAa,CAAA;AAAE;AACzG,GACF;AAAA,EACA,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS;AACjG,CAAA;AAEA,IAAM,IAAA,GAAO,SAAA;AACb,IAAM,SAAA,GAA0B;AAAA,EAC9B,EAAA,EAAI,WAAA;AAAA,EACJ,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO;AAAA,IACL,SAAS,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,IACrD,QAAQ,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,IAC9D,OAAO,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,IAC7D,UAAU,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,IAAA,EAAK;AAAA,IAC3D,SAAS,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,IAAA,EAAK;AAAA,IAC1D,UAAU,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,IAAA;AAAK,GAC7D;AAAA,EACA,WAAA,EAAa,SAAA;AAAA,EACb,MAAM,EAAE,MAAA,EAAQ,MAAM,KAAA,EAAO,GAAA,EAAK,WAAW,OAAA,EAAQ;AAAA,EACrD,KAAA,EAAO,EAAE,IAAA,EAAM,IAAA,EAAK;AAAA,EACpB,SAAA,EAAW,EAAE,IAAA,EAAM,2BAAA,EAA6B,QAAQ,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,CAAA,EAAG,IAAA,EAAM,CAAC,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,EACjH,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,WAAA,EAAa,CAAA,EAAE;AAAA,IACzE,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,2BAAA,EAA6B,MAAA,EAAQ,WAAW,IAAA,EAAM,IAAA,EAAM,aAAa,CAAA,EAAE;AAAA,MACnF,EAAE,MAAM,wBAAA,EAA0B,MAAA,EAAQ,WAAW,IAAA,EAAM,IAAA,EAAM,aAAa,CAAA;AAAE;AAClF,GACF;AAAA,EACA,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,EAAE,MAAA,EAAQ,yBAAA,EAA2B,MAAM,EAAA,EAAG;AAAA,EACpD,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS;AACjG,CAAA;AAEA,IAAM,IAAA,GAAO,SAAA;AACb,IAAM,MAAA,GAAuB;AAAA,EAC3B,EAAA,EAAI,QAAA;AAAA,EACJ,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO;AAAA,IACL,SAAS,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,IAAA,EAAK;AAAA,IAC1D,QAAQ,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,IAAA,EAAK;AAAA,IACzD,OAAO,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,IAC7D,UAAU,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,IAAA,EAAK;AAAA,IAC3D,SAAS,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,IAAA,EAAK;AAAA,IAC1D,UAAU,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,IAAA;AAAK,GAC7D;AAAA,EACA,WAAA,EAAa,SAAA;AAAA,EACb,MAAM,EAAE,MAAA,EAAQ,WAAW,KAAA,EAAO,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EACxD,KAAA,EAAO,EAAE,IAAA,EAAM,IAAA,EAAK;AAAA,EACpB,SAAA,EAAW,EAAE,IAAA,EAAM,2BAAA,EAA6B,QAAQ,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,CAAA,EAAG,IAAA,EAAM,CAAC,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,EACjH,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,WAAA,EAAa,CAAA,EAAE;AAAA,IACzE,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,SAAA,EAAW,MAAA,EAAQ,WAAW,IAAA,EAAM,IAAA,EAAM,aAAa,CAAA,EAAE;AAAA,MACjE,EAAE,MAAM,SAAA,EAAW,MAAA,EAAQ,WAAW,IAAA,EAAM,IAAA,EAAM,aAAa,CAAA;AAAE;AACnE,GACF;AAAA,EACA,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS;AACjG,CAAA;AAEA,IAAM,KAAA,GAAQ,SAAA;AACd,IAAM,KAAA,GAAQ,CAAC,IAAA,MAA6B,EAAE,MAAM,MAAA,EAAQ,KAAA,EAAO,MAAM,KAAA,EAAM,CAAA;AAC/E,IAAM,IAAA,GAAqB;AAAA,EACzB,EAAA,EAAI,MAAA;AAAA,EACJ,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,MAAM,SAAS,CAAA;AAAA,IACxB,MAAA,EAAQ,MAAM,SAAS,CAAA;AAAA,IACvB,OAAO,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,IAC7D,QAAA,EAAU,MAAM,SAAS,CAAA;AAAA,IACzB,OAAA,EAAS,MAAM,SAAS,CAAA;AAAA,IACxB,UAAU,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,KAAA,EAAO,MAAM,SAAA;AAAU,GAC9D;AAAA,EACA,WAAA,EAAa,SAAA;AAAA,EACb,MAAM,EAAE,MAAA,EAAQ,OAAO,KAAA,EAAO,GAAA,EAAK,WAAW,OAAA,EAAQ;AAAA,EACtD,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,EACrB,SAAA,EAAW,EAAE,IAAA,EAAM,qBAAA,EAAuB,QAAQ,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,CAAA,EAAG,IAAA,EAAM,CAAC,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,EAC3G,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,WAAA,EAAa,CAAA,EAAE;AAAA,IAC1E,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,SAAA,EAAW,MAAA,EAAQ,WAAW,IAAA,EAAM,KAAA,EAAO,aAAa,CAAA,EAAE;AAAA,MAClE,EAAE,MAAM,SAAA,EAAW,MAAA,EAAQ,WAAW,IAAA,EAAM,KAAA,EAAO,aAAa,CAAA;AAAE;AACpE,GACF;AAAA,EACA,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS;AACjG,CAAA;AAIO,IAAM,cAAA,GAAyD,OAAO,MAAA,CAAO,EAAE,OAAO,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM;;;AClJtH,IAAM,aAAA,GAAgB;AAAA,EAC3B,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,EAClC,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EAChC,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC9B,EAAE,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACpC,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,EAClC,EAAE,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,UAAA;AAC3B;AA0CO,IAAM,iBAAA,GAAoB;;;AC7C1B,SAAS,SAAA,CAAU,OAAqB,IAAA,EAA0B;AACvE,EAAA,OAAA,CAAQ,IAAA,KAAS,MAAA,GAAY,KAAA,CAAM,KAAA,CAAM,IAAI,IAAI,MAAA,KAAc,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA;AAC9F;AAIO,SAAS,aAAA,CAAc,OAAqB,IAAA,EAA0B;AAC3E,EAAA,MAAM,MAAM,IAAA,KAAS,MAAA,GAAY,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,GAAI,MAAA;AACrD,EAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,OAAO,EAAE,GAAG,KAAA,CAAM,IAAA,EAAM,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,KAAA,EAAO,GAAA,CAAI,MAAA,EAAO;AACrF,EAAA,OAAO,EAAE,GAAG,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,IAAA,EAAK;AACtE;AAGO,SAAS,gBAAgB,KAAA,EAA6B;AAC3D,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,WAAA,EAAa,SAAA,KAAc,KAAA,CAAM,IAAA;AAC9D,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,IACvB,OAAO,KAAA,IAAS,CAAA;AAAA,IAChB,GAAI,IAAA,GAAO,EAAE,IAAA,KAAS,EAAC;AAAA,IACvB,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB,EAAC;AAAA,IACrC,GAAI,cAAc,IAAA,GAAO,EAAE,WAAW,SAAA,IAAa,OAAA,KAAY;AAAC,GAClE;AACF;AAGO,IAAM,SAAA,GAAY,CAAC,KAAA,MACvB,EAAE,UAAA,EAAY,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK;AAGvD,IAAM,gBAAA,GAAmB,CAAC,KAAA,KAAgC,KAAA,CAAM,MAAM,IAAA,EAAM,MAAA,IAAU,MAAM,IAAA,CAAK;AAIjG,IAAM,cAAA,GAAiB,CAAC,KAAA,EAAqB,IAAA,GAAO,UAAU,KAAK,CAAA,KACxE,MAAM,KAAA,CAAM,IAAA,GAAO,EAAE,UAAA,EAAY,KAAA,CAAM,MAAM,IAAA,CAAK,MAAA,EAAQ,UAAU,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK,GAAI;AAGzF,IAAM,kBAAkB,CAAC,KAAA,KAAwB,YAAA,CAAa,cAAA,CAAe,KAAK,CAAC;AAInF,SAAS,gBAAA,CAAiB,KAAA,EAAgB,QAAA,GAAyB,cAAA,CAAe,KAAA,EAAsB;AAC7G,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,cAAA,CAAe,KAAK,CAAA,IAAK,QAAA;AAC/D,EAAA,IAAI,UAAU,IAAA,IAAQ,OAAO,UAAU,QAAA,IAAY,OAAA,IAAW,OAAO,OAAO,KAAA;AAC5E,EAAA,OAAO,QAAA;AACT;AAGO,SAAS,cAAA,CAAe,OAA+C,QAAA,EAAuC;AACnH,EAAA,OAAO,iBAAiB,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,iBAAiB,GAAG,QAAQ,CAAA;AACpE;AAGO,IAAM,aAAA,GAAgB,CAAC,KAAA,KAC5B,cAAA,CAAe,MAAM,EAAE,CAAA,KAAM,KAAA,GAAQ,KAAA,CAAM,EAAA,GAAK;;;ACzC3C,IAAM,eAAe,CAAC,MAAA,EAAgB,QAA+B,CAAA,EAAG,MAAM,YAAY,GAAG,CAAA;AAG7F,SAAS,aAAa,IAAA,EAA4C;AACvE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,IAAA;AACtD,EAAA,MAAM,QAAS,IAAA,CAAgD,OAAA;AAC/D,EAAA,MAAM,MAAM,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,GAAW,MAAM,UAAA,GAAa,MAAA;AAC7E,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,UAAU,OAAO,IAAA;AACpD,EAAA,MAAM,EAAE,IAAA,EAAM,GAAA,EAAI,GAAI,GAAA;AACtB,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,KAAa,GAAA,KAAQ,MAAA,IAAU,QAAQ,IAAA,CAAA,GAAQ,EAAE,IAAA,EAAM,GAAA,EAAI,GAAI,IAAA;AACxF;ACIO,IAAM,oBAAA,GAAuB;AAGpC,IAAM,GAAA,GAAM,CAAA;AAGL,IAAM,cAAA,GAAiB,CAAC,KAAA,MAC5B,EAAE,OAAO,eAAA,CAAgB,KAAK,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,UAAA,EAAY,MAAM,IAAA,EAAK;AAG5E,IAAM,iBAAiB,CAACG,SAAAA,EAAkB,QAAwB,CAAA,EAAGA,SAAQ,SAAM,GAAG,CAAA;AAGtF,SAAS,cAAA,CAAe,KAAA,EAA8B,KAAA,EAAqB,GAAA,EAA4B;AAC5G,EAAA,MAAM,GAAA,GAAM,GAAA,KAAQ,MAAA,GAAS,KAAA,CAAM,KAAK,KAAA,CAAM,IAAA;AAC9C,EAAA,MAAM,QAAQ,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,GAAG,CAAA;AACjD,EAAA,OAAO,cAAA,CAAe,KAAA,GAAQ,CAAA,GAAI,GAAA,GAAM,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,EAAI,KAAK,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA;AACnF;AAGO,SAAS,cAAA,CAAe,MAAc,IAAA,EAAyD;AACpG,EAAA,MAAM,GAAA,GAAM,KAAK,OAAA,IAAW,oBAAA;AAC5B,EAAA,MAAM,OAAO,SAAA,CAAU,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAK,OAAO,CAAA;AACrD,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAI,KAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,GAAA,EAAI;AACtE;AAGO,SAAS,cAAA,CAAe,MAAA,EAAgB,GAAA,EAAoB,IAAA,EAAc,IAAA,EAAsB;AACrG,EAAA,OAAO;AAAA,IACL,SAAS,EAAE,UAAA,EAAY,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAI,EAAE;AAAA,IAC7C,IAAA;AAAA,IACA,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,MAAM,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,CAAK,MAAK,EAAE;AAAA,IACpC,YAAY,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,CAAK,YAAW,EAAE;AAAA,IAChD,OAAA,EAAS,KAAK,OAAA,IAAW;AAAA,GAC3B;AACF;AAGO,SAAS,cAAA,CACd,MAAA,EAAgB,GAAA,EAAoB,IAAA,EAAc,IAAA,EACV;AACxC,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,YAAA,CAAa,MAAA,EAAQ,GAAG,CAAA;AAAA,IAC5B,IAAA,EAAM,MAAA;AAAA,IACN,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,IAAA,EAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,GAAG,cAAA,CAAe,IAAA,EAAM,IAAI,CAAA,EAAE;AAAA,IAClD,IAAA,EAAM,cAAA,CAAe,MAAA,EAAQ,GAAA,EAAK,MAAM,IAAI,CAAA;AAAA,IAC5C,SAAA,EAAW,CAAC,MAAe,CAAA;AAAA,IAC3B,UAAA,EAAY;AAAA,GACd;AACF;AAGO,SAAS,eAAA,CACd,MAAA,EAAgB,KAAA,EAAqB,KAAA,EAA8B,IAAA,EACzB;AAC1C,EAAA,OAAQ,CAAC,MAAA,EAAQ,IAAI,CAAA,CAAY,GAAA,CAAI,CAAC,GAAA,KAAQ,cAAA,CAAe,MAAA,EAAQ,GAAA,EAAK,eAAe,KAAA,EAAO,KAAA,EAAO,GAAG,CAAA,EAAG,IAAI,CAAC,CAAA;AACpH;AAGA,SAAS,OAAA,CAAQ,MAAuC,GAAA,EAAqD;AAC3G,EAAA,MAAM,OAAO,SAAA,CAAU,IAAA,EAAM,GAAA,KAAQ,MAAA,GAAS,IAAI,CAAC,CAAA;AACnD,EAAA,IAAI,IAAA,KAAS,QAAQ,IAAA,CAAK,IAAA,KAAS,aAAa,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAC/E,EAAA,MAAM,CAAA,GAAI,YAAY,IAAI,CAAA;AAC1B,EAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,EAAA,MAAM,CAAC,GAAA,EAAK,IAAI,CAAA,GAAI,GAAA,KAAQ,SACxB,CAAC,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAC,GAAI,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG,EAAG,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAI,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAI,CAAA,GACvD,CAAC,EAAE,CAAA,EAAG,EAAE,CAAC,CAAA,EAAI,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,IAAM,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAI,CAAA;AAC3D,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAA,GAAI,KAAK,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA;AACrD,EAAA,OAAO,QAAQ,CAAA,GAAI,IAAA,GAAO,EAAE,GAAA,EAAK,GAAA,EAAK,EAAE,CAAA,EAAA,CAAI,GAAA,CAAI,IAAI,IAAA,CAAK,CAAA,IAAK,KAAK,CAAA,EAAA,CAAI,GAAA,CAAI,IAAI,IAAA,CAAK,CAAA,IAAK,KAAI,EAAE;AACjG;AAOO,SAAS,oBAAA,CACd,IAAA,GAA6C,EAAC,EAC4D;AAC1G,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAaH,oBAAAA;AACnC,EAAA,OAAO,CAAC,MAAM,IAAA,KAAS;AACrB,IAAA,MAAM,GAAA,GAAM,aAAa,IAAI,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,IAAQ,IAAA;AAC9B,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,IAAA,KAAS,IAAA,EAAM,OAAO,IAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,IAAA,EAAM,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,IAAI,EAAA,KAAO,MAAM,OAAO,IAAA;AACxB,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACtC,IAAA,MAAM,QAAQ,GAAA,GAAA,CAAO,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,IAAI,CAAC,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,KAAK,GAAA,CAAI,EAAA,CAAG,IAAI,CAAC,CAAA,GAAI,EAAE,MAAA,IAAU,CAAA;AACrF,IAAA,MAAM,KAAK,EAAA,CAAG,GAAA,CAAI,CAAA,GAAI,EAAA,CAAG,IAAI,CAAA,GAAI,KAAA;AACjC,IAAA,MAAM,KAAK,EAAA,CAAG,GAAA,CAAI,CAAA,GAAI,EAAA,CAAG,IAAI,CAAA,GAAI,KAAA;AACjC,IAAA,OAAOE,0BAAAA,CAA2B,IAAA,CAAK,IAAA,EAAM,EAAA,IAAM,EAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,IAAI,QAAQ,CAAA;AAAA,EAC5G,CAAA;AACF;AAGO,IAAM,oBAAA,GAAuB;AAG7B,IAAM,2BAA2B,oBAAA;;;AC5HxC,IAAM,GAAA,GAAM,CAAC,CAAA,EAAS,CAAA,KAAoB,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA;AAYvD,SAAS,QAAA,CAAS,OAAwB,QAAA,EAAmC;AAClF,EAAA,MAAME,UAAS,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAoC,CAAA,CAAE,WAAW,IAAI,CAAA;AAClF,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,EAAW,KAAA,KACvB,KAAA,CAAM,MAAA;AAAA,IACJ,CAAC,IAAA,EAAM,CAAA,KAAO,IAAA,KAAS,UAAa,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,GAAG,IAAI,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,GAAG,IAAI,CAAA,GAAI,IAAA;AAAA,IACrF;AAAA,GACF;AACF,EAAA,MAAM,IAAA,GAAO,KAAK,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,IAAKA,OAAM,CAAA;AACxC,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,IAAA;AAE/B,EAAA,MAAM,EAAA,GAAK,KAAK,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,EAAA,EAAG,EAAGA,OAAAA,CAAO,MAAA,CAAO,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,CAAE,MAAA,EAAQ,KAAK,MAAM,CAAC,CAAA,GAAI,GAAG,CAAC,CAAA;AACjG,EAAA,IAAI,EAAA,KAAO,QAAW,OAAO,IAAA;AAE7B,EAAA,MAAM,MAAM,EAAE,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,QAAA,EAAU,GAAG,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,MAAA,CAAO,IAAI,QAAA,EAAS;AACrG,EAAA,MAAM,QAAQ,GAAA,CAAI,EAAE,GAAG,EAAA,CAAG,KAAA,CAAM,IAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,MAAM,CAAA,GAAI,GAAA,CAAI,GAAE,EAAG,EAAA,CAAG,MAAM,CAAA,GAAI,QAAA;AACjF,EAAA,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,KAAK,EAAE,CAAA,EAAG,IAAI,CAAA,GAAI,EAAA,CAAG,OAAO,CAAA,GAAI,KAAA,EAAO,GAAG,GAAA,CAAI,CAAA,GAAI,GAAG,MAAA,CAAO,CAAA,GAAI,OAAM,EAAE;AAC7F;AC9BA,IAAM,QAAA,GAAW,GAAA;AAGjB,IAAM,KAAA,GAAQ,MAAA;AAWd,SAAS,MAAM,CAAA,EAAe;AAC5B,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA,EAAM,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAG;AAC/C,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA,EAAM,OAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAE;AAC/C,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAC,EAAE,CAAA,EAAE;AAC3B;AAIA,SAAS,QAAA,CAAS,CAAA,EAAS,CAAA,EAAS,IAAA,EAAoC;AACtE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAC3C,EAAA,IAAI,GAAA,KAAQ,CAAA,EAAG,OAAO,EAAC;AACvB,EAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,GAAA;AACzB,EAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,GAAA;AACzB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,EAAA,CAAG,CAAA,GAAI,CAAA,CAAE,CAAA;AACxB,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,EAAA,CAAG,CAAA,GAAI,CAAA,CAAE,CAAA;AACxB,IAAA,MAAM,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AACzB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA,GAAI,QAAA,IAAY,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,GAAA,CAAI,IAAI,GAAA,EAAK;AAChF,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA;AAAA,EAC5B;AACA,EAAA,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAC9B,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,GAAA;AACT;AAQO,SAAS,QAAA,CAAS,QAAyB,IAAA,EAAgC;AAChF,EAAA,MAAM,CAAA,GAAI,IAAIC,aAAA,EAAY;AAC1B,EAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,EAAA,IAAI,UAAU,MAAA,IAAa,IAAA,CAAK,WAAW,CAAA,EAAG,OAAOC,qBAAmB,MAAM,CAAA;AAC9E,EAAA,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA;AACzB,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACtB,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAC3C,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAA,GAAI,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAE,GAAI,EAAE,IAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,GAAA,EAAK,IAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,GAAA,EAAI;AACpF,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,KAAA,MAAW,EAAE,GAAG,CAAA,EAAE,IAAK,SAAS,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,EAAG;AAC3C,MAAA,MAAM,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,IAAI,CAAA,EAAE;AAC/C,MAAA,MAAM,GAAA,GAAM,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,IAAI,CAAA,EAAE;AACjD,MAAA,MAAM,IAAI,KAAA,GAAQ,CAAA;AAClB,MAAA,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,GAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA;AACrC,MAAA,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,IAAI,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAC1G,MAAA,CAAA,CAAE,QAAQ,GAAA,CAAI,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,GAAG,GAAA,CAAI,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,GAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,IAAI,CAAA,CAAE,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,IAAI,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,IAAI,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAC1H,MAAA,IAAA,EAAA;AAAA,IACF;AACA,IAAA,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,SAAS,CAAA,GAAIA,oBAAA,CAAmB,MAAM,CAAA,GAAI,EAAE,KAAA,EAAM;AAC3D;AC3DO,IAAM,QAAA,GAAmB,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,GAAG,GAAA,CAAI,SAAA,EAAW,GAAA,CAAI,EAAA,CAAG,KAAK;AAWjF,IAAM,UAAA,GAAqB,CAAC,GAAA,KAAQ;AACzC,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,GAAG,GAAA,CAAI,SAAA,EAAW,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA;AAC7D,EAAA,MAAM,GAAA,GAAc,CAAC,KAAA,CAAM,CAAC,CAAE,CAAA;AAC9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC5B,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,IAAI,EAAE,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA,KAAM,EAAE,CAAA,EAAG;AAC9B,MAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,kBAAkB,CAAA,KAAM,CAAA,GAC1B,YAAA,CAAa,GAAA,CAAI,KAAK,MAAM,CAAA,GAC5B,GAAA,CAAI,MAAA,GAAS,KAAK,GAAA,CAAI,GAAA,CAAI,SAAS,CAAC,CAAA,CAAG,MAAM,CAAA,CAAE,CAAA;AAGnD,IAAA,MAAM,WAAW,CAAA,KAAM,KAAA,CAAM,SAAS,CAAA,GAAI,GAAA,CAAI,GAAG,MAAA,GAAS,IAAA;AAC1D,IAAA,MAAM,mBAAmB,QAAA,IAAY,IAAA,GAAO,CAAC,eAAA,GAAkB,aAAa,QAAQ,CAAA;AACpF,IAAA,IAAI,oBAAoB,gBAAA,EAAkB;AACxC,MAAA,GAAA,CAAI,KAAK,eAAA,GAAkB,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAE,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA;AAClE,MAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,GAAO,IAAI,MAAA,GAAS,CAAA,GAAI,IAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,IAAA;AACrD,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,GAAA,GAAA,CAAO,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAA;AAC1B,MAAA,IAAI,IAAA,KAAS,SAAS,GAAA,GAAM,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA,GAAI,KAAK,CAAA,CAAA,GAAK,CAAA,MAAO,IAAA,CAAK,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,IAAK,CAAC,CAAA;AAAA,eAC5E,IAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,CAAE,CAAA,EAAE,EAAG,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,CAAA,CAAE,CAAA,IAAK,CAAC,CAAA;AAAA,IACzD,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,GAAA,CAAO,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAA;AAC1B,MAAA,IAAI,IAAA,KAAS,SAAS,GAAA,GAAM,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA,GAAI,KAAK,CAAA,CAAA,GAAK,CAAA,MAAO,IAAA,CAAK,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,IAAK,CAAC,CAAA;AAAA,eAC5E,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,GAAA,EAAI,EAAG,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,GAAA,IAAO,CAAC,CAAA;AAAA,IACzD;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,aAAa,MAAA,EAA0C;AAC9D,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,CAAA,IAAK,CAAC,KAAK,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,CAAA,IAAK,CAAC,CAAA;AAC5D;AAUO,IAAM,MAAA,GAAiB,CAAC,GAAA,KAAQ;AACrC,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,GAAG,GAAA,CAAI,SAAA,EAAW,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA;AAC7D,EAAA,MAAM,GAAA,GAAc,CAAC,KAAA,CAAM,CAAC,CAAE,CAAA;AAC9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AACrB,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,GAAI,GAAA,CAAI,KAAK,MAAA,GAAS,OAAA,CAAQ,KAAA,EAAO,CAAA,GAAI,CAAC,CAAA;AAC7D,IAAA,MAAM,GAAA,GAAM,CAAA,KAAM,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,GAAA,CAAI,EAAA,CAAG,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,CAAC,CAAC,CAAA;AAC9E,IAAA,MAAM,GAAA,GAAM,eAAA;AAAA,MACV,CAAA,CAAE,CAAA;AAAA,MAAG,CAAA,CAAE,CAAA;AAAA,MAAG,CAAA,CAAE,CAAA;AAAA,MAAG,CAAA,CAAE,CAAA;AAAA,MACjB,QAAQ,IAAA,GAAO,IAAA,GAAO,CAAC,IAAA,CAAK,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,MACrC,OAAO,IAAA,GAAO,IAAA,GAAO,CAAC,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,MAClC;AAAA,KACF;AACA,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,GAAA,MAAS,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,cAAA,GAAiB,EAAA;AAQvB,SAAS,OAAA,CAAQ,OAAwB,CAAA,EAAwB;AAC/D,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,GAAS,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,EAAW,CAAA,KAAc,KAAK,CAAA,IAAK,CAAA,IAAK,IAAA,GAAO,CAAA,KAAM,KAAA,CAAM,CAAC,EAAG,CAAA,KAAM,KAAA,CAAM,CAAC,CAAA,CAAG,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,CAAG,CAAA,KAAM,KAAA,CAAM,CAAC,CAAA,CAAG,CAAA,CAAA;AAC3H,EAAA,MAAM,CAAC,IAAA,EAAM,EAAE,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,GAAI,CAAC,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAC1F,EAAA,MAAM,KAAK,KAAA,CAAM,EAAE,EAAG,CAAA,GAAI,KAAA,CAAM,IAAI,CAAA,CAAG,CAAA;AACvC,EAAA,MAAM,KAAK,KAAA,CAAM,EAAE,EAAG,CAAA,GAAI,KAAA,CAAM,IAAI,CAAA,CAAG,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC7B,EAAA,OAAO,GAAA,KAAQ,IAAI,IAAA,GAAO,EAAE,GAAG,EAAA,GAAK,GAAA,EAAK,CAAA,EAAG,EAAA,GAAK,GAAA,EAAI;AACvD;AAEA,IAAM,OAAA,GAAU,CAAC,CAAA,KAAiC,CAAA,KAAM,OAAO,IAAA,GAAO,EAAE,CAAA,EAAG,CAAC,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAC,EAAE,CAAA,EAAE;AAQlF,IAAM,KAAA,GAAgB,CAAC,GAAA,KAC3B,GAAA,CAAI,KAAA,KAAU,MAAA,IAAa,UAAA,CAAW,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,SAAA,EAAW,GAAA,CAAI,KAAK,CAAA,GAC7E,CAAC,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,GAAG,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA,GAC3C,UAAA,CAAW,GAAG;AAGb,IAAM,OAAA,GAA4C,OAAO,MAAA,CAAO;AAAA,EACrE,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC;ACjGM,SAAS,UAAA,CACd,GAAA,EACA,GAAA,EACA,MAAA,EACA,MACA,QAAA,EACkB;AAClB,EAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAW;AAC1B,IAAA,MAAM,KAAA,GAAQ,YAAY,GAAA,CAAI,IAAA,EAAe,IAAI,IAAA,EAAM,GAAA,CAAI,MAAM,IAAI,CAAA;AAGrE,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,IAAA,IAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,IAAK,MAAA,CAAO,IAAI,CAAA,CAAE,KAAA,CAAM,CAAA,CAAA,GAAK,CAAA,CAAE,MAAA,CAAO,CAAA,IAAK,OAAO,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,CAAA,GAAK,CAAC,CAAA;AACpI,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,KAAA,EAAO,MAAM,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG,MAAM,CAAA;AACrC;AAGO,SAAS,SAAA,CAAiB,UAAiC,IAAA,EAAmB;AACnF,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AACjC,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA,EAAE;AACvD;AAQO,SAAS,QACd,UAAA,EACA,QAAA,EACA,SAAA,EACA,KAAA,GAAyB,EAAC,EACA;AAC1B,EAAA,OAAO;AAAA,IACL,MAAM,KAAA,CAAM,CAAC,CAAA,IAAK,SAAA,CAAU,CAAC,CAAA,IAAK,QAAA;AAAA,IAClC,EAAA,EAAI,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,KAAK,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA,IAAK;AAAA,GACpE;AACF;AAGA,SAAS,MAAA,CAAO,OAAwB,MAAA,EAAgC;AACtE,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,SAAA,GAAY,CAAA,QAAA;AAChB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA;AACjC,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA;AACjC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA,IAAK,CAAA;AAElC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,KAAW,IAAA,GACxB,CAAA,GAAA,CACC,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,EAAA,IAAM,GAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,GAAM,GAAA;AAC1B,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,SAAA,GAAY,KAAA;AACZ,MAAA,IAAA,GAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,QAAA,CAAS,IAAA,EAA2B,OAAA,GAA4C,OAAA,EAAiB;AAC/G,EAAA,OAAQ,KAAK,MAAA,KAAW,MAAA,IAAa,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,IAAM,QAAA;AAChE;AAuBO,SAAS,cAAA,CACd,IAAA,GAAgC,EAAC,EAC2D;AAC5F,EAAA,MAAM,OAAA,GAAU,WAAW,IAAI,CAAA;AAC/B,EAAA,OAAO,CAAC,MAAM,IAAA,KAAS;AACrB,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA;AAChC,IAAA,IAAI,OAAO,KAAA,KAAU,MAAA,EAAW,OAAO,SAAA,CAAU,MAAM,KAAK,CAAA;AAC5D,IAAA,MAAM,SAAS,KAAA,EAAO,MAAA;AACtB,IAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,MAAA,GAAS,GAAG,OAAO,IAAA;AACtD,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAI,CAAA,EAAG,IAAA;AAClC,IAAA,OAAO,IAAA,KAAS,MAAA,IAAa,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,SAAS,MAAA,EAAQ,IAAI,CAAA,GAAIA,kBAAAA,CAAmB,MAAoC,CAAA;AAAA,EACjI,CAAA;AACF;AAmBO,IAAM,aAAA,GAAgB;AAG7B,SAASC,QAAAA,CAAQ,MAAY,MAAA,EAAoB;AAC/C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,IAAA,CAAK,MAAM,CAAC,CAAA;AAC9E,EAAA,OAAO,EAAE,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA,GAAI,aAAA,EAAe,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAA,CAAE,IAAI,aAAA,EAAc;AACxF;AAEA,SAAS,IAAA,CAAK,GAAW,CAAA,EAAiB;AACxC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC3B,EAAA,OAAO,GAAA,KAAQ,CAAA,GAAI,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAE,GAAI,EAAE,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,IAAI,GAAA,EAAI;AAC/D;AAEA,SAAS,UAAU,KAAA,EAA2C;AAC5D,EAAA,MAAM,CAAA,GAAI,IAAIF,WAAAA,EAAY;AAC1B,EAAA,KAAA,MAAW,GAAA,IAAO,OAAO,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAE,CAAA;AAClG,EAAA,OAAO,EAAE,KAAA,EAAM;AACjB;AAIO,SAAS,UAAA,CACd,IAAA,GAAgC,EAAC,EACoE;AACrG,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAaL,oBAAAA;AACnC,EAAA,MAAM,QAAA,GAAgC,EAAE,QAAA,EAAU,GAAI,IAAA,CAAK,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC,EAAG;AAC5F,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAChB,OAAA,CAAQ,EAAE,IAAA,EAAe,CAAA,CAAE,MAAM,QAAQ,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAiC;AACnD,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,CAAA,CAAE,IAAI,CAAA;AACnC,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,MAAM,CAAA,GAAI,CAAA;AAAA,EACvC,CAAA;AAEA,EAAA,OAAO,CAAC,MAAM,IAAA,KAAS;AACrB,IAAA,MAAM,IAAA,GAAO,cAAc,IAAI,CAAA;AAC/B,IAAA,IAAI,IAAA,KAAS,MAAM,OAAO,IAAA;AAC1B,IAAA,MAAM,CAAC,OAAA,EAAS,KAAK,CAAA,GAAI,IAAA;AACzB,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,KAAA,KAAU,MAAA,EAAW,OAAO,IAAA;AAEzD,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,EAAA,KAAO,KAAA,CAAM,KAAK,EAAA,IAAM,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,MAAA,IAAa,IAAA,CAAK,GAAG,IAAA,KAAS,MAAA,GAC/F,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG,KAAK,gBAAA,IAAoB,UAAA,CAAW,OAAO,CAAC,CAAA,GACxE,IAAA;AACJ,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,IAAa,EAAC;AACpC,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAU,QAAQ,IAAI,CAAA,EAAG,SAAA,CAAU,QAAA,EAAU,KAAA,CAAM,IAAI,CAAA,EAAG,QAAA,EAAU,KAAK,KAAK,CAAA;AAC7G,IAAA,MAAM,IAAA,GAAO,IAAA,EAAM,IAAA,IAAQ,UAAA,CAAW,IAAA,CAAK,MAAM,OAAA,EAAS,IAAA,CAAK,IAAA,EAAM,QAAA,EAAU,QAAQ,CAAA;AACvF,IAAA,MAAM,EAAA,GAAK,IAAA,EAAM,EAAA,IAAM,UAAA,CAAW,IAAA,CAAK,IAAI,KAAA,EAAO,IAAA,CAAK,EAAA,EAAI,QAAA,EAAU,QAAQ,CAAA;AAC7E,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,EAAA,KAAO,MAAA,EAAW,OAAO,IAAA;AAEnD,IAAA,MAAM,SAAA,GAAY,SAAS,IAAA,IAAQ,QAAA,CAAS,WAAW,CAAA,GAAI,CAAC,IAAA,CAAK,GAAG,CAAA,GAAI,QAAA;AACxE,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,OAAO,CAAA,CAAE,EAAE,IAAA,EAAM,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AACtF,IAAA,IAAI,IAAA,CAAK,YAAY,MAAA,EAAW,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,WAAW,MAAA,EAAO;AACrE,IAAA,MAAM,QAAQ,CAAC,CAAC,KAAK,KAAA,EAAOO,QAAAA,CAAQ,MAAM,EAAA,CAAG,KAAK,CAAC,CAAA,EAAG,CAACA,SAAQ,EAAA,EAAI,IAAA,CAAK,KAAK,CAAA,EAAG,EAAA,CAAG,KAAK,CAAC,CAAA;AACzF,IAAA,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,SAAA,EAAW,QAAQ,KAAA,EAAM;AAAA,EAC9C,CAAA;AACF;AAGO,IAAM,YAAA,GAAe;AAKrB,IAAM,mBAAmB,cAAA;AAIzB,SAAS,mBAAA,CACd,QAAA,GAAgD,EAAC,EACZ;AACrC,EAAA,OAAO;AAAA,IACL,GAAG,QAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV,CAAC,YAAY,GAAG,gBAAA;AAAA,MAChB,GAAG,QAAA,CAAS;AAAA,KACd;AAAA,IACA,UAAA,EAAY;AAAA,MACV,CAAC,aAAa,GAAG,iBAAA;AAAA,MACjB,CAAC,aAAa,GAAG,iBAAA;AAAA,MACjB,CAAC,cAAc,GAAG,kBAAA;AAAA,MAClB,CAAC,oBAAoB,GAAG,wBAAA;AAAA,MACxB,GAAG,QAAA,CAAS;AAAA,KACd;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,GAAI,iBAAA;AAAA,MACJ,GAAG,QAAA,CAAS;AAAA;AACd,GACF;AACF;;;AChPO,SAAS,YAAA,CAAa,IAAA,EAAgB,KAAA,EAAoB,OAAA,EAAwE;AACvI,EAAA,IAAI,KAAA,CAAM,WAAW,MAAA,IAAa,CAAC,KAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAA,IAAW,CAAA,CAAE,SAAS,OAAA,IAAW,CAAA,CAAE,SAAS,SAAS,CAAA,SAAU,EAAC;AACrI,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACrC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS,KAAK,OAAA,IAAW,CAAA;AAAA,MAAG,GAAA,EAAK,KAAK,GAAA,IAAO,CAAA;AAAA,MAAG,aAAA,EAAe,KAAK,aAAA,IAAiB,QAAA;AAAA,MAAU,IAAA,EAAM,KAAK,IAAA,CAAK,MAAA;AAAA,MAC/G,OAAA,EAAS,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA;AAAA,MAAG,GAAI,QAAA,CAAS,MAAA,GAAS,IAAI,EAAE,QAAA,KAAa;AAAC;AAChF,GACF;AACF;AAEA,IAAM,UAAA,GAAa,CAAC,CAAA,KAAyB,CAAA,CAAE,UAAU,MAAA,GAAY,EAAE,IAAA,EAAM,SAAA,KAAc,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,EAAE,KAAA,EAAM;AAE7H,SAAS,WAAW,IAAA,EAAqC;AACvD,EAAA,OAAO,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAG,UAAW,CAAA,CAAE,IAAA,KAAS,SAAA,GAAY,EAAC,GAAI,CAAC,EAAE,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAM,GAAI,EAAE,OAAO,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,CAAE,CAAA;AACjI;AAIO,SAAS,aAAa,MAAA,EAAkC;AAC7D,EAAA,IAAI,MAAA,CAAO,OAAA,KAAY,MAAA,EAAW,OAAO,IAAA;AACzC,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAA,CAAK,MAAA,CAAO,YAAY,EAAC,EAAG,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,CAAE,KAAA,EAAO,CAAC,CAAC,CAAC,CAAA;AACzE,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAQ,CAAA,KAAW;AAC5C,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA;AACxB,IAAA,OAAO,CAAA,KAAM,SAAY,EAAE,IAAA,EAAM,QAAQ,MAAA,EAAO,GAAI,WAAW,CAAC,CAAA;AAAA,EAClE,CAAC,CAAA;AACH;AAaA,IAAM,QAAA,GAAW,CAAC,CAAA,MAAwC;AAAA,EACxD,GAAI,GAAG,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAS,GAAI,EAAC;AAAA,EAC5D,GAAI,GAAG,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,CAAA,CAAE,UAAA,EAAW,GAAI,EAAC;AAAA,EAClE,GAAA,CAAK,GAAG,UAAA,IAAc,GAAA,KAAQ,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,EAAC;AAAA,EACtD,GAAI,GAAG,SAAA,KAAc,QAAA,GAAW,EAAE,MAAA,EAAQ,IAAA,KAAS;AACrD,CAAA,CAAA;AAEA,IAAM,OAAO,CAAC,CAAA,EAAQ,MAAW,CAAA,CAAE,CAAA,KAAM,EAAE,CAAA,IAAK,CAAA,CAAE,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,CAAE,KAAA,KAAU,EAAE,KAAA,IAAS,CAAA,CAAE,WAAW,CAAA,CAAE,MAAA;AAS9F,SAAS,cAAA,CAAe,KAAA,EAAsB,GAAA,EAAuB,OAAA,EAAgC;AAC1G,EAAA,KAAA,MAAW,EAAA,IAAM,IAAI,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,EAAW,CAAA;AAClC,IAAA,MAAM,KAAA,GAAS,MAAM,IAAA,EAAgD,OAAA;AACrE,IAAA,IAAI,SAAS,MAAA,IAAa,KAAA,EAAO,SAAS,MAAA,IAAa,KAAA,CAAM,YAAY,MAAA,EAAW;AACpF,IAAA,MAAM,SAAS,KAAA,CAAM,IAAA;AACrB,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,IAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,UAAA,CAAW,EAAW,CAAA,EAAG;AACjD,MAAA,MAAM,KAAA,GAAS,KAAA,CAAM,GAAA,CAAI,KAAc,GAAG,IAAA,EAA+B,OAAA;AACzE,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,IAC1D;AACA,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAA,CAAK,MAAA,CAAO,YAAY,EAAC,EAAG,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,CAAE,KAAA,EAAO,CAAC,CAAC,CAAC,CAAA;AACzE,IAAA,MAAM,IAAA,GAAc,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAK,EAAG,CAAC,CAAA,EAAG,CAAA,KAAW;AACrE,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA;AAC9B,MAAA,IAAI,OAAA,KAAY,MAAA,EAAW,OAAO,UAAA,CAAW,OAAO,CAAA;AACpD,MAAA,MAAM,OAAO,KAAA,CAAM,GAAA,CAAI,SAAS,GAAA,CAAI,CAAC,CAAU,CAAA,EAAG,IAAA;AAClD,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,OAAO,IAAA,EAAM,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,OAAO,EAAA,EAAI,KAAA,EAAO,QAAA,CAAS,IAAA,EAAM,KAAK,CAAA,EAAE;AAAA,IAC9G,CAAC,CAAA;AACD,IAAA,MAAM,IAAA,GAAiB,EAAE,OAAA,EAAS,KAAA,CAAM,SAAS,IAAA,EAAM,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,GAAA,EAAK,MAAA,CAAO,GAAA,EAAK,aAAA,EAAe,OAAO,aAAA,EAAc;AACrI,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA;AACxC,IAAA,IAAI,MAAA,CAAO,OAAA,KAAY,MAAA,IAAa,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,MAAA,CAAO,OAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AACpF,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,MAAA,KAAA,CAAM,OAAO,EAAA,EAAa,EAAE,MAAM,EAAE,GAAG,MAAM,OAAA,EAAS,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,EAAE,GAAG,MAAA,EAAQ,SAAQ,EAAE,IAAc,CAAA;AAAA,IAC/G;AACA,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,MAAM,QAAQ,UAAA,CAAW,IAAA,EAAM,WAAA,CAAY,IAAA,EAAM,OAAO,CAAC,CAAA;AACzD,IAAA,IAAI,KAAA,KAAU,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,IAAa,KAAc,CAAA;AAE7D,IAAA,KAAA,MAAW,OAAO,UAAA,CAAW,IAAA,EAAM,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,KAAA,CAAM,OAAO,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAO,EAAG,OAAO,CAAA,EAAG;AACrG,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AACpC,MAAA,MAAM,KAAK,KAAA,KAAU,MAAA,GAAY,SAAY,KAAA,CAAM,GAAA,CAAI,KAAc,CAAA,EAAG,IAAA;AACxE,MAAA,IAAI,OAAO,MAAA,EAAW;AACtB,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,EAAA,EAAI,GAAG,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,GAAG,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,MAAA,EAAQ,IAAI,MAAA,EAAO;AAC/E,MAAA,IAAI,CAAC,KAAK,EAAA,EAAI,IAAI,GAAG,KAAA,CAAM,OAAA,CAAQ,OAAgB,IAAa,CAAA;AAAA,IAClE;AAAA,EACF;AACF;;;AC+EO,IAAM,mBAAA,GAAsB;AAE5B,IAAM,iBAAA,GAAoB;AAY1B,IAAM,qBAAgC,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,SAAA;AAElF,IAAM,iBAAA,GAAoB;AAE1B,IAAM,iBAAA,GAAoB;AAE1B,IAAM,iBAAA,GAAoB;;;AC7LjC,IAAM,cAAA,GAAiB,CAAA;AAiCvB,SAAS,UAAA,CAAW,IAAA,EAAqB,IAAA,EAAiB,KAAA,EAAkB,QAAiB,OAAA,EAAuC;AAClI,EAAA,MAAM,SAAA,GAA8B;AAAA,IAClC,IAAA;AAAA,IAAM,MAAA,EAAQ,cAAA,CAAe,IAAA,EAAM,IAAI,CAAA,CAAE,MAAA;AAAA,IAAQ,GAAI,MAAA,GAAS,EAAE,MAAA,EAAQ,IAAA,KAAS,EAAC;AAAA,IAAI,GAAI,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,KAAY;AAAC,GACnI;AACA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAU;AAAA,IACtC,GAAI,IAAA,KAAS,MAAA,GAAS,KAAK,EAAE,IAAA,EAAM,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,IAAA,IAAO,EAAE;AAAA,IACpE,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAE,OAAO,KAAA,CAAM,MAAA,EAAO,EAAG,KAAA,EAAO,IAAA,KAAS,MAAA,GAAS,iBAAA,GAAoB,KAAA,CAAM,eAAe,iBAAA;AAAkB,GAChI;AACF;AAEA,IAAM,YAAY,CAAC,IAAA,EAAc,KAAA,EAAkB,UAAA,GAAa,aAAa,UAAA,MAAkC;AAAA,EAC7G,IAAA;AAAA,EACA,KAAA,EAAO,EAAE,UAAA,EAAY,QAAA,EAAU,IAAI,UAAA,EAAY,GAAA,EAAK,OAAO,QAAA,EAAS;AAAA,EACpE,aAAA,EAAe,QAAA;AAAA,EACf,MAAM,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,MAAK;AACrC,CAAA,CAAA;AAGO,SAAS,WAAA,CACd,IAAA,EAAqB,IAAA,EAAiB,IAAA,EAAgB,OAAsB,IAAA,EACtD;AACtB,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,kBAAA;AAC5B,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,cAAA,CAAe,MAAM,IAAI,CAAA;AACpD,EAAA,MAAM,MAAA,GAA6B;AAAA,IACjC,IAAI,IAAA,CAAK,EAAA;AAAA,IAAc,IAAA,EAAM,MAAA;AAAA,IAAQ,OAAO,IAAA,CAAK,KAAA;AAAA,IAAO,IAAA;AAAA,IAAM,MAAA,EAAS,KAAK,MAAA,IAAU,IAAA;AAAA,IACtF,IAAA,EAAM,WAAW,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,CAAK,MAAA,KAAW,IAAA,EAAM,IAAA,CAAK,OAAO,CAAA;AAAA,IAAG,MAAA,EAAQ,kBAAkB,MAAM;AAAA,GAC3G;AACA,EAAA,IAAI,KAAA,KAAU,IAAA,EAAM,OAAO,CAAC,MAAM,CAAA;AAClC,EAAA,OAAO,CAAC,MAAA,EAAQ;AAAA,IACd,EAAA,EAAI,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAAA,IAAa,IAAA,EAAM,MAAA;AAAA,IAAQ,OAAO,IAAA,CAAK,KAAA;AAAA,IAAO,QAAQ,IAAA,CAAK,EAAA;AAAA,IAAc,QAAA,EAAU,KAAA;AAAA,IACxG,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,MAAM,CAAA;AAAA,IAAG,IAAA,EAAM,SAAA,CAAU,KAAA,EAAO,KAAA,EAAO,KAAK,UAAU;AAAA,GAC7E,CAAA;AACH;AAGO,SAAS,UAAA,CACd,MAAA,EAAgB,IAAA,EAAiB,EAAA,EAAc,IAAA,EACzB;AACtB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,cAAA,CAAe,QAAQ,IAAI,CAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,aAAA,EAAA,CAAgB,IAAA,KAAS,MAAM,EAAA,CAAG,MAAA,GAAS,EAAA,CAAG,KAAA,IAAS,cAAc,CAAA;AAC3F,EAAA,MAAM,MAA4B,EAAC;AACnC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,EAAgB,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,OAAiB,IAAA,KAAS,GAAA,GAC5B,EAAE,CAAA,EAAG,GAAG,CAAA,GAAI,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA,GAAI,MAAM,KAAA,EAAO,EAAA,CAAG,QAAQ,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,KACpF,EAAE,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA,GAAI,MAAM,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,MAAA,CAAO,MAAM,KAAA,EAAO,IAAA,EAAM,QAAQ,EAAA,CAAG,MAAA,GAAS,OAAO,IAAA,EAAK;AAC9F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,EAAY,MAAA,IAAU,EAAC;AAC3C,IAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,GAAS,CAAA,GAAI,OAAO,CAAA,GAAI,MAAA,CAAO,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA;AACnE,IAAA,GAAA,CAAI,IAAA,CAAK,GAAG,WAAA,CAAY,MAAA,EAAQ,MAAM,IAAA,EAAM,CAAA,KAAA,EAAQ,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MAC3D,EAAA,EAAI,KAAK,KAAA,EAAM;AAAA,MAAG,OAAO,IAAA,CAAK,KAAA;AAAA,MAAO,MAAA,EAAQ,MAAA;AAAA,MAAQ,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC,KAC/E,CAAC,CAAA;AAAA,EACJ;AACA,EAAA,OAAO,GAAA;AACT;;;AChGA,IAAM,WAAA,GAAqC,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAG7D,SAAS,aAAa,MAAA,EAAqE;AAChG,EAAA,MAAM,GAAA,GAAM,YAAY,MAAA,CAAO,CAAC,MAAM,MAAA,GAAS,CAAC,MAAM,MAAS,CAAA;AAC/D,EAAA,OAAO,IAAI,MAAA,GAAS,CAAA,GAAI,EAAE,QAAA,EAAU,GAAA,KAAQ,EAAC;AAC/C;AAGO,SAAS,aAAa,MAAA,EAAqE;AAChG,EAAA,MAAM,MAAoB,EAAC;AAC3B,EAAA,IAAI,MAAA,EAAQ,MAAA,KAAW,MAAA,EAAW,GAAA,CAAI,KAAK,QAAQ,CAAA;AACnD,EAAA,IAAI,MAAA,EAAQ,KAAA,KAAU,MAAA,EAAW,GAAA,CAAI,KAAK,MAAM,CAAA;AAChD,EAAA,OAAO,IAAI,MAAA,GAAS,CAAA,GAAI,EAAE,QAAA,EAAU,GAAA,KAAQ,EAAC;AAC/C;AAGO,SAAS,UAAA,CAA6B,OAAU,MAAA,EAAmC;AACxF,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,KAAA;AACjC,EAAA,MAAM,GAAA,GAAM,EAAE,GAAG,KAAA,EAAM;AACvB,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAM,CAAA,EAAG,IAAI,CAAA,KAAM,MAAA,EAAY,GAAA,CAAgC,CAAC,CAAA,GAAI,CAAA;AACxG,EAAA,OAAO,GAAA;AACT;;;ACfO,IAAM,kBAAA,GAAgC,EAAE,MAAA,EAAQ,SAAA;AAGhD,SAAS,aAAA,CAAc,MAA0C,KAAA,EAAiC;AACvG,EAAA,OAAO,UAAA,CAAW,QAAQ,SAAA,CAAU,KAAA,EAAO,KAAK,KAAK,CAAA,GAAI,kBAAA,EAAoB,IAAA,CAAK,MAAM,CAAA;AAC1F;AAGO,SAAS,aAAA,CAAc,MAA0C,KAAA,EAAiC;AACvG,EAAA,OAAO,UAAA,CAAW,QAAQ,aAAA,CAAc,KAAA,EAAO,KAAK,KAAK,CAAA,GAAI,kBAAA,EAAoB,IAAA,CAAK,MAAM,CAAA;AAC9F;AAcO,SAAS,eAAA,CAAgB,MAAA,EAAsB,KAAA,EAAsB,SAAA,GAAY,CAAA,EAAc;AACpG,EAAA,OAAO,WAAW,gBAAA,CAAiB,MAAA,EAAQ,OAAO,SAAS,CAAA,EAAG,OAAO,MAAM,CAAA;AAC7E;AAEA,SAAS,gBAAA,CAAiB,CAAA,EAAiB,KAAA,EAAiC,SAAA,EAA8B;AACxG,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,kBAAA;AAChC,EAAA,MAAM,GAAA,GAAM,EAAE,KAAA,KAAU,MAAA,GAAY,MAAM,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA,GAAI,MAAA;AAC3D,EAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,GAAA;AAC9B,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,MAAM,IAAA,CAAK,MAAA;AACzC,EAAA,IAAI,EAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,KAAA,CAAM,KAAK,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,IAAA,CAAK,OAAO,MAAM,CAAC,KAAK,KAAA,CAAM,SAAA;AAC5G,EAAA,OAAO,KAAA,CAAM,SAAA;AACf;;;AC1CA,IAAM,SAAS,CAAC,CAAA,KAAc,CAAA,CAAE,OAAA,CAAQ,aAAa,MAAM,CAAA;AAMpD,IAAM,QAAA,GAAW,CAAC,CAAA,KAAgB;AACvC,EAAA,IAAI,CAAA,CAAE,EAAA,KAAO,MAAA,EAAW,OAAO,CAAA,CAAE,EAAA;AACjC,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,EAAc,CAAA,KAA2B,CAAA,KAAM,MAAA,GAAY,EAAA,GAAK,CAAA,EAAG,IAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AACjG,EAAA,OAAO,CAAA,KAAA,EAAQ,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,MAAM,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA;AACnH;ACaA,SAAS,MAAM,CAAA,EAAmB;AAChC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,GAAI,KAAK,KAAA,CAAA,CAAO,CAAA,GAAI,KAAK,EAAE,CAAA,QAAS,MAAA,CAAO,YAAA,CAAa,MAAO,CAAA,GAAI,CAAA,IAAK,EAAG,CAAA,GAAI,GAAA;AAC1G,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,eAAe,IAAA,EAAmC;AAChE,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,CAAA,EAAA;AAC3B,EAAA,OAAO,MAAM,CAAC,CAAA;AAChB;AASO,SAAS,cAAc,KAAA,EAA4D;AACxF,EAAA,MAAM,OAAO,IAAI,GAAA,CAAI,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAA;AACrC,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAiC;AACjD,EAAA,MAAM,QAAoD,EAAC;AAC3D,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,KAAA,CAAM,KAAA,EAAO,KAAK,IAAI,CAAA;AAChD,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,KAAA,CAAM,KAAA,EAAO,KAAK,EAAE,CAAA;AAC5C,IAAA,IAAI,SAAS,IAAA,IAAQ,EAAA,KAAO,QAAQ,IAAA,CAAK,EAAA,KAAO,GAAG,EAAA,EAAI;AACrD,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AACrB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAS,GAAA;AAC3B,IAAA,IAAI,SAAS,MAAA,IAAa,CAAC,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACzC,MAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,EAAA,EAAI,EAAA,CAAG,EAAA,EAAI,CAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,EAAA,EAAI,EAAA,CAAG,EAAA,EAAI,CAAA;AAAA,IACtD;AAAA,EACF;AACA,EAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,IAAA,MAAM,GAAA,GAAM,eAAe,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,IAAA,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,GAAA,EAAK,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,GAAA;AACT;AChEO,SAAS,aAAa,IAAA,EAAiC;AAC5D,EAAA,OAAO,YAAY,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,KAAK,UAAU,CAAA;AACtD;AAOO,SAAS,WAAA,CACd,KAAA,EACA,KAAA,EACA,KAAA,EACA,IAAA,EACoE;AACpE,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,KAAM;AACjC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAA,CAAE,EAAE,CAAA;AACrB,IAAA,OAAO,IAAA,KAAS,MAAA,IAAa,EAAA,KAAO,MAAA,GAAY,EAAC,GAAI,CAAC,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,IAAI,CAAA;AAAA,EAC9E,CAAC,CAAA;AACD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA0B;AAC7C,EAAA,MAAM,OAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,CAAA,IAAK,aAAA,CAAc,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG;AAChE,IAAA,IAAI,UAAU,IAAA,EAAM;AACpB,IAAA,MAAA,CAAO,GAAA,CAAI,IAAI,KAAK,CAAA;AACpB,IAAA,IAAA,CAAK,IAAA,CAAK,GAAI,eAAA,CAAgB,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,CAAmB,CAAA;AAAA,EAC/F;AACA,EAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AACxB;AAIO,SAAS,eAAA,CACd,IAAA,EACA,QAAA,EACA,KAAA,EACA,OACA,IAAA,EAC2E;AAC3E,EAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,cAAA,CAAe,CAAC,CAAA,KAAM,IAAI,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,EAAG,CAAA,CAAE,IAAc,CAAC,CAAC,CAAA;AACnH,EAAA,OAAO,WAAA,CAAY,KAAA,EAAO,KAAA,EAAO,CAAC,OAAO,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,IAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG,MAAM,CAAA;AACrF;;;ACzBO,SAAS,UAAA,CACd,UACA,MAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAClD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAsB;AAEzC,EAAA,MAAM,gBAAA,GAAmB,CAAC,SAAA,EAAmB,EAAA,KAAwB;AACnE,IAAA,KAAA,IAAS,EAAA,GAAyB,IAAI,EAAA,KAAO,MAAA,EAAW,KAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AAC7E,MAAA,IAAI,EAAA,KAAO,WAAW,OAAO,IAAA;AAAA,IAC/B;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,EAAA,IAAM,MAAM,OAAA,EAAS;AAC9B,MAAA,IAAI,MAAA,CAAO,EAAE,CAAA,EAAG;AACd,QAAA,IAAI,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA,EAAG;AAC1B,QAAA,YAAA,CAAa,IAAI,EAAE,CAAA;AACnB,QAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,MACb,CAAA,MAAA,IAAW,QAAA,CAAS,GAAA,CAAI,EAAE,KAAK,CAAC,QAAA,CAAS,GAAA,CAAI,EAAE,KAAK,CAAC,gBAAA,CAAiB,EAAA,EAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AACnF,QAAA,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,KAAA,CAAM,EAAE,CAAA;AACzB,QAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,MACb;AAAA,IACF;AACA,IAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,GAAG,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,MAAM,OAAA,GAAU,CAAC,EAAA,KAAyB;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACzB,IAAA,IAAI,KAAA,KAAU,QAAW,OAAO,KAAA;AAChC,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAI;AACpC,MAAA,IAAI,QAAA,CAAS,IAAI,MAAM,CAAA,MAAO,IAAA,CAAK,GAAG,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,WAChD,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,IACtB;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,IAAI,GAAG,CAAA;AAChB,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,OAAO,IAAI,GAAA,CAAI,SAAS,MAAA,CAAO,CAAC,MAAM,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACtF,EAAA,OAAO,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM;AACvD,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAChC,IAAA,OAAO;AAAA,MACL,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,QAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAE,EAAG,MAAA,CAAO,CAAC,EAAA,KAAO,CAAC,SAAS,GAAA,CAAI,EAAE,KAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA;AAAA,MAC1E,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAAA,MACtB,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW;AAAC,KAC3C;AAAA,EACF,CAAC,CAAA;AACH;;;ACyDO,SAAS,UAAA,CACd,MAAA,EACA,IAAA,GAAiC,EAAC,EAC3B;AACP,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAaP,sBAAAA;AACnC,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAuB;AACxC,EAAA,MAAM,aAA0B,EAAC;AACjC,EAAA,MAAM,aAAqH,EAAC;AAC5H,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA2B;AAE7C,EAAA,KAAA,MAAW,EAAE,IAAA,EAAM,IAAA,EAAK,IAAK,QAAO,EAAG;AACrC,IAAA,MAAM,IAAA,GAAO,cAAc,IAAI,CAAA;AAC/B,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,OAAO,IAAA,CAAK,SAAA;AAClB,MAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AAC5C,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,UACZ,EAAA,EAAI,KAAK,CAAC,CAAA;AAAA,UACV,GAAI,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,MAAA,GAAY,EAAE,QAAA,EAAU,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC;AAAA,UACnE,GAAI,IAAA,CAAK,EAAA,CAAG,IAAA,KAAS,MAAA,GAAY,EAAE,MAAA,EAAQ,IAAA,CAAK,EAAA,CAAG,IAAA,EAAK,GAAI,EAAC;AAAA,UAC7D,GAAI,IAAA,CAAK,SAAA,KAAc,MAAA,IAAa,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,KAAc,EAAC;AAAA,UACjG,GAAI,gBAAgB,IAAI,CAAA,GAAI,EAAC,GAAI,EAAE,UAAU,IAAA;AAAK,SACnD,CAAA;AACD,QAAA,IAAI,gBAAgB,IAAI,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,MAC/C;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,eAAe,IAAI,CAAA;AACjC,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,MAAM,OAAO,IAAA,CAAK,SAAA;AAClB,MAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,WAAW,CAAA,IAAK,kBAAA,CAAmB,KAAA,CAAM,EAAE,KAAK,CAAC,KAAA,CAAM,IAAI,IAAA,CAAK,CAAC,CAAE,CAAA,EAAG;AACpG,QAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,QAAA,CAAS,UAAU,IAAI,CAAA;AACjD,QAAA,KAAA,CAAM,IAAI,IAAA,CAAK,CAAC,CAAA,EAAI,EAAE,OAAO,MAAA,EAAQ,GAAI,KAAA,CAAM,MAAA,GAAS,EAAE,MAAA,EAAQ,KAAA,CAAM,QAAO,GAAI,IAAK,CAAA;AAAA,MAC1F;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AAC3C,IAAA,IAAI,UAAU,IAAA,EAAM;AACpB,IAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW;AAC7B,MAAA,MAAM,OAAO,IAAA,CAAK,SAAA;AAClB,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,SAAS,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAO,EAAC;AAAA,QACvC,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAAA,QAChC,GAAI,KAAA,CAAM,KAAA,CAAM,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,KAAA,CAAM,KAAA,CAAM,QAAA,EAAS,GAAI,EAAC;AAAA,QAC/E,GAAI,MAAM,KAAA,CAAM,OAAA,KAAY,SAAY,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI;AAAC,OAC/D,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAmB;AAAA,MACvB,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,MAAA,EAAQ,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AAAA,MAC/B,MAAA,EAAQ,MAAM,MAAA,KAAW,IAAA;AAAA,MACzB,GAAI,MAAM,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI,EAAC;AAAA,MAC1D,GAAI,MAAM,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAQ,GAAI,EAAC;AAAA,MAChE,GAAI,MAAM,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAO,GAAI;AAAC,KAC/D;AACA,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AACzD,EAAA,MAAM,IAAA,GAAqB,UAAA,CAAW,UAAA,EAAY,CAAC,EAAA,KAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM;AACjF,IAAA,KAAA,MAAW,EAAA,IAAM,EAAE,MAAA,EAAQ;AACzB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACxB,MAAA,IAAI,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,KAAA,GAAQ,CAAA,CAAE,EAAA;AAAA,IACzC;AACA,IAAA,OAAO;AAAA,MACL,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,CAAG,KAAA;AAAA,MAC3B,GAAI,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,EAAG,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,SAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,CAAG,QAAA,KAAa,EAAC;AAAA,MAC/F,GAAI,EAAE,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,GAAI,EAAC;AAAA,MACrD,GAAI,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,CAAG,QAAA,KAAa,IAAA,GAAO,EAAE,OAAA,EAAS,CAAA,CAAE,MAAA,KAAW;AAAC,KACvE;AAAA,EACF,CAAC,CAAA;AACD,EAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KAAe,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAG1E,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM;AACnC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC3B,IAAA,OAAO,IAAA,KAAS,MAAA,IAAa,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,GAAI,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,IAAA,EAAK,GAAI,CAAA;AAAA,EAC1E,CAAC,CAAA;AACD,EAAA,OAAO,QAAQ,KAAA,EAAO,gBAAA,CAAiB,OAAO,MAAA,CAAO,CAAC,MAAM,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA,IAAK,MAAM,CAAA,CAAE,EAAE,CAAC,CAAA,EAAG,IAAI,GAAG,IAAI,CAAA;AACxG;AAEA,IAAM,IAAA,GAA6B,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAG5C,SAAS,OAAA,CAAQ,KAAA,EAAoB,KAAA,EAAoB,MAAA,GAAuB,EAAC,EAAU;AAChG,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAChD,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAyB;AACzC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAyB;AAC1C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AACzB,IAAA,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA,EAAM,CAAC,EAAA,KAAO,IAAA,CAAK,IAAI,EAAE,CAAA;AAAA,IACzB,UAAU,CAAC,EAAA,KAAO,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,IAAK,IAAA;AAAA,IACjC,UAAU,CAAC,EAAA,KAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,IAAK;AAAA,GACpC;AACF;AAKO,SAAS,mBAAmB,EAAA,EAAiC;AAClE,EAAA,OAAO,EAAA,KAAO,KAAA,IAAS,OAAO,EAAA,KAAO,QAAA;AACvC;AAEA,SAAS,IAAA,CAAK,KAAA,EAAiC,GAAA,EAAa,IAAA,EAAuB;AACjF,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC1B,EAAA,IAAI,SAAS,MAAA,EAAW,KAAA,CAAM,IAAI,GAAA,EAAK,CAAC,IAAI,CAAC,CAAA;AAAA,OACxC,IAAA,CAAK,KAAK,IAAI,CAAA;AACrB;;;AC3PO,IAAM,QAAA,GAAW,CAAC,CAAA,EAA6B,IAAA,MAAkC;AAAA,EACtF,UAAA,EAAY,CAAA,EAAG,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,EAClC,QAAA,EAAU,CAAA,EAAG,QAAA,IAAY,IAAA,CAAK,QAAA;AAAA,EAC9B,GAAI,GAAG,IAAA,KAAS,IAAA,GAAO,EAAE,UAAA,EAAY,GAAA,KAAQ,EAAC;AAAA,EAC9C,GAAI,GAAG,MAAA,KAAW,IAAA,GAAO,EAAE,SAAA,EAAW,QAAA,KAAsB;AAC9D,CAAA,CAAA;AAGO,SAAS,YAAA,CAAa,KAAsB,IAAA,EAA8B;AAC/E,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,GAAA,EAAK,IAAA,KAAS,OAAA,IAAW,GAAA,EAAK,IAAA,KAAS,OAAA,GAAU,GAAA,CAAI,KAAA,GAAQ,MAAA,EAAW,IAAI,CAAA;AAClG,EAAA,OAAO,GAAA,EAAK,SAAS,OAAA,GAAU,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,UAAS,GAAI,IAAA;AAChE;ACoBO,SAAS,cAAc,IAAA,EAA6C;AACzE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,IAAA;AACtD,EAAA,MAAM,KAAA,GAAS,KAAiC,iBAAiB,CAAA;AACjE,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,EAAE,MAAA,IAAU,QAAQ,OAAO,IAAA;AAC9E,EAAA,MAAM,OAAQ,KAAA,CAA4B,IAAA;AAC1C,EAAA,OAAO,IAAA,KAAS,QAAQ,OAAO,IAAA,KAAS,YAAY,OAAQ,IAAA,CAAqB,CAAA,KAAM,QAAA,GAClF,IAAA,GACD,IAAA;AACN;AAEA,IAAM,MAAA,uBAAa,GAAA,EAAkB;AACrC,IAAM,UAAA,GAAa,GAAA;AAEnB,SAAS,QAAA,CAAS,GAAW,MAAA,EAA0C;AACrE,EAAA,IAAI,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AACvB,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,IAAA,GAAO,SAAA,CAAU,CAAA,EAAG,CAAC,OAAA,KAAY;AAC/B,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,MAAA,GAAS,OAAO,CAAA;AAAA,IAClB,CAAC,CAAA;AACD,IAAA,IAAI,IAAA,CAAK,SAAS,SAAA,IAAa,IAAA,CAAK,SAAS,MAAA,KAAW,CAAA,WAAY,kBAAkB,CAAA;AAAA,SAAA,IAC7E,CAAC,MAAA,EAAQ;AAChB,MAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,UAAA,EAAY,MAAA,CAAO,KAAA,EAAM;AAC5C,MAAA,MAAA,CAAO,GAAA,CAAI,GAAG,IAAI,CAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAIA,SAAS,aAAA,CAAc,MAAA,EAAgB,KAAA,EAAe,CAAA,EAAiB;AACrE,EAAA,QAAA,CAAS,CAAA,EAAG,CAAC,OAAA,KAAY;AACvB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAM,CAAA,QAAA,EAAW,KAAK,CAAA,YAAA,EAAe,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAE,CAAA;AAAA,EAC5H,CAAC,CAAA;AACH;AAGO,SAAS,SAAA,CACd,IAAA,GAA6C,EAAC,EACd;AAChC,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAa,oBAAA;AACnC,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,cAAA;AAAA,IACJ,OAAA,EAAS,CAAC,IAAA,KAAS,aAAA,CAAc,IAAI,CAAA,KAAM,IAAA;AAAA,IAC3C,KAAA,EAAO,CAAC,IAAA,EAAM,IAAA,EAAM,GAAA,KAAQ;AAC1B,MAAA,MAAM,IAAA,GAAO,cAAc,IAAI,CAAA;AAC/B,MAAA,IAAI,IAAA,KAAS,IAAA,EAAM,OAAO,EAAC;AAC3B,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AACnC,MAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,MAAA,MAAM,eAAe,WAAA,CAAY,CAAA,CAAE,IAAA,EAAM,GAAA,EAAK,WAAW,IAAI,CAAA;AAC7D,MAAA,MAAM,iBAAiB,aAAA,CAAc,CAAA,CAAE,MAAA,EAAQ,GAAA,EAAK,WAAW,MAAM,CAAA;AACrE,MAAA,MAAM,IAAA,GAAO,YAAA,IAAgB,WAAA,CAAY,YAAA,EAAc,GAAG,CAAA;AAC1D,MAAA,MAAM,MAAA,GAAS,cAAA,IAAkB,aAAA,CAAc,cAAA,EAAgB,GAAG,CAAA;AAClE,MAAA,OAAO,CAAC;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,MAAM,aAAA,CAAc,QAAA,CAAS,IAAA,CAAK,CAAC,GAAG,CAAC,GAAA,CAAI,KAAA,EAAO,CAAA,EAAG,GAAG,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,QACjF,GAAI,IAAA,GAAO,EAAE,IAAA,KAAS,EAAC;AAAA,QACvB,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW;AAAC,OAC5B,CAAA;AAAA,IACH;AAAA,GACF;AACF;AAGO,SAAS,iBAAA,CAAyB,IAAA,GAA6C,EAAC,EAAe;AACpG,EAAA,OAAO,kBAAkB,SAAA,CAAU,IAAI,GAAG,EAAE,QAAA,EAAU,QAAQ,CAAA;AAChE;AAGO,SAAS,SAAA,CACd,MAAA,EACA,KAAA,EACA,GAAA,EACA,GAAA,EACe;AACf,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAmB;AACzC,IAAA,MAAM,EAAA,GAAK,CAAA,EAAG,MAAM,CAAA,MAAA,EAAS,CAAC,CAAA,CAAA;AAC9B,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,aAAA,CAAc,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA;AAC/B,MAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,MAAmB,EAAE,OAAO,GAAI,IAAA,CAAK,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ,GAAI,EAAC,EAAG,CAAA;AAC5G,MAAA,MAAM,MAAA,GAAS,KAAK,MAAA,KAAW,IAAA,CAAK,SAAS,MAAA,GAAY,GAAA,CAAI,MAAM,MAAA,GAAS,MAAA,CAAA;AAC5E,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QACA,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,QAAA,EAAU,KAAA;AAAA,QACV,IAAA,EAAM,EAAE,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,MAAA,EAAQ,IAAI,MAAA,EAAO;AAAA,QACjE,IAAA,EAAM;AAAA,UACJ,SAAS,EAAE,IAAA,EAAM,EAAE,CAAA,EAAG,IAAA,CAAK,GAAE,EAAE;AAAA,UAC/B,GAAI,IAAA,CAAK,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAE,KAAM,EAAC;AAAA,UACvE,GAAI,MAAA,KAAW,MAAA,GACX,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,MAAM,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,WAAA,IAAe,KAAK,GAAI,IAAA,CAAK,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC,EAAG,EAAE,GAC9G;AAAC;AACP,OACF;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAI,OAAA,CAAQ,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA;AACpD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,EAAA;AAC/B,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU,KAAA;AAAA,MACV,IAAA,EAAM;AAAA,QACJ,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA,CAAI,KAAA,IAAS,IAAA,CAAK,MAAA,EAAQ,CAAA,IAAK,CAAA,CAAA,GAAK,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA;AAAA,QACzE,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA,CAAI,MAAA,IAAU,IAAA,CAAK,MAAA,EAAQ,CAAA,IAAK,CAAA,CAAA,GAAK,IAAA,CAAK,IAAI,IAAA,CAAK,MAAA;AAAA,QAC1E,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAQ,IAAA,CAAK;AAAA,OACf;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,SAAS,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAI,IAAA,CAAK,IAAI,IAAA,EAAM,GAAI,IAAA,CAAK,MAAA,GAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAO,GAAI,IAAI,EAAE;AAAA,QAC1F,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,KAAA,EAAO,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AAAA,QAC/B,IAAA,EAAM,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,KAAK,KAAA,IAAS,GAAA,CAAI,KAAA,CAAM,IAAA,EAAK;AAAE,OACzD;AAAA,MACA,SAAA,EAAW,CAAC,MAAe,CAAA;AAAA,MAC3B,UAAA,EAAY;AAAA,KACd;AAAA,EACF,CAAC,CAAA;AACH;;;AClJO,IAAM,eAAA,GAAkB,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA,EAAI;AAwClD,SAAS,iBAAA,CACd,UAAA,EACA,GAAA,EACA,OAAA,EACa;AACb,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAwB;AACzC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AACjC,IAAA,IAAI,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,CAAA,CAAE,EAAE,CAAA,2CAAA,CAA6C,CAAA;AACnH,IAAA,GAAA,CAAI,GAAA,CAAI,EAAE,EAAE,CAAA;AACZ,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAAA,EAClB,CAAA;AACA,EAAA,MAAM,IAAA,GAAO,EAAE,MAAA,EAAQ,EAAC,EAAG,QAAQ,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,CAAA,EAAE;AAClE,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,OAAO,CAAA,CAAE,IAAA,KAAS,MAAA,GAAS,CAAA,CAAE,QAAQ,GAAA,GAAM,GAAA;AACjD,IAAA,OAAA,CAAQ;AAAA,MACN,GAAG,IAAA;AAAA,MAAM,QAAQ,EAAC;AAAA,MAAG,IAAI,CAAA,CAAE,EAAA;AAAA,MAAI,MAAM,CAAA,CAAE,IAAA;AAAA,MAAM,IAAA;AAAA,MAAM,MAAA,EAAQ,EAAE,MAAA,KAAW,IAAA;AAAA,MACxE,GAAI,EAAE,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,GAAI,EAAC;AAAA,MAAI,GAAI,EAAE,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,GAAI,EAAC;AAAA,MACxG,GAAI,EAAE,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,GAAI,EAAC;AAAA,MACrD,GAAI,CAAA,CAAE,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,EAAE,GAAG,CAAA,CAAE,GAAA,EAAI,EAAE,GAAI,EAAC;AAAA,MACnD,GAAI,CAAA,CAAE,IAAA,KAAS,WAAA,IAAe,CAAA,CAAE,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,CAAA,CAAE,OAAA,EAAQ,GAAI;AAAC,KACnF,CAAA;AACD,IAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACvB,IAAA,CAAC,EAAE,KAAA,IAAS,IAAI,OAAA,CAAQ,CAAC,GAAG,KAAA,KAAU;AACpC,MAAA,OAAA,CAAQ;AAAA,QACN,GAAG,IAAA;AAAA,QAAM,QAAQ,EAAC;AAAA,QAAG,IAAI,CAAA,CAAE,EAAA;AAAA,QAAI,IAAA,EAAM,MAAA;AAAA,QAAQ,IAAA;AAAA,QAAM,KAAA;AAAA,QAAO,QAAQ,CAAA,CAAE,EAAA;AAAA,QACpE,GAAI,EAAE,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,GAAI,EAAC;AAAA,QAAI,GAAI,EAAE,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAK,GAAI,EAAC;AAAA,QACrG,GAAI,EAAE,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,GAAI;AAAC,OACtD,CAAA;AACD,MAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,EAAE,CAAA;AACvB,MAAA,IAAA,CAAK,IAAI,CAAA,CAAE,EAAE,EAAG,MAAA,CAAO,IAAA,CAAK,EAAE,EAAE,CAAA;AAAA,IAClC,CAAC,CAAA;AAAA,EACH;AACA,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,EAAoB,EAAA,KAAe;AAChD,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AACtB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAC1B,IAAA,IAAI,MAAA,KAAW,SAAY,CAAC,OAAA,CAAQ,IAAI,EAAE,CAAA,GAAI,MAAA,CAAO,IAAA,KAAS,WAAA,EAAa;AAC3E,IAAA,KAAA,IAAS,EAAA,GAAyB,MAAA,CAAO,EAAA,EAAI,EAAA,KAAO,MAAA,EAAW,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG,IAAI,EAAA,KAAO,EAAA,EAAI;AACrG,IAAA,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,MAAA,CAAO,EAAE,CAAA;AAC1B,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,EACvB,CAAA;AACA,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,WAAA,EAAa,KAAA,MAAW,KAAK,CAAA,CAAE,OAAA,IAAW,EAAC,QAAS,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,GAAI,CAAC,CAAA;AAAA,oBACrE,CAAA,IAAK,CAAA,CAAE,SAAS,EAAC,aAAc,CAAA,IAAK,CAAA,CAAE,OAAA,IAAW,IAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,CAAE,EAAE,GAAI,CAAC,CAAA;AAAA,EAC/F;AACA,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAkB;AAC/B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAChC,IAAA,IAAI,MAAA,KAAW,MAAA,EAAW,CAAA,CAAE,MAAA,GAAS,MAAA;AACrC,IAAA,CAAA,CAAE,MAAA,GAAS,EAAE,IAAA,KAAS,WAAA,IAAe,EAAE,GAAA,KAAQ,MAAA,IAAa,CAAA,CAAE,MAAA,CAAO,MAAA,GAAS,CAAA;AAC9E,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AACd,IAAA,KAAA,MAAW,EAAA,IAAM,EAAE,MAAA,EAAQ;AACzB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACzB,MAAA,IAAI,KAAA,KAAU,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA;AAAA,IACtC;AAAA,EACF,CAAA;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,MAAA,EAAO,EAAG,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA;AAC/D,EAAA,OAAO,EAAE,SAAS,QAAA,EAAS;AAC7B;AAiBO,IAAM,WAAA,GAAc,CAAC,GAAA,MAA6B,EAAE,GAAA,EAAK,gBAAA,CAAiB,IAAA,GAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,MAAM,GAAA,EAAI,CAAA;AAGzH,SAAS,SAAA,CAAU,OAA8B,KAAA,EAAqC;AAC3F,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,CAAA,CAAE,IAAA,IAAQ,iBAAiB,CAAC,CAAA;AACrG,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,IAAK,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAA,EAAI,CAAC,CAAA;AACzD,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAS,CAAA,CAAE,MAAA;AAC1D,EAAA,MAAM,KAAA,GAAQ,OAAA,KAAY,CAAA,GAAI,CAAA,GAAA,CAAK,QAAQ,KAAA,IAAS,OAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,CAAA,CAAE,IAAA,IAAQ,KAAK,CAAC,CAAA;AACvE,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,GAAK,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAC3I,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,QAAA,CAAS,CAAA,EAAe,KAAA,EAA8B,IAAA,EAAkB;AAC/E,EAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,MAAA,EAAW,OAAO,CAAA,CAAE,GAAA;AAClC,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ,OAAO,EAAE,GAAG,IAAA,EAAM,GAAG,eAAA,EAAgB;AAC5D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,UAAU,KAAA,EAAO,MAAS,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAC5F,EAAA,OAAO,EAAE,IAAA,KAAS,GAAA,GACd,EAAE,GAAG,MAAM,KAAA,EAAO,mBAAA,EAAqB,MAAA,EAAQ,KAAA,KAC/C,EAAE,GAAG,MAAM,KAAA,EAAO,KAAA,EAAO,QAAQ,mBAAA,EAAoB;AAC3D;AAQO,SAAS,oBAAA,CACd,EAAE,OAAA,EAAS,QAAA,IACX,IAAA,EACiB;AACjB,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAClD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,KAAW,MAAA,GAAY,SAAY,MAAA,CAAO,GAAA,CAAI,EAAE,MAAM,CAAA;AACtE,IAAA,MAAM,IAAA,GAAO,KAAA,KAAU,CAAA,CAAE,MAAA,GAAS,SAAY,CAAA,CAAE,EAAA,CAAA;AAChD,IAAA,IAAI,SAAS,MAAA,EAAW,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,IAAI,IAAI,CAAA;AAAA,EAC/C;AACA,EAAA,MAAMQ,MAAAA,GAAQ,CAAC,EAAA,KAAuB;AACpC,IAAA,IAAI,IAAA,CAAK,IAAI,EAAE,CAAA,SAAU,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,IAAK,EAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC9B,IAAA,OAAA,CAAQ,WAAW,MAAA,GAAY,MAAA,GAAY,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,KAAM,EAAA;AAAA,EACpE,CAAA;AACA,EAAA,MAAM,SAAS,IAAI,GAAA,CAAY,CAAC,GAAG,SAAS,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAOA,MAAAA,CAAM,EAAE,CAAA,KAAM,EAAE,CAAC,CAAA;AACpF,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,IAAA,IAAI,OAAO,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,KAAM,EAAE,EAAA,EAAI;AAC/B,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,MAAA,CAAO,OAAA,CAAQ,CAAC,EAAA,KAAO;AAAE,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAAG,MAAA,OAAO,GAAG,IAAA,KAAS,MAAA,GAAS,CAAC,CAAC,IAAI,EAAC;AAAA,IAAG,CAAC,CAAA;AACxG,IAAA,KAAA,CAAM,KAAK,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,QAAQ,QAAA,CAAS,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,KAAK,CAAC,CAAC,GAAG,MAAA,EAAQ,CAAA,CAAE,QAAQ,CAAA;AAAA,EACrF,CAAC,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,CAAC,EAAA,KAAe,CAAC,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,IAAK,EAAE,IAAA,CAAK,GAAA,CAAI,EAAE,GAAG,MAAA,IAAU,KAAA,CAAA;AAC1E,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KACb,CAAA,CAAE,OAAO,OAAA,CAAQ,CAAC,EAAA,KAAQ,IAAA,CAAK,EAAE,CAAA,GAAI,CAAC,EAAE,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG,MAAA,KAAW,IAAA,IAAQ,CAAC,MAAA,CAAO,IAAI,EAAE,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAE,CAAA,GAAI,EAAG,CAAA;AAC3H,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,IAAI,CAAC,CAAA,CAAE,MAAA,IAAU,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACvD,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,SAAS,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,EAAO,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA,EAAG,GAAI,CAAA,CAAE,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,GAAI,EAAC,EAAI,CAAA;AACtI,IAAA,KAAA,MAAW,EAAA,IAAM,CAAA,CAAE,MAAA,EAAQ,IAAI,IAAA,CAAK,EAAE,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,CAAA,CAAE,EAAE,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,OAAAA,MAAAA,EAAM;AACjD;;;ACtKA,SAAS,QAAA,CAAS,GAAA,EAAwB,GAAA,EAAwB,IAAA,EAAY,OAA4C,GAAA,EAAmB;AAC3I,EAAA,IAAI,CAAA,GAAI,KAAK,CAAA,GAAI,GAAA;AACjB,EAAA,IAAI,CAAA,GAAI,KAAK,CAAA,GAAI,GAAA;AACjB,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,KAAA,CAAM,IAAI,EAAE,CAAA;AACtC,IAAA,IAAI,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,GAAA,IAAO,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,GAAA,EAAK;AAC7D,MAAA,CAAA,GAAI,KAAK,CAAA,GAAI,GAAA;AACb,MAAA,CAAA,IAAK,GAAA,GAAM,GAAA;AACX,MAAA,GAAA,GAAM,CAAA;AAAA,IACR;AACA,IAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,QAAQ,CAAA;AACnC,IAAA,CAAA,IAAK,KAAA,GAAQ,GAAA;AACb,IAAA,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AAAA,EAC5B;AACF;AASO,SAAS,eAAA,CACd,EAAE,OAAA,EAAS,QAAA,IACX,MAAA,EACA,MAAA,EACA,OACA,GAAA,EACmB;AACnB,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,MAAA,CAAO,MAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,MAAM,CAAC,CAAC,CAAA;AAC/D,EAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KAAqB;AAClC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAC1B,IAAA,OAAO,IAAA,KAAS,UAAa,EAAA,KAAO,MAAA,GAAY,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE,GAAI,EAAE,CAAA,EAAG,EAAA,CAAG,IAAI,IAAA,CAAK,CAAA,EAAG,GAAG,EAAA,CAAG,CAAA,GAAI,KAAK,CAAA,EAAE;AAAA,EACxG,CAAA;AACA,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAkB;AAClC,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,KAAK,CAAA;AAC5B,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,IAAI,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ;AACnC,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC3B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAA,CAAE,EAAE,CAAA;AACpB,IAAA,MAAM,GAAA,GAAM,QAAQ,CAAA,CAAE,GAAA,KAAQ,SAAY,EAAE,GAAG,EAAE,GAAA,EAAK,CAAA,EAAG,EAAE,GAAA,CAAI,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,GAAA,CAAI,CAAA,GAAI,CAAA,CAAE,CAAA,EAAE,GAAI,IAAA,CAAA;AAC7F,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,EAAE,CAAA;AACf,MAAA,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,eAAe,CAAA;AAChC,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,GAAG,CAAA;AACjB,IAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACvB,IAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,GAAA,CAAI,CAAC,EAAA,KAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAE,CAAA;AAChD,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA,KAAS,GAAA,GAAM,GAAA,CAAI,SAAS,GAAA,CAAI,KAAA;AAChD,IAAA,MAAMC,SAAQ,SAAA,CAAU,KAAA,EAAO,EAAE,GAAA,KAAQ,MAAA,GAAY,SAAY,KAAK,CAAA;AACtE,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,CAAA,CAAE,IAAA,EAAM,GAAA,EAAK,eAAe,MAAA,EAAQ,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA,EAAQ,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAMA,MAAAA,CAAM,CAAC,CAAA,EAAG,CAAE,CAAC,CAAA;AACrI,IAAA,KAAA,MAAW,CAAC,IAAI,IAAI,CAAA,IAAK,SAAS,GAAA,CAAI,GAAA,CAAI,IAAI,IAAI,CAAA;AAAA,EACpD;AACA,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAAuC;AACrD,IAAA,IAAI,KAAK,IAAA,CAAK,GAAA,CAAI,SAAS,GAAA,CAAI,EAAE,KAAK,EAAE,CAAA;AACxC,IAAA,OAAO,EAAA,KAAO,UAAa,EAAA,CAAG,MAAA,OAAa,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,MAAA,IAAU,EAAE,CAAA;AACnE,IAAA,OAAO,EAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA0B;AAC/C,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,CAAA,IAAK,MAAA,EAAQ;AAC/B,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,IAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,IAAK,CAAC,KAAA,CAAM,QAAA,CAAS,EAAE,CAAA,EAAI;AACrE,IAAA,IAAI,IAAA,CAAK,OAAO,MAAA,EAAW;AACzB,MAAA,MAAM,CAAA,GAAI,MAAM,EAAE,CAAA;AAClB,MAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAE,CAAA,EAAG,KAAK,EAAA,CAAG,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,EAAG,KAAK,EAAA,CAAG,CAAA,GAAI,EAAE,CAAA,EAAG,KAAA,EAAO,KAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAC9F,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,EAAE,CAAA;AACtB,IAAA,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,CAAC,GAAI,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,IAAK,EAAC,EAAI,EAAE,CAAC,CAAA;AAAA,EACxD;AACA,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,QAAA,EAAU;AAClC,IAAA,QAAA,CAAS,KAAK,GAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,KAAK,EAAE,CAAA,EAAI,cAAA,CAAe,IAAA,CAAK,MAAM,IAAA,CAAK,IAAI,EAAE,MAAM,CAAA,EAAG,QAAQ,GAAG,CAAA;AAAA,EACzG;AACA,EAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KAAiC;AAClD,IAAA,IAAI,KAAK,GAAA,CAAI,EAAE,GAAG,OAAO,GAAA,CAAI,IAAI,EAAE,CAAA;AACnC,IAAA,MAAM,KAAK,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,IAAK,MAAA,CAAO,IAAI,EAAE,CAAA;AACvC,IAAA,OAAO,EAAA,KAAO,SAAY,MAAA,GAAY,OAAA,CAAQ,IAAI,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,EAAG,MAAM,CAAA;AAAA,EACzE,CAAA;AACA,EAAA,KAAA,MAAW,KAAK,CAAC,GAAG,OAAO,CAAA,CAAE,SAAQ,EAAG;AACtC,IAAA,IAAI,CAAC,EAAE,MAAA,EAAQ;AACf,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,SAAS,EAAE,MAAA,CAAO,CAAC,CAAA,KAAiB,CAAA,KAAM,MAAS,CAAA;AAC3E,IAAA,MAAM,KAAA,GAAQ,YAAY,GAAG,CAAA;AAC7B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,KAAA,CAAM,IAAA;AAClD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,KAAA,CAAM,GAAA;AAClD,IAAA,GAAA,CAAI,GAAA,CAAI,EAAE,EAAA,EAAI;AAAA,MACZ,CAAA;AAAA,MAAG,CAAA;AAAA,MACH,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,GAAG,GAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA,GAAI,MAAM,KAAA,GAAQ,CAAA;AAAA,MACjE,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,GAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,MAAM,CAAC,CAAA,GAAI,MAAM,MAAA,GAAS;AAAA,KACrE,CAAA;AAAA,EACH;AACA,EAAA,OAAO,GAAA;AACT;AAIO,SAAS,eACd,EAAE,OAAA,EAAQ,EACV,KAAA,EACA,OACA,UAAA,EACe;AACf,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,KAAM;AAC5B,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC1B,IAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,OAAO,EAAC;AAC/B,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,EAAE,GAAG,GAAA,EAAI,EAAG,CAAA,CAAE,KAAA,IAAS,IAAA,EAAM;AAAA,MACrE,IAAI,CAAA,CAAE,EAAA;AAAA,MAAI,KAAA,EAAO,MAAA;AAAA,MAAQ,MAAA,EAAQ,EAAE,MAAA,IAAU,IAAA;AAAA,MAAM,KAAA,EAAO,eAAA,CAAgB,CAAA,EAAG,KAAA,EAAO,EAAE,KAAK,CAAA;AAAA,MAAG,QAAQ,CAAA,CAAE,MAAA;AAAA,MAAQ,UAAA;AAAA,MAChH,GAAI,EAAE,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,CAAA,CAAE,OAAA,EAAQ,GAAI;AAAC,KACzD,CAAA;AACD,IAAA,MAAM,KAAA,GAAQ,EAAE,GAAI,CAAA,CAAE,SAAS,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,EAAC,EAAI,GAAG,YAAA,CAAa,CAAA,CAAE,MAAM,CAAA,EAAE;AACjF,IAAA,IAAI,OAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,KAAA;AAC5C,IAAA,MAAM,CAAC,MAAA,EAAQ,GAAG,IAAI,CAAA,GAAI,KAAA;AAC1B,IAAA,OAAO,CAAC,EAAE,GAAG,MAAA,EAAS,MAAM,EAAE,GAAG,OAAQ,IAAA,EAAM,OAAA,EAAS,EAAE,GAAG,MAAA,CAAQ,KAAK,OAAA,EAAS,GAAG,OAAM,EAAW,EAAE,EAAG,GAAG,IAAI,CAAA;AAAA,EACrH,CAAC,CAAA;AACH;;;ACzHO,IAAM,aAAA,GAAgB,CAAC,KAAA,EAAe,GAAA,KAAwB,QAAQ,CAAA,GAAI;AAO1E,SAAS,aAAA,CACd,MAAA,EACA,GAAA,EACA,OAAA,EACA,IAAA,EACiB;AACjB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,KAAA,CAAM,EAAE,CAAA,+BAAA,CAAiC,CAAA;AAC3G,IAAA,GAAA,CAAI,GAAA,CAAI,MAAM,EAAE,CAAA;AAAA,EAClB;AACA,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AACrD,EAAA,MAAM,MAAA,GAAS,WAAW,MAAA,EAAQ,CAAC,OAAO,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAC,CAAA;AACzD,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KAAuB;AACpC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,CAAG,MAAA;AAC7B,IAAA,IAAI,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACtB,IAAA,IAAI,CAAA,KAAM,MAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAK,CAAA,GAAI,MAAA,KAAW,MAAA,GAAY,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,GAAI,CAAE,CAAA;AACvF,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,OAAO,EAAE,CAAA,EAAG,CAAA,EAAE,CAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,KAAA,CAAM,CAAA,CAAE,CAAA,CAAE,EAAE,CAAA,GAAI,KAAA,CAAM,CAAA,CAAE,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,EAAE,GAAE,KAAM;AAChH,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,IAAW,IAAA,CAAK,OAAA;AAClC,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,GAAI,IAAA;AAEtD,IAAA,MAAM,KAAA,GAAQ,EAAE,GAAA,EAAK,GAAA,IAAO,QAAQ,KAAA,CAAM,MAAA,GAAS,GAAA,GAAM,CAAA,GAAI,IAAI,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,MAAM,GAAA,EAAI;AACpG,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MAAO,QAAQ,CAAA,CAAE,MAAA;AAAA,MAAQ,SAAS,CAAA,CAAE,OAAA;AAAA,MAAS,KAAA;AAAA,MAAO,GAAA;AAAA,MAAK,KAAA;AAAA,MACzD,GAAI,KAAA,GAAQ,EAAE,QAAA,EAAU,aAAA,CAAc,MAAM,KAAA,EAAO,GAAG,CAAA,EAAE,GAAI,EAAC;AAAA,MAC7D,GAAI,EAAE,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,GAAI;AAAC,KACvD;AAAA,EACF,CAAC,CAAA;AACH;AAKO,IAAM,cAAA,GAAiB,CAAC,EAAA,KAAuB,CAAA,EAAG,EAAE,CAAA,MAAA;AAapD,SAAS,aAAA,CAAc,QAAkC,MAAA,EAAwD;AACtH,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,CAAM,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AACvD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,EAAQ,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA;AAC1E,EAAA,MAAM,QAAA,GAAW,CAAC,EAAA,KAAyB;AACzC,IAAA,MAAMC,OAAgB,EAAC;AACvB,IAAA,KAAA,IAAS,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,KAAK,GAAA,CAAI,EAAE,CAAA,CAAG,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG,EAAA,KAAO,MAAA,EAAW,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG,MAAA,EAAQA,IAAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAC5H,IAAA,OAAOA,IAAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAyB;AACzC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,KAAK,IAAI,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,EAAE,CAAC,CAAA;AACrC,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,EAAA,CAAG,GAAA,CAAI,CAAC,CAAC,CAAA;AACzD,IAAA,IAAI,MAAA,KAAW,MAAA,EAAW,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAC,GAAI,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,IAAK,EAAC,EAAI,KAAK,CAAC,CAAA;AAAA,EAC/E;AACA,EAAA,OAAO,GAAA;AACT;AAIO,SAAS,WACd,MAAA,EACA,QAAA,EACA,MAAA,mBAAoD,IAAI,KAAI,EACzC;AACnB,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,CAAM,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AACvD,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAkB;AACpC,EAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KAAqB;AAClC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAC1B,IAAA,IAAI,KAAA,KAAU,QAAW,OAAO,KAAA;AAChC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACrB,IAAA,MAAM,KAAK,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,MAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,MAAM,CAAC,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAG,CAAA;AAC1E,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,GAAA,CAAI,EAAE,KAAK,EAAC,EAAG,IAAI,KAAA,CAAM,EAAA,KAAO,IAAA,EAAM,EAAA,CAAG,IAAA,CAAK,MAAM,EAAE,CAAA;AACjF,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,EAAA,CAAG,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AACxC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,EAAA,CAAG,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AACxC,IAAA,MAAM,MAAM,SAAA,CAAU;AAAA,MACpB,CAAA;AAAA,MACA,CAAA;AAAA,MACA,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,GAAG,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAK,CAAC,CAAA,GAAI,CAAA;AAAA,MACnD,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA,GAAI;AAAA,OACpD,CAAC,CAAA;AACJ,IAAA,KAAA,CAAM,GAAA,CAAI,IAAI,GAAG,CAAA;AACjB,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,EAAQ,KAAA,CAAM,CAAA,CAAE,MAAM,EAAE,CAAA;AACxC,EAAA,OAAO,KAAA;AACT;AAQO,SAAS,WACd,MAAA,EACA,QAAA,EACA,OAAA,EACAC,WAAAA,GAAmC,EAAC,EACrB;AACf,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,MAAA,EAAQA,WAAU,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AACjD,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,OAAA,CAAQ,EAAE,KAAK,CAAA;AACvC,IAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAA,KAAW,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA;AACpD,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,EAAA,EAAI,EAAE,KAAA,CAAM,EAAA;AAAA,MACZ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAM,EAAE,CAAA,EAAG,CAAA,EAAG,OAAO,MAAA,EAAO;AAAA,MAC5B,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS;AAAA,UACP,OAAA,EAAS,MAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,OAAO,CAAA,CAAE,KAAA;AAAA,YACT,GAAI,EAAE,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAS,GAAI,EAAC;AAAA,YAC3D,GAAI,CAAA,CAAE,KAAA,CAAM,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,OAAA,EAAQ,GAAI;AAAC;AACtE,SACF;AAAA,QACA,MAAM,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,MAAK,EAAE;AAAA,QACrC,MAAA,EAAQ;AAAA,UACN,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,MAAA,EAAO;AAAA,UAC7B,KAAA,EAAO,MAAM,WAAA,IAAe,CAAA;AAAA,UAC5B,GAAI,MAAM,IAAA,GAAO,EAAE,MAAM,KAAA,CAAM,IAAA,KAAS;AAAC;AAC3C,OACF;AAAA,MACA,WAAW,CAAC,GAAG,EAAE,MAAA,EAAQ,GAAA,CAAI,OAAO,GAAA,CAAI,CAAA,CAAE,MAAM,EAAE,CAAA,IAAK,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,MAC3E,UAAA,EAAY;AAAA,KACb,CAAA;AACD,IAAA,IAAI,EAAE,KAAA,KAAU,IAAA,IAAQ,CAAC,CAAA,CAAE,MAAM,KAAA,EAAO;AACxC,IAAA,MAAM,SAAwB,EAAE,EAAA,EAAI,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAE,EAAG,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAG,CAAA,CAAE,KAAI,EAAE;AACnF,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,EAAA,EAAI,cAAA,CAAe,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA;AAAA,MAC7B,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU,KAAA;AAAA,MACV,MAAM,EAAE,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,KAAK,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,GAAA,EAAK,OAAO,CAAA,CAAE,KAAA,CAAM,OAAO,MAAA,EAAQ,CAAA,CAAE,MAAM,MAAA,EAAO;AAAA,MACjF,IAAA,EAAM,EAAE,OAAA,EAAS,EAAE,QAAO,EAAG,IAAA,EAAM,EAAE,KAAA,CAAM,KAAA,EAAO,OAAO,IAAA,EAAM,IAAA,EAAM,EAAE,KAAA,EAAO,EAAE,OAAO,KAAA,CAAM,IAAA,IAAO,EAAE;AAAA,MACtG,SAAA,EAAW,CAAC,CAAA,CAAE,KAAA,CAAM,EAAW,CAAA;AAAA,MAC/B,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AACA,EAAA,OAAO,KAAA;AACT;ACzJA,SAAS,WAAA,CAAY,CAAA,EAAa,KAAA,EAAiC,GAAA,EAAoC;AACrG,EAAA,MAAM,YAAY,CAAA,CAAE,cAAA,IAAkB,GAAA,CAAI,IAAA,CAAK,kBAAkB,GAAA,CAAI,cAAA;AACrE,EAAA,OAAO,KAAA,EAAO,OAAA,KAAY,MAAA,GAAY,SAAA,GAAY,EAAE,GAAG,SAAA,EAAW,EAAA,EAAI,EAAE,IAAA,EAAM,KAAA,CAAM,OAAA,EAAQ,EAAE;AAChG;AAIO,SAAS,UAAA,CAAW,OAA4B,GAAA,EAAmC;AACxF,EAAA,MAAM,MAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAC,EAAE,KAAA,EAAO;AACd,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACrB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,EAAQ,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,CAAE,KAAA,EAAO,YAAA,CAAa,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,IAAI,CAAA,EAAG,GAAA,CAAI,OAAO,CAAA;AACpF,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAC3C,IAAA,MAAMV,UAAS,KAAA,EAAO,SAAA,KAAc,UAAa,OAAO,SAAA,CAAU,OAAO,QAAA,GACrE,WAAA,CAAYK,kBAAAA,CAAmB,CAAC,GAAG,KAAA,CAAM,SAAS,CAAC,CAAA,EAAG,SAAA,EAAW,IAAI,CAAA,GACrE,IAAA;AACJ,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,EAAA,EAAI,GAAG,EAAE,CAAA,MAAA,CAAA;AAAA,MACT,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,IAAIL,OAAAA,KAAW,IAAA,GAAO,OAAO,EAAE,CAAA,EAAGA,QAAO,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA,EAAG,GAAGA,OAAAA,CAAO,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,EAAG,GAAG,IAAA;AAAK,KACrG,CAAA;AAAA,EACH;AACA,EAAA,OAAO,GAAA;AACT;AAGA,IAAM,QAAQ,CAAC,GAAA,EAAyB,IAAA,KACtC,CAAC,OAAO,EAAC,GAAI,GAAA,KAAQ,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK,GAAI,EAAE,IAAA,EAAK;AAE7D,SAAS,SAAA,CAAU,OAA4B,GAAA,EAAqC;AACzF,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACrB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,EAAQ,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,IAAU,GAAA,CAAI,KAAK,MAAA,IAAU,QAAA;AAC9C,IAAA,MAAM,UAAU,KAAA,IAAS;AAAA,MACvB,QAAA,EAAU,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,WAAA,EAAa,IAAA;AAAA,MACvC,MAAA,EAAQ,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,WAAA,EAAa,EAAA;AAAA,MACnC,SAAA,EAAW,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE;AAAA,KAC9B;AACA,IAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,OAAA;AAE7B,IAAA,MAAM,SAAA,GAAY,MAAA,KAAW,OAAA,GAAU,CAAA,CAAE,YAAY,OAAA,CAAQ,SAAA;AAE7D,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,SAAA,KAAc,MAAA,IAAa,SAAA,KAAc,MAAA;AAC3D,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,IAAA,CAAK,SAAA,GAAY,CAAC,CAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,GAAA,KAAQ,MAAA,GAAY,UAAA,CAAW,GAAA,EAAK,CAAA,CAAE,MAAM,CAAA,GAAI,aAAA,CAAc,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA;AACxF,IAAA,MAAM,WAAA,GAAc,MAAM,WAAA,IAAe,IAAA;AACzC,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,SAAA,KAAc,MAAA,GAAY,UAAU,KAAA,CAAM,SAAA;AAClE,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,EAAQ,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,EAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU,KAAA;AAAA,MACV,IAAA,EAAM,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACxC,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,KAAA,CAAM,CAAA,CAAE,QAAA,EAAU,QAAQ,CAAA;AAAA,UAChC,EAAA,EAAI,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,UAC1B,MAAA;AAAA,UACA,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,UACjC,GAAI,OAAA,GAAU,EAAE,OAAA,EAAS,SAAA,KAAc,EAAC;AAAA,UACxC,GAAI,EAAE,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,GAAI,EAAC;AAAA,UAClD,GAAG,YAAA,CAAa,CAAA,CAAE,MAAM,CAAA;AAAA,UACxB,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,OAAA,EAAS,KAAA,KAAU;AAAC,SAClD;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,MAAA,EAAO;AAAA,UAC7B,KAAA,EAAO,MAAM,KAAA,IAAS,iBAAA;AAAA,UACtB,GAAI,MAAM,IAAA,GAAO,EAAE,MAAM,KAAA,CAAM,IAAA,KAAS,EAAC;AAAA,UACzC,GAAI,WAAA,KAAgB,IAAA,GAAO,EAAE,WAAA,KAAgB,EAAC;AAAA,UAC9C,GAAI,SAAA,KAAc,IAAA,GAAO,EAAE,SAAA,KAAc;AAAC;AAC5C,OACF;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,CAAE,IAAA,EAAe,EAAE,EAAW,CAAA;AAAA,MAC1C,UAAA,EAAY;AAAA,KACb,CAAA;AACD,IAAA,IAAI,CAAC,EAAE,KAAA,EAAO;AACd,IAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,EAAA,EAAI,CAAA,CAAE,KAAA,EAAO;AAAA,MACpC,KAAA,EAAO,MAAA;AAAA,MACP,KAAA,EAAO,WAAA,CAAY,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAAA,MAChC,KAAA,EAAO,YAAA,CAAa,GAAA,CAAI,SAAA,IAAa,IAAI,IAAI,CAAA;AAAA,MAC7C,IAAA,EAAM,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,MAAA;AAAA,MAC3B,SAAS,GAAA,CAAI;AAAA,KACd,CAAgB,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,KAAA;AACT;;;AC7EO,IAAM,UAAA,GAAa,aAAA;AAGnB,IAAM,mBAAA,GAAiC,EAAE,IAAA,EAAM,2BAAA,EAA6B,QAAQ,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,CAAA,EAAG,IAAA,EAAM,CAAC,CAAA,EAAG,CAAC,CAAA;AAElJ,IAAMW,KAAAA,GAAO,GAAA;AACb,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,OAAA,GAAU,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,KAAA,EAAM;AAO9C,SAAS,WAAA,CAAY,CAAA,EAAa,IAAA,EAA2B,IAAA,EAC3D,OAAA,EAA+C;AAC/C,EAAA,IAAI,CAAC,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,SAAA,KAAc,QAAW,OAAO,IAAA;AAClD,EAAA,IAAI,CAAA,CAAE,mBAAmB,MAAA,IAAa,CAAC,mBAAmB,CAAA,CAAE,cAAA,CAAe,EAAE,CAAA,EAAG,OAAO,IAAA;AACvF,EAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAA,CAAU,CAAA,CAAE,cAAA,IAAkB,IAAA,CAAK,kBAAkB,eAAA,EAAiB,MAAA;AAC5E,EAAA,OAAO,EAAE,GAAG,SAAA,CAAU,CAAA,CAAE,OAAO,KAAA,EAAO,OAAO,CAAA,EAAG,GAAI,WAAW,MAAA,GAAY,EAAE,MAAA,EAAO,GAAI,EAAC,EAAG;AAC9F;AAIA,SAAS,WAAA,CAAY,GAAa,IAAA,EAAuC;AACvE,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,SAAS,CAAC,CAAA;AAAA,IACd,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,GAAI,EAAE,QAAA,GAAW,EAAE,UAAU,CAAA,CAAE,QAAA,KAAa,EAAC;AAAA,IAC7C,GAAI,EAAE,MAAA,GAAS,EAAE,QAAQ,CAAA,CAAE,MAAA,KAAW,EAAC;AAAA,IACvC,GAAI,IAAA,KAAS,IAAA,GAAO,EAAE,KAAA,EAAO,IAAA,KAAS;AAAC,GACzC;AACF;AAKA,SAAS,SAAA,CACP,CAAA,EAAa,IAAA,EAAgB,GAAA,EAC7B,IAAA,EACe;AACf,EAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAClB,EAAA,MAAM,WAAW,CAAC,IAAA,EAAc,SAC7B,EAAE,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,EAAG,IAAA,EAAM,EAAE,KAAA,EAAO,EAAE,OAAO,KAAA,CAAM,IAAA,IAAO,EAAE,CAAA;AACzE,EAAA,MAAM,KAAA,GAAQ,SAAA,CAA8C,IAAA,EAAM,GAAA,EAAK;AAAA,IACrE,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,IAAA,EAAM,CAAC,KAAA,MAAW;AAAA,MAChB,OAAA,EAAS;AAAA,QACP,GAAG,KAAA;AAAA,QAAO,GAAG,YAAA,CAAa,IAAA,EAAM,KAAA,EAAO,KAAK,OAAO,CAAA;AAAA,QAAG,GAAI,EAAE,MAAA,KAAW,IAAA,GAAO,EAAE,MAAA,EAAQ,IAAA,KAAS,EAAC;AAAA,QAAI,GAAI,EAAE,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,GAAI,EAAC;AAAA,QACxJ,GAAG,YAAA,CAAa,CAAA,CAAE,MAAM;AAAA,OAC1B;AAAA,MACA,MAAM,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,MAAK,EAAE;AAAA,MACrC,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAE,OAAO,KAAA,CAAM,MAAA,IAAU,KAAA,EAAO,KAAA,CAAM,eAAe,iBAAA,EAAmB,GAAI,MAAM,IAAA,GAAO,EAAE,MAAM,KAAA,CAAM,IAAA,EAAK,GAAI,EAAC;AAAG,KACvI,CAAA;AAAA,IACA,GAAA,EAAK,CAAC,IAAA,EAAM,EAAA,KACV,GAAG,GAAA,CAAI,IAAA,KAAS,SACX,EAAA,CAAG,GAAA,CAAI,OAAO,MAAA,GAAY,IAAA,GAAO,EAAE,OAAA,EAAS,EAAE,MAAM,EAAE,CAAA,EAAG,UAAA,EAAW,EAAE,EAAG,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAE,OAAO,KAAA,CAAM,MAAA,IAAU,KAAA,EAAO,CAAA,IAAI,GAC/H,IAAA,KAAS,KAAK,IAAA,GAAO,EAAE,GAAG,QAAA,CAAS,IAAA,EAAM,GAAG,GAAG,CAAA,EAAG,OAAA,EAAS,EAAA,CAAG,KAAA,EAAM;AAAA,IAC1E,SAAA,EAAW,CAAC,IAAA,KAAS,QAAA,CAAS,MAAM,MAAS;AAAA,GAC9C,CAAA;AACD,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,OAAO,EAAE,GAAG,CAAA,EAAG,GAAI,CAAA,CAAE,EAAA,KAAO,SAAY,EAAC,GAAI,EAAE,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,EAAE,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAG,EAAG,CAAiB,CAAA;AACnH;AAWO,SAAS,YAAA,CAAoC,IAAA,EAAmB,IAAA,GAAoC,EAAC,EAA0B;AACpI,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,GAAc,sBAAA,EAAwB,GAAG,MAAK,GAAI,IAAA;AAEjE,EAAA,MAAM,QAAQ,kBAAA,CAAmB,SAAA,CAAU,IAAA,EAAM,IAAI,GAAG,WAAW,CAAA;AACnE,EAAA,OAAQ,KAAA,KAAU,MAAA,GAAY,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAM,CAAE,CAAA;AAC1E;AAGA,SAAS,SAAA,CAAU,MAAmB,IAAA,EAA0C;AAC9E,EAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAClB,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA,KAAS,KAAA,GAAQ,SAAA,CAAU,KAAK,CAAA,GAAI,YAAA,CAAA;AACtD,EAAA,MAAM,SAAA,GAAY,KAAA,GAAQ,cAAA,CAAe,KAAA,EAAO,IAAI,CAAA,GAAI,IAAA;AACxD,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAgC,QAAA,CAAS,GAAG,IAAI,CAAA;AACjE,EAAA,MAAM,OAAA,GAA0B,IAAA,CAAK,OAAA,GACjC,CAAC,IAAA,EAAM,CAAA,KAAM,IAAA,CAAK,OAAA,CAAS,IAAA,EAAM,EAAE,GAAG,CAAA,EAAG,UAAA,EAAY,EAAE,UAAA,IAAc,IAAA,CAAK,UAAA,EAAY,QAAA,EAAU,CAAA,CAAE,QAAA,IAAY,IAAA,CAAK,QAAA,EAAU,CAAA,GAC7H,CAAC,IAAA,EAAM,CAAA,KAAM;AACX,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,QAAA,IAAY,IAAA,CAAK,QAAA;AAChC,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,MAAA,GAAS,KAAA,GAAQ,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAKA,KAAAA,GAAO,IAAI,CAAA,EAAE;AAAA,EAC7E,CAAA;AAEJ,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,KAAA,EAAO;AAC1B,IAAA,IAAI,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,CAAA,CAAE,EAAE,CAAA,wBAAA,CAA0B,CAAA;AAC3F,IAAA,GAAA,CAAI,GAAA,CAAI,EAAE,EAAE,CAAA;AAAA,EACd;AACA,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,MAAM,GAAA,GAAM,KAAK,YAAA,IAAgB,mBAAA;AACjC,EAAA,MAAM,UAAU,iBAAA,CAAkB,IAAA,CAAK,cAAc,EAAC,EAAG,KAAK,OAAO,CAAA;AAGrE,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,MAAA,IAAU,EAAC,EAAG;AACjC,IAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,MAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,CAAC,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,GAAI,MAAA;AAC1D,MAAA,IAAI,MAAA,KAAW,MAAA,EAAW,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,CAAC,CAAA,eAAA,EAAkB,CAAA,CAAE,EAAE,CAAA,iBAAA,EAAoB,MAAM,CAAA,oCAAA,CAAsC,CAAA;AAAA,IAC1J;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,qBAAqB,OAAA,EAAS,EAAE,SAAS,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA,MAAO,EAAE,GAAG,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAE,CAAA,EAAI,CAAA;AACnI,EAAA,MAAM,aAAa,EAAE,GAAG,MAAM,QAAA,EAAU,IAAA,CAAK,WAAW,CAAA,EAAE;AAC1D,EAAA,MAAM,MAAA,GAAS,cAAc,IAAA,CAAK,MAAA,IAAU,EAAC,EAAG,GAAA,EAAK,IAAI,GAAA,CAAI,CAAC,GAAG,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAO,CAAC,KAAA,CAAM,OAAO,GAAA,CAAI,EAAE,CAAC,CAAC,CAAA,EAAG;AAAA,IAChH,OAAA,EAAS,GAAA;AAAA,IACT,KAAA,EAAO,CAAC,IAAA,KAAS,OAAA,CAAQ,MAAM,UAAU;AAAA,GAC1C,CAAA;AACD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM;AACrC,IAAA,MAAM,EAAA,GAAK,SAAS,CAAC,CAAA;AACrB,IAAA,IAAI,KAAK,GAAA,CAAI,EAAE,CAAA,IAAK,CAAC,IAAI,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,IAAK,CAAC,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,EAAE,GAAG,OAAO,KAAA;AAC/D,IAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACpC,OAAA,EAAS,CAAA,CAAE,OAAA,IAAW,IAAA,CAAK,OAAA,IAAW,MAAA;AAAA,IACtC,IAAA,EAAM,CAAA,CAAE,IAAA,IAAA,CAAS,CAAA,CAAE,SAAS,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,MAAe,EAAE,IAAA,EAAM,OAAA,EAAS,MAAK,CAAE,CAAA;AAAA,IAC5E,OAAA,EAAS,CAAA,CAAE,OAAA,IAAW,IAAA,CAAK,OAAA,IAAW,CAAA;AAAA,IACtC,GAAA,EAAK,CAAA,CAAE,GAAA,IAAO,IAAA,CAAK,GAAA,IAAO,CAAA;AAAA,IAC1B,aAAA,EAAe,CAAA,CAAE,aAAA,IAAiB,IAAA,CAAK,aAAA,IAAiB,QAAA;AAAA,IACxD,GAAI,EAAE,KAAA,GAAQ,EAAE,OAAO,CAAA,CAAE,KAAA,KAAU,EAAC;AAAA,IACpC,GAAI,EAAE,UAAA,GAAa,EAAE,YAAY,CAAA,CAAE,UAAA,KAAe;AAAC,GACrD,CAAE,CAAA;AAGF,EAAA,MAAM,QAAqB,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAClD,IAAA,MAAM,IAAA,GAAO,UAAA;AAAA,MACX,EAAE,GAAI,CAAA,CAAE,MAAM,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,IAAM,KAAA,EAAO,CAAA,CAAE,SAAS,IAAA,CAAK,QAAA,IAAY,WAAW,MAAA,EAAQ,CAAA,CAAE,UAAU,CAAA,EAAE;AAAA,MACnG,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,EAAI,OAAO;AAAA,KACjC;AACA,IAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,MAAA,EAAO,GAAI,UAAU,MAAA,CAAO,CAAC,CAAA,EAAI,IAAA,EAAM,OAAO,CAAA;AACtE,IAAA,OAAO;AAAA,MAAE,IAAI,CAAA,CAAE,EAAA;AAAA,MAAI,MAAA,EAAQ,IAAA;AAAA,MAAM,MAAA,EAAQ,EAAE,MAAA,KAAW,IAAA;AAAA,MAAM,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU,EAAC;AAAA,MACjG,GAAI,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,KAAY,EAAC;AAAA,MAAI,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW;AAAC,KAAG;AAAA,EAC/F,CAAC,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,EAAO,KAAA,EAAO,QAAQ,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,EAAG,IAAA,EAAM,SAAA,EAAW,OAAO,CAAC,CAAA;AAEtG,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI;AAAA,IAAE,GAAG,KAAA,CAAM,CAAC,CAAA,CAAG,MAAA;AAAA,IAAQ,GAAI,EAAE,EAAA,GAAK,EAAE,IAAI,CAAA,CAAE,EAAA,KAAO,EAAC;AAAA,IACtG,GAAI,KAAA,CAAM,CAAC,CAAA,CAAG,MAAA,GAAS,EAAE,MAAA,EAAQ,KAAA,CAAM,CAAC,CAAA,CAAG,MAAA,EAAO,GAAI;AAAC,GAAI,CAAC,CAAC,CAAA;AAC/D,EAAA,MAAM,WAAW,IAAI,GAAA,CAAI,CAAC,GAAG,KAAK,MAAA,EAAQ,GAAG,eAAA,CAAgB,OAAA,EAAS,OAAO,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,GAAG,CAAC,CAAC,CAAA;AAEtG,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,KAAS,IAAA,GAAO,IAAA,GAChC,YAAA,CAAa,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,SAAS,GAAA,CAAI,CAAC,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,EAAA,EAAI,QAAA,CAAS,CAAC,CAAA,EAAE,CAAE,CAAA,EAAG,KAAK,IAAI,CAAA;AAC9G,EAAA,MAAM,UAAU,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,WAAW,OAAA,EAAS,cAAA,EAAgB,eAAA,EAAiB,MAAA,EAAQ,MAAM,GAAI,KAAA,GAAQ,EAAE,KAAA,EAAM,GAAI,EAAC,EAAG;AACvI,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,MAAkB,EAAE,OAAO,IAAA,CAAK,UAAA,GAAa,CAAC,CAAA,IAAK,OAAO,SAAA,IAAa,mBAAA,EAAqB,IAAA,EAAM,OAAA,CAAQ,UAAU,CAAA,EAAE,CAAA;AACzI,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,CAAC,GAAG,UAAU,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,EAAE,EAAA,EAAI,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAI,CAAA,CAAE,MAAM,CAAC,CAAU,CAAC,CAAC,CAAA;AAEtH,EAAA,KAAA,CAAM,IAAA,CAAK,GAAG,cAAA,CAAe,OAAA,EAAS,UAAU,KAAA,EAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AACvE,EAAA,KAAA,CAAM,IAAA,CAAK,GAAG,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAY,WAAW,UAAA,CAAW,KAAA,EAAO,OAAO,CAAC,CAAC,CAAA;AACnF,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,IAAA,CAAK,KAAA,CAAM,SAAQ,EAAG;AACzC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAG,MAAA;AACvB,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC5B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,GAAY,CAAC,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,GAAA,KAAQ,MAAA,GAAY,UAAA,CAAW,GAAA,EAAK,EAAE,MAAM,CAAA,GAAI,aAAA,CAAc,CAAA,EAAG,KAAK,CAAA;AACpF,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,EAAE,EAAE,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA,EAAI,EAAE,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,GAAG,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,EAAG,EAAE,KAAA,EAAO,IAAA,EAAM,CAAC,GAAA,KAAQ,YAAA,CAAa,GAAA,EAAK,IAAI,CAAA,EAAG,SAAS,CAAA;AAC/J,IAAA,KAAA,CAAM,KAAK,GAAI,MAAA,KAAW,SAAY,KAAA,GAAQ,KAAA,CAAM,IAAI,CAAC,CAAA,KAAO,EAAE,EAAA,KAAO,CAAA,CAAE,KAAK,EAAE,GAAG,GAAG,MAAA,EAAwB,GAAI,CAAE,CAAE,CAAA;AACxH,IAAA,IAAI,EAAE,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,GAAG,UAAU,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,KAAA,EAAO,IAAI,EAAE,KAAA,EAAO,WAAW,OAAA,EAAS,OAAA,EAAS,CAAC,CAAA;AAAA,EACjG;AACA,EAAA,MAAM,KAAA,GAAQ,eAAA;AAAA,IAAgB,IAAA;AAAA,IAAM,QAAA;AAAA,IAAU,KAAA;AAAA,IAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,QAAA,CAAS,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,EAAM,EAAA,EAAI,CAAA,CAAE,IAAG,CAAE,CAAA;AAAA,IACjH,OAAO,EAAE,GAAG,cAAA,CAAe,SAAS,gBAAA,CAAiB,MAAS,CAAC,CAAA,EAAG,OAAA,EAAQ;AAAA,GAAE;AAC9E,EAAA,KAAA,CAAM,KAAK,GAAG,SAAA,CAAU,OAAO,KAAA,KAAU,IAAA,GAAO,UAAU,EAAE,GAAG,SAAS,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA,EAAG,GAAI,KAAA,EAAO,IAAA,IAAQ,EAAG,CAAA;AACvH,EAAA,OAAO,KAAA;AACT;AAQA,SAAS,OACP,KAAA,EACA,KAAA,EACA,MAAA,EACA,KAAA,EACA,MACA,IAAA,EACyF;AACzF,EAAA,MAAM,cAA4B,CAAC,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvD,EAAA,EAAI,EAAE,KAAA,CAAM,EAAA;AAAA,IACZ,SAAS,CAAA,CAAE,OAAA;AAAA,IACX,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,GAAI,EAAE,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAS,GAAI,EAAC;AAAA,IAC3D,GAAI,EAAE,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,GAAI,EAAC;AAAA,IACrD,GAAI,CAAA,CAAE,KAAA,CAAM,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,GAAI;AAAC,GAC/D,CAAE,CAAA,EAAG,GAAG,KAAA,CAAM,MAAM,CAAA;AACpB,EAAA,MAAM,UAAU,CAAC,GAAG,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA,CAAE,EAAE,CAAC,CAAA,EAAG,GAAG,MAAM,KAAK,CAAA;AAChF,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AACpD,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,CAAA,IAAK,KAAA,CAAM,SAAS,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,CAAG,KAAA,GAAQ,KAAA;AACjE,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,KAAA,MAAW,CAAA,IAAK,EAAE,MAAA,EAAQ;AACxB,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AACzB,MAAA,IAAI,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,KAAA,GAAQ,EAAE,KAAA,CAAM,EAAA;AAAA,IAC/C;AAAA,EACF;AACA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAc;AACnC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,KAAmB;AACnD,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA;AAC/B,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,KAAA,CAAM,CAAA,CAAE,EAAE,CAAA;AAC3B,IAAA,IAAI,IAAA,KAAS,EAAE,IAAA,IAAQ,EAAA,KAAO,EAAE,EAAA,EAAI,OAAO,CAAC,IAAI,CAAA;AAChD,IAAA,QAAA,CAAS,IAAI,CAAC,CAAA;AACd,IAAA,IAAI,IAAA,KAAS,EAAA,EAAI,OAAO,EAAC;AACzB,IAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,QAAQ,EAAA,EAAI,GAAG,MAAK,GAAI,IAAA;AAC9C,IAAA,OAAO,CAAC;AAAA,MAAE,GAAG,IAAA;AAAA,MAAM,IAAA;AAAA,MAAM,EAAA;AAAA,MAAI,GAAI,IAAA,KAAS,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,QAAA,GAAW,EAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAS,GAAI,EAAC;AAAA,MAC3F,GAAI,EAAA,KAAO,CAAA,CAAE,EAAA,IAAM,CAAA,CAAE,MAAA,GAAS,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,GAAI;AAAC,KAAI,CAAA;AAAA,EAC9D,CAAC,CAAA;AACD,EAAA,MAAM,QAAQ,OAAA,CAAQ,OAAA,EAAS,iBAAiB,UAAA,EAAY,WAAW,GAAG,WAAW,CAAA;AACrF,EAAA,MAAM,MAAA,GAA0B,OAAO,IAAA,CAAK,MAAA,KAAW,aAAa,IAAA,CAAK,MAAA,GACrE,IAAA,CAAK,MAAA,KAAW,MAAA,GAAS,IAAA,GACzB,OAAA,CAAQ,IAAA,CAAK,UAAU,SAAS,CAAA;AACpC,EAAA,MAAM,gBAA+B,EAAE,KAAA,EAAO,YAAA,EAAc,GAAG,KAAK,aAAA,EAAc;AAClF,EAAA,MAAM,OAAO,MAAA,KAAW,IAAA,GAAO,OAAO,MAAA,CAAO,MAAA,EAAQ,OAAO,aAAa,CAAA;AACzE,EAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,KAAA,oBAAS,IAAI,GAAA,EAAkB;AACnD,EAAA,MAAM,SAAS,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AACxC,IAAA,MAAM,KAAK,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,KAAK,CAAA,CAAE,MAAA;AAChC,IAAA,OAAO,CAAC,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA,EAAG,EAAA,CAAG,GAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,KAAA,EAAO,EAAE,MAAA,CAAO,KAAA,EAAO,QAAQ,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAA;AAAA,EACpF,CAAC,CAAC,CAAA;AACF,EAAA,OAAO,EAAE,QAAQ,IAAA,EAAM,MAAA,EAAQ,SAAS,MAAA,GAAY,IAAA,GAAO,MAAM,QAAA,EAAS;AAC5E","file":"chunk-ZWXM5F4I.js","sourcesContent":["/**\n * A group's box, and anything pinned to a point on another node.\n *\n * The box is an ordinary node that depends on its members and derives its pose\n * from theirs: their union, grown by the inset. Drag a member and the box\n * follows; lay the diagram out and the box lands around wherever the members\n * went. Nothing has to keep it in sync, because nothing stores it.\n *\n * An anchored node — a group's title is the first — derives its pose from one\n * dependency's bounds the same way, so it travels with the box it labels.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n translatePoseViaDescriptor,\n type DerivedDep,\n type PoseDescriptor,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { insetOf, type GroupInset } from './cluster';\nimport { grownBy } from './footprint';\nimport { DIAGRAM_TRAIT_KEY } from './trait';\nimport type { DiagramGroup, PortAnchor } from './types';\n\n/** Where an anchored node sits on its dependency. */\nexport interface DiagramAnchor {\n /** The point on the dependency's bounds, normalized as a port's is. */\n at: PortAnchor;\n /** The point on the node's own bounds that lands there. Default `at`, so\n * `{ u: 0, v: 0 }` puts the node's top-left on the dependency's. */\n self?: PortAnchor;\n /** Then moved by this much, in world units. */\n offset?: Vec2;\n}\n\nfunction traitOf(node: { data: unknown }): Record<string, unknown> | null {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const trait = (data as Record<string, unknown>)[DIAGRAM_TRAIT_KEY];\n return trait !== null && typeof trait === 'object' ? (trait as Record<string, unknown>) : null;\n}\n\n/** The group trait on a node's data, or `null`. */\nexport function diagramGroupOf(node: { data: unknown }): DiagramGroup | null {\n const group = traitOf(node)?.group;\n return group !== null && typeof group === 'object' ? (group as DiagramGroup) : null;\n}\n\n/** The anchor trait on a node's data, or `null`. */\nexport function diagramAnchorOf(node: { data: unknown }): DiagramAnchor | null {\n const anchor = traitOf(node)?.anchor;\n return anchor !== null && typeof anchor === 'object' && 'at' in anchor ? (anchor as DiagramAnchor) : null;\n}\n\n/** Options for {@link groupDerivePose} and {@link anchorDerivePose}.\n * `geometry` defaults to the kit's `AUTO_POSE_DESCRIPTOR`. */\nexport interface GroupPoseOptions<TPose> {\n geometry?: PoseDescriptor<TPose>;\n}\n\n/** A `derivePose` function as the scene calls it: the node, then what it depends on, in `dependsOn` order. */\nexport type DiagramDerivePose<TPose> = (\n node: { pose: TPose; data: unknown },\n deps: readonly (DerivedDep<TPose> | undefined)[],\n) => TPose | null;\n\n/**\n * A `derivePose` that draws a group's box around its members: the union of\n * what each takes up, its `margin` included, grown by the trait's inset. `null` — the authored pose stands — when the node\n * carries no group trait or every member is gone.\n */\nexport function groupDerivePose<TPose>(opts: GroupPoseOptions<TPose> = {}): DiagramDerivePose<TPose> {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n return (node, deps) => {\n const group = diagramGroupOf(node);\n if (group === null) return null;\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n for (const dep of deps) {\n if (dep === undefined) continue;\n const b = grownBy(geometry.getBounds(dep.pose), traitOf(dep.node)?.margin as GroupInset | undefined);\n x0 = Math.min(x0, b.x);\n y0 = Math.min(y0, b.y);\n x1 = Math.max(x1, b.x + b.width);\n y1 = Math.max(y1, b.y + b.height);\n }\n if (!Number.isFinite(x0)) return null;\n return geometry.fromBounds(boxAround({ x: x0, y: y0, width: x1 - x0, height: y1 - y0 }, group), node.pose);\n };\n}\n\n/** A group's box around the union of its members: grown by its inset, and\n * widened evenly to its `minWidth`. */\nexport function boxAround(\n union: { x: number; y: number; width: number; height: number },\n group: DiagramGroup,\n): { x: number; y: number; width: number; height: number } {\n const inset = insetOf(group.inset);\n const width = union.width + inset.left + inset.right;\n const grow = Math.max(0, (group.minWidth ?? 0) - width);\n return {\n x: union.x - inset.left - grow / 2,\n y: union.y - inset.top,\n width: width + grow,\n height: union.height + inset.top + inset.bottom,\n };\n}\n\n/**\n * A `derivePose` that keeps a node at a point on its dependency's bounds.\n * `null` when the node carries no anchor trait or the dependency is gone.\n */\nexport function anchorDerivePose<TPose>(opts: GroupPoseOptions<TPose> = {}): DiagramDerivePose<TPose> {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n return (node, deps) => {\n const anchor = diagramAnchorOf(node);\n const dep = deps[0];\n if (anchor === null || dep === undefined) return null;\n const target = geometry.getBounds(dep.pose);\n const own = geometry.getBounds(node.pose);\n const self = anchor.self ?? anchor.at;\n const x = target.x + anchor.at.u * target.width + (anchor.offset?.x ?? 0) - self.u * own.width;\n const y = target.y + anchor.at.v * target.height + (anchor.offset?.y ?? 0) - self.v * own.height;\n return translatePoseViaDescriptor(node.pose, x - own.x, y - own.y, geometry);\n };\n}\n\n/** Registry key for {@link GROUP_DERIVE_POSE}. */\nexport const DIAGRAM_GROUP = 'diagram:group';\n/** Registry key for {@link ANCHOR_DERIVE_POSE}. */\nexport const DIAGRAM_ANCHOR = 'diagram:anchor';\n\n/** The default group derivation, a stable reference so `toJSON` can find its key. */\nexport const GROUP_DERIVE_POSE = groupDerivePose<unknown>();\n/** The default anchor derivation, a stable reference for the same reason. */\nexport const ANCHOR_DERIVE_POSE = anchorDerivePose<unknown>();\n","/**\n * The container trait: what makes a core `GroupNode` a diagram container,\n * a pool, or one of a pool's lanes, and where its header is.\n *\n * A container's title is a text child in its header, named\n * `<container id>/title`. The layouts find it by that name, because a layout\n * strategy sees only ids and poses.\n */\nimport type { Outline } from '../outline';\nimport { DIAGRAM_TRAIT_KEY } from '../trait';\n\n/** Which kind of region a container is. */\nexport type ContainerRole = 'container' | 'pool' | 'lane';\n\n/** The strip a container's title sits in, along one side. */\nexport interface ContainerHeader {\n side: 'top' | 'left';\n /** Its depth into the container, in world units. */\n size: number;\n}\n\n/** The container half of a diagram node's trait, under `data.diagram.container`. */\nexport interface DiagramContainer {\n role: ContainerRole;\n header?: ContainerHeader;\n /** Its box is fitted to its members each time the diagram is built from data\n * (`DataContainer` with no `box`), so a move that carries it along is no edit of its own. */\n fitted?: true;\n /** A container whose members are reordered along this axis (`DataContainer.reorder`). */\n reorder?: 'x' | 'y';\n}\n\ntype Box = { x: number; y: number; width: number; height: number };\n\nfunction traitOf(node: { data: unknown }): Record<string, unknown> | null {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const trait = (data as Record<string, unknown>)[DIAGRAM_TRAIT_KEY];\n return trait !== null && typeof trait === 'object' ? (trait as Record<string, unknown>) : null;\n}\n\n/** The container trait on a node's data, or `null`. */\nexport function diagramContainerOf(node: { data: unknown }): DiagramContainer | null {\n const c = traitOf(node)?.container;\n return c !== null && typeof c === 'object' && typeof (c as DiagramContainer).role === 'string'\n ? (c as DiagramContainer)\n : null;\n}\n\n/** The outline a lane draws. A lane takes no connectors, so the participant\n * reader passes over it, and the shape painter asks here instead. */\nexport function laneOutlineOf(node: { data: unknown }): Outline | undefined {\n if (diagramContainerOf(node)?.role !== 'lane') return undefined;\n return traitOf(node)?.outline as Outline | undefined;\n}\n\n/** The id of a container's title node. */\nexport const titleIdOf = (containerId: string): string => `${containerId}/title`;\n\n/** The header strip of a container at `bounds`; null with no header. */\nexport function headerBox(bounds: Box, header: ContainerHeader | undefined): Box | null {\n if (header === undefined) return null;\n return header.side === 'top'\n ? { x: bounds.x, y: bounds.y, width: bounds.width, height: Math.min(header.size, bounds.height) }\n : { x: bounds.x, y: bounds.y, width: Math.min(header.size, bounds.width), height: bounds.height };\n}\n\n/** What a container at `bounds` holds members in: everything past its header. */\nexport function bodyBox(bounds: Box, header: ContainerHeader | undefined): Box {\n const h = headerBox(bounds, header);\n if (h === null) return { ...bounds };\n return header!.side === 'top'\n ? { x: bounds.x, y: bounds.y + h.height, width: bounds.width, height: bounds.height - h.height }\n : { x: bounds.x + h.width, y: bounds.y, width: bounds.width - h.width, height: bounds.height };\n}\n","import type { RectPose } from '@weasel-js/core';\nimport { headerBox, type ContainerHeader } from './trait';\n\ntype Box = { x: number; y: number; width: number; height: number };\n\n/** Where a container's title sits: its header strip, turned a quarter to run\n * up a left header. */\nexport function titlePose(bounds: Box, header: ContainerHeader | undefined): RectPose {\n const h = headerBox(bounds, header) ?? { ...bounds, height: 0 };\n if (header?.side !== 'left') return { x: h.x, y: h.y, width: h.width, height: h.height };\n const cx = h.x + h.width / 2;\n const cy = h.y + h.height / 2;\n return { x: cx - h.height / 2, y: cy - h.width / 2, width: h.height, height: h.width, rotation: -Math.PI / 2 };\n}\n\n/** {@link titlePose} as the title is stored: in its container's own frame. */\nexport function titleInFrame(size: { width: number; height: number }, header: ContainerHeader | undefined): RectPose {\n return titlePose({ x: 0, y: 0, width: size.width, height: size.height }, header);\n}\n","/**\n * `diagramContainerLayout` — free placement under a header. A member stays\n * wherever it is dropped or the container is resized to; only the title is\n * placed, in the header.\n *\n * A strategy sees ids and poses, never data, so it cannot tell a lane from a\n * shape. Which nodes a container admits is `diagramCanDropInto`'s call.\n */\nimport { createTransformOp, type LayoutStrategy, type RectPose } from '@weasel-js/core';\nimport { titlePose } from './titlePose';\nimport { bodyBox, titleIdOf, type ContainerHeader } from './trait';\n\n/** Options for {@link diagramContainerLayout}. */\nexport interface ContainerLayoutOptions {\n /** Where the title sits; matches the container trait's own `header`. */\n header?: ContainerHeader;\n}\n\nconst center = (p: RectPose) => ({ x: p.x + p.width / 2, y: p.y + p.height / 2 });\n\n/** The title's pose when it is not already there; nothing else is placed. */\nexport function titlePoses(\n container: { id: string; bounds: { x: number; y: number; width: number; height: number } },\n children: readonly { id: string; pose: RectPose }[],\n header: ContainerHeader | undefined,\n): Map<string, RectPose> {\n const out = new Map<string, RectPose>();\n const title = children.find((c) => c.id === titleIdOf(container.id));\n if (title !== undefined) out.set(title.id, titlePose(container.bounds, header));\n return out;\n}\n\n/** A free-placement layout whose drops land in the body below or beside `header`. */\nexport function diagramContainerLayout(opts: ContainerLayoutOptions = {}): LayoutStrategy<RectPose> {\n const { header } = opts;\n return {\n snap: { pickTarget: (targets) => targets[0] ?? null },\n childPoses: (container, children) => titlePoses(container, children, header),\n getDropTargets: (_container, _children, dragged) => [{ pose: dragged.pose, origin: center(dragged.pose) }],\n reflowPoses: () => new Map(),\n commitDrop: (_container, _children, dragged, target) => [createTransformOp<RectPose>({\n id: dragged.id, from: dragged.originPose, to: target?.pose ?? dragged.pose, label: 'Drop',\n })],\n dropRegion(container) {\n const b = container.bounds;\n const body = bodyBox(b, header);\n return { kind: 'rect', x: body.x - b.x, y: body.y - b.y, width: body.width, height: body.height };\n },\n };\n}\n","/**\n * `laneStackLayout` — a pool's lanes, stacked along one axis in the order they\n * sit and stretched across the body past the header. The pool's size along\n * the stack is the sum of its lanes; its size across is the author's.\n *\n * Like every strategy it sees ids and poses only: the title is told apart by\n * its name, and which nodes a pool admits (lanes) is `diagramCanDropInto`'s call.\n */\nimport {\n createTransformOp,\n type ContainerBounds,\n type LayoutArrival,\n type LayoutChild,\n type LayoutContainer,\n type LayoutStrategy,\n type Op,\n type RectPose,\n} from '@weasel-js/core';\nimport { titlePose } from './titlePose';\nimport { bodyBox, titleIdOf, type ContainerHeader } from './trait';\n\n/** Options for {@link laneStackLayout}. */\nexport interface LaneStackOptions {\n /** The axis lanes stack along: `'y'` for a pool of rows, `'x'` for columns. */\n axis: 'x' | 'y';\n /** The header's depth, across the stack. Default {@link POOL_HEADER_SIZE}. */\n headerSize?: number;\n}\n\n/** A pool header's default depth. */\nexport const POOL_HEADER_SIZE = 32;\n/** The least a lane is along the stack. */\nexport const MIN_LANE_SIZE = 40;\n\ntype Lane = LayoutChild<RectPose>;\n\n/** The header a pool stacking along `axis` has: across the stack, at its start. */\nexport const poolHeader = (axis: 'x' | 'y', size = POOL_HEADER_SIZE): ContainerHeader =>\n ({ side: axis === 'y' ? 'left' : 'top', size });\n\n/** Where lanes of the given sizes sit, in order, in a pool at `bounds`. */\nexport function stackedLanes(\n axis: 'x' | 'y',\n bounds: ContainerBounds,\n header: ContainerHeader,\n lanes: readonly { id: string; size: number }[],\n): Map<string, RectPose> {\n const body = bodyBox(bounds, header);\n const out = new Map<string, RectPose>();\n let at = axis === 'y' ? bounds.y : bounds.x;\n for (const { id, size } of lanes) {\n out.set(id, axis === 'y'\n ? { x: body.x, y: at, width: body.width, height: size }\n : { x: at, y: body.y, width: size, height: body.height });\n at += size;\n }\n return out;\n}\n\n/** A pool stacking its lanes along `axis`. */\nexport function laneStackLayout(opts: LaneStackOptions): LayoutStrategy<RectPose> {\n const { axis } = opts;\n const header = poolHeader(axis, opts.headerSize);\n const along = (p: { width: number; height: number }) => (axis === 'y' ? p.height : p.width);\n const mid = (p: RectPose) => (axis === 'y' ? p.y + p.height / 2 : p.x + p.width / 2);\n const lanesOf = (container: LayoutContainer, children: readonly Lane[], skip?: string) =>\n children.filter((c) => c.id !== titleIdOf(container.id) && c.id !== skip).sort((a, b) => mid(a.pose) - mid(b.pose));\n const sized = (lanes: readonly Lane[]) => lanes.map((l) => ({ id: l.id, size: along(l.pose) }));\n const withTitle = (container: LayoutContainer, children: readonly Lane[], poses: Map<string, RectPose>, bounds = container.bounds) => {\n if (children.some((c) => c.id === titleIdOf(container.id))) poses.set(titleIdOf(container.id), titlePose(bounds, header));\n return poses;\n };\n /** The pool sized to hold `lanes`, and where they sit in it. */\n const resized = (container: LayoutContainer, children: readonly Lane[], lanes: readonly Lane[]): LayoutArrival<RectPose> => {\n const sizes = sized(lanes);\n const total = Math.max(MIN_LANE_SIZE, sizes.reduce((s, l) => s + l.size, 0));\n const bounds = axis === 'y' ? { ...container.bounds, height: total } : { ...container.bounds, width: total };\n return { poses: withTitle(container, children, stackedLanes(axis, bounds, header, sizes), bounds), bounds };\n };\n const insertAt = (container: LayoutContainer, children: readonly Lane[], dragged: Lane, index: number) => {\n const sizes = sized(lanesOf(container, children, dragged.id));\n sizes.splice(index, 0, { id: dragged.id, size: along(dragged.pose) });\n return stackedLanes(axis, container.bounds, header, sizes);\n };\n const shifted: LayoutStrategy<RectPose>['reflowPoses'] = (container, children, dragged, target) => {\n if (target === null) return new Map();\n const poses = insertAt(container, children, dragged, (target.meta as { index: number }).index);\n poses.delete(dragged.id);\n return poses;\n };\n\n return {\n snap: {\n pickTarget(targets, pointer) {\n const p = axis === 'y' ? pointer.y : pointer.x;\n let best = null;\n for (const t of targets) {\n if (best === null || Math.abs(t.origin[axis] - p) < Math.abs(best.origin[axis] - p)) best = t;\n }\n return best;\n },\n },\n\n childPoses(container, children) {\n const sizes = sized(lanesOf(container, children));\n const last = sizes[sizes.length - 1];\n if (last !== undefined) {\n const slack = along(container.bounds) - sizes.reduce((s, l) => s + l.size, 0);\n last.size = Math.max(MIN_LANE_SIZE, last.size + slack);\n }\n return withTitle(container, children, stackedLanes(axis, container.bounds, header, sizes));\n },\n\n getDropTargets(container, children, dragged) {\n const count = lanesOf(container, children, dragged.id).length;\n const self = { id: dragged.id, pose: dragged.pose };\n const targets = [];\n for (let index = 0; index <= count; index++) {\n const pose = insertAt(container, children, self, index).get(dragged.id)!;\n targets.push({ pose, origin: { x: pose.x + pose.width / 2, y: pose.y + pose.height / 2 }, meta: { index } });\n }\n return targets;\n },\n\n reflowPoses: shifted,\n\n commitDrop(container, children, dragged, target) {\n const ops: Op[] = [];\n const poses = shifted(container, children, dragged, target);\n for (const c of children) {\n const to = poses.get(c.id);\n if (to !== undefined && (to.x !== c.pose.x || to.y !== c.pose.y)) {\n ops.push(createTransformOp<RectPose>({ id: c.id, from: c.pose, to, label: 'Shift lane' }));\n }\n }\n ops.push(createTransformOp<RectPose>({\n id: dragged.id, from: dragged.originPose, to: target?.pose ?? dragged.pose, label: 'Move lane',\n }));\n return ops;\n },\n\n arrive: (container, children) => resized(container, children, lanesOf(container, children)),\n depart: (container, children) => resized(container, children, lanesOf(container, children)),\n\n dropRegion(container) {\n const b = container.bounds;\n const body = bodyBox(b, header);\n return { kind: 'rect', x: body.x - b.x, y: body.y - b.y, width: body.width, height: body.height };\n },\n\n releaseDrop: () => [],\n };\n}\n","/**\n * The container layouts by registry key, as stable references so a saved\n * scene finds them again (`withDiagramRegistry`).\n */\nimport type { LayoutStrategy, RectPose } from '@weasel-js/core';\nimport { diagramContainerLayout } from './containerLayout';\nimport { laneStackLayout, poolHeader } from './laneStack';\nimport type { ContainerHeader, ContainerRole } from './trait';\n\n/** A plain container's header. */\nexport const CONTAINER_HEADER: ContainerHeader = { side: 'top', size: 28 };\n/** A lane's header depth, across its pool's stack. */\nexport const LANE_HEADER_SIZE = 28;\n\n/** The header a lane of a pool stacking along `axis` has. */\nexport const laneHeader = (axis: 'x' | 'y'): ContainerHeader =>\n ({ side: axis === 'y' ? 'left' : 'top', size: LANE_HEADER_SIZE });\n\n/** A titled container's layout key: free placement in the body below its header. */\nexport const DIAGRAM_CONTAINER_LAYOUT = 'diagram:container';\n/** A pool's layout key when its lanes stack as rows, top to bottom. */\nexport const DIAGRAM_POOL_ROWS_LAYOUT = 'diagram:pool-rows';\n/** A pool's layout key when its lanes stack as columns, left to right. */\nexport const DIAGRAM_POOL_COLUMNS_LAYOUT = 'diagram:pool-columns';\n/** The layout key of a lane in a pool of rows: free placement beside its left header. */\nexport const DIAGRAM_LANE_ROWS_LAYOUT = 'diagram:lane-rows';\n/** The layout key of a lane in a pool of columns: free placement below its top header. */\nexport const DIAGRAM_LANE_COLUMNS_LAYOUT = 'diagram:lane-columns';\n\n/** Every container layout this package registers, by key. */\nexport const CONTAINER_LAYOUTS: Readonly<Record<string, LayoutStrategy<RectPose>>> = Object.freeze({\n [DIAGRAM_CONTAINER_LAYOUT]: diagramContainerLayout({ header: CONTAINER_HEADER }),\n [DIAGRAM_POOL_ROWS_LAYOUT]: laneStackLayout({ axis: 'y' }),\n [DIAGRAM_POOL_COLUMNS_LAYOUT]: laneStackLayout({ axis: 'x' }),\n [DIAGRAM_LANE_ROWS_LAYOUT]: diagramContainerLayout({ header: laneHeader('y') }),\n [DIAGRAM_LANE_COLUMNS_LAYOUT]: diagramContainerLayout({ header: laneHeader('x') }),\n});\n\n/** The layout key and header for a container of `role`; a pool or lane's\n * follow the axis its pool stacks along. */\nexport function containerShape(role: ContainerRole, axis: 'x' | 'y' = 'y'): { layout: string; header: ContainerHeader } {\n if (role === 'pool') return { layout: axis === 'y' ? DIAGRAM_POOL_ROWS_LAYOUT : DIAGRAM_POOL_COLUMNS_LAYOUT, header: poolHeader(axis) };\n if (role === 'lane') return { layout: axis === 'y' ? DIAGRAM_LANE_ROWS_LAYOUT : DIAGRAM_LANE_COLUMNS_LAYOUT, header: laneHeader(axis) };\n return { layout: DIAGRAM_CONTAINER_LAYOUT, header: CONTAINER_HEADER };\n}\n","/**\n * The label trait: where along its edge a label sits. Data only — placing the\n * label on the route is `label`'s job, so layout can read one without\n * reaching the scene.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\n\n/** Where along an edge a label sits. */\nexport interface DiagramLabel {\n /** `'start'`, `'mid'` and `'end'` are 0, 0.5 and 1; a number is that\n * fraction of the route's length. `{ near }` is the point on the route\n * nearest `near`, in world coordinates — where `layered` leaves a label\n * room — so a bend added or removed elsewhere leaves the label on the\n * stretch it was on. */\n at: 'start' | 'mid' | 'end' | number | { near: Vec2 };\n /** World units between the route and the label's near side, to the **left\n * of the direction of travel** — above a left-to-right edge. Default 0,\n * which centers the label on the line. */\n offset?: number;\n /** Where label placement moved it, off a station something covered:\n * `at` a fraction of the route's length, `offset` as above. Read in place\n * of `at` and `offset`, which stay the author's preference. Written only\n * by placement (`installLabelPlacement`). */\n placed?: LabelSpot;\n /** `false` keeps placement from ever moving this label. */\n dodge?: false;\n}\n\n/** A station placement chose: a fraction of the route's length, and the\n * offset from the line. */\nexport interface LabelSpot {\n at: number;\n offset: number;\n}\n\n/** Where an edge label sits when neither the edge nor the scene says. */\nexport const LABEL_PLACEMENT: DiagramLabel = { at: 'mid', offset: 9 };\n\n/** The label trait on a node's data, or `null`. */\nexport function diagramLabelOf(node: { data: unknown }): DiagramLabel | null {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const trait = (data as { diagram?: unknown }).diagram;\n if (trait === null || typeof trait !== 'object') return null;\n const label = (trait as { label?: unknown }).label;\n if (label === null || typeof label !== 'object') return null;\n return 'at' in label ? (label as DiagramLabel) : null;\n}\n","/**\n * A label on an edge: an ordinary leaf node that derives its *pose* from the\n * route it sits on.\n *\n * It reads the edge's resolved path off its dependency rather than routing\n * again, so the label and the arrowhead can never disagree about where the\n * edge went. Everything else about it is a normal scene node — its own size,\n * data, styling, z-order and selection.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n translatePoseViaDescriptor,\n type DerivedDep,\n type PoseDescriptor,\n} from '@weasel-js/core';\nimport { diagramLabelOf } from './labelTrait';\nimport { labelCenter } from './labels/station';\n\nexport { labelCenter };\n\n/** Options for {@link labelDerivePose}. `geometry` defaults to the kit's\n * `AUTO_POSE_DESCRIPTOR`. */\nexport interface LabelPoseOptions<TPose> {\n geometry?: PoseDescriptor<TPose>;\n}\n\n/**\n * A `derivePose` that stations a label along its dependency's path.\n *\n * Returns `null` — nothing derived, so the node keeps its authored pose —\n * when the node carries no label trait, when the dependency is gone, or when\n * the dependency derives no path. A label that snapped to the origin because\n * its edge was deleted is worse than one that stayed where the author left it.\n */\nexport function labelDerivePose<TPose>(\n opts: LabelPoseOptions<TPose> = {},\n): (node: { pose: TPose; data: unknown }, deps: readonly (DerivedDep<TPose> | undefined)[]) => TPose | null {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n\n return (node, deps) => {\n const label = diagramLabelOf(node);\n if (label === null) return null;\n const path = deps[0]?.path ?? null;\n if (path === null) return null;\n\n const bounds = geometry.getBounds(node.pose);\n const center = labelCenter(path, label, bounds);\n if (center === null) return null;\n\n return translatePoseViaDescriptor(\n node.pose,\n center.x - (bounds.x + bounds.width / 2),\n center.y - (bounds.y + bounds.height / 2),\n geometry,\n );\n };\n}\n\n/** Registry key for {@link LABEL_DERIVE_POSE}. */\nexport const DIAGRAM_LABEL = 'diagram:label';\n\n/** The default label derivation, as one stable function reference so `toJSON`\n * can find its key. */\nexport const LABEL_DERIVE_POSE = labelDerivePose<unknown>();\n","/**\n * A hit index rebuilt when its source's key changes, built on the second read\n * at a key (`createSettledCache`). A source with no key (`undefined`) is never\n * indexed: every read answers null, so the caller scans.\n */\nimport { createBvh, createSettledCache, type Bvh } from '@weasel-js/geom/nd';\n\nexport function keyedIndex<T>(key: () => readonly unknown[] | undefined, build: () => T): () => T | null {\n const cache = createSettledCache<T>();\n return () => {\n const now = key();\n return now === undefined ? null : cache.read(now, build);\n };\n}\n\n/** A 2D BVH over `boxes` (`[minX, minY, maxX, maxY]`), keyed by position. A box the tree\n * refuses (non-finite or inverted) goes on `always`, for every query to read. */\nexport interface BoxIndex {\n tree: Bvh<number>;\n always: readonly number[];\n}\n\nexport function boxIndex(boxes: readonly (readonly [number, number, number, number])[]): BoxIndex {\n const entries: [number, readonly number[]][] = [];\n const always: number[] = [];\n boxes.forEach((b, i) => {\n if (b.every(Number.isFinite) && b[0] <= b[2] && b[1] <= b[3]) entries.push([i, b]);\n else always.push(i);\n });\n return { tree: createBvh<number>(2, entries), always };\n}\n\n/** Positions of the boxes meeting `[x0, y0, x1, y1]`, grown by a relative epsilon so rounding\n * only ever adds one, ascending; null for a query with a NaN in it, which meets nothing. */\nexport function boxesMeeting(index: BoxIndex, x0: number, y0: number, x1: number, y1: number): number[] | null {\n const q = [x0, y0, x1, y1];\n if (q.some(Number.isNaN)) return null;\n const e = 1e-9 * (1 + Math.max(0, ...q.filter(Number.isFinite).map(Math.abs)));\n const found = [...index.always];\n index.tree.queryBox([x0 - e, y0 - e, x1 + e, y1 + e], (i) => { found.push(i); });\n return found.sort((a, b) => a - b);\n}\n","/**\n * What makes an edge label grabbable, so a drag can move it along and beside\n * its edge (`labelDragAction`).\n *\n * Built the way the route handles are: rect regions with a `null` `targetId`\n * and no paint, composed into a layer whose id is the kind a press reports.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n composeAffordanceLayer,\n documentDepOf,\n documentPose,\n type Affordance,\n type AffordanceRegion,\n type CursorSpec,\n type NodeId,\n type RenderLayer,\n type Scene,\n} from '@weasel-js/core';\nimport type { Path, Vec2 } from '@weasel-js/core/math';\nimport { boxIndex, boxesMeeting, keyedIndex, type BoxIndex } from './keyedIndex';\nimport { diagramLabelOf, type DiagramLabel } from './labelTrait';\nimport type { Bounds } from './outline';\n\n/** The layer id the label regions are composed into. */\nexport const LABEL_DRAG_LAYER_ID = 'diagram-edge-labels';\n\n/** The affordance kind a press on an edge label reports. */\nexport const LABEL_DRAG_AFFORDANCE_KIND = `layer:${LABEL_DRAG_LAYER_ID}` as const;\n\n/** What a press on an edge label hands the label actions, as the hit's `payload`. */\nexport interface LabelScratch {\n targetId: string;\n labelId: string;\n edgeId: string;\n}\n\n/** Read a label press's scratch back off the hit an action was handed. */\nexport function labelScratchOf(hit: { payload?: unknown } | null | undefined): LabelScratch | null {\n const payload = hit?.payload as LabelScratch | undefined;\n return payload !== undefined && typeof payload.labelId === 'string' && typeof payload.edgeId === 'string'\n ? payload : null;\n}\n\n/** A label a press can pick up: its box as the document places it, and its edge's route. */\nexport interface DraggableLabel {\n labelId: string;\n edgeId: string;\n box: Bounds;\n path: Path;\n}\n\n/** Whether an edit may touch a label: neither it nor its edge is locked, and it is not hidden. */\nexport const labelEditable = (scene: Scene<unknown, string, unknown>, labelId: NodeId, edgeId: NodeId): boolean =>\n !scene.isLocked(labelId) && !scene.isLocked(edgeId) && !scene.isHidden(labelId);\n\n/** A label an edit may touch, and the one edge it stands on. */\nexport interface EditableLabel {\n labelId: NodeId;\n edgeId: NodeId;\n label: DiagramLabel;\n}\n\n/** Every label in `scene` an edit may touch, in render order: one carrying the\n * label trait, on exactly one edge, that `labelEditable` passes. With `edges`,\n * only the labels on those edges. */\nexport function* editableLabels(\n scene: Scene<unknown, string, unknown>, edges?: ReadonlySet<string>,\n): Iterable<EditableLabel> {\n for (const node of scene.renderOrderNodes()) {\n const label = diagramLabelOf(node);\n if (label === null) continue;\n const deps = node.dependsOn;\n if (!Array.isArray(deps) || deps.length !== 1) continue;\n const edgeId = deps[0] as NodeId;\n if (edges !== undefined && !edges.has(edgeId)) continue;\n if (labelEditable(scene, node.id, edgeId)) yield { labelId: node.id, edgeId, label };\n }\n}\n\n/** Every editable label in `scene` whose edge derives a path, in render order. */\nexport function* draggableLabels(scene: Scene<unknown, string, unknown>): Iterable<DraggableLabel> {\n for (const { labelId, edgeId } of editableLabels(scene)) {\n const path = documentDepOf(scene as never, edgeId)?.path ?? null;\n if (path === null) continue;\n const box = AUTO_POSE_DESCRIPTOR.getBounds(documentPose(scene as never, scene.get(labelId) as never));\n yield { labelId, edgeId, box, path };\n }\n}\n\nconst holds = (b: Bounds, at: Vec2) => at.x >= b.x && at.x <= b.x + b.width && at.y >= b.y && at.y <= b.y + b.height;\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** Each scene's draggable labels, boxed. Read at document poses, so the scene's version is the whole key. */\nconst INDEXES = new WeakMap<AnyScene, () => { labels: DraggableLabel[]; boxes: BoxIndex } | null>();\n\nfunction labelIndexOf(scene: AnyScene) {\n let index = INDEXES.get(scene);\n if (index === undefined) {\n index = keyedIndex(\n () => (typeof scene.getVersion === 'function' ? [scene.getVersion()] : undefined),\n () => {\n const labels = [...draggableLabels(scene)];\n return {\n labels,\n boxes: boxIndex(labels.map(({ box: b }) => [\n Math.min(b.x, b.x + b.width), Math.min(b.y, b.y + b.height),\n Math.max(b.x, b.x + b.width), Math.max(b.y, b.y + b.height),\n ] as const)),\n };\n },\n );\n INDEXES.set(scene, index);\n }\n return index;\n}\n\n/** The draggable labels whose box can hold `at`, in render order: every one, without an index. */\nfunction labelsAt(scene: AnyScene, at: Vec2): Iterable<DraggableLabel> {\n const built = labelIndexOf(scene)();\n const near = built && boxesMeeting(built.boxes, at.x, at.y, at.x, at.y);\n if (!built || !near) return draggableLabels(scene);\n return near.map((i) => built.labels[i]!);\n}\n\n/** The topmost draggable label whose box holds `at`, as its press scratch. */\nexport function labelUnder(scene: AnyScene, at: Vec2): LabelScratch | null {\n let found: LabelScratch | null = null;\n for (const { labelId, edgeId, box } of labelsAt(scene, at)) {\n if (holds(box, at)) found = { targetId: labelId, labelId, edgeId };\n }\n return found;\n}\n\nfunction createLabelDragAffordance(scene: AnyScene, cursor: CursorSpec): Affordance {\n const regionsOf = (labels: Iterable<DraggableLabel>): readonly AffordanceRegion[] => {\n const out: AffordanceRegion[] = [];\n for (const { labelId, edgeId, box } of labels) {\n out.push({\n id: labelId,\n targetId: null,\n shape: { kind: 'rect', x: box.x, y: box.y, width: box.width, height: box.height },\n cursor,\n strength: 'exclusive',\n claimedKinds: ['pointer'],\n bind: () => ({ initialScratch: { targetId: labelId, labelId, edgeId } satisfies LabelScratch }),\n });\n }\n return out;\n };\n return {\n id: LABEL_DRAG_LAYER_ID,\n regions: () => regionsOf(draggableLabels(scene)),\n regionsAt: (_state, wx, wy) => regionsOf(labelsAt(scene, { x: wx, y: wy })),\n };\n}\n\n/** The composed layer, for `CanvasExtensionApi.registerLayer`. Register it\n * before the port layer: the last registered is hit first, and a port or a\n * route handle must win over a label beside it. */\nexport function labelDragLayer(\n scene: Scene<unknown, string, unknown>,\n opts: { cursor?: CursorSpec } = {},\n): RenderLayer<unknown> {\n return composeAffordanceLayer(\n LABEL_DRAG_LAYER_ID,\n 'Diagram edge labels',\n [createLabelDragAffordance(scene, opts.cursor ?? 'move')],\n ) as unknown as RenderLayer<unknown>;\n}\n","/**\n * Edge labels: the one place a label node's spec is made, and the action that\n * adds or edits an edge's label on a double-click.\n */\nimport {\n ActionDisabledReason,\n bodyPredicate,\n type Action,\n type ActionDeps,\n type AddNodeSpec,\n type GestureBinding,\n type InvocationCtx,\n type RectPose,\n type Scene,\n} from '@weasel-js/core';\nimport type { MeasureRowText, RowTextStyle } from './body';\nimport { diagramEdgeOf } from './edgeTrait';\nimport { LABEL_DERIVE_POSE } from './label';\nimport { labelScratchOf, labelUnder } from './labelDragLayer';\nimport { LABEL_PLACEMENT, diagramLabelOf, type DiagramLabel } from './labelTrait';\nimport type { ImmediateParams } from '@weasel-js/core';\n\n/** The face an edge label is set in: the diagram's, two sizes down. */\nexport const labelStyleOf = (font: { fontFamily: string; fontSize: number }) => ({ ...font, fontSize: font.fontSize - 2 });\n\n/** The diagram's face when the scene names none. */\nexport const DEFAULT_FONT = { fontFamily: 'sans-serif', fontSize: 12 };\n/** Advance width per character, in font sizes, where nothing measures text. */\nexport const GLYPH = 0.6;\n\nconst LABEL_STYLE: RowTextStyle = labelStyleOf(DEFAULT_FONT);\nconst LABEL_FILL = '#dbe7f2';\n\n/** The box a label's text takes: measured width, and a height of the font size\n * whatever the measure reports. */\nexport function labelSize(text: string, style: RowTextStyle, measure?: MeasureRowText): { width: number; height: number } {\n const size = style.fontSize ?? LABEL_STYLE.fontSize!;\n return { width: measure !== undefined ? measure(text, style).width : text.length * size * GLYPH, height: size };\n}\n\n/** Options for {@link edgeLabelSpec}. */\nexport interface EdgeLabelOptions<TLayer extends string> {\n layer: TLayer;\n /** Where along the edge it sits. Default {@link LABEL_PLACEMENT}. */\n label?: DiagramLabel;\n style?: RowTextStyle;\n /** Text color. */\n fill?: string;\n /** Sizes the box. Default: a per-character estimate. */\n measure?: MeasureRowText;\n}\n\n/** The label node for edge `edgeId`: a leaf that derives its pose from the edge's route. */\nexport function edgeLabelSpec<TLayer extends string>(\n edgeId: string, text: string, opts: EdgeLabelOptions<TLayer>,\n): AddNodeSpec<unknown, TLayer, RectPose> {\n const style = opts.style ?? LABEL_STYLE;\n return {\n id: `${edgeId}/label` as never,\n kind: 'mark',\n layer: opts.layer,\n pickable: false,\n pose: { x: 0, y: 0, ...labelSize(text, style, opts.measure) },\n data: {\n diagram: { label: opts.label ?? LABEL_PLACEMENT },\n text,\n style,\n fill: { paint: { color: opts.fill ?? LABEL_FILL } },\n },\n dependsOn: [edgeId as never],\n derivePose: LABEL_DERIVE_POSE as never,\n } as AddNodeSpec<unknown, TLayer, RectPose>;\n}\n\n/**\n * Removes node `id` if it is an edge label left with no text, and says whether\n * it did. The default edit adds a label before its text is typed, so a host\n * passes this as its text edit's `onEnd` to drop one that ends empty.\n */\nexport function dropEmptyEdgeLabel(scene: Scene<unknown, string, unknown>, id: string): boolean {\n const node = scene.get(id as never);\n if (node === undefined || diagramLabelOf(node) === null) return false;\n const text = (node.data as { text?: unknown }).text;\n if (typeof text === 'string' && text.trim() !== '') return false;\n scene.remove(id as never);\n return true;\n}\n\n/** The action that adds or edits an edge's label. */\nexport const EDIT_EDGE_LABEL_ACTION_ID = 'diagram.editEdgeLabel';\n\n/** Options for {@link editEdgeLabelAction}. */\nexport interface EditEdgeLabelOptions {\n /** Runs in place of the default add-then-edit. */\n commit?: (edgeId: string, ctx: InvocationCtx) => void;\n /** The face a new label is set in. Default the diagram's, two sizes down. Ignored when `commit` is given. */\n style?: RowTextStyle;\n /** A new label's text color. Ignored when `commit` is given. */\n fill?: string;\n}\n\nfunction edgeUnder(deps: ActionDeps | undefined, at: { x: number; y: number } | undefined): string | null {\n if (deps === undefined || at === undefined) return null;\n // A label is not pickable, so a connector passing under it would win the pick.\n const label = deps.scene === undefined ? null : labelUnder(deps.scene, at);\n if (label !== null) return label.edgeId;\n const id = deps.nodeAtPoint?.(at);\n const node = id == null ? undefined : deps.scene?.get(id);\n return node !== undefined && diagramEdgeOf(node) !== null ? id! : null;\n}\n\nfunction beginEditing(edgeId: string, ctx: InvocationCtx, look: Pick<EditEdgeLabelOptions, 'style' | 'fill'>): void {\n const { scene, textEdit } = ctx.deps;\n if (scene === undefined) return;\n const labelId = `${edgeId}/label`;\n if (scene.get(labelId as never) === undefined) {\n const edge = scene.get(edgeId as never);\n if (edge === undefined) return;\n scene.add(edgeLabelSpec(edgeId, '', {\n layer: edge.layer,\n ...(look.style ? { style: look.style } : {}),\n ...(look.fill !== undefined ? { fill: look.fill } : {}),\n }) as never);\n }\n textEdit?.startEdit(labelId);\n}\n\n/**\n * Creates an edge's label, or edits the one it has, where a double-click\n * lands on the edge. It declines a double-click on anything else.\n *\n * An immediate invoker is handed no `InvocationCtx`, so `commit` gets one\n * built from the deps and the click point.\n */\nexport function editEdgeLabelAction(opts: EditEdgeLabelOptions = {}): Action {\n const commit = opts.commit ?? ((edgeId: string, ctx: InvocationCtx) => beginEditing(edgeId, ctx, opts));\n return {\n id: EDIT_EDGE_LABEL_ACTION_ID,\n label: 'Edit edge label',\n group: 'diagram',\n requires: ['scene', 'nodeAtPoint', 'textEdit'],\n eligible: { mode: 'normal' },\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const p = params as ImmediateParams | undefined;\n const world = p?.world;\n if (!world) return;\n const pressed = labelScratchOf(p.affordance as { payload?: unknown } | undefined);\n const edgeId = pressed?.edgeId ?? edgeUnder(deps, world);\n if (edgeId === null) return;\n const ctx = { world, modifiers: { alt: false, shift: false, meta: false, ctrl: false }, deps } as InvocationCtx;\n commit(edgeId, ctx);\n },\n },\n enabled: (deps, at) => (edgeUnder(deps, at) !== null ? true : ActionDisabledReason.NotApplicable),\n };\n}\n\nconst onBody = bodyPredicate((target) => target === 'selected-body' || target === 'unselected-body');\n\n/** A double-click on a node's body; the action itself declines unless that node is an edge. */\nexport function editEdgeLabelBinding(actionId: string = EDIT_EDGE_LABEL_ACTION_ID): GestureBinding {\n return { spec: { kind: 'doubleClick', target: { kindOf: onBody } }, actionId, opts: { id: `${actionId}.doubleClick` } };\n}\n","import type { NodeStyle } from '../fromData';\nimport type { DiagramTheme } from './types';\n\nconst SANS = { family: 'sans-serif', size: 12 };\n\nconst INK = '#1f2933';\nconst paper: DiagramTheme = {\n id: 'paper',\n name: 'Paper',\n roles: {\n default: { fill: '#ffffff', stroke: '#3e4c59', text: INK },\n accent: { fill: '#e6f0ff', stroke: '#2f6fd6', text: INK },\n muted: { fill: '#f3f5f7', stroke: '#9aa5b1', text: '#616e7c' },\n positive: { fill: '#e8f6ec', stroke: '#2f9e57', text: INK },\n warning: { fill: '#fdf4dc', stroke: '#c98a0b', text: INK },\n negative: { fill: '#fdecec', stroke: '#d14343', text: INK },\n },\n defaultRole: 'default',\n edge: { stroke: '#3e4c59', width: 2, markerEnd: 'arrow' },\n label: { fill: INK },\n container: { fill: 'rgba(62, 76, 89, 0.04)', stroke: '#7b8794', text: '#52606d', strokeWidth: 1, dash: [4, 3] },\n lane: {\n header: { fill: '#e4e7eb', stroke: '#9aa5b1', text: INK, strokeWidth: 1 },\n bodies: [\n { fill: '#ffffff', stroke: '#cbd2d9', text: INK, strokeWidth: 1 },\n { fill: '#f5f7fa', stroke: '#cbd2d9', text: INK, strokeWidth: 1 },\n ],\n },\n page: '#ffffff',\n font: SANS,\n series: ['#2f6fd6', '#8b5cf6', '#c98a0b', '#2f9e57', '#e8590c', '#0f9b8e', '#d6336c', '#7b8794'],\n};\n\n// The effect looks' and `lanes`' own dark colors, so a look drawn under it is unchanged.\nconst NIGHT_TEXT = '#dbe7f2';\nconst night: DiagramTheme = {\n id: 'night',\n name: 'Night',\n roles: {\n default: { fill: '#16222c', stroke: '#3d566b', text: NIGHT_TEXT, strokeWidth: 1.5 },\n accent: { fill: '#13263a', stroke: '#6fb3ff', text: NIGHT_TEXT, strokeWidth: 1.5 },\n muted: { fill: '#121a21', stroke: '#3d566b', text: '#6d8496', strokeWidth: 1.5 },\n positive: { fill: '#14261c', stroke: '#5ad07f', text: NIGHT_TEXT, strokeWidth: 1.5 },\n warning: { fill: '#2a2414', stroke: '#f2c14e', text: NIGHT_TEXT, strokeWidth: 1.5 },\n negative: { fill: '#2c1618', stroke: '#ff5d5d', text: NIGHT_TEXT, strokeWidth: 1.5 },\n },\n defaultRole: 'default',\n edge: { stroke: '#7ba7c7', width: 2, markerEnd: 'arrow' },\n label: { fill: NIGHT_TEXT },\n container: { fill: 'rgba(123, 167, 199, 0.08)', stroke: '#7ba7c7', text: '#9fbdd6', strokeWidth: 1, dash: [4, 3] },\n lane: {\n header: { fill: 'rgba(255, 255, 255, 0.06)', stroke: 'rgba(255, 255, 255, 0.06)', text: '#9fbdd6', strokeWidth: 1 },\n bodies: [\n { fill: 'rgba(255, 255, 255, 0.035)', stroke: 'rgba(255, 255, 255, 0.06)', text: '#9fbdd6', strokeWidth: 1 },\n { fill: 'rgba(255, 255, 255, 0)', stroke: 'rgba(255, 255, 255, 0.06)', text: '#9fbdd6', strokeWidth: 1 },\n ],\n },\n page: '#0e151b',\n font: SANS,\n series: ['#6fb3ff', '#c58bff', '#f2c14e', '#5ad07f', '#ff8a6b', '#4fd1c5', '#e58fb8', '#b0bec5'],\n};\n\nconst LINE = '#e8f1ff';\nconst blueprint: DiagramTheme = {\n id: 'blueprint',\n name: 'Blueprint',\n roles: {\n default: { fill: '#1d4a85', stroke: LINE, text: LINE },\n accent: { fill: '#2560a8', stroke: '#ffe28a', text: '#ffffff' },\n muted: { fill: '#183f72', stroke: '#8fb1dc', text: '#b9cfee' },\n positive: { fill: '#1d4a85', stroke: '#8ff0b0', text: LINE },\n warning: { fill: '#1d4a85', stroke: '#ffd166', text: LINE },\n negative: { fill: '#1d4a85', stroke: '#ff9b9b', text: LINE },\n },\n defaultRole: 'default',\n edge: { stroke: LINE, width: 1.5, markerEnd: 'arrow' },\n label: { fill: LINE },\n container: { fill: 'rgba(232, 241, 255, 0.06)', stroke: '#8fb1dc', text: '#b9cfee', strokeWidth: 1, dash: [6, 4] },\n lane: {\n header: { fill: '#1d4a85', stroke: '#8fb1dc', text: LINE, strokeWidth: 1 },\n bodies: [\n { fill: 'rgba(232, 241, 255, 0.05)', stroke: '#8fb1dc', text: LINE, strokeWidth: 1 },\n { fill: 'rgba(232, 241, 255, 0)', stroke: '#8fb1dc', text: LINE, strokeWidth: 1 },\n ],\n },\n page: '#163a6b',\n font: { family: 'ui-monospace, monospace', size: 12 },\n series: ['#ffe28a', '#8ff0b0', '#9fd3ff', '#ffb38a', '#d9b8ff', '#7fe3d8', '#ff9b9b', '#c9d6e8'],\n};\n\nconst PLUM = '#4a3b40';\nconst pastel: DiagramTheme = {\n id: 'pastel',\n name: 'Pastel',\n roles: {\n default: { fill: '#e3f0ff', stroke: '#7d9cc4', text: PLUM },\n accent: { fill: '#fde2e4', stroke: '#c9848f', text: PLUM },\n muted: { fill: '#f4f1ee', stroke: '#bfb5ad', text: '#8a7f78' },\n positive: { fill: '#dcf5e3', stroke: '#6fb487', text: PLUM },\n warning: { fill: '#fff1cc', stroke: '#d4a84a', text: PLUM },\n negative: { fill: '#ffdcd6', stroke: '#d77f73', text: PLUM },\n },\n defaultRole: 'default',\n edge: { stroke: '#8a7f99', width: 2, markerEnd: 'arrow' },\n label: { fill: PLUM },\n container: { fill: 'rgba(201, 132, 143, 0.06)', stroke: '#c9b8c2', text: '#7a6670', strokeWidth: 1, dash: [4, 3] },\n lane: {\n header: { fill: '#efe6f5', stroke: '#c9b8c2', text: PLUM, strokeWidth: 1 },\n bodies: [\n { fill: '#fffaf3', stroke: '#e6dccf', text: PLUM, strokeWidth: 1 },\n { fill: '#fbf3ea', stroke: '#e6dccf', text: PLUM, strokeWidth: 1 },\n ],\n },\n page: '#fffaf3',\n font: SANS,\n series: ['#7d9cc4', '#c9848f', '#d4a84a', '#6fb487', '#b48fd1', '#5fb3ad', '#e08fb0', '#a3a3a3'],\n};\n\nconst BLACK = '#111111';\nconst shade = (fill: string): NodeStyle => ({ fill, stroke: BLACK, text: BLACK });\nconst mono: DiagramTheme = {\n id: 'mono',\n name: 'Mono',\n roles: {\n default: shade('#ffffff'),\n accent: shade('#d9d9d9'),\n muted: { fill: '#f5f5f5', stroke: '#9e9e9e', text: '#757575' },\n positive: shade('#ededed'),\n warning: shade('#c4c4c4'),\n negative: { fill: '#595959', stroke: BLACK, text: '#ffffff' },\n },\n defaultRole: 'default',\n edge: { stroke: BLACK, width: 1.5, markerEnd: 'arrow' },\n label: { fill: BLACK },\n container: { fill: 'rgba(0, 0, 0, 0.03)', stroke: '#757575', text: '#424242', strokeWidth: 1, dash: [4, 3] },\n lane: {\n header: { fill: '#e0e0e0', stroke: '#757575', text: BLACK, strokeWidth: 1 },\n bodies: [\n { fill: '#ffffff', stroke: '#bdbdbd', text: BLACK, strokeWidth: 1 },\n { fill: '#f5f5f5', stroke: '#bdbdbd', text: BLACK, strokeWidth: 1 },\n ],\n },\n page: '#ffffff',\n font: SANS,\n series: ['#111111', '#555555', '#888888', '#333333', '#777777', '#222222', '#666666', '#999999'],\n};\n\n/** The themes that ship, by id, in the order a picker lists them. `paper` is ink on white;\n * `night` is the effect looks' own dark colors. */\nexport const DIAGRAM_THEMES: Readonly<Record<string, DiagramTheme>> = Object.freeze({ paper, night, blueprint, pastel, mono });\n","import type { EdgeStyle, NodeStyle } from '../fromData';\n\n/** The roles every shipped theme styles, with the name a picker shows. */\nexport const DIAGRAM_ROLES = [\n { id: 'default', label: 'Default' },\n { id: 'accent', label: 'Accent' },\n { id: 'muted', label: 'Muted' },\n { id: 'positive', label: 'Positive' },\n { id: 'warning', label: 'Warning' },\n { id: 'negative', label: 'Negative' },\n] as const;\n\n/** The id of one of {@link DIAGRAM_ROLES}. A theme may style roles of its own besides. */\nexport type DiagramRole = (typeof DIAGRAM_ROLES)[number]['id'];\n\nexport type { FontField, StyleField } from './styleField';\n\n/** The face a theme sets diagram text in. A text row keeps its own size. */\nexport interface DiagramFont {\n family: string;\n size: number;\n}\n\n/**\n * A document's colors and face. Applying one writes literal colors into the\n * scene, so nothing that reads the scene needs the theme to draw it.\n */\nexport interface DiagramTheme {\n id: string;\n name: string;\n /** A shape's fill, stroke and text by role id. A connector given a role takes that role's stroke. */\n roles: Readonly<Record<string, NodeStyle>>;\n /** The names a picker shows for roles beyond {@link DIAGRAM_ROLES}, or for a shipped role renamed. */\n roleLabels?: Readonly<Record<string, string>>;\n /** The role a shape or connector naming none, or naming one this theme lacks, is drawn in. */\n defaultRole: string;\n /** A connector naming no role. */\n edge: EdgeStyle;\n /** A connector's label, where the connector names no role. */\n label: { fill: string; font?: DiagramFont };\n /** A group's or a container's box, its `text` the title's color. */\n container: NodeStyle;\n /** A pool's header, and its lanes' bodies in turn. */\n lane: { header: NodeStyle; bodies: readonly NodeStyle[] };\n /** The page a document is drawn on. */\n page: string;\n font: DiagramFont;\n /** Colors for a series of things the theme cannot name in advance: an effect look's value types. */\n series: readonly string[];\n}\n\n/** The document value a theme is saved under: a shipped theme's id, or a whole custom theme. */\nexport const DIAGRAM_THEME_KEY = 'diagram:theme';\n","import type { Stroke } from '@weasel-js/core';\nimport { labelStyleOf } from '../edgeLabel';\nimport type { EdgeStyle, NodeStyle } from '../fromData';\nimport { DIAGRAM_THEMES } from './themes';\nimport { DIAGRAM_THEME_KEY, type DiagramTheme } from './types';\n\n/** The style a shape naming `role` is drawn in: that role's, or the theme's default role's. */\nexport function roleStyle(theme: DiagramTheme, role?: string): NodeStyle {\n return (role !== undefined ? theme.roles[role] : undefined) ?? theme.roles[theme.defaultRole]!;\n}\n\n/** The style a connector naming `role` is drawn in: the role's stroke, its label in that stroke too;\n * with no role, the theme's own connector and label colors. */\nexport function roleEdgeStyle(theme: DiagramTheme, role?: string): EdgeStyle {\n const own = role !== undefined ? theme.roles[role] : undefined;\n if (own !== undefined) return { ...theme.edge, stroke: own.stroke, label: own.stroke };\n return { ...theme.edge, label: theme.edge.label ?? theme.label.fill };\n}\n\n/** The stroke a connector drawn under `theme` starts with, for a connect action's `edgeStroke`. */\nexport function themeEdgeStroke(theme: DiagramTheme): Stroke {\n const { stroke, width, dash, markerStart, markerEnd } = theme.edge;\n return {\n paint: { color: stroke },\n width: width ?? 2,\n ...(dash ? { dash } : {}),\n ...(markerStart ? { markerStart } : {}),\n ...(markerEnd !== null ? { markerEnd: markerEnd ?? 'arrow' } : {}),\n };\n}\n\n/** The theme's face as `diagramScene` and the stencils take one. */\nexport const themeFont = (theme: DiagramTheme): { fontFamily: string; fontSize: number } =>\n ({ fontFamily: theme.font.family, fontSize: theme.font.size });\n\n/** The family a connector's label is set in: the label's own, else the theme's. */\nexport const themeLabelFamily = (theme: DiagramTheme): string => theme.label.font?.family ?? theme.font.family;\n\n/** The face edge labels are sized from, before `labelStyleOf` takes two sizes off: the theme's label\n * face where it names one, else `font`. */\nexport const themeLabelFont = (theme: DiagramTheme, font = themeFont(theme)): { fontFamily: string; fontSize: number } =>\n theme.label.font ? { fontFamily: theme.label.font.family, fontSize: theme.label.font.size } : font;\n\n/** The face a new connector label is set in under `theme`. */\nexport const themeLabelStyle = (theme: DiagramTheme) => labelStyleOf(themeLabelFont(theme));\n\n/** The theme a document value names: a shipped theme by id, or a whole theme. `fallback` for none,\n * or for an id no shipped theme has. */\nexport function diagramThemeFrom(value: unknown, fallback: DiagramTheme = DIAGRAM_THEMES.night!): DiagramTheme {\n if (typeof value === 'string') return DIAGRAM_THEMES[value] ?? fallback;\n if (value !== null && typeof value === 'object' && 'roles' in value) return value as DiagramTheme;\n return fallback;\n}\n\n/** The theme a scene's `diagram:theme` value names. */\nexport function diagramThemeOf(scene: { doc: { get(key: string): unknown } }, fallback?: DiagramTheme): DiagramTheme {\n return diagramThemeFrom(scene.doc.get(DIAGRAM_THEME_KEY), fallback);\n}\n\n/** What `diagram:theme` holds for `theme`: a shipped theme's id, or the whole theme. */\nexport const themeDocValue = (theme: DiagramTheme): string | DiagramTheme =>\n DIAGRAM_THEMES[theme.id] === theme ? theme.id : theme;\n","/**\n * Off-page markers as data: what a connector cut at the page gap holds, and\n * what each of its two tags holds. The pass that writes both is `install`.\n */\n\n/** A connector whose ends sit on different pages: its reference letter, and\n * the pages its `from` and `to` ends are on. */\nexport interface OffPageSplit {\n ref: string;\n from: string;\n to: string;\n}\n\n/** Which end of which connector a tag names the far page for. */\nexport interface OffPageTag {\n edge: string;\n end: 'from' | 'to';\n}\n\n/** The id of the tag at end `end` of connector `edgeId`. */\nexport const offPageTagId = (edgeId: string, end: 'from' | 'to'): string => `${edgeId}/offpage-${end}`;\n\n/** The off-page tag trait on a node's data (`data.diagram.offPageTag`), or `null`. */\nexport function offPageTagOf(node: { data: unknown }): OffPageTag | null {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const trait = (data as { diagram?: { offPageTag?: unknown } }).diagram;\n const tag = trait !== null && typeof trait === 'object' ? trait.offPageTag : undefined;\n if (tag === null || typeof tag !== 'object') return null;\n const { edge, end } = tag as Partial<OffPageTag>;\n return typeof edge === 'string' && (end === 'from' || end === 'to') ? { edge, end } : null;\n}\n","/**\n * An off-page tag: a text leaf with a background that names the far page and\n * the reference, and stations itself past the tip of its connector's stub.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n translatePoseViaDescriptor,\n type AddNodeSpec,\n pageName,\n type DerivedDep,\n type PlacedPage,\n type PoseDescriptor,\n type RectPose,\n type Vec2,\n} from '@weasel-js/core';\nimport type { MeasureRowText, RowTextStyle } from '../body';\nimport { labelSize } from '../edgeLabel';\nimport { subpathOf } from '../subpaths';\nimport { themeLabelStyle } from '../theme/resolve';\nimport type { DiagramTheme } from '../theme/types';\nimport { offPageTagId, offPageTagOf, type OffPageSplit } from './trait';\nimport { worldCoords } from '@weasel-js/geom';\n\n/** How a tag is drawn: its face, its text color, and the box behind the text. */\nexport interface OffPageTagLook {\n style: RowTextStyle;\n fill: string;\n background: string;\n /** World units between the box and the text. Default {@link OFF_PAGE_TAG_PADDING}. */\n padding?: number;\n /** Sizes the text. Default: a per-character estimate. */\n measure?: MeasureRowText;\n}\n\n/** A tag's default padding, in world units. */\nexport const OFF_PAGE_TAG_PADDING = 3;\n\n/** World units between a stub's tip and its tag. */\nconst GAP = 2;\n\n/** A tag's look under `theme`: the theme's connector-label face and color, on its page color. */\nexport const offPageTagLook = (theme: DiagramTheme): OffPageTagLook =>\n ({ style: themeLabelStyle(theme), fill: theme.label.fill, background: theme.page });\n\n/** What a tag reads: the far page's name and the connector's reference. */\nexport const offPageTagText = (pageName: string, ref: string): string => `${pageName} · ${ref}`;\n\n/** What the tag at `end` of a split reads: the page at the other end, by name or place, else its raw id, and the reference. */\nexport function offPageFarText(pages: readonly PlacedPage[], split: OffPageSplit, end: 'from' | 'to'): string {\n const far = end === 'from' ? split.to : split.from;\n const index = pages.findIndex((p) => p.id === far);\n return offPageTagText(index < 0 ? far : pageName(pages[index]!, index), split.ref);\n}\n\n/** The box a tag of `text` takes in `look`. */\nexport function offPageTagSize(text: string, look: OffPageTagLook): { width: number; height: number } {\n const pad = look.padding ?? OFF_PAGE_TAG_PADDING;\n const size = labelSize(text, look.style, look.measure);\n return { width: size.width + 2 * pad, height: size.height + 2 * pad };\n}\n\n/** The tag `data` for end `end` of `edgeId`, reading `text` in `look`. */\nexport function offPageTagData(edgeId: string, end: 'from' | 'to', text: string, look: OffPageTagLook) {\n return {\n diagram: { offPageTag: { edge: edgeId, end } },\n text,\n style: look.style,\n fill: { paint: { color: look.fill } },\n background: { paint: { color: look.background } },\n padding: look.padding ?? OFF_PAGE_TAG_PADDING,\n };\n}\n\n/** The tag node at end `end` of connector `edgeId`, on `layer`: it derives its pose from the connector's stub. */\nexport function offPageTagSpec<TLayer extends string>(\n edgeId: string, end: 'from' | 'to', text: string, look: OffPageTagLook & { layer: TLayer },\n): AddNodeSpec<unknown, TLayer, RectPose> {\n return {\n id: offPageTagId(edgeId, end) as never,\n kind: 'mark',\n layer: look.layer,\n pose: { x: 0, y: 0, ...offPageTagSize(text, look) },\n data: offPageTagData(edgeId, end, text, look),\n dependsOn: [edgeId as never],\n derivePose: OFF_PAGE_TAG_DERIVE_POSE as never,\n } as AddNodeSpec<unknown, TLayer, RectPose>;\n}\n\n/** A split connector's two tag specs, `from` then `to`. */\nexport function offPageTagSpecs<TLayer extends string>(\n edgeId: string, split: OffPageSplit, pages: readonly PlacedPage[], look: OffPageTagLook & { layer: TLayer },\n): AddNodeSpec<unknown, TLayer, RectPose>[] {\n return (['from', 'to'] as const).map((end) => offPageTagSpec(edgeId, end, offPageFarText(pages, split, end), look));\n}\n\n/** The tip of the stub at `end` of a split connector's path, and the way the stub runs out to it. */\nfunction stubTip(path: Parameters<typeof subpathOf>[0], end: 'from' | 'to'): { tip: Vec2; out: Vec2 } | null {\n const stub = subpathOf(path, end === 'from' ? 0 : 1);\n if (stub === null || stub.kind !== 'polygon' || stub.coords.length < 4) return null;\n const c = worldCoords(stub);\n const n = c.length;\n const [tip, base] = end === 'from'\n ? [{ x: c[n - 2]!, y: c[n - 1]! }, { x: c[0]!, y: c[1]! }]\n : [{ x: c[0]!, y: c[1]! }, { x: c[n - 2]!, y: c[n - 1]! }];\n const len = Math.hypot(tip.x - base.x, tip.y - base.y);\n return len === 0 ? null : { tip, out: { x: (tip.x - base.x) / len, y: (tip.y - base.y) / len } };\n}\n\n/**\n * A `derivePose` that stations a tag just past its stub's tip, on the far\n * side from the shape. `null`, so the tag keeps its authored pose, while its\n * connector draws no stub at that end.\n */\nexport function offPageTagDerivePose<TPose>(\n opts: { geometry?: PoseDescriptor<TPose> } = {},\n): (node: { pose: TPose; data: unknown }, deps: readonly (DerivedDep<TPose> | undefined)[]) => TPose | null {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n return (node, deps) => {\n const tag = offPageTagOf(node);\n const path = deps[0]?.path ?? null;\n if (tag === null || path === null) return null;\n const at = stubTip(path, tag.end);\n if (at === null) return null;\n const b = geometry.getBounds(node.pose);\n const reach = GAP + (Math.abs(at.out.x) * b.width + Math.abs(at.out.y) * b.height) / 2;\n const cx = at.tip.x + at.out.x * reach;\n const cy = at.tip.y + at.out.y * reach;\n return translatePoseViaDescriptor(node.pose, cx - (b.x + b.width / 2), cy - (b.y + b.height / 2), geometry);\n };\n}\n\n/** Registry key for {@link OFF_PAGE_TAG_DERIVE_POSE}. */\nexport const DIAGRAM_OFF_PAGE_TAG = 'diagram:offPageTag';\n\n/** The default tag derivation, as one stable function reference so `toJSON` can find its key. */\nexport const OFF_PAGE_TAG_DERIVE_POSE = offPageTagDerivePose<unknown>();\n","import type { Vec2 } from '@weasel-js/core';\nimport type { Port } from './types';\n\n/** How a self-edge with no ports named leaves its node and comes back. */\nexport interface SelfLoop {\n from: Port;\n to: Port;\n /** A point outside the node, off the corner between the two sides. */\n via: Vec2;\n}\n\nconst dot = (a: Vec2, b: Vec2): number => a.x * b.x + a.y * b.y;\n\n/**\n * The route a self-edge takes when neither end names a port: out by one side\n * and back by the next one round, past a point `standoff` clear of both.\n *\n * Both ends of such an edge aim at their own node's center, so every port\n * faces it equally, both pick the same one, and the edge has no length. The\n * sides are taken by where they face on the page, east and then north, so the\n * loop sits at the same corner of every node however its ports are listed.\n * `null` where the node has no two ports facing different ways.\n */\nexport function selfLoop(ports: readonly Port[], standoff: number): SelfLoop | null {\n const facing = ports.filter((p): p is Port & { normal: Vec2 } => p.normal !== null);\n const most = (dir: Vec2, among: typeof facing) =>\n among.reduce<(typeof facing)[number] | undefined>(\n (best, p) => (best === undefined || dot(p.normal, dir) > dot(best.normal, dir) ? p : best),\n undefined,\n );\n const from = most({ x: 1, y: 0 }, facing);\n if (from === undefined) return null;\n // Across, not along: a second port on the same side would fold the loop flat.\n const to = most({ x: 0, y: -1 }, facing.filter((p) => Math.abs(dot(p.normal, from.normal)) < 0.5));\n if (to === undefined) return null;\n // Out along the first side's facing, then along the second's until level with its own standoff.\n const out = { x: from.point.x + from.normal.x * standoff, y: from.point.y + from.normal.y * standoff };\n const reach = dot({ x: to.point.x - out.x, y: to.point.y - out.y }, to.normal) + standoff;\n return { from, to, via: { x: out.x + to.normal.x * reach, y: out.y + to.normal.y * reach } };\n}\n","/**\n * A connector's route drawn with its hops: each one a half circle in place of\n * the stretch of route it spans.\n */\nimport { PathBuilder, polylineFromPoints, type Path } from '@weasel-js/geom';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { EdgeHop } from './types';\n\n/** How far off its route a hop may lie and still draw. */\nconst ON_ROUTE = 0.5;\n\n/** The control distance that makes a cubic a quarter circle, per unit radius. */\nconst KAPPA = 0.5523;\n\n/** A hop placed on one segment: its center `t` units along it. */\ninterface Placed {\n t: number;\n r: number;\n}\n\n/** The side a hop bulges to: −y on a horizontal run and −x on a vertical one,\n * whichever way it travels, so every hop on a page bulges alike; else the\n * left of travel. */\nfunction bulge(u: Vec2): Vec2 {\n if (Math.abs(u.y) < 1e-9) return { x: 0, y: -1 };\n if (Math.abs(u.x) < 1e-9) return { x: -1, y: 0 };\n return { x: u.y, y: -u.x };\n}\n\n/** The hops of `hops` that lie on segment `a`–`b` and fit on it, by distance\n * along it, each starting past the end of the one before. */\nfunction placedOn(a: Vec2, b: Vec2, hops: readonly EdgeHop[]): Placed[] {\n const len = Math.hypot(b.x - a.x, b.y - a.y);\n if (len === 0) return [];\n const ux = (b.x - a.x) / len;\n const uy = (b.y - a.y) / len;\n const found: Placed[] = [];\n for (const hop of hops) {\n const dx = hop.at.x - a.x;\n const dy = hop.at.y - a.y;\n const t = dx * ux + dy * uy;\n if (Math.abs(dx * uy - dy * ux) > ON_ROUTE || t - hop.r < 0 || t + hop.r > len) continue;\n found.push({ t, r: hop.r });\n }\n found.sort((m, n) => m.t - n.t);\n const out: Placed[] = [];\n for (const p of found) {\n const last = out[out.length - 1];\n if (last === undefined || p.t - p.r >= last.t + last.r) out.push(p);\n }\n return out;\n}\n\n/**\n * The open path through `points`, bowing over each of `hops` in a half circle\n * of its radius. A hop more than half a unit off the route, or too near a bend\n * or an end for its half circle to fit on one segment, is stale and does not\n * draw; nor does one overlapping the hop before it.\n */\nexport function withHops(points: readonly Vec2[], hops: readonly EdgeHop[]): Path {\n const b = new PathBuilder();\n const first = points[0];\n if (first === undefined || hops.length === 0) return polylineFromPoints(points);\n b.moveTo(first.x, first.y);\n let arcs = 0;\n for (let i = 1; i < points.length; i++) {\n const p = points[i - 1]!;\n const q = points[i]!;\n const len = Math.hypot(q.x - p.x, q.y - p.y);\n const u = len === 0 ? { x: 1, y: 0 } : { x: (q.x - p.x) / len, y: (q.y - p.y) / len };\n const n = bulge(u);\n for (const { t, r } of placedOn(p, q, hops)) {\n const c = { x: p.x + u.x * t, y: p.y + u.y * t };\n const top = { x: c.x + n.x * r, y: c.y + n.y * r };\n const k = KAPPA * r;\n b.lineTo(c.x - u.x * r, c.y - u.y * r);\n b.curveTo(c.x - u.x * r + n.x * k, c.y - u.y * r + n.y * k, top.x - u.x * k, top.y - u.y * k, top.x, top.y);\n b.curveTo(top.x + u.x * k, top.y + u.y * k, c.x + u.x * r + n.x * k, c.y + u.y * r + n.y * k, c.x + u.x * r, c.y + u.y * r);\n arcs++;\n }\n b.lineTo(q.x, q.y);\n }\n return arcs === 0 ? polylineFromPoints(points) : b.build();\n}\n","/**\n * The routers an edge is drawn with: functions from two resolved ends and the\n * waypoints between them to the points the edge runs through. `edge` resolves\n * the ends and calls one by the key the edge names.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { portCurvePoints } from '@weasel-js/geom';\nimport { routeHolds } from './avoid/holds';\nimport type { Port } from './types';\n\n/** What a router is given: the two resolved ends, the author's waypoints\n * between them, and the route stored on the edge, when it holds one. */\nexport interface RouteRequest {\n from: Port;\n to: Port;\n waypoints: readonly Vec2[];\n route?: readonly Vec2[] | undefined;\n}\n\n/** A router returns the points the edge runs through, `from.point` first and\n * `to.point` last. */\nexport type Router = (req: RouteRequest) => readonly Vec2[];\n\n/** The straight run between the two ends, through any waypoints. */\nexport const straight: Router = (req) => [req.from.point, ...req.waypoints, req.to.point];\n\n/**\n * An axis-aligned route: leave along the departing end's normal and arrive\n * against the receiving one's.\n *\n * A leg is one elbow where the two ends face different axes and two where they\n * face the same one, turning at the midpoint of the axis they share. Arriving\n * along the port's own facing is what makes the arrowhead point *into* the\n * shape.\n */\nexport const orthogonal: Router = (req) => {\n const stops = [req.from.point, ...req.waypoints, req.to.point];\n const out: Vec2[] = [stops[0]!];\n for (let i = 1; i < stops.length; i++) {\n const a = out[out.length - 1]!;\n const b = stops[i]!;\n if (a.x === b.x || a.y === b.y) {\n out.push(b);\n continue;\n }\n // Only the first leg has a port to leave along; later legs follow the\n // one before them so the route does not alternate for no reason.\n const leaveHorizontal = i === 1\n ? isHorizontal(req.from.normal)\n : out.length > 1 && out[out.length - 2]!.y === a.y;\n // Likewise only the last leg has a port to arrive against. Without a\n // facing there is nothing to satisfy, so it keeps the single elbow.\n const arriving = i === stops.length - 1 ? req.to.normal : null;\n const arriveHorizontal = arriving == null ? !leaveHorizontal : isHorizontal(arriving);\n if (leaveHorizontal !== arriveHorizontal) {\n out.push(leaveHorizontal ? { x: b.x, y: a.y } : { x: a.x, y: b.y });\n out.push(b);\n continue;\n }\n // Splitting the leg at its midpoint starts back the way the route just\n // came when the last stop overshot this one; turning at once does not.\n const prev = out.length > 1 ? out[out.length - 2]! : null;\n if (leaveHorizontal) {\n const mid = (a.x + b.x) / 2;\n if (prev !== null && (mid - a.x) * (a.x - prev.x) < 0) out.push({ x: a.x, y: b.y }, b);\n else out.push({ x: mid, y: a.y }, { x: mid, y: b.y }, b);\n } else {\n const mid = (a.y + b.y) / 2;\n if (prev !== null && (mid - a.y) * (a.y - prev.y) < 0) out.push({ x: b.x, y: a.y }, b);\n else out.push({ x: a.x, y: mid }, { x: b.x, y: mid }, b);\n }\n }\n return out;\n};\n\n/** Which axis a port faces. A port with no facing counts as horizontal. */\nfunction isHorizontal(normal: Vec2 | null | undefined): boolean {\n return Math.abs(normal?.x ?? 1) >= Math.abs(normal?.y ?? 0);\n}\n\n/**\n * A smooth route, sampled into points.\n *\n * Each leg is a cubic that leaves along the departing end's normal and arrives\n * against the receiving one's, and passes each waypoint without a corner.\n * Sampled rather than emitted as curve commands so every router returns the\n * same thing.\n */\nexport const bezier: Router = (req) => {\n const stops = [req.from.point, ...req.waypoints, req.to.point];\n const out: Vec2[] = [stops[0]!];\n for (let i = 1; i < stops.length; i++) {\n const a = stops[i - 1]!;\n const b = stops[i]!;\n const outN = i === 1 ? req.from.normal : through(stops, i - 1);\n const inN = i === stops.length - 1 ? req.to.normal : negated(through(stops, i));\n const leg = portCurvePoints(\n a.x, a.y, b.x, b.y,\n outN == null ? null : [outN.x, outN.y],\n inN == null ? null : [inN.x, inN.y],\n BEZIER_SAMPLES,\n );\n for (const [x, y] of leg) out.push({ x, y });\n }\n return out;\n};\n\nconst BEZIER_SAMPLES = 16;\n\n/**\n * The direction a smooth route passes an interior stop: along the straight run\n * it makes with a neighboring waypoint level with it on one axis, else from\n * the stop before it toward the one after. Two such waypoints are a run the\n * route was meant to hold, the way `layered` lays one through each rank.\n */\nfunction through(stops: readonly Vec2[], i: number): Vec2 | null {\n const last = stops.length - 1;\n const run = (a: number, b: number) => a >= 1 && b <= last - 1 && (stops[a]!.x === stops[b]!.x || stops[a]!.y === stops[b]!.y);\n const [from, to] = run(i, i + 1) ? [i, i + 1] : run(i - 1, i) ? [i - 1, i] : [i - 1, i + 1];\n const dx = stops[to]!.x - stops[from]!.x;\n const dy = stops[to]!.y - stops[from]!.y;\n const len = Math.hypot(dx, dy);\n return len === 0 ? null : { x: dx / len, y: dy / len };\n}\n\nconst negated = (v: Vec2 | null): Vec2 | null => (v === null ? null : { x: -v.x, y: -v.y });\n\n/**\n * The route the obstacle-avoiding router stored on the edge, while it still\n * fits the ends and passes every waypoint; else `orthogonal` through the stops,\n * so an end moved by something that did not reroute still draws sensibly.\n * The route itself is computed at edit time (`useAvoidRouting`).\n */\nexport const avoid: Router = (req) =>\n (req.route !== undefined && routeHolds(req.from, req.to, req.waypoints, req.route)\n ? [req.from.point, ...req.route, req.to.point]\n : orthogonal(req));\n\n/** The routers this package ships. A consumer's own go in the same shape. */\nexport const ROUTERS: Readonly<Record<string, Router>> = Object.freeze({\n straight,\n orthogonal,\n bezier,\n avoid,\n});\n","/**\n * `DiagramEdge` — a connection between two participants.\n *\n * An edge is an ordinary leaf scene node with `dependsOn: [from, to]` and a\n * `derivePath` that runs a **router**. Being a scene node rather than a\n * plugin-owned render layer buys selection, hit-testing, hover, styling,\n * z-order, SVG export, undo, and copy/paste. The cost is that an edge costs\n * what a node costs — right for tens to hundreds of edges, wrong for a\n * 10k-edge force graph.\n *\n * **Author-dragged waypoints are data on the edge and the router routes\n * through them**, so a moved endpoint still re-routes.\n *\n * Arrowheads are not here. They are stroke markers, the same\n * `markerStart` / `markerEnd` any other stroke carries.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n PathBuilder,\n polylineFromPoints,\n type DerivedDep,\n type Path,\n type PoseDescriptor,\n type SceneRegistry,\n type Vec2,\n} from '@weasel-js/core';\nimport { ANCHOR_DERIVE_POSE, DIAGRAM_ANCHOR, DIAGRAM_GROUP, GROUP_DERIVE_POSE } from './group';\nimport { CONTAINER_LAYOUTS } from './containers/layouts';\nimport { DIAGRAM_LABEL, LABEL_DERIVE_POSE } from './label';\nimport { DIAGRAM_OFF_PAGE_TAG, OFF_PAGE_TAG_DERIVE_POSE } from './offPage/tag';\nimport { portSitesOf, portsOf, type PortsOptions } from './ports';\nimport { selfLoop } from './selfLoop';\nimport { diagramEdgeOf, type EdgeEnd } from './edgeTrait';\nimport { withHops } from './hops/draw';\nimport { ROUTERS, straight, type Router } from './routers';\nimport type { Port } from './types';\n\nexport { avoid, bezier, orthogonal, ROUTERS, straight } from './routers';\nexport type { RouteRequest, Router } from './routers';\n\n/**\n * The port an end resolves to: the one it named, at whichever of its places\n * faces `toward` most directly, else the port facing `toward` most directly.\n *\n * \"Facing\" rather than \"nearest\": a port on the far side of a wide node can be\n * closer in a straight line than the one pointing at the target.\n */\nexport function resolveEnd<TPose>(\n end: EdgeEnd,\n dep: DerivedDep<TPose>,\n toward: Vec2,\n opts: PortsOptions<TPose>,\n allPorts: (d: DerivedDep<TPose>) => Port[],\n): Port | undefined {\n if (end.port !== undefined) {\n const sites = portSitesOf(dep.node as never, dep.pose, end.port, opts);\n // A place counts only when it faces `toward` at all; else the port sits\n // at `at`, as a self-loop's does.\n const ahead = sites.filter((p) => p.normal !== null && p.normal.x * (toward.x - p.point.x) + p.normal.y * (toward.y - p.point.y) > 0);\n if (sites.length > 0) return ahead.length > 0 ? facing(ahead, toward) : sites[0];\n }\n return facing(allPorts(dep), toward);\n}\n\n/** The point an end aims at when it names none: the center of its bounds. */\nexport function boxCenter<TPose>(geometry: PoseDescriptor<TPose>, pose: TPose): Vec2 {\n const b = geometry.getBounds(pose);\n return { x: b.x + b.width / 2, y: b.y + b.height / 2 };\n}\n\n/**\n * Where each end of an edge aims as it resolves: the nearest bend of its\n * stored route, else its nearest authored waypoint, else the other end's\n * center. Centers are stable while both ends resolve; aiming at the other\n * *port* would be circular.\n */\nexport function endAims(\n fromCenter: Vec2,\n toCenter: Vec2,\n waypoints: readonly Vec2[],\n route: readonly Vec2[] = [],\n): { from: Vec2; to: Vec2 } {\n return {\n from: route[0] ?? waypoints[0] ?? toCenter,\n to: route[route.length - 1] ?? waypoints[waypoints.length - 1] ?? fromCenter,\n };\n}\n\n/** The port pointing at `toward` most directly, tie-broken toward the closer. */\nfunction facing(ports: readonly Port[], toward: Vec2): Port | undefined {\n let best: Port | undefined;\n let bestScore = -Infinity;\n for (const port of ports) {\n const dx = toward.x - port.point.x;\n const dy = toward.y - port.point.y;\n const len = Math.hypot(dx, dy) || 1;\n // Alignment with the port's own facing, tie-broken toward the closer port.\n const aim = port.normal === null\n ? 0\n : (port.normal.x * dx + port.normal.y * dy) / len;\n const score = aim - len / 1e6;\n if (score > bestScore) {\n bestScore = score;\n best = port;\n }\n }\n return best;\n}\n\n/** The router an edge is drawn with: the one it names, else `straight`. */\nexport function routerOf(edge: { router?: string }, routers: Readonly<Record<string, Router>> = ROUTERS): Router {\n return (edge.router !== undefined && routers[edge.router]) || straight;\n}\n\n/** Options for {@link edgeDerivePath}. */\nexport interface EdgeRouteOptions<TPose> extends PortsOptions<TPose> {\n /** Routers by key. Defaults to {@link ROUTERS}. */\n routers?: Readonly<Record<string, Router>>;\n /** How far outside its node a self-edge with no ports named turns, in\n * world units. Defaults to half the node's shorter side. */\n selfLoopStandoff?: number;\n}\n\n/**\n * A `derivePath` that routes an edge between its two dependencies.\n *\n * An edge from a node to itself that names no ports leaves and returns by the\n * sides {@link selfLoop} picks, and where the author set no waypoints the\n * router is handed that rule's point outside the node as one.\n *\n * An edge carrying `hops` bows over each one that still lies on its route.\n *\n * Returns `null` — nothing to draw — when the node is not an edge, when either\n * dependency is gone, or when an endpoint offers no ports at all.\n */\nexport function edgeDerivePath<TPose>(\n opts: EdgeRouteOptions<TPose> = {},\n): (node: { data: unknown }, deps: readonly (DerivedDep<TPose> | undefined)[]) => Path | null {\n const routeOf = edgeRouter(opts);\n return (node, deps) => {\n const route = routeOf(node, deps);\n if (route?.stubs !== undefined) return stubsPath(route.stubs);\n const points = route?.points;\n if (points === undefined || points.length < 2) return null;\n const hops = diagramEdgeOf(node)?.hops;\n return hops !== undefined && hops.length > 0 ? withHops(points, hops) : polylineFromPoints(points as { x: number; y: number }[]);\n };\n}\n\n/** An edge's route as {@link edgeDerivePath} draws it, before it becomes a path. */\nexport interface ResolvedRoute {\n /** The two ends, resolved. */\n from: Port;\n to: Port;\n /** What the router was handed between them: the author's waypoints, or a\n * self-loop's turning point. */\n waypoints: readonly Vec2[];\n /** The router's answer, `from.point` first and `to.point` last. */\n points: readonly Vec2[];\n /** Set while the edge is split across pages (`DiagramEdge.offPage`): the\n * two runs drawn in place of `points`, one out of `from` to its tag's\n * side and one from the other tag's side into `to`. */\n stubs?: readonly [readonly Vec2[], readonly Vec2[]];\n}\n\n/** How far a split edge's stub runs out of its shape, in world units. */\nexport const OFF_PAGE_STUB = 24;\n\n/** The stub end `port` leaves by: along its normal, else toward `toward`. */\nfunction stubTip(port: Port, toward: Vec2): Vec2 {\n const n = port.normal ?? unit(toward.x - port.point.x, toward.y - port.point.y);\n return { x: port.point.x + n.x * OFF_PAGE_STUB, y: port.point.y + n.y * OFF_PAGE_STUB };\n}\n\nfunction unit(x: number, y: number): Vec2 {\n const len = Math.hypot(x, y);\n return len === 0 ? { x: 1, y: 0 } : { x: x / len, y: y / len };\n}\n\nfunction stubsPath(stubs: readonly (readonly Vec2[])[]): Path {\n const b = new PathBuilder();\n for (const run of stubs) run.forEach((p, i) => (i === 0 ? b.moveTo(p.x, p.y) : b.lineTo(p.x, p.y)));\n return b.build();\n}\n\n/** Routes an edge between its two dependencies the way {@link edgeDerivePath}\n * does, answering the route itself; null where that draws nothing. */\nexport function edgeRouter<TPose>(\n opts: EdgeRouteOptions<TPose> = {},\n): (node: { data: unknown }, deps: readonly (DerivedDep<TPose> | undefined)[]) => ResolvedRoute | null {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n const portOpts: PortsOptions<TPose> = { geometry, ...(opts.read ? { read: opts.read } : {}) };\n const allPorts = (d: DerivedDep<TPose>): Port[] =>\n portsOf(d.node as never, d.pose, portOpts);\n const standoffOf = (d: DerivedDep<TPose>): number => {\n const b = geometry.getBounds(d.pose);\n return Math.min(b.width, b.height) / 2;\n };\n\n return (node, deps) => {\n const edge = diagramEdgeOf(node);\n if (edge === null) return null;\n const [fromDep, toDep] = deps;\n if (fromDep === undefined || toDep === undefined) return null;\n\n const loop = fromDep.node.id === toDep.node.id && edge.from.port === undefined && edge.to.port === undefined\n ? selfLoop(allPorts(fromDep), opts.selfLoopStandoff ?? standoffOf(fromDep))\n : null;\n const authored = edge.waypoints ?? [];\n const aims = endAims(boxCenter(geometry, fromDep.pose), boxCenter(geometry, toDep.pose), authored, edge.route);\n const from = loop?.from ?? resolveEnd(edge.from, fromDep, aims.from, portOpts, allPorts);\n const to = loop?.to ?? resolveEnd(edge.to, toDep, aims.to, portOpts, allPorts);\n if (from === undefined || to === undefined) return null;\n\n const waypoints = loop !== null && authored.length === 0 ? [loop.via] : authored;\n const points = routerOf(edge, opts.routers)({ from, to, waypoints, route: edge.route });\n if (edge.offPage === undefined) return { from, to, waypoints, points };\n const stubs = [[from.point, stubTip(from, to.point)], [stubTip(to, from.point), to.point]] as const;\n return { from, to, waypoints, points, stubs };\n };\n}\n\n/** Registry key for {@link EDGE_DERIVE_PATH}. */\nexport const DIAGRAM_EDGE = 'diagram:edge';\n\n/** The default edge router, as one stable function reference so `toJSON` can\n * find its key. A consumer wanting different options registers their own\n * `edgeDerivePath(...)` under a key of their choosing. */\nexport const EDGE_DERIVE_PATH = edgeDerivePath<unknown>();\n\n/** Merge this package's registry entries under a consumer's, so an edge\n * round-trips through `toJSON` without the consumer wiring the key. */\nexport function withDiagramRegistry<TPose, TData = unknown, TLayer extends string = string>(\n registry: SceneRegistry<TPose, TData, TLayer> = {},\n): SceneRegistry<TPose, TData, TLayer> {\n return {\n ...registry,\n derivePath: {\n [DIAGRAM_EDGE]: EDGE_DERIVE_PATH,\n ...registry.derivePath,\n },\n derivePose: {\n [DIAGRAM_LABEL]: LABEL_DERIVE_POSE as NonNullable<SceneRegistry<TPose, TData, TLayer>['derivePose']>[string],\n [DIAGRAM_GROUP]: GROUP_DERIVE_POSE as NonNullable<SceneRegistry<TPose, TData, TLayer>['derivePose']>[string],\n [DIAGRAM_ANCHOR]: ANCHOR_DERIVE_POSE as NonNullable<SceneRegistry<TPose, TData, TLayer>['derivePose']>[string],\n [DIAGRAM_OFF_PAGE_TAG]: OFF_PAGE_TAG_DERIVE_POSE as NonNullable<SceneRegistry<TPose, TData, TLayer>['derivePose']>[string],\n ...registry.derivePose,\n },\n layout: {\n ...(CONTAINER_LAYOUTS as unknown as NonNullable<SceneRegistry<TPose, TData, TLayer>['layout']>),\n ...registry.layout,\n },\n };\n}\n","/**\n * Laying a built body out again once its text changes size. A body whose\n * rows are all text or dividers records how it stacks them (`DiagramNode.body`),\n * and each text row records its place (`bodyRow`), so the rows can be read\n * back from the scene and handed to the same layout `buildBody` used.\n */\nimport {\n layoutBody, measureBody, rowHeights, sizeToBody, type BodySpec, type MeasureRowText, type Row, type RowTextStyle,\n} from './body';\nimport type { BodyDivider, BodyLayout, DiagramNode } from './types';\n\n/** The `body` record a body built from `spec` carries, or `undefined` for one that cannot be laid\n * out again from its text: one with a `ports` or `slot` row, or with port labels drawn outside it. */\nexport function bodyLayoutOf(spec: BodySpec, trait: DiagramNode, measure?: MeasureRowText): { body: BodyLayout } | Record<string, never> {\n if (trait.margin !== undefined || !spec.rows.every((r) => r.kind === 'label' || r.kind === 'field' || r.kind === 'divider')) return {};\n const dividers = dividersOf(spec.rows);\n return {\n body: {\n padding: spec.padding ?? 8, gap: spec.gap ?? 4, verticalAlign: spec.verticalAlign ?? 'center', rows: spec.rows.length,\n heights: rowHeights(spec, measure), ...(dividers.length > 0 ? { dividers } : {}),\n },\n };\n}\n\nconst dividerRow = (d: BodyDivider): Row => (d.inset === undefined ? { kind: 'divider' } : { kind: 'divider', inset: d.inset });\n\nfunction dividersOf(rows: readonly Row[]): BodyDivider[] {\n return rows.flatMap((r, index) => (r.kind !== 'divider' ? [] : [r.inset === undefined ? { index } : { index, inset: r.inset }]));\n}\n\n/** `layout`'s rows with no text to measure: each divider as itself, every other row as a slot of\n * the height it was last laid out at. Null for a body saved without its heights. */\nexport function recordedRows(layout: BodyLayout): Row[] | null {\n if (layout.heights === undefined) return null;\n const dividers = new Map((layout.dividers ?? []).map((d) => [d.index, d]));\n return layout.heights.map((height, i): Row => {\n const d = dividers.get(i);\n return d === undefined ? { kind: 'slot', height } : dividerRow(d);\n });\n}\n\ntype Box = { x: number; y: number; width: number; height: number };\ntype TextData = { text?: unknown; bodyRow?: unknown; style?: { fontSize?: number; fontFamily?: string; fontWeight?: number; fontStyle?: string } };\n\n/** A scene as {@link relayoutBodies} reads and writes it. */\nexport interface RelayoutScene {\n get(id: never): { pose: unknown; data: unknown } | undefined;\n childrenOf(id: never): readonly string[];\n setPose(id: never, pose: never): void;\n update(id: never, patch: never): void;\n}\n\nconst rowStyle = (s: TextData['style']): RowTextStyle => ({\n ...(s?.fontSize !== undefined ? { fontSize: s.fontSize } : {}),\n ...(s?.fontFamily !== undefined ? { fontFamily: s.fontFamily } : {}),\n ...((s?.fontWeight ?? 400) >= 700 ? { bold: true } : {}),\n ...(s?.fontStyle === 'italic' ? { italic: true } : {}),\n});\n\nconst same = (a: Box, b: Box) => a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n\n/**\n * Lays each body among `ids` out again from its text rows as they are now:\n * the body grows to what its rows need, never shrinks, and its rows are\n * stacked again inside it. Anything that is not a body carrying a `body`\n * record is left alone. Call inside the batch that changed the text, so it is\n * the same undo entry.\n */\nexport function relayoutBodies(scene: RelayoutScene, ids: Iterable<string>, measure?: MeasureRowText): void {\n for (const id of new Set(ids)) {\n const node = scene.get(id as never);\n const trait = (node?.data as { diagram?: DiagramNode } | undefined)?.diagram;\n if (node === undefined || trait?.body === undefined || trait.outline === undefined) continue;\n const layout = trait.body;\n const rowNodes = new Map<number, string>();\n for (const child of scene.childrenOf(id as never)) {\n const index = (scene.get(child as never)?.data as TextData | undefined)?.bodyRow;\n if (typeof index === 'number') rowNodes.set(index, child);\n }\n const dividers = new Map((layout.dividers ?? []).map((d) => [d.index, d]));\n const rows: Row[] = Array.from({ length: layout.rows }, (_, i): Row => {\n const divider = dividers.get(i);\n if (divider !== undefined) return dividerRow(divider);\n const data = scene.get(rowNodes.get(i) as never)?.data as TextData | undefined;\n return { kind: 'label', text: typeof data?.text === 'string' ? data.text : '', style: rowStyle(data?.style) };\n });\n const spec: BodySpec = { outline: trait.outline, rows, padding: layout.padding, gap: layout.gap, verticalAlign: layout.verticalAlign };\n const heights = rowHeights(spec, measure);\n if (layout.heights === undefined || heights.some((h, i) => h !== layout.heights![i])) {\n const data = node.data as { diagram: DiagramNode };\n scene.update(id as never, { data: { ...data, diagram: { ...trait, body: { ...layout, heights } } } } as never);\n }\n const pose = node.pose as Box;\n const grown = sizeToBody(pose, measureBody(spec, measure));\n if (grown !== pose) scene.setPose(id as never, grown as never);\n // Rows are stored in the body's own frame.\n for (const box of layoutBody(spec, { x: 0, y: 0, width: grown.width, height: grown.height }, measure)) {\n const child = rowNodes.get(box.index);\n const at = child === undefined ? undefined : scene.get(child as never)?.pose as Box | undefined;\n if (at === undefined) continue;\n const next = { ...at, x: box.x, y: box.y, width: box.width, height: box.height };\n if (!same(at, next)) scene.setPose(child as never, next as never);\n }\n }\n}\n","/**\n * The plain data `diagramScene` reads, and the options and styles it takes.\n */\nimport type { AddNodeSpec, MarkerRef, Page, PageLayoutOptions, PoseComposition, RectPose, Stroke } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { BodySpec, MeasureRowText, Row } from './body';\nimport type { DiagramEdge } from './edgeTrait';\nimport type { DiagramAnchor } from './group';\nimport type { DiagramLabel } from './labelTrait';\nimport type { LayoutFn, LayoutOptions, LayoutPorts } from './layout';\nimport type { DataMark, DiagramMark } from './marks';\nimport type { OffPageTag } from './offPage/trait';\nimport type { Outline } from './outline';\nimport type { DiagramTextStyle } from './rowStyle';\nimport type { DiagramTheme } from './theme/types';\nimport type { DiagramNode, PortSpec } from './types';\n\n/** One node of a {@link DiagramData}: its rows of text, and optionally its outline, ports, size, and starting place. */\nexport interface DataNode {\n id: string;\n /** Shorthand for one `label` row per line. Ignored when `rows` is given. */\n lines?: readonly string[];\n rows?: readonly Row[];\n /** Default `DiagramSceneOptions.outline`, which defaults to `'rect'`. */\n outline?: Outline;\n /** Perimeter ports, replacing the four compass midpoints. */\n ports?: readonly PortSpec[];\n /** Labels for the perimeter ports by id, drawn outside the box beside each. */\n portLabels?: Readonly<Record<string, string>>;\n /** Layout leaves this node at `at`. */\n pinned?: boolean;\n /** Where the node starts, before layout. Unset, nodes start on the\n * diagonal in source order, which is what within-rank order is seeded\n * from. */\n at?: Vec2;\n /** The smallest the box may be. Its content grows it past this. */\n width?: number;\n height?: number;\n /** Default `DiagramSceneOptions.padding`. */\n padding?: number;\n /** Default `DiagramSceneOptions.gap`. */\n gap?: number;\n /** Default `DiagramSceneOptions.verticalAlign`. */\n verticalAlign?: BodySpec['verticalAlign'];\n /** Drawn over the box besides its rows: shapes in a unit square stretched\n * over it, and text pinned to a point on it. */\n marks?: readonly DataMark[];\n /** The theme role it is drawn in, under `DiagramSceneOptions.theme`. Kept on its trait. */\n style?: string;\n /** Colors of its own, over its role's. Each one set is listed in the trait's `ownStyle`, so a\n * theme change leaves it. */\n colors?: Partial<NodeStyle>;\n}\n\n/** One edge of a {@link DiagramData}, between two nodes or groups by id. */\nexport interface DataEdge {\n /** The scene node id this edge gets, for an editor that must find it again\n * after its ends, ports or label change. Unset, {@link edgeIdOf} derives\n * one from those. */\n id?: string;\n /** A node's id, or a group's: an edge naming a group meets its box. */\n from: string;\n to: string;\n /** The port to leave from or arrive at. Unset, the end facing the other\n * node most directly. */\n fromPort?: string;\n toPort?: string;\n label?: string;\n /** Where along the edge the label sits. Unset or at `'mid'`, under\n * `layered` the label sits in the room layout leaves it beside its wire,\n * at this placement's offset, else `DiagramSceneOptions.labelPlacement`'s;\n * otherwise at the placement. */\n labelPlacement?: DiagramLabel;\n /** Default `DiagramSceneOptions.router`. */\n router?: DiagramRouter;\n /** World points the route passes through. Layout does not move them. */\n waypoints?: readonly Vec2[];\n /** A route a layout run wrote, as `DiagramView`'s `onMove` reports it: drawn\n * until layout runs again, which may replace it. `waypoints` wins. */\n routed?: readonly Vec2[];\n /** Ports a layout run named, as `onMove` reports them: used like `routed`,\n * and not part of the edge's id. `fromPort` and `toPort` win. */\n routedPorts?: LayoutPorts;\n /** The theme role it is drawn in, under `DiagramSceneOptions.theme`: that role's stroke. Kept on its trait. */\n style?: string;\n /** Its stroke, markers, and label color of its own, over the theme's. `stroke` and `label` are\n * listed in the trait's `ownStyle` (as `stroke` and `text`), so a theme change leaves them. */\n colors?: Partial<EdgeStyle>;\n}\n\n/** A box drawn around some nodes, which layout keeps together. */\nexport interface DataGroup {\n /** Shares one namespace with node ids. */\n id: string;\n /** Node ids, and the ids of groups nested in this one. A node or group a\n * later group also names stays in this one; an id that is neither is\n * ignored, and so is one that would put a group inside itself. */\n members: readonly string[];\n /** Drawn inside the box, above its members. */\n label?: string;\n /** Between the box and its members, and around the label. Default\n * `DiagramSceneOptions.groupPadding`. */\n padding?: number;\n /** The axis its members can be dragged along to change their order, in a\n * `DiagramView` given `onReorder`. A member that is a group carries\n * everything inside it. */\n reorder?: 'x' | 'y';\n}\n\n/** A diagram as plain data, the input to `diagramScene`. */\nexport interface DiagramData {\n nodes: readonly DataNode[];\n edges: readonly DataEdge[];\n /** A group may be a member of another. `layered`, `tree`, `force`, and `chain`\n * keep each group's members together; `'none'` ignores groups but still\n * draws them. */\n groups?: readonly DataGroup[];\n /** Containers and pools: regions drawn as scene containers that hold their\n * members, which a `DiagramView` drags shapes into and out of. */\n containers?: readonly DataContainer[];\n /** The sheets the diagram is drawn on, in world space as `layoutPages` places them; a node\n * belongs to the page its box overlaps most (`pageOfBounds`). A connector whose ends belong\n * to different pages is split into two stubs, each with an off-page tag. A node in the gap\n * between pages belongs to none, and its connectors stay whole. */\n pages?: readonly Page[];\n /** How `pages` are laid out in world space. */\n pageLayout?: PageLayoutOptions;\n}\n\n/**\n * A container or a pool, drawn as a region that holds its members. Its id\n * shares one namespace with node, group, and lane ids.\n *\n * With a `box` it is laid out as one node of that size, and its members ride\n * along with it: a member with no `at` is seeded inside its body, in rows.\n * With none, a container is laid out as a group and its box fits its members.\n * A pool always has a box, {@link DEFAULT_POOL_ACROSS} across and\n * {@link DEFAULT_LANE_SIZE} along per lane when none is given. An edge with\n * an end inside a boxed region ranks against the outermost one holding it.\n */\nexport interface DataContainer {\n id: string;\n role: 'container' | 'pool';\n /** Its title, drawn in its header. */\n label?: string;\n /** A container's direct members: node ids and container ids. A member\n * already claimed by an earlier container, a pool, an unknown id, and one\n * that would put a container inside itself are ignored. */\n members?: readonly string[];\n /** A pool's lanes, in the order they stack. */\n lanes?: readonly DataLane[];\n /** Lets a container's members be dragged along this axis among each other\n * with `onReorder`, which hears the container and its members in their\n * new order, as a group's do. Nothing moves until the members do: write\n * the order to `members`, and place them by it. Not for a pool. */\n reorder?: 'x' | 'y';\n /** The axis a pool stacks its lanes along: `'y'` for rows. Default `'y'`. */\n axis?: 'x' | 'y';\n /** Where it stands and how big it is, in world units. A pool's size along\n * its stack is shared by the lanes that give no `size`. */\n box?: { x: number; y: number; width: number; height: number };\n /** Layout leaves its box where it is. */\n pinned?: boolean;\n /** The theme role it is drawn in. Unset, a container takes the theme's\n * `container` style, a pool its `lane.header`. */\n style?: string;\n /** Colors of its own, over its style's, listed in its trait's `ownStyle` as a node's are. */\n colors?: Partial<NodeStyle>;\n}\n\n/** One lane of a pool. Its id shares the node id namespace. */\nexport interface DataLane {\n id: string;\n label?: string;\n /** Its depth along the pool's stack, in world units. */\n size?: number;\n /** Node ids and container ids, claimed as a container's are. */\n members?: readonly string[];\n /** Colors of its own, as a container's. A lane draws no fill. */\n colors?: Partial<NodeStyle>;\n}\n\n/** A pool's size across its stack when it gives no box. */\nexport const DEFAULT_POOL_ACROSS = 600;\n/** A lane's size along its pool's stack when neither it nor the pool's box gives one. */\nexport const DEFAULT_LANE_SIZE = 120;\n\n/** The colors and outline a node is drawn with. */\nexport interface NodeStyle {\n fill: string;\n stroke: string;\n text: string;\n strokeWidth?: number;\n dash?: number[];\n}\n\n/** What a node is drawn with when nothing says otherwise. */\nexport const DEFAULT_NODE_STYLE: NodeStyle = { fill: '#16222c', stroke: '#7ba7c7', text: '#dbe7f2' };\n/** A node's or region's outline width when its style gives none. */\nexport const NODE_STROKE_WIDTH = 2;\n/** A lane's outline width, which its style does not change. */\nexport const LANE_STROKE_WIDTH = 1;\n/** An edge's stroke width when its style gives none. */\nexport const EDGE_STROKE_WIDTH = 1.5;\n\n/** The stroke, markers, and label color an edge is drawn with. */\nexport interface EdgeStyle {\n stroke: string;\n width?: number;\n dash?: number[];\n /** `null` for none. Default none. */\n markerStart?: MarkerRef | null;\n /** `null` for none. Default `'arrow'`. */\n markerEnd?: MarkerRef | null;\n /** Default `stroke`. */\n label?: string;\n}\n\n/** How an edge is drawn between its ends. */\nexport type DiagramRouter = 'straight' | 'bezier' | 'orthogonal' | 'avoid';\n/** The `data` of a scene node `diagramScene` makes: its diagram role, and what it paints. */\nexport interface DiagramSceneData {\n diagram?: DiagramNode | DiagramEdge | { label: DiagramLabel } | { anchor: DiagramAnchor } | { mark: DiagramMark } | { offPageTag: OffPageTag };\n fill?: { paint: { color: string; opacity?: number } };\n stroke?: Stroke;\n text?: string;\n style?: DiagramTextStyle;\n verticalAlign?: 'top' | 'center' | 'bottom';\n /** What a slot is filled with: an image the kit's image painter draws. */\n image?: { src: string; opacity?: number };\n /** A body's text row: its place among the body's rows (see `DiagramNode.body`). */\n bodyRow?: number;\n /** An off-page tag's box, behind its text, and the room between them. */\n background?: { paint: { color: string } };\n padding?: number;\n}\n\n/** A scene node spec, as `diagramScene` returns them. */\nexport type DiagramSpec<TLayer extends string = 'main'> = AddNodeSpec<DiagramSceneData, TLayer, RectPose>;\n\n/** How `diagramScene` lays out, routes, and styles a {@link DiagramData}. */\nexport interface DiagramSceneOptions<TLayer extends string = 'main'> {\n /** The layer every spec goes on. Default `'main'`. */\n layer?: TLayer;\n /** A layout by name, or any `LayoutFn`. Default `'layered'`. `'none'`\n * leaves every node at its `at`. */\n layout?: 'layered' | 'tree' | 'force' | 'chain' | 'none' | LayoutFn;\n /** Merged over `{ order: 'barycenter' }`. */\n layoutOptions?: LayoutOptions;\n /** Default `'bezier'`. */\n router?: DiagramRouter;\n /** The text style rows fall back on. Default 12px sans-serif. */\n font?: { fontFamily: string; fontSize: number };\n /** Measures one run of text. Default an estimate from character count, so\n * layout needs no canvas; pass `canvasMeasure(ctx)` for real widths. */\n measure?: MeasureRowText;\n /** Default `'rect'`. */\n outline?: Outline;\n /** Between a box's outline and its rows. Default 8. */\n padding?: number;\n /** Between adjacent rows. Default 4. */\n gap?: number;\n /** Where a box's rows sit when it is taller than they need. Default `'center'`. */\n verticalAlign?: BodySpec['verticalAlign'];\n /** The narrowest a box may be. Default 64. */\n minWidth?: number;\n /** Where edge labels sit. Default `{ at: 'mid', offset: 9 }`. */\n labelPlacement?: DiagramLabel;\n /** A node's look; `undefined` keeps the theme's, else {@link DEFAULT_NODE_STYLE}. */\n nodeStyle?: (node: DataNode) => NodeStyle | undefined;\n /** Default 12. */\n groupPadding?: number;\n /** A group's box and label. `text` colors the label. `undefined` keeps the theme's\n * container, else `DEFAULT_GROUP_STYLE`. */\n groupStyle?: (group: DataGroup) => NodeStyle | undefined;\n /** An edge's look; `undefined` keeps the theme's, else `DEFAULT_EDGE_STYLE`. */\n edgeStyle?: (edge: DataEdge) => EdgeStyle | undefined;\n /** Styles nodes by their `style` role, and edges, groups and text by the theme, where the\n * functions above leave them; and its face is the default `font`. */\n theme?: DiagramTheme;\n /** How the scene the specs go into folds a child's pose into its container's: each\n * spec's pose is stored in its container's frame under it. Default\n * `RIGID_POSE_COMPOSITION`, a scene's own default. */\n composition?: PoseComposition<RectPose>;\n}\n","/**\n * The node specs of a region — a container, a pool, or a lane — and its title,\n * which a stencil drawn on the canvas and a `DiagramData` container both build\n * from.\n */\nimport type { AddNodeSpec, NodeId, RectPose } from '@weasel-js/core';\nimport { LANE_STROKE_WIDTH, DEFAULT_NODE_STYLE, NODE_STROKE_WIDTH, type DiagramSceneData, type NodeStyle } from '../dataTypes';\nimport { DEFAULT_FONT } from '../edgeLabel';\nimport { CONTAINER_LAYOUTS, containerShape } from './layouts';\nimport { MIN_LANE_SIZE } from './laneStack';\nimport { titlePose } from './titlePose';\nimport { titleIdOf, type ContainerRole, type DiagramContainer } from './trait';\n\n/** How many lanes a new pool starts with. */\nconst NEW_POOL_LANES = 2;\n\n/** A region's node spec, always with an id. */\nexport type RegionSpec<TLayer extends string> = AddNodeSpec<DiagramSceneData, TLayer, RectPose> & { id: NodeId };\n\n/** Options for `containerBuild`. */\nexport interface ContainerBuildOptions<TLayer extends string> {\n layer: TLayer;\n newId: () => string;\n /** The box's fill, stroke and title colors. Default `diagramScene`'s node style. */\n style?: NodeStyle;\n /** The container the new one goes in. Default the top level. */\n parent?: string | null;\n /** A pool's header colors and its lanes' bodies in turn. Default `style` for both. */\n laneStyles?: { header: NodeStyle; bodies: readonly NodeStyle[] };\n}\n\n/** Options for {@link regionSpecs}. */\nexport interface RegionOptions<TLayer extends string> {\n id: string;\n layer: TLayer;\n /** Default the top level. */\n parent?: string | null;\n /** Default `diagramScene`'s node style. */\n style?: NodeStyle;\n /** Marks a region whose box is fitted to its members each time it is built from data. */\n fitted?: boolean;\n /** A container's reorder axis. */\n reorder?: 'x' | 'y';\n /** The title's family. Default sans-serif. */\n fontFamily?: string;\n}\n\nfunction regionData(role: ContainerRole, axis: 'x' | 'y', style: NodeStyle, fitted: boolean, reorder?: 'x' | 'y'): DiagramSceneData {\n const container: DiagramContainer = {\n role, header: containerShape(role, axis).header, ...(fitted ? { fitted: true } : {}), ...(reorder !== undefined ? { reorder } : {}),\n };\n return {\n diagram: { outline: 'rect', container },\n ...(role === 'lane' ? {} : { fill: { paint: { color: style.fill } } }),\n stroke: { paint: { color: style.stroke }, width: role === 'lane' ? LANE_STROKE_WIDTH : style.strokeWidth ?? NODE_STROKE_WIDTH },\n };\n}\n\nconst titleData = (text: string, style: NodeStyle, fontFamily = DEFAULT_FONT.fontFamily): DiagramSceneData => ({\n text,\n style: { fontFamily, fontSize: 13, fontWeight: 700, align: 'center' },\n verticalAlign: 'center',\n fill: { paint: { color: style.text } },\n});\n\n/** The node specs of one region, and its title unless `title` is null. */\nexport function regionSpecs<TLayer extends string>(\n role: ContainerRole, axis: 'x' | 'y', pose: RectPose, title: string | null, opts: RegionOptions<TLayer>,\n): RegionSpec<TLayer>[] {\n const style = opts.style ?? DEFAULT_NODE_STYLE;\n const { layout, header } = containerShape(role, axis);\n const region: RegionSpec<TLayer> = {\n id: opts.id as NodeId, kind: 'mark', layer: opts.layer, pose, parent: (opts.parent ?? null) as NodeId | null,\n data: regionData(role, axis, style, opts.fitted === true, opts.reorder), layout: CONTAINER_LAYOUTS[layout],\n };\n if (title === null) return [region];\n return [region, {\n id: titleIdOf(opts.id) as NodeId, kind: 'mark', layer: opts.layer, parent: opts.id as NodeId, pickable: false,\n pose: titlePose(pose, header), data: titleData(title, style, opts.fontFamily),\n }];\n}\n\n/** The lane specs a new pool at `at` starts with. */\nexport function firstLanes<TLayer extends string>(\n poolId: string, axis: 'x' | 'y', at: RectPose, opts: ContainerBuildOptions<TLayer>,\n): RegionSpec<TLayer>[] {\n const { header } = containerShape('pool', axis);\n const size = Math.max(MIN_LANE_SIZE, (axis === 'y' ? at.height : at.width) / NEW_POOL_LANES);\n const out: RegionSpec<TLayer>[] = [];\n for (let i = 0; i < NEW_POOL_LANES; i++) {\n const pose: RectPose = axis === 'y'\n ? { x: at.x + header.size, y: at.y + i * size, width: at.width - header.size, height: size }\n : { x: at.x + i * size, y: at.y + header.size, width: size, height: at.height - header.size };\n const bodies = opts.laneStyles?.bodies ?? [];\n const style = bodies.length > 0 ? bodies[i % bodies.length] : opts.style;\n out.push(...regionSpecs('lane', axis, pose, `Lane ${i + 1}`, {\n id: opts.newId(), layer: opts.layer, parent: poolId, ...(style ? { style } : {}),\n }));\n }\n return out;\n}\n","/** Which of a data item's own colors `diagramScene` lists in its trait's `ownStyle`. */\nimport type { EdgeStyle, NodeStyle } from './dataTypes';\nimport type { StyleField } from './theme/styleField';\n\nconst NODE_FIELDS: readonly StyleField[] = ['fill', 'stroke', 'text'];\n\n/** The `ownStyle` a node, container, or lane given `colors` carries: `{}` when it sets no color. */\nexport function ownNodeStyle(colors: Partial<NodeStyle> | undefined): { ownStyle?: StyleField[] } {\n const own = NODE_FIELDS.filter((f) => colors?.[f] !== undefined);\n return own.length > 0 ? { ownStyle: own } : {};\n}\n\n/** The `ownStyle` an edge given `colors` carries: its stroke as `stroke`, its label as `text`. */\nexport function ownEdgeStyle(colors: Partial<EdgeStyle> | undefined): { ownStyle?: StyleField[] } {\n const own: StyleField[] = [];\n if (colors?.stroke !== undefined) own.push('stroke');\n if (colors?.label !== undefined) own.push('text');\n return own.length > 0 ? { ownStyle: own } : {};\n}\n\n/** `style` with every color `colors` sets over it. */\nexport function withColors<T extends object>(style: T, colors: Partial<T> | undefined): T {\n if (colors === undefined) return style;\n const out = { ...style };\n for (const [k, v] of Object.entries(colors)) if (v !== undefined) (out as Record<string, unknown>)[k] = v;\n return out;\n}\n","/**\n * The style each item of a `DiagramData` is drawn in: its own colors over its\n * theme role's, over the theme's defaults. `diagramScene` draws with these, and\n * a format writing a document's colors out reads them the same way.\n */\nimport { withColors } from './dataColors';\nimport { DEFAULT_NODE_STYLE, type DataContainer, type DataEdge, type DataNode, type EdgeStyle, type NodeStyle } from './dataTypes';\nimport { roleEdgeStyle, roleStyle } from './theme/resolve';\nimport type { DiagramTheme } from './theme/types';\n\n/** What an edge is drawn with when there is no theme and nothing says otherwise. */\nexport const DEFAULT_EDGE_STYLE: EdgeStyle = { stroke: '#7ba7c7' };\n\n/** A node's style: its colors over its role's under `theme`, else over {@link DEFAULT_NODE_STYLE}. */\nexport function dataNodeStyle(node: Pick<DataNode, 'style' | 'colors'>, theme?: DiagramTheme): NodeStyle {\n return withColors(theme ? roleStyle(theme, node.style) : DEFAULT_NODE_STYLE, node.colors);\n}\n\n/** An edge's style: its colors over its role's stroke under `theme`, else over the theme's connector, else over {@link DEFAULT_EDGE_STYLE}. */\nexport function dataEdgeStyle(edge: Pick<DataEdge, 'style' | 'colors'>, theme?: DiagramTheme): EdgeStyle {\n return withColors(theme ? roleEdgeStyle(theme, edge.style) : DEFAULT_EDGE_STYLE, edge.colors);\n}\n\n/** A region as {@link dataRegionStyle} reads it: a container, a pool, or a lane. */\nexport interface StyledRegion {\n role: DataContainer['role'] | 'lane';\n style?: string;\n colors?: Partial<NodeStyle>;\n}\n\n/**\n * A region's style: its colors over its theme role's, else over the theme's\n * container, its pool header, or the lane body at `laneIndex` in turn; with no\n * theme, over {@link DEFAULT_NODE_STYLE}.\n */\nexport function dataRegionStyle(region: StyledRegion, theme?: DiagramTheme, laneIndex = 0): NodeStyle {\n return withColors(themeRegionStyle(region, theme, laneIndex), region.colors);\n}\n\nfunction themeRegionStyle(r: StyledRegion, theme: DiagramTheme | undefined, laneIndex: number): NodeStyle {\n if (theme === undefined) return DEFAULT_NODE_STYLE;\n const own = r.style !== undefined ? theme.roles[r.style] : undefined;\n if (own !== undefined) return own;\n if (r.role === 'pool') return theme.lane.header;\n if (r.role === 'lane') return theme.lane.bodies[laneIndex % Math.max(1, theme.lane.bodies.length)] ?? theme.container;\n return theme.container;\n}\n","import type { DataEdge } from './fromData';\n\n/** A part of an edge id with its separators, and the `/` sub-specs append\n * after one, escaped by a backslash. */\nconst idPart = (s: string) => s.replace(/[\\\\.>:/]/g, '\\\\$&');\n\n/** The scene node id `diagramScene` gives an edge: its `id` when set, else one\n * built from its ends, ports, and label. Two edges differing in any of those\n * get different ids, an empty port or label included: a `.`, `>`, `:`, `/` or\n * `\\` in one of them is escaped with a backslash. */\nexport const edgeIdOf = (e: DataEdge) => {\n if (e.id !== undefined) return e.id;\n const part = (mark: string, p: string | undefined) => (p === undefined ? '' : `${mark}${idPart(p)}`);\n return `edge:${idPart(e.from)}${part('.', e.fromPort)}->${idPart(e.to)}${part('.', e.toPort)}${part(':', e.label)}`;\n};\n","/**\n * Which connectors cross from one page to another, as arithmetic: page\n * rects and end boxes in, splits out. Nothing here reads a scene.\n */\nimport { pageOfBounds, type PlacedPage } from '@weasel-js/core';\nimport type { OffPageSplit } from './trait';\n\ntype Box = { x: number; y: number; width: number; height: number };\n\n/** One connector as {@link offPageSplits} reads it: its two ends' world boxes,\n * and the split it holds now, if any. */\nexport interface OffPageEdgeInput {\n id: string;\n from: Box;\n to: Box;\n offPage?: OffPageSplit | undefined;\n}\n\n/** What {@link offPageSplits} reads. */\nexport interface OffPageSplitInput {\n pages: readonly PlacedPage[];\n edges: readonly OffPageEdgeInput[];\n /** Refs held by split connectors not in `edges`, which no edge here may take. */\n used?: Iterable<string>;\n}\n\n/** The letters of the `n`th ref, counting from 0: A…Z, then AA, AB, … */\nfunction refAt(n: number): string {\n let out = '';\n for (let k = n + 1; k > 0; k = Math.floor((k - 1) / 26)) out = String.fromCharCode(65 + ((k - 1) % 26)) + out;\n return out;\n}\n\n/** The first ref, in A…Z, AA… order, that `used` does not hold. */\nexport function nextOffPageRef(used: ReadonlySet<string>): string {\n let n = 0;\n while (used.has(refAt(n))) n++;\n return refAt(n);\n}\n\n/**\n * Each connector's split, or `null` where it stays whole. A connector splits\n * when its two ends belong to different pages (`pageOfBounds`); an end in a\n * gap belongs to none, and never splits. A split keeps the ref it holds while\n * no earlier connector here or `used` holds it too; a new one takes the next\n * free ref.\n */\nexport function offPageSplits(input: OffPageSplitInput): Map<string, OffPageSplit | null> {\n const used = new Set(input.used ?? []);\n const out = new Map<string, OffPageSplit | null>();\n const fresh: { id: string; from: string; to: string }[] = [];\n for (const edge of input.edges) {\n const from = pageOfBounds(input.pages, edge.from);\n const to = pageOfBounds(input.pages, edge.to);\n if (from === null || to === null || from.id === to.id) {\n out.set(edge.id, null);\n continue;\n }\n const held = edge.offPage?.ref;\n if (held !== undefined && !used.has(held)) {\n used.add(held);\n out.set(edge.id, { ref: held, from: from.id, to: to.id });\n } else {\n out.set(edge.id, null);\n fresh.push({ id: edge.id, from: from.id, to: to.id });\n }\n }\n for (const split of fresh) {\n const ref = nextOffPageRef(used);\n used.add(ref);\n out.set(split.id, { ref, from: split.from, to: split.to });\n }\n return out;\n}\n","/** The pages a {@link DiagramData} is drawn on, and the connectors that cross between them. */\nimport { layoutPages, type Bounds, type PlacedPage } from '@weasel-js/core';\nimport type { DiagramData, DiagramSpec } from './dataTypes';\nimport { diagramGroupOf } from './group';\nimport { offPageSplits } from './offPage/split';\nimport { offPageTagSpecs, type OffPageTagLook } from './offPage/tag';\nimport type { OffPageSplit } from './offPage/trait';\n\n/** `data`'s pages, placed in world space. */\nexport function diagramPages(data: DiagramData): PlacedPage[] {\n return layoutPages(data.pages ?? [], data.pageLayout);\n}\n\n/**\n * Which of `edges` cross between `pages`, lettered in their order, and the two\n * off-page tags of each that does. An edge with an end `boxOf` has no box for\n * is left whole.\n */\nexport function dataOffPage(\n edges: readonly { id: string; from: string; to: string }[],\n pages: readonly PlacedPage[],\n boxOf: (id: string) => Bounds | undefined,\n look: OffPageTagLook,\n): { splits: ReadonlyMap<string, OffPageSplit>; tags: DiagramSpec[] } {\n const input = edges.flatMap((e) => {\n const from = boxOf(e.from);\n const to = boxOf(e.to);\n return from === undefined || to === undefined ? [] : [{ id: e.id, from, to }];\n });\n const splits = new Map<string, OffPageSplit>();\n const tags: DiagramSpec[] = [];\n for (const [id, split] of offPageSplits({ pages, edges: input })) {\n if (split === null) continue;\n splits.set(id, split);\n tags.push(...(offPageTagSpecs(id, split, pages, { ...look, layer: 'main' }) as DiagramSpec[]));\n }\n return { splits, tags };\n}\n\n/** {@link dataOffPage} for `diagramScene`: ends are boxed by where nodes and regions were\n * placed, and by the group specs already made. Nothing when `data` has no pages. */\nexport function scenePageSplits(\n data: DiagramData,\n placedAt: ReadonlyMap<string, Bounds>,\n specs: readonly DiagramSpec[],\n edges: readonly { id: string; from: string; to: string }[],\n look: () => OffPageTagLook,\n): { splits: ReadonlyMap<string, OffPageSplit>; tags: DiagramSpec[] } | null {\n const pages = diagramPages(data);\n if (pages.length === 0) return null;\n const groups = new Map(specs.filter((s) => diagramGroupOf(s) !== null).map((s) => [String(s.id), s.pose as Bounds]));\n return dataOffPage(edges, pages, (id) => placedAt.get(id) ?? groups.get(id), look());\n}\n","/**\n * Which group holds what, settled once for both readers of groups: the scene\n * graph a layout runs over, and the data a diagram is built from.\n *\n * A group names nodes and other groups. A node belongs to the first group that\n * names it and a group to the first group that names it, in source order; a\n * membership that would make a group its own ancestor is ignored, and so is an\n * id that is neither. A group with no node anywhere inside it is dropped.\n */\n\n/** A group as declared: its id and the ids it names. */\nexport interface DeclaredGroup {\n id: string;\n members: readonly string[];\n}\n\n/** A group with its place in the tree settled. */\nexport interface NestedGroup {\n id: string;\n /** The nodes and groups directly inside, in the order they were named. */\n direct: string[];\n /** Every node inside, through any nested group, in that same order. */\n members: string[];\n /** The group this one is directly inside. */\n parent?: string;\n}\n\nexport function nestGroups(\n declared: readonly DeclaredGroup[],\n isNode: (id: string) => boolean,\n): NestedGroup[] {\n const groupIds = new Set(declared.map((g) => g.id));\n const parentOf = new Map<string, string>();\n const claimedNodes = new Set<string>();\n const direct = new Map<string, string[]>();\n\n const isAncestorOrSelf = (candidate: string, of: string): boolean => {\n for (let at: string | undefined = of; at !== undefined; at = parentOf.get(at)) {\n if (at === candidate) return true;\n }\n return false;\n };\n\n for (const group of declared) {\n const own: string[] = [];\n for (const id of group.members) {\n if (isNode(id)) {\n if (claimedNodes.has(id)) continue;\n claimedNodes.add(id);\n own.push(id);\n } else if (groupIds.has(id) && !parentOf.has(id) && !isAncestorOrSelf(id, group.id)) {\n parentOf.set(id, group.id);\n own.push(id);\n }\n }\n direct.set(group.id, own);\n }\n\n const flat = new Map<string, string[]>();\n const flatten = (id: string): string[] => {\n const known = flat.get(id);\n if (known !== undefined) return known;\n const out: string[] = [];\n for (const member of direct.get(id)!) {\n if (groupIds.has(member)) out.push(...flatten(member));\n else out.push(member);\n }\n flat.set(id, out);\n return out;\n };\n\n const live = new Set(declared.filter((g) => flatten(g.id).length > 0).map((g) => g.id));\n return declared.filter((g) => live.has(g.id)).map((g) => {\n const parent = parentOf.get(g.id);\n return {\n id: g.id,\n direct: direct.get(g.id)!.filter((id) => !groupIds.has(id) || live.has(id)),\n members: flat.get(g.id)!,\n ...(parent !== undefined ? { parent } : {}),\n };\n });\n}\n","/**\n * `Graph` — the adjacency index a layout runs over.\n *\n * Built from the scene on demand, used, and thrown away. Rebuilding per layout\n * invocation is deliberate — a maintained index is a cache to invalidate on\n * every add, delete, reparent, and `dependsOn` edit, and layout is not on the\n * hot path.\n */\nimport { AUTO_POSE_DESCRIPTOR, type PoseDescriptor, type Vec2 } from '@weasel-js/core/math';\nimport { expandGroupEdges, insetOf, type GroupInset } from './cluster';\nimport { diagramEdgeOf, layoutOwnsRoute } from './edgeTrait';\nimport { nestGroups } from './groupTree';\nimport { diagramLabelOf, type DiagramLabel } from './labelTrait';\nimport type { Bounds, Outline } from './outline';\nimport { diagramNodeOf, type DiagramNodeLike, type DiagramNodeReader } from './trait';\nimport type { PortSpec } from './types';\n\n/** A scene node as the graph reads it. `dependsOn` is what an edge's two\n * endpoints are: the edge trait names *ports*, and the nodes those ports are\n * on are the dependencies the derivation already runs on. */\nexport interface GraphNodeLike extends DiagramNodeLike {\n dependsOn?: readonly string[] | 'children';\n}\n\n/** Where the graph gets its nodes. The same thunk shape the port affordance\n * takes, so one source answers both. */\nexport type GraphSource<TPose> = () => Iterable<{ node: GraphNodeLike; pose: TPose }>;\n\n/** One participant. */\nexport interface GraphNode {\n id: string;\n /** Where it is now, in world coordinates. */\n bounds: Bounds;\n /** Layout must not move it. */\n pinned: boolean;\n /** The innermost group it belongs to, when it belongs to one. */\n group?: string;\n /** Where its ports sit. Absent, the four compass midpoints\n * (`DEFAULT_PORTS`). */\n ports?: readonly PortSpec[];\n /** The shape its ports are cast onto, as `portsOf` casts them. Absent,\n * its bounds. */\n outline?: Outline;\n /** How far past `bounds` it reaches (`DiagramNode.margin`). `planOf` lays\n * it out as that much bigger. */\n margin?: GroupInset;\n}\n\n/** A box drawn around some participants, which a layout keeps together and\n * leaves room for. */\nexport interface GraphGroup {\n id: string;\n /** Every participant inside, through any group nested in this one, in\n * source order. */\n members: readonly string[];\n /** Room the box keeps around what it holds, in world units. */\n inset: GroupInset;\n /** The narrowest its box may be across the world x axis, which a layout\n * leaves room for. */\n minWidth?: number;\n /** The group this one is directly inside. */\n parent?: string;\n /** Its direct members, nodes and groups, in the order a layered layout\n * keeps them across every rank: set for a group that reorders. */\n ordered?: readonly string[];\n}\n\n/** One connection. `id` is the edge node's own id, so a caller can go back to\n * the scene for its trait. */\nexport interface GraphEdge {\n id: string;\n from: string;\n to: string;\n /** The port it leaves `from` by, when it names one. */\n fromPort?: string;\n /** The port it arrives at `to` by, when it names one. */\n toPort?: string;\n /** Room its label needs: the label's box, and how far its near side sits\n * from the wire (`DiagramLabel.offset`). `layered` sets the label beside\n * its wire in a rank of its own. */\n label?: EdgeLabelRoom;\n /** Where its route runs now, from `from` to `to`. `layered` starts each\n * placeholder where the route already crosses that rank, so a re-run keeps\n * the order the last one settled on. */\n waypoints?: readonly Vec2[];\n /** Its route is someone's own: layout leaves it, and keeps no room for it\n * in the ranks it crosses. */\n authored?: boolean;\n /** The edge as drawn, when this one stands in for an edge to or from a\n * group (see `expandGroupEdges`). */\n origin?: { id: string; from: string; to: string };\n}\n\n/** The room a {@link GraphEdge}'s label takes, in world units. */\nexport interface EdgeLabelRoom {\n width: number;\n height: number;\n /** Between the wire and the label's near side, to the left of the\n * direction of travel; negative for the right. Default 0, which centers\n * the label on the wire. */\n offset?: number;\n}\n\n/**\n * Nodes, edges, and the two adjacency reads a layout needs.\n *\n * Every list is in source order — render order, when the source is a scene —\n * which is what a layout's tiebreaks resolve against.\n */\nexport interface Graph {\n readonly nodes: readonly GraphNode[];\n readonly edges: readonly GraphEdge[];\n /** Absent or empty for a graph with no groups. */\n readonly groups?: readonly GraphGroup[];\n node(id: string): GraphNode | undefined;\n /** Edges leaving `id`, in source order. */\n outgoing(id: string): readonly GraphEdge[];\n /** Edges arriving at `id`, in source order. */\n incoming(id: string): readonly GraphEdge[];\n}\n\n/** Options for {@link buildGraph}: how the trait is read, and how a pose\n * yields bounds. Both default to the kit's own. */\nexport interface BuildGraphOptions<TPose> {\n read?: DiagramNodeReader;\n geometry?: PoseDescriptor<TPose>;\n}\n\n/**\n * Read a graph out of a source of scene nodes.\n *\n * A node is an edge if it carries the edge trait and names exactly two\n * dependencies; a group if its trait carries `group`, with its dependencies as\n * its members, which may be groups themselves (see `nestGroups`); a participant if the reader hands back any other\n * `DiagramNode`; and otherwise not in the diagram at all. An edge whose\n * endpoints are not both participants or groups is dropped, and an edge to a\n * group ranks against its members (see `expandGroupEdges`).\n */\nexport function buildGraph<TPose>(\n source: GraphSource<TPose>,\n opts: BuildGraphOptions<TPose> = {},\n): Graph {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n const nodes: GraphNode[] = [];\n const byId = new Map<string, GraphNode>();\n const candidates: GraphEdge[] = [];\n const groupNodes: { id: string; members: readonly string[]; inset: GroupInset; minWidth?: number; reorders?: boolean }[] = [];\n const routed = new Set<string>();\n const rooms = new Map<string, EdgeLabelRoom>();\n\n for (const { node, pose } of source()) {\n const edge = diagramEdgeOf(node);\n if (edge !== null) {\n const deps = node.dependsOn;\n if (Array.isArray(deps) && deps.length === 2) {\n candidates.push({\n id: node.id,\n from: deps[0]!,\n to: deps[1]!,\n ...(edge.from.port !== undefined ? { fromPort: edge.from.port } : {}),\n ...(edge.to.port !== undefined ? { toPort: edge.to.port } : {}),\n ...(edge.waypoints !== undefined && edge.waypoints.length > 0 ? { waypoints: edge.waypoints } : {}),\n ...(layoutOwnsRoute(edge) ? {} : { authored: true }),\n });\n if (layoutOwnsRoute(edge)) routed.add(node.id);\n }\n continue;\n }\n const label = diagramLabelOf(node);\n if (label !== null) {\n const deps = node.dependsOn;\n if (Array.isArray(deps) && deps.length === 1 && labelFollowsLayout(label.at) && !rooms.has(deps[0]!)) {\n const { width, height } = geometry.getBounds(pose);\n rooms.set(deps[0]!, { width, height, ...(label.offset ? { offset: label.offset } : {}) });\n }\n continue;\n }\n const trait = diagramNodeOf(node, opts.read);\n if (trait === null) continue;\n if (trait.group !== undefined) {\n const deps = node.dependsOn;\n groupNodes.push({\n id: node.id,\n members: Array.isArray(deps) ? deps : [],\n inset: insetOf(trait.group.inset),\n ...(trait.group.minWidth !== undefined ? { minWidth: trait.group.minWidth } : {}),\n ...(trait.group.reorder !== undefined ? { reorders: true } : {}),\n });\n continue;\n }\n const entry: GraphNode = {\n id: node.id,\n bounds: geometry.getBounds(pose),\n pinned: trait.pinned === true,\n ...(trait.ports !== undefined ? { ports: trait.ports } : {}),\n ...(trait.outline !== undefined ? { outline: trait.outline } : {}),\n ...(trait.margin !== undefined ? { margin: trait.margin } : {}),\n };\n nodes.push(entry);\n byId.set(entry.id, entry);\n }\n\n const declared = new Map(groupNodes.map((g) => [g.id, g]));\n const live: GraphGroup[] = nestGroups(groupNodes, (id) => byId.has(id)).map((g) => {\n for (const id of g.direct) {\n const node = byId.get(id);\n if (node !== undefined) node.group = g.id;\n }\n return {\n id: g.id,\n members: g.members,\n inset: declared.get(g.id)!.inset,\n ...(declared.get(g.id)!.minWidth !== undefined ? { minWidth: declared.get(g.id)!.minWidth } : {}),\n ...(g.parent !== undefined ? { parent: g.parent } : {}),\n ...(declared.get(g.id)!.reorders === true ? { ordered: g.direct } : {}),\n };\n });\n const known = (id: string) => byId.has(id) || live.some((g) => g.id === id);\n // Room beside layout's own route only: an author's waypoints say where the\n // wire goes, and the label goes with it.\n const roomed = candidates.map((e) => {\n const room = rooms.get(e.id);\n return room !== undefined && routed.has(e.id) ? { ...e, label: room } : e;\n });\n return graphOf(nodes, expandGroupEdges(roomed.filter((e) => known(e.from) && known(e.to)), live), live);\n}\n\nconst NONE: readonly GraphEdge[] = Object.freeze([]);\n\n/** The graph over `nodes`, `edges`, and `groups`, indexed for lookup. */\nexport function graphOf(nodes: GraphNode[], edges: GraphEdge[], groups: GraphGroup[] = []): Graph {\n const byId = new Map(nodes.map((n) => [n.id, n]));\n const out = new Map<string, GraphEdge[]>();\n const into = new Map<string, GraphEdge[]>();\n for (const edge of edges) {\n push(out, edge.from, edge);\n push(into, edge.to, edge);\n }\n return {\n nodes,\n edges,\n groups,\n node: (id) => byId.get(id),\n outgoing: (id) => out.get(id) ?? NONE,\n incoming: (id) => into.get(id) ?? NONE,\n };\n}\n\n/** Whether layout stations a label stationed at `at`: the default middle, or a\n * place among its edge's waypoints, which only layout hands out. A label put\n * at an end or a fraction stays there. */\nexport function labelFollowsLayout(at: DiagramLabel['at']): boolean {\n return at === 'mid' || typeof at === 'object';\n}\n\nfunction push(index: Map<string, GraphEdge[]>, key: string, edge: GraphEdge): void {\n const list = index.get(key);\n if (list === undefined) index.set(key, [edge]);\n else list.push(edge);\n}\n","import type { Row, RowTextStyle } from './body';\n\n/** The face a diagram node's text is set in. */\nexport type DiagramTextStyle = { fontFamily: string; fontSize: number; fontWeight?: number; fontStyle?: 'italic'; align?: 'center' };\n\ntype Font = { fontFamily: string; fontSize: number };\n\n/** The face `s` names, `font` filling in what it leaves out. */\nexport const textFace = (s: RowTextStyle | undefined, font: Font): DiagramTextStyle => ({\n fontFamily: s?.fontFamily ?? font.fontFamily,\n fontSize: s?.fontSize ?? font.fontSize,\n ...(s?.bold === true ? { fontWeight: 700 } : {}),\n ...(s?.italic === true ? { fontStyle: 'italic' as const } : {}),\n});\n\n/** The face a body row's text is set in. A label row's is centered in the row. */\nexport function rowTextStyle(row: Row | undefined, font: Font): DiagramTextStyle {\n const face = textFace(row?.kind === 'label' || row?.kind === 'field' ? row.style : undefined, font);\n return row?.kind === 'label' ? { ...face, align: 'center' } : face;\n}\n","/**\n * Marks: what a data node draws besides its rows. A drawn mark is SVG path\n * data in a unit square, stretched over the node's box, so it follows the node\n * wherever layout or a drag puts it. A text mark is pinned to a point on the box.\n */\nimport {\n commandFill,\n commandStroke,\n pathFromD,\n RECT_POSE_DESCRIPTOR,\n registerNodeShape,\n resolveFill,\n resolveStroke,\n transformPath,\n type Fill,\n type Inherit,\n type NodeShapeEntry,\n type Path,\n type PoseDescriptor,\n type Stroke,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { MeasureRowText, RowTextStyle } from './body';\nimport type { DiagramSpec, DiagramTextStyle, NodeStyle } from './fromData';\nimport { ANCHOR_DERIVE_POSE } from './group';\nimport type { Bounds } from './outline';\nimport { DIAGRAM_TRAIT_KEY } from './trait';\nimport type { PortAnchor } from './types';\n\n/** One mark on a `DataNode`. Colors default to the node's stroke and text. */\nexport type DataMark =\n | { d: string; fill?: string; stroke?: string; strokeWidth?: number; dash?: number[]; opacity?: number }\n | { text: string; at: PortAnchor; self?: PortAnchor; offset?: Vec2; color?: string; style?: RowTextStyle };\n\n/** The trait on a drawn mark's `data`: path data in a unit square. */\nexport interface DiagramMark { d: string }\n\n/** The mark a scene node carries, or null for a node that is not a drawn\n * mark: how `markShape` tells which nodes it paints. */\nexport function diagramMarkOf(node: { data: unknown }): DiagramMark | null {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const trait = (data as Record<string, unknown>)[DIAGRAM_TRAIT_KEY];\n if (trait === null || typeof trait !== 'object' || !('mark' in trait)) return null;\n const mark = (trait as { mark: unknown }).mark;\n return mark !== null && typeof mark === 'object' && typeof (mark as DiagramMark).d === 'string'\n ? (mark as DiagramMark)\n : null;\n}\n\nconst PARSED = new Map<string, Path>();\nconst PARSED_MAX = 256;\n\nfunction unitPath(d: string, onWarn?: (message: string) => void): Path {\n let path = PARSED.get(d);\n if (path === undefined) {\n let warned = false;\n path = pathFromD(d, (message) => {\n warned = true;\n onWarn?.(message);\n });\n if (path.kind === 'polygon' && path.commands.length === 0) onWarn?.('it draws nothing');\n else if (!warned) {\n if (PARSED.size >= PARSED_MAX) PARSED.clear();\n PARSED.set(d, path);\n }\n }\n return path;\n}\n\n/** Parse a drawn mark's path data now, so a typo surfaces where the diagram\n * is built rather than at first paint. */\nfunction checkMarkPath(nodeId: string, index: number, d: string): void {\n unitPath(d, (message) => {\n throw new Error(`diagramScene: node \"${nodeId}\", mark ${index}: path data ${JSON.stringify(d)} does not parse: ${message}`);\n });\n}\n\n/** The painter for a drawn mark. */\nexport function markShape<TPose>(\n opts: { geometry?: PoseDescriptor<TPose> } = {},\n): NodeShapeEntry<unknown, TPose> {\n const geometry = opts.geometry ?? (RECT_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n return {\n id: 'diagram:mark',\n matches: (node) => diagramMarkOf(node) !== null,\n paint: (node, pose, ctx) => {\n const mark = diagramMarkOf(node);\n if (mark === null) return [];\n const box = geometry.getBounds(pose);\n const d = node.data as { fill?: Fill | Inherit | null; stroke?: Stroke | Inherit | null };\n const declaredFill = resolveFill(d.fill, ctx?.inherited?.fill);\n const declaredStroke = resolveStroke(d.stroke, ctx?.inherited?.stroke);\n const fill = declaredFill && commandFill(declaredFill, box);\n const stroke = declaredStroke && commandStroke(declaredStroke, box);\n return [{\n kind: 'path',\n path: transformPath(unitPath(mark.d), [box.width, 0, 0, box.height, box.x, box.y]),\n ...(fill ? { fill } : {}),\n ...(stroke ? { stroke } : {}),\n }];\n },\n };\n}\n\n/** Register {@link markShape}; returns the disposer. */\nexport function registerMarkShape<TPose>(opts: { geometry?: PoseDescriptor<TPose> } = {}): () => void {\n return registerNodeShape(markShape(opts), { priority: 'high' });\n}\n\n/** The specs for one node's marks. `box` is where the node stands. */\nexport function markSpecs(\n nodeId: string,\n marks: readonly DataMark[],\n box: Bounds,\n ctx: { style: NodeStyle; textStyle: (s: RowTextStyle | undefined) => DiagramTextStyle; measure: MeasureRowText },\n): DiagramSpec[] {\n return marks.map((mark, i): DiagramSpec => {\n const id = `${nodeId}/mark:${i}` as never;\n if ('d' in mark) {\n checkMarkPath(nodeId, i, mark.d);\n const paint = (color: string) => ({ color, ...(mark.opacity !== undefined ? { opacity: mark.opacity } : {}) });\n const stroke = mark.stroke ?? (mark.fill === undefined ? ctx.style.stroke : undefined);\n return {\n id,\n kind: 'mark',\n layer: 'main',\n parent: nodeId as never,\n pickable: false,\n pose: { x: box.x, y: box.y, width: box.width, height: box.height },\n data: {\n diagram: { mark: { d: mark.d } },\n ...(mark.fill !== undefined ? { fill: { paint: paint(mark.fill) } } : {}),\n ...(stroke !== undefined\n ? { stroke: { paint: paint(stroke), width: mark.strokeWidth ?? 1.5, ...(mark.dash ? { dash: mark.dash } : {}) } }\n : {}),\n },\n };\n }\n const size = ctx.measure(mark.text, mark.style ?? {});\n const self = mark.self ?? mark.at;\n return {\n id,\n kind: 'mark',\n layer: 'main',\n pickable: false,\n pose: {\n x: box.x + mark.at.u * box.width + (mark.offset?.x ?? 0) - self.u * size.width,\n y: box.y + mark.at.v * box.height + (mark.offset?.y ?? 0) - self.v * size.height,\n width: size.width,\n height: size.height,\n },\n data: {\n diagram: { anchor: { at: mark.at, self, ...(mark.offset ? { offset: mark.offset } : {}) } },\n text: mark.text,\n style: ctx.textStyle(mark.style),\n fill: { paint: { color: mark.color ?? ctx.style.text } },\n },\n dependsOn: [nodeId as never],\n derivePose: ANCHOR_DERIVE_POSE as never,\n };\n });\n}\n","/**\n * `diagramScene`'s containers and pools: which nodes and regions each region\n * holds, and what layout sees of them. `dataContainerPlace.ts` places them and\n * builds their specs.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { GroupInset } from './cluster';\nimport { CONTAINER_HEADER } from './containers/layouts';\nimport { MIN_LANE_SIZE } from './containers/laneStack';\nimport type { ContainerRole } from './containers/trait';\nimport { DEFAULT_LANE_SIZE, DEFAULT_POOL_ACROSS, type DataContainer, type NodeStyle } from './dataTypes';\nimport type { GraphGroup, GraphNode } from './graph';\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/** A container's size when it gives no box and holds nothing to fit. */\nexport const EMPTY_CONTAINER = { width: 240, height: 160 };\n\n/** A container, pool, or lane with its members settled. */\nexport interface DataRegion {\n id: string;\n role: ContainerRole;\n /** The axis its pool stacks along; `'y'` for a plain container. */\n axis: 'x' | 'y';\n label?: string;\n style?: string;\n colors?: Partial<NodeStyle>;\n /** The region it is directly inside. */\n parent?: string;\n /** What it holds directly: a pool its lanes, else node and container ids. */\n direct: string[];\n /** A container's or a pool's own box. */\n box?: Rect;\n /** A lane's size along its pool's stack. */\n size?: number;\n pinned: boolean;\n /** A container whose box fits what it holds: one with no `box` that holds something. */\n fitted: boolean;\n /** A lane's place in its pool. */\n index: number;\n /** A container's reorder axis. */\n reorder?: 'x' | 'y';\n}\n\n/** Every region, outer before inner, and the region each node or region is directly inside. */\nexport interface DataRegions {\n regions: readonly DataRegion[];\n parentOf: ReadonlyMap<string, string>;\n}\n\n/**\n * Settle what each region holds. A member already claimed, a pool, an\n * unknown id, and a claim that would put a container inside itself are\n * passed over. Throws on a container or lane id already in `ids`, and adds\n * each to it.\n */\nexport function resolveContainers(\n containers: readonly DataContainer[],\n ids: Set<string>,\n nodeIds: ReadonlySet<string>,\n): DataRegions {\n const byId = new Map<string, DataRegion>();\n const parentOf = new Map<string, string>();\n const declare = (r: DataRegion) => {\n if (ids.has(r.id)) throw new Error(`diagramScene: container id \"${r.id}\" is already a node, group, or container id`);\n ids.add(r.id);\n byId.set(r.id, r);\n };\n const base = { direct: [], pinned: false, fitted: false, index: 0 };\n for (const c of containers) {\n const axis = c.role === 'pool' ? c.axis ?? 'y' : 'y';\n declare({\n ...base, direct: [], id: c.id, role: c.role, axis, pinned: c.pinned === true,\n ...(c.label !== undefined ? { label: c.label } : {}), ...(c.style !== undefined ? { style: c.style } : {}),\n ...(c.colors !== undefined ? { colors: c.colors } : {}),\n ...(c.box !== undefined ? { box: { ...c.box } } : {}),\n ...(c.role === 'container' && c.reorder !== undefined ? { reorder: c.reorder } : {}),\n });\n if (c.role !== 'pool') continue;\n (c.lanes ?? []).forEach((l, index) => {\n declare({\n ...base, direct: [], id: l.id, role: 'lane', axis, index, parent: c.id,\n ...(l.label !== undefined ? { label: l.label } : {}), ...(l.size !== undefined ? { size: l.size } : {}),\n ...(l.colors !== undefined ? { colors: l.colors } : {}),\n });\n parentOf.set(l.id, c.id);\n byId.get(c.id)!.direct.push(l.id);\n });\n }\n const claim = (holder: DataRegion, id: string) => {\n if (parentOf.has(id)) return;\n const region = byId.get(id);\n if (region === undefined ? !nodeIds.has(id) : region.role !== 'container') return;\n for (let at: string | undefined = holder.id; at !== undefined; at = parentOf.get(at)) if (at === id) return;\n parentOf.set(id, holder.id);\n holder.direct.push(id);\n };\n for (const c of containers) {\n if (c.role === 'container') for (const m of c.members ?? []) claim(byId.get(c.id)!, m);\n else for (const l of c.lanes ?? []) for (const m of l.members ?? []) claim(byId.get(l.id)!, m);\n }\n const regions: DataRegion[] = [];\n const visit = (r: DataRegion) => {\n const parent = parentOf.get(r.id);\n if (parent !== undefined) r.parent = parent;\n r.fitted = r.role === 'container' && r.box === undefined && r.direct.length > 0;\n regions.push(r);\n for (const id of r.direct) {\n const inner = byId.get(id);\n if (inner !== undefined) visit(inner);\n }\n };\n for (const r of byId.values()) if (!parentOf.has(r.id)) visit(r);\n return { regions, parentOf };\n}\n\n/** What layout sees of the regions. */\nexport interface ContainerLayout {\n /** Each outermost boxed region, as one node at its box. */\n nodes: GraphNode[];\n /** Each fitted container outside every boxed region, kept together as a group. */\n groups: GraphGroup[];\n /** The fitted container each node layout sees is directly inside. */\n groupOf: ReadonlyMap<string, string>;\n /** Every node and region inside a boxed region, which layout does not see. */\n hidden: ReadonlySet<string>;\n /** The outermost boxed region holding `id` or being it, else `id`: what an edge's end ranks against. */\n endOf(id: string): string;\n}\n\n/** The inset a fitted container keeps around what it holds: its header, and `pad` all round. */\nexport const fittedInset = (pad: number): GroupInset => ({ top: CONTAINER_HEADER.size + pad, right: pad, bottom: pad, left: pad });\n\n/** A pool's lane sizes along its stack, the lanes giving none sharing what the box leaves. */\nexport function laneSizes(lanes: readonly DataRegion[], along: number | undefined): number[] {\n if (along === undefined) return lanes.map((l) => Math.max(MIN_LANE_SIZE, l.size ?? DEFAULT_LANE_SIZE));\n const given = lanes.reduce((s, l) => s + (l.size ?? 0), 0);\n const unsized = lanes.filter((l) => l.size === undefined).length;\n const share = unsized === 0 ? 0 : (along - given) / unsized;\n const sizes = lanes.map((l) => Math.max(MIN_LANE_SIZE, l.size ?? share));\n if (sizes.length > 0) sizes[sizes.length - 1] = Math.max(MIN_LANE_SIZE, sizes[sizes.length - 1]! + along - sizes.reduce((s, n) => s + n, 0));\n return sizes;\n}\n\n/** The box a boxed region starts at: its own, or a default size at `seed`. */\nfunction startBox(r: DataRegion, lanes: readonly DataRegion[], seed: Vec2): Rect {\n if (r.box !== undefined) return r.box;\n if (r.role !== 'pool') return { ...seed, ...EMPTY_CONTAINER };\n const along = Math.max(MIN_LANE_SIZE, laneSizes(lanes, undefined).reduce((s, n) => s + n, 0));\n return r.axis === 'y'\n ? { ...seed, width: DEFAULT_POOL_ACROSS, height: along }\n : { ...seed, width: along, height: DEFAULT_POOL_ACROSS };\n}\n\n/**\n * What layout sees of `regions`: an outermost boxed region is one node, a\n * fitted container outside every boxed region is a group around what it\n * holds, and everything inside a boxed region is hidden. `seed` is where a\n * region giving no box starts, by its place among the regions.\n */\nexport function containerLayoutNodes(\n { regions, parentOf }: DataRegions,\n opts: { padding: number; seed: (k: number) => Vec2 },\n): ContainerLayout {\n const byId = new Map(regions.map((r) => [r.id, r]));\n const rootOf = new Map<string, string>();\n for (const r of regions) {\n const outer = r.parent === undefined ? undefined : rootOf.get(r.parent);\n const root = outer ?? (r.fitted ? undefined : r.id);\n if (root !== undefined) rootOf.set(r.id, root);\n }\n const endOf = (id: string): string => {\n if (byId.has(id)) return rootOf.get(id) ?? id;\n const parent = parentOf.get(id);\n return (parent === undefined ? undefined : rootOf.get(parent)) ?? id;\n };\n const hidden = new Set<string>([...parentOf.keys()].filter((id) => endOf(id) !== id));\n const nodes: GraphNode[] = [];\n regions.forEach((r, k) => {\n if (rootOf.get(r.id) !== r.id) return;\n const lanes = r.direct.flatMap((id) => { const l = byId.get(id); return l?.role === 'lane' ? [l] : []; });\n nodes.push({ id: r.id, bounds: startBox(r, lanes, opts.seed(k)), pinned: r.pinned });\n });\n const seen = (id: string) => !hidden.has(id) && !(byId.get(id)?.fitted ?? false);\n const below = (r: DataRegion): string[] =>\n r.direct.flatMap((id) => (seen(id) ? [id] : byId.get(id)?.fitted === true && !hidden.has(id) ? below(byId.get(id)!) : []));\n const groups: GraphGroup[] = [];\n const groupOf = new Map<string, string>();\n for (const r of regions) {\n if (!r.fitted || hidden.has(r.id) || rootOf.has(r.id)) continue;\n groups.push({ id: r.id, members: below(r), inset: fittedInset(opts.padding), ...(r.parent !== undefined ? { parent: r.parent } : {}) });\n for (const id of r.direct) if (seen(id)) groupOf.set(id, r.id);\n }\n return { nodes, groups, groupOf, hidden, endOf };\n}\n","/**\n * Where `diagramScene`'s regions and the nodes inside boxed regions land once\n * layout has run, and the specs the regions are drawn with.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { GroupInset } from './cluster';\nimport { containerShape } from './containers/layouts';\nimport { stackedLanes } from './containers/laneStack';\nimport { regionSpecs } from './containers/regionSpecs';\nimport { bodyBox } from './containers/trait';\nimport { EMPTY_CONTAINER, fittedInset, laneSizes, type ContainerLayout, type DataRegion, type DataRegions } from './dataContainers';\nimport type { DiagramSpec } from './dataTypes';\nimport { ownNodeStyle } from './dataColors';\nimport { dataRegionStyle } from './dataStyles';\nimport { grownBy } from './footprint';\nimport type { DiagramTheme } from './theme/types';\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/** A data node as placement reads it: where it asked to start, its size, and how far past its box it reaches. */\nexport interface PlacedNodeSize {\n at?: Vec2;\n width: number;\n height: number;\n margin?: GroupInset;\n}\n\n/** Fill `out` with where the nodes no `at` places sit: in rows across `seat`'s body, in order. */\nfunction seedRows(out: Map<string, Rect>, ids: readonly string[], body: Rect, sizes: ReadonlyMap<string, PlacedNodeSize>, pad: number): void {\n let x = body.x + pad;\n let y = body.y + pad;\n let row = 0;\n for (const id of ids) {\n const { width, height } = sizes.get(id)!;\n if (x > body.x + pad && x + width > body.x + body.width - pad) {\n x = body.x + pad;\n y += row + pad;\n row = 0;\n }\n out.set(id, { x, y, width, height });\n x += width + pad;\n row = Math.max(row, height);\n }\n}\n\n/**\n * Every region's box, and where each node inside a boxed region sits. A node\n * with an `at` moves by as much as layout moved its outermost boxed region;\n * one without is seeded in its nearest boxed region's body. A fitted\n * container's box is the union of what it holds, grown by its inset.\n * `placed` is where layout put everything it saw.\n */\nexport function placeContainers(\n { regions, parentOf }: DataRegions,\n layout: ContainerLayout,\n placed: ReadonlyMap<string, Rect>,\n sizes: ReadonlyMap<string, PlacedNodeSize>,\n pad: number,\n): Map<string, Rect> {\n const byId = new Map(regions.map((r) => [r.id, r]));\n const start = new Map(layout.nodes.map((n) => [n.id, n.bounds]));\n const delta = (id: string): Vec2 => {\n const root = layout.endOf(id);\n const from = start.get(root);\n const to = placed.get(root);\n return from === undefined || to === undefined ? { x: 0, y: 0 } : { x: to.x - from.x, y: to.y - from.y };\n };\n const out = new Map<string, Rect>();\n const seated = new Map(sizes);\n const empty: string[] = [];\n for (const r of regions) {\n if (r.fitted || r.role === 'lane') continue;\n const own = placed.get(r.id);\n const d = delta(r.id);\n const box = own ?? (r.box !== undefined ? { ...r.box, x: r.box.x + d.x, y: r.box.y + d.y } : null);\n if (box === null) {\n empty.push(r.id);\n seated.set(r.id, EMPTY_CONTAINER);\n continue;\n }\n out.set(r.id, box);\n if (r.role !== 'pool') continue;\n const lanes = r.direct.map((id) => byId.get(id)!);\n const along = r.axis === 'y' ? box.height : box.width;\n const sizes = laneSizes(lanes, r.box === undefined ? undefined : along);\n const stacked = stackedLanes(r.axis, box, containerShape('pool', r.axis).header, lanes.map((l, i) => ({ id: l.id, size: sizes[i]! })));\n for (const [id, pose] of stacked) out.set(id, pose);\n }\n const seatOf = (id: string): DataRegion | undefined => {\n let at = byId.get(parentOf.get(id) ?? '');\n while (at !== undefined && at.fitted) at = byId.get(at.parent ?? '');\n return at;\n };\n const unseated = new Map<DataRegion, string[]>();\n for (const [id, size] of seated) {\n if (!layout.hidden.has(id) || (byId.has(id) && !empty.includes(id))) continue;\n if (size.at !== undefined) {\n const d = delta(id);\n out.set(id, { x: size.at.x + d.x, y: size.at.y + d.y, width: size.width, height: size.height });\n continue;\n }\n const seat = seatOf(id)!;\n unseated.set(seat, [...(unseated.get(seat) ?? []), id]);\n }\n for (const [seat, ids] of unseated) {\n seedRows(out, ids, bodyBox(out.get(seat.id)!, containerShape(seat.role, seat.axis).header), seated, pad);\n }\n const footprint = (id: string): Rect | undefined => {\n if (byId.has(id)) return out.get(id);\n const at = out.get(id) ?? placed.get(id);\n return at === undefined ? undefined : grownBy(at, sizes.get(id)?.margin);\n };\n for (const r of [...regions].reverse()) {\n if (!r.fitted) continue;\n const rs = r.direct.map(footprint).filter((b): b is Rect => b !== undefined);\n const inset = fittedInset(pad);\n const x = Math.min(...rs.map((b) => b.x)) - inset.left;\n const y = Math.min(...rs.map((b) => b.y)) - inset.top;\n out.set(r.id, {\n x, y,\n width: Math.max(...rs.map((b) => b.x + b.width)) + inset.right - x,\n height: Math.max(...rs.map((b) => b.y + b.height)) + inset.bottom - y,\n });\n }\n return out;\n}\n\n/** Each region's specs and its title's, outer regions first, as `createScene` needs parents before what they hold.\n * Titles are set in `fontFamily`, the diagram's face. */\nexport function containerSpecs(\n { regions }: DataRegions,\n boxes: ReadonlyMap<string, Rect>,\n theme: DiagramTheme | undefined,\n fontFamily: string,\n): DiagramSpec[] {\n return regions.flatMap((r) => {\n const box = boxes.get(r.id);\n if (box === undefined) return [];\n const specs = regionSpecs(r.role, r.axis, { ...box }, r.label ?? null, {\n id: r.id, layer: 'main', parent: r.parent ?? null, style: dataRegionStyle(r, theme, r.index), fitted: r.fitted, fontFamily,\n ...(r.reorder !== undefined ? { reorder: r.reorder } : {}),\n });\n const marks = { ...(r.pinned ? { pinned: true } : {}), ...ownNodeStyle(r.colors) };\n if (Object.keys(marks).length === 0) return specs as DiagramSpec[];\n const [region, ...rest] = specs;\n return [{ ...region!, data: { ...region!.data, diagram: { ...region!.data.diagram, ...marks } as never } }, ...rest] as DiagramSpec[];\n });\n}\n","/**\n * `diagramScene`'s groups: which nodes each one holds, and the box and label\n * it draws around them.\n */\nimport type { GroupInset } from './cluster';\nimport type { DataGroup, DiagramSceneData, DiagramSpec, NodeStyle } from './fromData';\nimport { ANCHOR_DERIVE_POSE, GROUP_DERIVE_POSE, boxAround, type DiagramAnchor } from './group';\nimport { nestGroups } from './groupTree';\n\n/** A group with its members settled and its inset worked out. */\nexport interface ResolvedGroup {\n group: DataGroup;\n /** The nodes and groups directly inside, which the box derives from. */\n direct: readonly string[];\n /** Every node inside, through any nested group. */\n members: readonly string[];\n /** The group this one is directly inside. */\n parent?: string;\n inset: GroupInset;\n pad: number;\n title: { width: number; height: number } | null;\n /** Room for the title across the box, when there is one. */\n minWidth?: number;\n}\n\n/** The width a group's box needs to hold a title `title` wide, `pad` in from either side. */\nexport const groupMinWidth = (title: number, pad: number): number => title + 2 * pad;\n\n/**\n * Settle what each group holds (see `nestGroups`), outer groups ahead of the\n * groups inside them. A group left with no node inside it is dropped. Throws\n * on a group id already in `ids`, and adds each group's id to it.\n */\nexport function resolveGroups(\n groups: readonly DataGroup[],\n ids: Set<string>,\n nodeIds: ReadonlySet<string>,\n opts: { padding: number; title: (text: string) => { width: number; height: number } },\n): ResolvedGroup[] {\n for (const group of groups) {\n if (ids.has(group.id)) throw new Error(`diagramScene: group id \"${group.id}\" is already a node or group id`);\n ids.add(group.id);\n }\n const declared = new Map(groups.map((g) => [g.id, g]));\n const nested = nestGroups(groups, (id) => nodeIds.has(id));\n const depthOf = new Map<string, number>();\n const byId = new Map(nested.map((g) => [g.id, g]));\n const depth = (id: string): number => {\n const parent = byId.get(id)!.parent;\n let d = depthOf.get(id);\n if (d === undefined) depthOf.set(id, (d = parent === undefined ? 0 : depth(parent) + 1));\n return d;\n };\n // Stable, so groups at one depth keep the order they were declared in.\n return nested.map((g, i) => ({ g, i })).sort((a, b) => depth(a.g.id) - depth(b.g.id) || a.i - b.i).map(({ g }) => {\n const group = declared.get(g.id)!;\n const pad = group.padding ?? opts.padding;\n const title = group.label ? opts.title(group.label) : null;\n // The label sits in the top inset, half a pad above what the box holds.\n const inset = { top: pad + (title ? title.height + pad / 2 : 0), right: pad, bottom: pad, left: pad };\n return {\n group, direct: g.direct, members: g.members, inset, pad, title,\n ...(title ? { minWidth: groupMinWidth(title.width, pad) } : {}),\n ...(g.parent !== undefined ? { parent: g.parent } : {}),\n };\n });\n}\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/** The node id of a group's title. */\nexport const groupLabelIdOf = (id: string): string => `${id}/label`;\n\n/** A label on a wire, as a group box takes it in: the label node's id, and\n * where it sits when that is known before the scene derives it. */\nexport interface WireLabel {\n id: string;\n from: string;\n to: string;\n at: Rect | null;\n}\n\n/** The labels each group's box takes in: those on wires with both ends\n * inside it, each in the innermost group holding both. */\nexport function labelsByGroup(groups: readonly ResolvedGroup[], labels: readonly WireLabel[]): Map<string, WireLabel[]> {\n const byId = new Map(groups.map((g) => [g.group.id, g]));\n const holder = new Map<string, string>();\n for (const g of groups) for (const m of g.direct) holder.set(m, g.group.id);\n const ancestry = (id: string): string[] => {\n const out: string[] = [];\n for (let at = byId.has(id) ? byId.get(id)!.parent : holder.get(id); at !== undefined; at = byId.get(at)?.parent) out.push(at);\n return out;\n };\n const out = new Map<string, WireLabel[]>();\n for (const label of labels) {\n const up = new Set(ancestry(label.to));\n const shared = ancestry(label.from).find((g) => up.has(g));\n if (shared !== undefined) out.set(shared, [...(out.get(shared) ?? []), label]);\n }\n return out;\n}\n\n/** Each group's box around where its members were placed, and the labels\n * it takes in where they are known. */\nexport function groupBoxes(\n groups: readonly ResolvedGroup[],\n placedAt: ReadonlyMap<string, Rect>,\n labels: ReadonlyMap<string, readonly WireLabel[]> = new Map(),\n): Map<string, Rect> {\n const byId = new Map(groups.map((g) => [g.group.id, g]));\n const boxes = new Map<string, Rect>();\n const boxOf = (id: string): Rect => {\n const known = boxes.get(id);\n if (known !== undefined) return known;\n const g = byId.get(id)!;\n const rs = g.direct.map((m) => (byId.has(m) ? boxOf(m) : placedAt.get(m)!));\n for (const label of labels.get(id) ?? []) if (label.at !== null) rs.push(label.at);\n const x = Math.min(...rs.map((r) => r.x));\n const y = Math.min(...rs.map((r) => r.y));\n const box = boxAround({\n x,\n y,\n width: Math.max(...rs.map((r) => r.x + r.width)) - x,\n height: Math.max(...rs.map((r) => r.y + r.height)) - y,\n }, g);\n boxes.set(id, box);\n return box;\n };\n for (const g of groups) boxOf(g.group.id);\n return boxes;\n}\n\n/**\n * Each group's box, and its label when it has one, around where its members\n * were placed. In the order given, so an outer box paints behind the boxes\n * inside it. A box depends on its members and on the labels it takes in\n * (see {@link labelsByGroup}), so a wire's label stays inside it.\n */\nexport function groupSpecs(\n groups: readonly ResolvedGroup[],\n placedAt: ReadonlyMap<string, Rect>,\n styleOf: (group: DataGroup) => { style: NodeStyle; text: NonNullable<DiagramSceneData['style']> },\n wireLabels: readonly WireLabel[] = [],\n): DiagramSpec[] {\n const labels = labelsByGroup(groups, wireLabels);\n const boxes = groupBoxes(groups, placedAt, labels);\n const specs: DiagramSpec[] = [];\n for (const g of groups) {\n const { style, text } = styleOf(g.group);\n const { x, y, width, height } = boxes.get(g.group.id)!;\n specs.push({\n id: g.group.id as never,\n kind: 'mark',\n layer: 'main',\n pose: { x, y, width, height },\n data: {\n diagram: {\n outline: 'rect',\n group: {\n inset: g.inset,\n ...(g.minWidth !== undefined ? { minWidth: g.minWidth } : {}),\n ...(g.group.reorder !== undefined ? { reorder: g.group.reorder } : {}),\n },\n },\n fill: { paint: { color: style.fill } },\n stroke: {\n paint: { color: style.stroke },\n width: style.strokeWidth ?? 1,\n ...(style.dash ? { dash: style.dash } : {}),\n },\n },\n dependsOn: [...g.direct, ...(labels.get(g.group.id) ?? []).map((l) => l.id)] as never[],\n derivePose: GROUP_DERIVE_POSE as never,\n });\n if (g.title === null || !g.group.label) continue;\n const anchor: DiagramAnchor = { at: { u: 0, v: 0 }, offset: { x: g.pad, y: g.pad } };\n specs.push({\n id: groupLabelIdOf(g.group.id) as never,\n kind: 'mark',\n layer: 'main',\n pickable: false,\n pose: { x: x + g.pad, y: y + g.pad, width: g.title.width, height: g.title.height },\n data: { diagram: { anchor }, text: g.group.label, style: text, fill: { paint: { color: style.text } } },\n dependsOn: [g.group.id as never],\n derivePose: ANCHOR_DERIVE_POSE as never,\n });\n }\n return specs;\n}\n","/** The scene specs `diagramScene` makes for edges and their labels. */\nimport { polylineFromPoints } from '@weasel-js/core';\nimport type { WireLabel } from './dataGroups';\nimport { EDGE_DERIVE_PATH } from './edge';\nimport type { MeasureRowText } from './body';\nimport type { DataEdge, DiagramSceneOptions, DiagramSpec } from './fromData';\nimport { ownEdgeStyle, withColors } from './dataColors';\nimport { edgeLabelSpec, labelSize, labelStyleOf } from './edgeLabel';\nimport { labelCenter } from './label';\nimport type { DiagramLabel } from './labelTrait';\nimport type { LayeredRoute } from './route';\nimport { dataEdgeStyle } from './dataStyles';\nimport { EDGE_STROKE_WIDTH } from './dataTypes';\nimport type { DiagramTheme } from './theme/types';\nimport type { OffPageSplit } from './offPage/trait';\n\nexport interface EdgeSpecContext {\n idOf: (edge: DataEdge) => string;\n font: { fontFamily: string; fontSize: number };\n /** The face labels are sized from. Default `font`. */\n labelFont?: { fontFamily: string; fontSize: number };\n measure: MeasureRowText;\n /** Styles each edge under its role. Unset, edges take `dataEdgeStyle`'s defaults. */\n theme?: DiagramTheme;\n labelPlacement: DiagramLabel;\n /** Ports and waypoints by edge id, overriding the edge's own (from `layeredRoutes`). */\n routes?: ReadonlyMap<string, LayeredRoute> | null;\n opts: Pick<DiagramSceneOptions, 'edgeStyle' | 'router' | 'labelPlacement'>;\n /** The off-page split of each edge, by id, that crosses between pages. */\n splits?: ReadonlyMap<string, OffPageSplit>;\n}\n\n/** Where a label sits: beside the room layout left it, at the edge's own\n * offset or else the diagram's; else the edge's own placement, else the\n * diagram's. */\nfunction placementOf(e: DataEdge, route: LayeredRoute | undefined, ctx: EdgeSpecContext): DiagramLabel {\n const placement = e.labelPlacement ?? ctx.opts.labelPlacement ?? ctx.labelPlacement;\n return route?.labelAt === undefined ? placement : { ...placement, at: { near: route.labelAt } };\n}\n\n/** Each edge's label as a group's box takes it in: where it sits, when layout\n * stationed it beside its waypoints, else only its id. */\nexport function wireLabels(edges: readonly DataEdge[], ctx: EdgeSpecContext): WireLabel[] {\n const out: WireLabel[] = [];\n for (const e of edges) {\n if (!e.label) continue;\n const id = ctx.idOf(e);\n const route = ctx.routes?.get(id);\n const size = labelSize(e.label, labelStyleOf(ctx.labelFont ?? ctx.font), ctx.measure);\n const placement = placementOf(e, route, ctx);\n const center = route?.waypoints !== undefined && typeof placement.at === 'object'\n ? labelCenter(polylineFromPoints([...route.waypoints]), placement, size)\n : null;\n out.push({\n id: `${id}/label`,\n from: e.from,\n to: e.to,\n at: center === null ? null : { x: center.x - size.width / 2, y: center.y - size.height / 2, ...size },\n });\n }\n return out;\n}\n\n/** An edge end naming `port`, marked as layout's when the author named none. */\nconst endOf = (own: string | undefined, port: string | undefined) =>\n !port ? {} : own === undefined ? { port, laidOut: port } : { port };\n\nexport function edgeSpecs(edges: readonly DataEdge[], ctx: EdgeSpecContext): DiagramSpec[] {\n const specs: DiagramSpec[] = [];\n for (const e of edges) {\n const id = ctx.idOf(e);\n const route = ctx.routes?.get(id);\n const router = e.router ?? ctx.opts.router ?? 'bezier';\n const planned = route ?? {\n fromPort: e.fromPort ?? e.routedPorts?.from,\n toPort: e.toPort ?? e.routedPorts?.to,\n waypoints: e.waypoints ?? e.routed,\n };\n const { fromPort, toPort } = planned;\n // An avoid connector's bends are routed, never stops.\n const waypoints = router === 'avoid' ? e.waypoints : planned.waypoints;\n // Layout's own route, marked so a later layout of the live scene owns it.\n const laidOut = e.waypoints === undefined && waypoints !== undefined;\n const own = ctx.opts.edgeStyle?.(e);\n const style = own !== undefined ? withColors(own, e.colors) : dataEdgeStyle(e, ctx.theme);\n const markerStart = style.markerStart ?? null;\n const markerEnd = style.markerEnd === undefined ? 'arrow' : style.markerEnd;\n const split = ctx.splits?.get(id);\n specs.push({\n id: id as never,\n kind: 'mark',\n layer: 'main',\n pickable: false,\n pose: { x: 0, y: 0, width: 0, height: 0 },\n data: {\n diagram: {\n from: endOf(e.fromPort, fromPort),\n to: endOf(e.toPort, toPort),\n router,\n ...(waypoints ? { waypoints } : {}),\n ...(laidOut ? { laidOut: waypoints } : {}),\n ...(e.style !== undefined ? { style: e.style } : {}),\n ...ownEdgeStyle(e.colors),\n ...(split !== undefined ? { offPage: split } : {}),\n },\n stroke: {\n paint: { color: style.stroke },\n width: style.width ?? EDGE_STROKE_WIDTH,\n ...(style.dash ? { dash: style.dash } : {}),\n ...(markerStart !== null ? { markerStart } : {}),\n ...(markerEnd !== null ? { markerEnd } : {}),\n },\n },\n dependsOn: [e.from as never, e.to as never],\n derivePath: EDGE_DERIVE_PATH,\n });\n if (!e.label) continue;\n specs.push(edgeLabelSpec(id, e.label, {\n layer: 'main',\n label: placementOf(e, route, ctx),\n style: labelStyleOf(ctx.labelFont ?? ctx.font),\n fill: style.label ?? style.stroke,\n measure: ctx.measure,\n }) as DiagramSpec);\n }\n return specs;\n}\n","/**\n * `diagramScene` — a laid-out diagram from plain `{ nodes, edges }`.\n *\n * Every box is a `buildBody` body, so a data node can say anything a body\n * can: outline, rows, padding, ports. Sizes are estimated from character\n * counts unless `measure` is given, so layout runs without a canvas and gives\n * the same answer in node and in a browser.\n */\nimport { RIGID_POSE_COMPOSITION, localizeWorldPoses, type RectPose } from '@weasel-js/core';\nimport { DEFAULT_GROUP_INSET, expandGroupEdges } from './cluster';\nimport { placeContainers, containerSpecs } from './dataContainerPlace';\nimport { containerLayoutNodes, resolveContainers, type ContainerLayout } from './dataContainers';\nimport { groupSpecs, resolveGroups, type ResolvedGroup } from './dataGroups';\nimport { bodyLayoutOf } from './bodyRelayout';\nimport { bodyTrait, measureBody, sizeToBody, type BodySpec, type MeasureRowText, type Row, type RowTextStyle } from './body';\nimport { buildBody } from './buildBody';\nimport { edgeIdOf } from './edgeId';\nimport { ownNodeStyle, withColors } from './dataColors';\nimport { dataNodeStyle } from './dataStyles';\nimport { scenePageSplits } from './dataPages';\nimport { edgeSpecs, wireLabels } from './dataEdges';\nimport {\n DEFAULT_NODE_STYLE, NODE_STROKE_WIDTH,\n type DataEdge, type DataGroup, type DataNode, type DiagramData, type DiagramSceneData, type DiagramSceneOptions, type DiagramSpec,\n type NodeStyle,\n} from './dataTypes';\nimport { DEFAULT_FONT, GLYPH, labelSize, labelStyleOf } from './edgeLabel';\nimport { force } from './force';\nimport { grownBy } from './footprint';\nimport { graphOf, labelFollowsLayout, type EdgeLabelRoom, type GraphEdge, type GraphGroup, type GraphNode } from './graph';\nimport { LABEL_PLACEMENT } from './labelTrait';\nimport { chain } from './chain';\nimport { rowTextStyle, textFace, type DiagramTextStyle } from './rowStyle';\nimport { layered } from './layered';\nimport { planOf, type LayoutFn, type LayoutOptions, type LayoutPlan } from './layout';\nimport { markSpecs } from './marks';\nimport { authoredOver } from './route';\nimport { diagramThemeFrom, themeFont, themeLabelFont } from './theme/resolve';\nimport { offPageTagLook } from './offPage/tag';\nimport { tree } from './tree';\nimport type { Vec2 } from '@weasel-js/core/math';\n\nexport type { DiagramTextStyle };\nexport { DEFAULT_NODE_STYLE };\nexport type {\n DataEdge, DataGroup, DataNode, DiagramData, DiagramRouter, DiagramSceneData, DiagramSceneOptions, DiagramSpec, EdgeStyle, NodeStyle,\n} from './dataTypes';\n\n/** The frame an empty slot with an id draws, in the unit square a mark is drawn in. */\nexport const SLOT_FRAME = 'M0 0H1V1H0Z';\n\n/** What a group is drawn with when there is no theme and nothing says otherwise. */\nexport const DEFAULT_GROUP_STYLE: NodeStyle = { fill: 'rgba(123, 167, 199, 0.08)', stroke: '#7ba7c7', text: '#9fbdd6', strokeWidth: 1, dash: [4, 3] };\nexport { LABEL_PLACEMENT };\nconst LINE = 1.4;\nconst MIN_WIDTH = 64;\nconst LAYOUTS = { layered, tree, force, chain } as const;\n\nexport { edgeIdOf };\n\n/** The room an edge's label asks layout for: none when the edge puts its\n * label somewhere layout does not station it, or routes itself through\n * waypoints of its own. */\nfunction labelRoomOf(e: DataEdge, opts: DiagramSceneOptions, font: { fontFamily: string; fontSize: number },\n measure: MeasureRowText): EdgeLabelRoom | null {\n if (!e.label || e.waypoints !== undefined) return null;\n if (e.labelPlacement !== undefined && !labelFollowsLayout(e.labelPlacement.at)) return null;\n const style = labelStyleOf(font);\n const offset = (e.labelPlacement ?? opts.labelPlacement ?? LABEL_PLACEMENT).offset;\n return { ...labelSize(e.label, style, measure), ...(offset !== undefined ? { offset } : {}) };\n}\n\n/** A data edge as layout reads it: its ends, the ports it names, and the room\n * its label asks for. */\nfunction graphEdgeOf(e: DataEdge, room: EdgeLabelRoom | null): GraphEdge {\n return {\n id: edgeIdOf(e),\n from: e.from,\n to: e.to,\n ...(e.fromPort ? { fromPort: e.fromPort } : {}),\n ...(e.toPort ? { toPort: e.toPort } : {}),\n ...(room !== null ? { label: room } : {}),\n };\n}\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/** A node's box, its rows' text and slots, and its port labels, laid out in `box`. */\nfunction nodeSpecs(\n n: DataNode, body: BodySpec, box: { x: number; y: number; width: number; height: number },\n look: { style: NodeStyle; text: (row: Row | undefined) => DiagramTextStyle; measure: MeasureRowText },\n): DiagramSpec[] {\n const { style } = look;\n const textData = (text: string, row: Row | undefined): DiagramSceneData =>\n ({ text, style: look.text(row), fill: { paint: { color: style.text } } });\n const built = buildBody<DiagramSceneData, 'main', RectPose>(body, box, {\n id: n.id,\n layer: 'main',\n measure: look.measure,\n body: (trait) => ({\n diagram: {\n ...trait, ...bodyLayoutOf(body, trait, look.measure), ...(n.pinned === true ? { pinned: true } : {}), ...(n.style !== undefined ? { style: n.style } : {}),\n ...ownNodeStyle(n.colors),\n },\n fill: { paint: { color: style.fill } },\n stroke: { paint: { color: style.stroke }, width: style.strokeWidth ?? NODE_STROKE_WIDTH, ...(style.dash ? { dash: style.dash } : {}) },\n }),\n row: (text, at) =>\n at.row.kind === 'slot'\n ? (at.row.id === undefined ? null : { diagram: { mark: { d: SLOT_FRAME } }, stroke: { paint: { color: style.stroke }, width: 1 } })\n : text === '' ? null : { ...textData(text, at.row), bodyRow: at.index },\n portLabel: (text) => textData(text, undefined),\n });\n return built.specs.map((s, k) => ({ ...s, ...(s.id !== undefined ? {} : { id: `${n.id}/${k}` }) }) as DiagramSpec);\n}\n\n/** Every spec carries an id — a node's own, `<id>/<k>` for its text,\n * `<id>/mark:<i>` for its marks, `<edge id>/label`, a group's own and\n * `<group id>/label`, a region's own and `<region id>/title` — so a later call's\n * specs can be reconciled against this one's. Throws on a repeated id among\n * nodes, groups, containers and lanes, which names two things as one. An edge whose\n * end is not a node is dropped, and so is a repeat of an earlier edge with\n * the same ends, ports and label: it would draw exactly on top of the first. */\nexport function diagramScene<TLayer extends string>(data: DiagramData, opts: DiagramSceneOptions<TLayer> & { layer: TLayer }): DiagramSpec<TLayer>[];\nexport function diagramScene(data: DiagramData, opts?: DiagramSceneOptions): DiagramSpec[];\nexport function diagramScene<TLayer extends string>(data: DiagramData, opts: DiagramSceneOptions<TLayer> = {}): DiagramSpec<TLayer>[] {\n const { layer, composition = RIGID_POSE_COMPOSITION, ...rest } = opts;\n // Laid out in world; each spec is stored in its container's frame.\n const specs = localizeWorldPoses(mainSpecs(data, rest), composition);\n return (layer === undefined ? specs : specs.map((s) => ({ ...s, layer }))) as DiagramSpec<TLayer>[];\n}\n\n/** {@link diagramScene}'s specs, on `main`. */\nfunction mainSpecs(data: DiagramData, opts: DiagramSceneOptions): DiagramSpec[] {\n const { theme } = opts;\n const font = opts.font ?? (theme ? themeFont(theme) : DEFAULT_FONT);\n const labelFont = theme ? themeLabelFont(theme, font) : font;\n const styleOf = (s: RowTextStyle | undefined) => textFace(s, font);\n const measure: MeasureRowText = opts.measure\n ? (text, s) => opts.measure!(text, { ...s, fontFamily: s.fontFamily ?? font.fontFamily, fontSize: s.fontSize ?? font.fontSize })\n : (text, s) => {\n const size = s.fontSize ?? font.fontSize;\n return { width: text.length * GLYPH * size, height: Math.ceil(LINE * size) };\n };\n\n const ids = new Set<string>();\n for (const n of data.nodes) {\n if (ids.has(n.id)) throw new Error(`diagramScene: node id \"${n.id}\" appears more than once`);\n ids.add(n.id);\n }\n const nodeIds = new Set(ids);\n const pad = opts.groupPadding ?? DEFAULT_GROUP_INSET;\n const regions = resolveContainers(data.containers ?? [], ids, nodeIds);\n // A region is a node's scene parent and a group only gathers it for layout and draws around it: a\n // node in both would have two owners whose boxes disagree, so the data is refused rather than guessed at.\n for (const g of data.groups ?? []) {\n for (const m of g.members) {\n const region = nodeIds.has(m) ? regions.parentOf.get(m) : undefined;\n if (region !== undefined) throw new Error(`diagramScene: node \"${m}\" is in group \"${g.id}\" and in region \"${region}\"; a node may be in one or the other`);\n }\n }\n const boxes = containerLayoutNodes(regions, { padding: pad, seed: (k) => ({ x: data.nodes.length + k, y: data.nodes.length + k }) });\n const titleStyle = { ...font, fontSize: font.fontSize - 1 };\n const groups = resolveGroups(data.groups ?? [], ids, new Set([...nodeIds].filter((id) => !boxes.hidden.has(id))), {\n padding: pad,\n title: (text) => measure(text, titleStyle),\n });\n const seen = new Set<string>();\n const edges = data.edges.filter((e) => {\n const id = edgeIdOf(e);\n if (seen.has(id) || !ids.has(e.from) || !ids.has(e.to)) return false;\n seen.add(id);\n return true;\n });\n\n const bodies = data.nodes.map((n) => ({\n outline: n.outline ?? opts.outline ?? 'rect',\n rows: n.rows ?? (n.lines ?? []).map((text): Row => ({ kind: 'label', text })),\n padding: n.padding ?? opts.padding ?? 8,\n gap: n.gap ?? opts.gap ?? 4,\n verticalAlign: n.verticalAlign ?? opts.verticalAlign ?? 'center',\n ...(n.ports ? { ports: n.ports } : {}),\n ...(n.portLabels ? { portLabels: n.portLabels } : {}),\n }));\n // Seeded on the diagonal in source order, so whichever axis a layout reads\n // for in-rank order, it starts from the data's own order.\n const seeds: GraphNode[] = data.nodes.map((n, i) => {\n const pose = sizeToBody(\n { ...(n.at ?? { x: i, y: i }), width: n.width ?? opts.minWidth ?? MIN_WIDTH, height: n.height ?? 0 },\n measureBody(bodies[i]!, measure),\n );\n const { ports, outline, margin } = bodyTrait(bodies[i]!, pose, measure);\n return { id: n.id, bounds: pose, pinned: n.pinned === true, ...(ports !== undefined ? { ports } : {}),\n ...(outline !== undefined ? { outline } : {}), ...(margin !== undefined ? { margin } : {}) };\n });\n const laid = layOut(seeds, edges, groups, boxes, opts, (e) => labelRoomOf(e, opts, labelFont, measure));\n\n const specs: DiagramSpec[] = [];\n const sizes = new Map(data.nodes.map((n, i) => [n.id, { ...seeds[i]!.bounds, ...(n.at ? { at: n.at } : {}),\n ...(seeds[i]!.margin ? { margin: seeds[i]!.margin } : {}) }]));\n const placedAt = new Map([...laid.placed, ...placeContainers(regions, boxes, laid.placed, sizes, pad)]);\n // The author's own ports and waypoints win over the plan's; an edge layout ranked against a region keeps none of the plan's.\n const routes = laid.plan === null ? null\n : authoredOver(edges.filter((e) => !laid.remapped.has(e)).map((e) => ({ ...e, id: edgeIdOf(e) })), laid.plan);\n const edgeCtx = { idOf: edgeIdOf, font, labelFont, measure, labelPlacement: LABEL_PLACEMENT, routes, opts, ...(theme ? { theme } : {}) };\n const groupLook = (g: DataGroup) => ({ style: opts.groupStyle?.(g) ?? theme?.container ?? DEFAULT_GROUP_STYLE, text: styleOf(titleStyle) });\n const footprints = new Map([...placedAt, ...seeds.map((s) => [s.id, grownBy(placedAt.get(s.id)!, s.margin)] as const)]);\n // Regions and group boxes first, so a box never paints over what it holds.\n specs.push(...containerSpecs(regions, placedAt, theme, font.fontFamily));\n specs.push(...groupSpecs(groups, footprints, groupLook, wireLabels(edges, edgeCtx)));\n for (const [i, n] of data.nodes.entries()) {\n const seed = seeds[i]!.bounds;\n const at = placedAt.get(n.id)!;\n const own = opts.nodeStyle?.(n);\n const style = own !== undefined ? withColors(own, n.colors) : dataNodeStyle(n, theme);\n const parent = regions.parentOf.get(n.id);\n const built = nodeSpecs(n, bodies[i]!, { x: at.x, y: at.y, width: seed.width, height: seed.height }, { style, text: (row) => rowTextStyle(row, font), measure });\n specs.push(...(parent === undefined ? built : built.map((s) => (s.id === n.id ? { ...s, parent: parent as never } : s))));\n if (n.marks) specs.push(...markSpecs(n.id, n.marks, at, { style, textStyle: styleOf, measure }));\n }\n const pages = scenePageSplits(data, placedAt, specs, edges.map((e) => ({ id: edgeIdOf(e), from: e.from, to: e.to })),\n () => ({ ...offPageTagLook(theme ?? diagramThemeFrom(undefined)), measure }));\n specs.push(...edgeSpecs(edges, pages === null ? edgeCtx : { ...edgeCtx, splits: pages.splits }), ...(pages?.tags ?? []));\n return specs;\n}\n\n/**\n * Lay out what layout sees: every node outside a boxed region, each outermost\n * boxed region as one node, and the groups and fitted containers around\n * them. An edge with an end inside a boxed region ranks against the\n * outermost one, and one with both ends inside the same one ranks nothing.\n */\nfunction layOut(\n seeds: readonly GraphNode[],\n edges: readonly DataEdge[],\n groups: readonly ResolvedGroup[],\n boxes: ContainerLayout,\n opts: DiagramSceneOptions,\n room: (e: DataEdge) => EdgeLabelRoom | null,\n): { placed: Map<string, Rect>; plan: LayoutPlan | null; remapped: ReadonlySet<DataEdge> } {\n const graphGroups: GraphGroup[] = [...groups.map((g) => ({\n id: g.group.id,\n members: g.members,\n inset: g.inset,\n ...(g.minWidth !== undefined ? { minWidth: g.minWidth } : {}),\n ...(g.parent !== undefined ? { parent: g.parent } : {}),\n ...(g.group.reorder !== undefined ? { ordered: g.direct } : {}),\n })), ...boxes.groups];\n const visible = [...seeds.filter((s) => !boxes.hidden.has(s.id)), ...boxes.nodes];\n const seedOf = new Map(visible.map((n) => [n.id, n]));\n for (const [id, group] of boxes.groupOf) seedOf.get(id)!.group = group;\n for (const g of groups) {\n for (const m of g.direct) {\n const seed = seedOf.get(m);\n if (seed !== undefined) seed.group = g.group.id;\n }\n }\n const remapped = new Set<DataEdge>();\n const graphEdges = edges.flatMap((e): GraphEdge[] => {\n const edge = graphEdgeOf(e, room(e));\n const from = boxes.endOf(e.from);\n const to = boxes.endOf(e.to);\n if (from === e.from && to === e.to) return [edge];\n remapped.add(e);\n if (from === to) return [];\n const { fromPort: _f, toPort: _t, ...rest } = edge;\n return [{ ...rest, from, to, ...(from === e.from && e.fromPort ? { fromPort: e.fromPort } : {}),\n ...(to === e.to && e.toPort ? { toPort: e.toPort } : {}) }];\n });\n const graph = graphOf(visible, expandGroupEdges(graphEdges, graphGroups), graphGroups);\n const layout: LayoutFn | null = typeof opts.layout === 'function' ? opts.layout\n : opts.layout === 'none' ? null\n : LAYOUTS[opts.layout ?? 'layered'];\n const layoutOptions: LayoutOptions = { order: 'barycenter', ...opts.layoutOptions };\n const plan = layout === null ? null : planOf(layout, graph, layoutOptions);\n const moved = plan?.moves ?? new Map<string, Vec2>();\n const placed = new Map(visible.map((n) => {\n const at = moved.get(n.id) ?? n.bounds;\n return [n.id, { x: at.x, y: at.y, width: n.bounds.width, height: n.bounds.height }];\n }));\n return { placed, plan: layout?.plan === undefined ? null : plan, remapped };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/group.ts","../src/containers/trait.ts","../src/containers/titlePose.ts","../src/containers/containerLayout.ts","../src/containers/laneStack.ts","../src/containers/layouts.ts","../src/labelTrait.ts","../src/label.ts","../src/keyedIndex.ts","../src/labelDragLayer.ts","../src/edgeLabel.ts","../src/theme/themes.ts","../src/theme/types.ts","../src/theme/resolve.ts","../src/offPage/trait.ts","../src/offPage/tag.ts","../src/selfLoop.ts","../src/hops/draw.ts","../src/routers.ts","../src/edge.ts","../src/bodyRelayout.ts","../src/dataTypes.ts","../src/containers/regionSpecs.ts","../src/dataColors.ts","../src/dataStyles.ts","../src/edgeId.ts","../src/offPage/split.ts","../src/dataPages.ts","../src/groupTree.ts","../src/graph.ts","../src/rowStyle.ts","../src/marks.ts","../src/dataContainers.ts","../src/dataContainerPlace.ts","../src/dataGroups.ts","../src/dataEdges.ts","../src/fromData.ts"],"names":["traitOf","createTransformOp","AUTO_POSE_DESCRIPTOR","center","translatePoseViaDescriptor","pageName","facing","PathBuilder","polylineFromPoints","stubTip","endOf","sizes","out","wireLabels","LINE"],"mappings":"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","file":"chunk-DE7UILJA.js","sourcesContent":["/**\n * A group's box, and anything pinned to a point on another node.\n *\n * The box is an ordinary node that depends on its members and derives its pose\n * from theirs: their union, grown by the inset. Drag a member and the box\n * follows; lay the diagram out and the box lands around wherever the members\n * went. Nothing has to keep it in sync, because nothing stores it.\n *\n * An anchored node — a group's title is the first — derives its pose from one\n * dependency's bounds the same way, so it travels with the box it labels.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n translatePoseViaDescriptor,\n type DerivedDep,\n type PoseDescriptor,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { insetOf, type GroupInset } from './cluster';\nimport { grownBy } from './footprint';\nimport { DIAGRAM_TRAIT_KEY } from './trait';\nimport type { DiagramGroup, PortAnchor } from './types';\n\n/** Where an anchored node sits on its dependency. */\nexport interface DiagramAnchor {\n /** The point on the dependency's bounds, normalized as a port's is. */\n at: PortAnchor;\n /** The point on the node's own bounds that lands there. Default `at`, so\n * `{ u: 0, v: 0 }` puts the node's top-left on the dependency's. */\n self?: PortAnchor;\n /** Then moved by this much, in world units. */\n offset?: Vec2;\n}\n\nfunction traitOf(node: { data: unknown }): Record<string, unknown> | null {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const trait = (data as Record<string, unknown>)[DIAGRAM_TRAIT_KEY];\n return trait !== null && typeof trait === 'object' ? (trait as Record<string, unknown>) : null;\n}\n\n/** The group trait on a node's data, or `null`. */\nexport function diagramGroupOf(node: { data: unknown }): DiagramGroup | null {\n const group = traitOf(node)?.group;\n return group !== null && typeof group === 'object' ? (group as DiagramGroup) : null;\n}\n\n/** The anchor trait on a node's data, or `null`. */\nexport function diagramAnchorOf(node: { data: unknown }): DiagramAnchor | null {\n const anchor = traitOf(node)?.anchor;\n return anchor !== null && typeof anchor === 'object' && 'at' in anchor ? (anchor as DiagramAnchor) : null;\n}\n\n/** Options for {@link groupDerivePose} and {@link anchorDerivePose}.\n * `geometry` defaults to the kit's `AUTO_POSE_DESCRIPTOR`. */\nexport interface GroupPoseOptions<TPose> {\n geometry?: PoseDescriptor<TPose>;\n}\n\n/** A `derivePose` function as the scene calls it: the node, then what it depends on, in `dependsOn` order. */\nexport type DiagramDerivePose<TPose> = (\n node: { pose: TPose; data: unknown },\n deps: readonly (DerivedDep<TPose> | undefined)[],\n) => TPose | null;\n\n/**\n * A `derivePose` that draws a group's box around its members: the union of\n * what each takes up, its `margin` included, grown by the trait's inset. `null` — the authored pose stands — when the node\n * carries no group trait or every member is gone.\n */\nexport function groupDerivePose<TPose>(opts: GroupPoseOptions<TPose> = {}): DiagramDerivePose<TPose> {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n return (node, deps) => {\n const group = diagramGroupOf(node);\n if (group === null) return null;\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n for (const dep of deps) {\n if (dep === undefined) continue;\n const b = grownBy(geometry.getBounds(dep.pose), traitOf(dep.node)?.margin as GroupInset | undefined);\n x0 = Math.min(x0, b.x);\n y0 = Math.min(y0, b.y);\n x1 = Math.max(x1, b.x + b.width);\n y1 = Math.max(y1, b.y + b.height);\n }\n if (!Number.isFinite(x0)) return null;\n return geometry.fromBounds(boxAround({ x: x0, y: y0, width: x1 - x0, height: y1 - y0 }, group), node.pose);\n };\n}\n\n/** A group's box around the union of its members: grown by its inset, and\n * widened evenly to its `minWidth`. */\nexport function boxAround(\n union: { x: number; y: number; width: number; height: number },\n group: DiagramGroup,\n): { x: number; y: number; width: number; height: number } {\n const inset = insetOf(group.inset);\n const width = union.width + inset.left + inset.right;\n const grow = Math.max(0, (group.minWidth ?? 0) - width);\n return {\n x: union.x - inset.left - grow / 2,\n y: union.y - inset.top,\n width: width + grow,\n height: union.height + inset.top + inset.bottom,\n };\n}\n\n/**\n * A `derivePose` that keeps a node at a point on its dependency's bounds.\n * `null` when the node carries no anchor trait or the dependency is gone.\n */\nexport function anchorDerivePose<TPose>(opts: GroupPoseOptions<TPose> = {}): DiagramDerivePose<TPose> {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n return (node, deps) => {\n const anchor = diagramAnchorOf(node);\n const dep = deps[0];\n if (anchor === null || dep === undefined) return null;\n const target = geometry.getBounds(dep.pose);\n const own = geometry.getBounds(node.pose);\n const self = anchor.self ?? anchor.at;\n const x = target.x + anchor.at.u * target.width + (anchor.offset?.x ?? 0) - self.u * own.width;\n const y = target.y + anchor.at.v * target.height + (anchor.offset?.y ?? 0) - self.v * own.height;\n return translatePoseViaDescriptor(node.pose, x - own.x, y - own.y, geometry);\n };\n}\n\n/** Registry key for {@link GROUP_DERIVE_POSE}. */\nexport const DIAGRAM_GROUP = 'diagram:group';\n/** Registry key for {@link ANCHOR_DERIVE_POSE}. */\nexport const DIAGRAM_ANCHOR = 'diagram:anchor';\n\n/** The default group derivation, a stable reference so `toJSON` can find its key. */\nexport const GROUP_DERIVE_POSE = groupDerivePose<unknown>();\n/** The default anchor derivation, a stable reference for the same reason. */\nexport const ANCHOR_DERIVE_POSE = anchorDerivePose<unknown>();\n","/**\n * The container trait: what makes a core `GroupNode` a diagram container,\n * a pool, or one of a pool's lanes, and where its header is.\n *\n * A container's title is a text child in its header, named\n * `<container id>/title`. The layouts find it by that name, because a layout\n * strategy sees only ids and poses.\n */\nimport type { Outline } from '../outline';\nimport { DIAGRAM_TRAIT_KEY } from '../trait';\n\n/** Which kind of region a container is. */\nexport type ContainerRole = 'container' | 'pool' | 'lane';\n\n/** The strip a container's title sits in, along one side. */\nexport interface ContainerHeader {\n side: 'top' | 'left';\n /** Its depth into the container, in world units. */\n size: number;\n}\n\n/** The container half of a diagram node's trait, under `data.diagram.container`. */\nexport interface DiagramContainer {\n role: ContainerRole;\n header?: ContainerHeader;\n /** Its box is fitted to its members each time the diagram is built from data\n * (`DataContainer` with no `box`), so a move that carries it along is no edit of its own. */\n fitted?: true;\n /** A container whose members are reordered along this axis (`DataContainer.reorder`). */\n reorder?: 'x' | 'y';\n}\n\ntype Box = { x: number; y: number; width: number; height: number };\n\nfunction traitOf(node: { data: unknown }): Record<string, unknown> | null {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const trait = (data as Record<string, unknown>)[DIAGRAM_TRAIT_KEY];\n return trait !== null && typeof trait === 'object' ? (trait as Record<string, unknown>) : null;\n}\n\n/** The container trait on a node's data, or `null`. */\nexport function diagramContainerOf(node: { data: unknown }): DiagramContainer | null {\n const c = traitOf(node)?.container;\n return c !== null && typeof c === 'object' && typeof (c as DiagramContainer).role === 'string'\n ? (c as DiagramContainer)\n : null;\n}\n\n/** The outline a lane draws. A lane takes no connectors, so the participant\n * reader passes over it, and the shape painter asks here instead. */\nexport function laneOutlineOf(node: { data: unknown }): Outline | undefined {\n if (diagramContainerOf(node)?.role !== 'lane') return undefined;\n return traitOf(node)?.outline as Outline | undefined;\n}\n\n/** The id of a container's title node. */\nexport const titleIdOf = (containerId: string): string => `${containerId}/title`;\n\n/** The header strip of a container at `bounds`; null with no header. */\nexport function headerBox(bounds: Box, header: ContainerHeader | undefined): Box | null {\n if (header === undefined) return null;\n return header.side === 'top'\n ? { x: bounds.x, y: bounds.y, width: bounds.width, height: Math.min(header.size, bounds.height) }\n : { x: bounds.x, y: bounds.y, width: Math.min(header.size, bounds.width), height: bounds.height };\n}\n\n/** What a container at `bounds` holds members in: everything past its header. */\nexport function bodyBox(bounds: Box, header: ContainerHeader | undefined): Box {\n const h = headerBox(bounds, header);\n if (h === null) return { ...bounds };\n return header!.side === 'top'\n ? { x: bounds.x, y: bounds.y + h.height, width: bounds.width, height: bounds.height - h.height }\n : { x: bounds.x + h.width, y: bounds.y, width: bounds.width - h.width, height: bounds.height };\n}\n","import type { RectPose } from '@weasel-js/core';\nimport { headerBox, type ContainerHeader } from './trait';\n\ntype Box = { x: number; y: number; width: number; height: number };\n\n/** Where a container's title sits: its header strip, turned a quarter to run\n * up a left header. */\nexport function titlePose(bounds: Box, header: ContainerHeader | undefined): RectPose {\n const h = headerBox(bounds, header) ?? { ...bounds, height: 0 };\n if (header?.side !== 'left') return { x: h.x, y: h.y, width: h.width, height: h.height };\n const cx = h.x + h.width / 2;\n const cy = h.y + h.height / 2;\n return { x: cx - h.height / 2, y: cy - h.width / 2, width: h.height, height: h.width, rotation: -Math.PI / 2 };\n}\n\n/** {@link titlePose} as the title is stored: in its container's own frame. */\nexport function titleInFrame(size: { width: number; height: number }, header: ContainerHeader | undefined): RectPose {\n return titlePose({ x: 0, y: 0, width: size.width, height: size.height }, header);\n}\n","/**\n * `diagramContainerLayout` — free placement under a header. A member stays\n * wherever it is dropped or the container is resized to; only the title is\n * placed, in the header.\n *\n * A strategy sees ids and poses, never data, so it cannot tell a lane from a\n * shape. Which nodes a container admits is `diagramCanDropInto`'s call.\n */\nimport { createTransformOp, type LayoutStrategy, type RectPose } from '@weasel-js/core';\nimport { titlePose } from './titlePose';\nimport { bodyBox, titleIdOf, type ContainerHeader } from './trait';\n\n/** Options for {@link diagramContainerLayout}. */\nexport interface ContainerLayoutOptions {\n /** Where the title sits; matches the container trait's own `header`. */\n header?: ContainerHeader;\n}\n\nconst center = (p: RectPose) => ({ x: p.x + p.width / 2, y: p.y + p.height / 2 });\n\n/** The title's pose when it is not already there; nothing else is placed. */\nexport function titlePoses(\n container: { id: string; bounds: { x: number; y: number; width: number; height: number } },\n children: readonly { id: string; pose: RectPose }[],\n header: ContainerHeader | undefined,\n): Map<string, RectPose> {\n const out = new Map<string, RectPose>();\n const title = children.find((c) => c.id === titleIdOf(container.id));\n if (title !== undefined) out.set(title.id, titlePose(container.bounds, header));\n return out;\n}\n\n/** A free-placement layout whose drops land in the body below or beside `header`. */\nexport function diagramContainerLayout(opts: ContainerLayoutOptions = {}): LayoutStrategy<RectPose> {\n const { header } = opts;\n return {\n snap: { pickTarget: (targets) => targets[0] ?? null },\n childPoses: (container, children) => titlePoses(container, children, header),\n getDropTargets: (_container, _children, dragged) => [{ pose: dragged.pose, origin: center(dragged.pose) }],\n reflowPoses: () => new Map(),\n commitDrop: (_container, _children, dragged, target) => [createTransformOp<RectPose>({\n id: dragged.id, from: dragged.originPose, to: target?.pose ?? dragged.pose, label: 'Drop',\n })],\n dropRegion(container) {\n const b = container.bounds;\n const body = bodyBox(b, header);\n return { kind: 'rect', x: body.x - b.x, y: body.y - b.y, width: body.width, height: body.height };\n },\n };\n}\n","/**\n * `laneStackLayout` — a pool's lanes, stacked along one axis in the order they\n * sit and stretched across the body past the header. The pool's size along\n * the stack is the sum of its lanes; its size across is the author's.\n *\n * Like every strategy it sees ids and poses only: the title is told apart by\n * its name, and which nodes a pool admits (lanes) is `diagramCanDropInto`'s call.\n */\nimport {\n createTransformOp,\n type ContainerBounds,\n type LayoutArrival,\n type LayoutChild,\n type LayoutContainer,\n type LayoutStrategy,\n type Op,\n type RectPose,\n} from '@weasel-js/core';\nimport { titlePose } from './titlePose';\nimport { bodyBox, titleIdOf, type ContainerHeader } from './trait';\n\n/** Options for {@link laneStackLayout}. */\nexport interface LaneStackOptions {\n /** The axis lanes stack along: `'y'` for a pool of rows, `'x'` for columns. */\n axis: 'x' | 'y';\n /** The header's depth, across the stack. Default {@link POOL_HEADER_SIZE}. */\n headerSize?: number;\n}\n\n/** A pool header's default depth. */\nexport const POOL_HEADER_SIZE = 32;\n/** The least a lane is along the stack. */\nexport const MIN_LANE_SIZE = 40;\n\ntype Lane = LayoutChild<RectPose>;\n\n/** The header a pool stacking along `axis` has: across the stack, at its start. */\nexport const poolHeader = (axis: 'x' | 'y', size = POOL_HEADER_SIZE): ContainerHeader =>\n ({ side: axis === 'y' ? 'left' : 'top', size });\n\n/** Where lanes of the given sizes sit, in order, in a pool at `bounds`. */\nexport function stackedLanes(\n axis: 'x' | 'y',\n bounds: ContainerBounds,\n header: ContainerHeader,\n lanes: readonly { id: string; size: number }[],\n): Map<string, RectPose> {\n const body = bodyBox(bounds, header);\n const out = new Map<string, RectPose>();\n let at = axis === 'y' ? bounds.y : bounds.x;\n for (const { id, size } of lanes) {\n out.set(id, axis === 'y'\n ? { x: body.x, y: at, width: body.width, height: size }\n : { x: at, y: body.y, width: size, height: body.height });\n at += size;\n }\n return out;\n}\n\n/** A pool stacking its lanes along `axis`. */\nexport function laneStackLayout(opts: LaneStackOptions): LayoutStrategy<RectPose> {\n const { axis } = opts;\n const header = poolHeader(axis, opts.headerSize);\n const along = (p: { width: number; height: number }) => (axis === 'y' ? p.height : p.width);\n const mid = (p: RectPose) => (axis === 'y' ? p.y + p.height / 2 : p.x + p.width / 2);\n const lanesOf = (container: LayoutContainer, children: readonly Lane[], skip?: string) =>\n children.filter((c) => c.id !== titleIdOf(container.id) && c.id !== skip).sort((a, b) => mid(a.pose) - mid(b.pose));\n const sized = (lanes: readonly Lane[]) => lanes.map((l) => ({ id: l.id, size: along(l.pose) }));\n const withTitle = (container: LayoutContainer, children: readonly Lane[], poses: Map<string, RectPose>, bounds = container.bounds) => {\n if (children.some((c) => c.id === titleIdOf(container.id))) poses.set(titleIdOf(container.id), titlePose(bounds, header));\n return poses;\n };\n /** The pool sized to hold `lanes`, and where they sit in it. */\n const resized = (container: LayoutContainer, children: readonly Lane[], lanes: readonly Lane[]): LayoutArrival<RectPose> => {\n const sizes = sized(lanes);\n const total = Math.max(MIN_LANE_SIZE, sizes.reduce((s, l) => s + l.size, 0));\n const bounds = axis === 'y' ? { ...container.bounds, height: total } : { ...container.bounds, width: total };\n return { poses: withTitle(container, children, stackedLanes(axis, bounds, header, sizes), bounds), bounds };\n };\n const insertAt = (container: LayoutContainer, children: readonly Lane[], dragged: Lane, index: number) => {\n const sizes = sized(lanesOf(container, children, dragged.id));\n sizes.splice(index, 0, { id: dragged.id, size: along(dragged.pose) });\n return stackedLanes(axis, container.bounds, header, sizes);\n };\n const shifted: LayoutStrategy<RectPose>['reflowPoses'] = (container, children, dragged, target) => {\n if (target === null) return new Map();\n const poses = insertAt(container, children, dragged, (target.meta as { index: number }).index);\n poses.delete(dragged.id);\n return poses;\n };\n\n return {\n snap: {\n pickTarget(targets, pointer) {\n const p = axis === 'y' ? pointer.y : pointer.x;\n let best = null;\n for (const t of targets) {\n if (best === null || Math.abs(t.origin[axis] - p) < Math.abs(best.origin[axis] - p)) best = t;\n }\n return best;\n },\n },\n\n childPoses(container, children) {\n const sizes = sized(lanesOf(container, children));\n const last = sizes[sizes.length - 1];\n if (last !== undefined) {\n const slack = along(container.bounds) - sizes.reduce((s, l) => s + l.size, 0);\n last.size = Math.max(MIN_LANE_SIZE, last.size + slack);\n }\n return withTitle(container, children, stackedLanes(axis, container.bounds, header, sizes));\n },\n\n getDropTargets(container, children, dragged) {\n const count = lanesOf(container, children, dragged.id).length;\n const self = { id: dragged.id, pose: dragged.pose };\n const targets = [];\n for (let index = 0; index <= count; index++) {\n const pose = insertAt(container, children, self, index).get(dragged.id)!;\n targets.push({ pose, origin: { x: pose.x + pose.width / 2, y: pose.y + pose.height / 2 }, meta: { index } });\n }\n return targets;\n },\n\n reflowPoses: shifted,\n\n commitDrop(container, children, dragged, target) {\n const ops: Op[] = [];\n const poses = shifted(container, children, dragged, target);\n for (const c of children) {\n const to = poses.get(c.id);\n if (to !== undefined && (to.x !== c.pose.x || to.y !== c.pose.y)) {\n ops.push(createTransformOp<RectPose>({ id: c.id, from: c.pose, to, label: 'Shift lane' }));\n }\n }\n ops.push(createTransformOp<RectPose>({\n id: dragged.id, from: dragged.originPose, to: target?.pose ?? dragged.pose, label: 'Move lane',\n }));\n return ops;\n },\n\n arrive: (container, children) => resized(container, children, lanesOf(container, children)),\n depart: (container, children) => resized(container, children, lanesOf(container, children)),\n\n dropRegion(container) {\n const b = container.bounds;\n const body = bodyBox(b, header);\n return { kind: 'rect', x: body.x - b.x, y: body.y - b.y, width: body.width, height: body.height };\n },\n\n releaseDrop: () => [],\n };\n}\n","/**\n * The container layouts by registry key, as stable references so a saved\n * scene finds them again (`withDiagramRegistry`).\n */\nimport type { LayoutStrategy, RectPose } from '@weasel-js/core';\nimport { diagramContainerLayout } from './containerLayout';\nimport { laneStackLayout, poolHeader } from './laneStack';\nimport type { ContainerHeader, ContainerRole } from './trait';\n\n/** A plain container's header. */\nexport const CONTAINER_HEADER: ContainerHeader = { side: 'top', size: 28 };\n/** A lane's header depth, across its pool's stack. */\nexport const LANE_HEADER_SIZE = 28;\n\n/** The header a lane of a pool stacking along `axis` has. */\nexport const laneHeader = (axis: 'x' | 'y'): ContainerHeader =>\n ({ side: axis === 'y' ? 'left' : 'top', size: LANE_HEADER_SIZE });\n\n/** A titled container's layout key: free placement in the body below its header. */\nexport const DIAGRAM_CONTAINER_LAYOUT = 'diagram:container';\n/** A pool's layout key when its lanes stack as rows, top to bottom. */\nexport const DIAGRAM_POOL_ROWS_LAYOUT = 'diagram:pool-rows';\n/** A pool's layout key when its lanes stack as columns, left to right. */\nexport const DIAGRAM_POOL_COLUMNS_LAYOUT = 'diagram:pool-columns';\n/** The layout key of a lane in a pool of rows: free placement beside its left header. */\nexport const DIAGRAM_LANE_ROWS_LAYOUT = 'diagram:lane-rows';\n/** The layout key of a lane in a pool of columns: free placement below its top header. */\nexport const DIAGRAM_LANE_COLUMNS_LAYOUT = 'diagram:lane-columns';\n\n/** Every container layout this package registers, by key. */\nexport const CONTAINER_LAYOUTS: Readonly<Record<string, LayoutStrategy<RectPose>>> = Object.freeze({\n [DIAGRAM_CONTAINER_LAYOUT]: diagramContainerLayout({ header: CONTAINER_HEADER }),\n [DIAGRAM_POOL_ROWS_LAYOUT]: laneStackLayout({ axis: 'y' }),\n [DIAGRAM_POOL_COLUMNS_LAYOUT]: laneStackLayout({ axis: 'x' }),\n [DIAGRAM_LANE_ROWS_LAYOUT]: diagramContainerLayout({ header: laneHeader('y') }),\n [DIAGRAM_LANE_COLUMNS_LAYOUT]: diagramContainerLayout({ header: laneHeader('x') }),\n});\n\n/** The layout key and header for a container of `role`; a pool or lane's\n * follow the axis its pool stacks along. */\nexport function containerShape(role: ContainerRole, axis: 'x' | 'y' = 'y'): { layout: string; header: ContainerHeader } {\n if (role === 'pool') return { layout: axis === 'y' ? DIAGRAM_POOL_ROWS_LAYOUT : DIAGRAM_POOL_COLUMNS_LAYOUT, header: poolHeader(axis) };\n if (role === 'lane') return { layout: axis === 'y' ? DIAGRAM_LANE_ROWS_LAYOUT : DIAGRAM_LANE_COLUMNS_LAYOUT, header: laneHeader(axis) };\n return { layout: DIAGRAM_CONTAINER_LAYOUT, header: CONTAINER_HEADER };\n}\n","/**\n * The label trait: where along its edge a label sits. Data only — placing the\n * label on the route is `label`'s job, so layout can read one without\n * reaching the scene.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\n\n/** Where along an edge a label sits. */\nexport interface DiagramLabel {\n /** `'start'`, `'mid'` and `'end'` are 0, 0.5 and 1; a number is that\n * fraction of the route's length. `{ near }` is the point on the route\n * nearest `near`, in world coordinates — where `layered` leaves a label\n * room — so a bend added or removed elsewhere leaves the label on the\n * stretch it was on. */\n at: 'start' | 'mid' | 'end' | number | { near: Vec2 };\n /** World units between the route and the label's near side, to the **left\n * of the direction of travel** — above a left-to-right edge. Default 0,\n * which centers the label on the line. */\n offset?: number;\n /** Where label placement moved it, off a station something covered:\n * `at` a fraction of the route's length, `offset` as above. Read in place\n * of `at` and `offset`, which stay the author's preference. Written only\n * by placement (`installLabelPlacement`). */\n placed?: LabelSpot;\n /** `false` keeps placement from ever moving this label. */\n dodge?: false;\n}\n\n/** A station placement chose: a fraction of the route's length, and the\n * offset from the line. */\nexport interface LabelSpot {\n at: number;\n offset: number;\n}\n\n/** Where an edge label sits when neither the edge nor the scene says. */\nexport const LABEL_PLACEMENT: DiagramLabel = { at: 'mid', offset: 9 };\n\n/** The label trait on a node's data, or `null`. */\nexport function diagramLabelOf(node: { data: unknown }): DiagramLabel | null {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const trait = (data as { diagram?: unknown }).diagram;\n if (trait === null || typeof trait !== 'object') return null;\n const label = (trait as { label?: unknown }).label;\n if (label === null || typeof label !== 'object') return null;\n return 'at' in label ? (label as DiagramLabel) : null;\n}\n","/**\n * A label on an edge: an ordinary leaf node that derives its *pose* from the\n * route it sits on.\n *\n * It reads the edge's resolved path off its dependency rather than routing\n * again, so the label and the arrowhead can never disagree about where the\n * edge went. Everything else about it is a normal scene node — its own size,\n * data, styling, z-order and selection.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n translatePoseViaDescriptor,\n type DerivedDep,\n type PoseDescriptor,\n} from '@weasel-js/core';\nimport { diagramLabelOf } from './labelTrait';\nimport { labelCenter } from './labels/station';\n\nexport { labelCenter };\n\n/** Options for {@link labelDerivePose}. `geometry` defaults to the kit's\n * `AUTO_POSE_DESCRIPTOR`. */\nexport interface LabelPoseOptions<TPose> {\n geometry?: PoseDescriptor<TPose>;\n}\n\n/**\n * A `derivePose` that stations a label along its dependency's path.\n *\n * Returns `null` — nothing derived, so the node keeps its authored pose —\n * when the node carries no label trait, when the dependency is gone, or when\n * the dependency derives no path. A label that snapped to the origin because\n * its edge was deleted is worse than one that stayed where the author left it.\n */\nexport function labelDerivePose<TPose>(\n opts: LabelPoseOptions<TPose> = {},\n): (node: { pose: TPose; data: unknown }, deps: readonly (DerivedDep<TPose> | undefined)[]) => TPose | null {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n\n return (node, deps) => {\n const label = diagramLabelOf(node);\n if (label === null) return null;\n const path = deps[0]?.path ?? null;\n if (path === null) return null;\n\n const bounds = geometry.getBounds(node.pose);\n const center = labelCenter(path, label, bounds);\n if (center === null) return null;\n\n return translatePoseViaDescriptor(\n node.pose,\n center.x - (bounds.x + bounds.width / 2),\n center.y - (bounds.y + bounds.height / 2),\n geometry,\n );\n };\n}\n\n/** Registry key for {@link LABEL_DERIVE_POSE}. */\nexport const DIAGRAM_LABEL = 'diagram:label';\n\n/** The default label derivation, as one stable function reference so `toJSON`\n * can find its key. */\nexport const LABEL_DERIVE_POSE = labelDerivePose<unknown>();\n","/**\n * A hit index rebuilt when its source's key changes, built on the second read\n * at a key (`createSettledCache`). A source with no key (`undefined`) is never\n * indexed: every read answers null, so the caller scans.\n */\nimport { createBvh, createSettledCache, type Bvh } from '@weasel-js/geom/nd';\n\nexport function keyedIndex<T>(key: () => readonly unknown[] | undefined, build: () => T): () => T | null {\n const cache = createSettledCache<T>();\n return () => {\n const now = key();\n return now === undefined ? null : cache.read(now, build);\n };\n}\n\n/** A 2D BVH over `boxes` (`[minX, minY, maxX, maxY]`), keyed by position. A box the tree\n * refuses (non-finite or inverted) goes on `always`, for every query to read. */\nexport interface BoxIndex {\n tree: Bvh<number>;\n always: readonly number[];\n}\n\nexport function boxIndex(boxes: readonly (readonly [number, number, number, number])[]): BoxIndex {\n const entries: [number, readonly number[]][] = [];\n const always: number[] = [];\n boxes.forEach((b, i) => {\n if (b.every(Number.isFinite) && b[0] <= b[2] && b[1] <= b[3]) entries.push([i, b]);\n else always.push(i);\n });\n return { tree: createBvh<number>(2, entries), always };\n}\n\n/** Positions of the boxes meeting `[x0, y0, x1, y1]`, grown by a relative epsilon so rounding\n * only ever adds one, ascending; null for a query with a NaN in it, which meets nothing. */\nexport function boxesMeeting(index: BoxIndex, x0: number, y0: number, x1: number, y1: number): number[] | null {\n const q = [x0, y0, x1, y1];\n if (q.some(Number.isNaN)) return null;\n const e = 1e-9 * (1 + Math.max(0, ...q.filter(Number.isFinite).map(Math.abs)));\n const found = [...index.always];\n index.tree.queryBox([x0 - e, y0 - e, x1 + e, y1 + e], (i) => { found.push(i); });\n return found.sort((a, b) => a - b);\n}\n","/**\n * What makes an edge label grabbable, so a drag can move it along and beside\n * its edge (`labelDragAction`).\n *\n * Built the way the route handles are: rect regions with a `null` `targetId`\n * and no paint, composed into a layer whose id is the kind a press reports.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n composeAffordanceLayer,\n documentDepOf,\n documentPose,\n type Affordance,\n type AffordanceRegion,\n type CursorSpec,\n type NodeId,\n type RenderLayer,\n type Scene,\n} from '@weasel-js/core';\nimport type { Path, Vec2 } from '@weasel-js/core/math';\nimport { boxIndex, boxesMeeting, keyedIndex, type BoxIndex } from './keyedIndex';\nimport { diagramLabelOf, type DiagramLabel } from './labelTrait';\nimport type { Bounds } from './outline';\n\n/** The layer id the label regions are composed into. */\nexport const LABEL_DRAG_LAYER_ID = 'diagram-edge-labels';\n\n/** The affordance kind a press on an edge label reports. */\nexport const LABEL_DRAG_AFFORDANCE_KIND = `layer:${LABEL_DRAG_LAYER_ID}` as const;\n\n/** What a press on an edge label hands the label actions, as the hit's `payload`. */\nexport interface LabelScratch {\n targetId: string;\n labelId: string;\n edgeId: string;\n}\n\n/** Read a label press's scratch back off the hit an action was handed. */\nexport function labelScratchOf(hit: { payload?: unknown } | null | undefined): LabelScratch | null {\n const payload = hit?.payload as LabelScratch | undefined;\n return payload !== undefined && typeof payload.labelId === 'string' && typeof payload.edgeId === 'string'\n ? payload : null;\n}\n\n/** A label a press can pick up: its box as the document places it, and its edge's route. */\nexport interface DraggableLabel {\n labelId: string;\n edgeId: string;\n box: Bounds;\n path: Path;\n}\n\n/** Whether an edit may touch a label: neither it nor its edge is locked, and it is not hidden. */\nexport const labelEditable = (scene: Scene<unknown, string, unknown>, labelId: NodeId, edgeId: NodeId): boolean =>\n !scene.isLocked(labelId) && !scene.isLocked(edgeId) && !scene.isHidden(labelId);\n\n/** A label an edit may touch, and the one edge it stands on. */\nexport interface EditableLabel {\n labelId: NodeId;\n edgeId: NodeId;\n label: DiagramLabel;\n}\n\n/** Every label in `scene` an edit may touch, in render order: one carrying the\n * label trait, on exactly one edge, that `labelEditable` passes. With `edges`,\n * only the labels on those edges. */\nexport function* editableLabels(\n scene: Scene<unknown, string, unknown>, edges?: ReadonlySet<string>,\n): Iterable<EditableLabel> {\n for (const node of scene.renderOrderNodes()) {\n const label = diagramLabelOf(node);\n if (label === null) continue;\n const deps = node.dependsOn;\n if (!Array.isArray(deps) || deps.length !== 1) continue;\n const edgeId = deps[0] as NodeId;\n if (edges !== undefined && !edges.has(edgeId)) continue;\n if (labelEditable(scene, node.id, edgeId)) yield { labelId: node.id, edgeId, label };\n }\n}\n\n/** Every editable label in `scene` whose edge derives a path, in render order. */\nexport function* draggableLabels(scene: Scene<unknown, string, unknown>): Iterable<DraggableLabel> {\n for (const { labelId, edgeId } of editableLabels(scene)) {\n const path = documentDepOf(scene as never, edgeId)?.path ?? null;\n if (path === null) continue;\n const box = AUTO_POSE_DESCRIPTOR.getBounds(documentPose(scene as never, scene.get(labelId) as never));\n yield { labelId, edgeId, box, path };\n }\n}\n\nconst holds = (b: Bounds, at: Vec2) => at.x >= b.x && at.x <= b.x + b.width && at.y >= b.y && at.y <= b.y + b.height;\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** Each scene's draggable labels, boxed. Read at document poses, so the scene's version is the whole key. */\nconst INDEXES = new WeakMap<AnyScene, () => { labels: DraggableLabel[]; boxes: BoxIndex } | null>();\n\nfunction labelIndexOf(scene: AnyScene) {\n let index = INDEXES.get(scene);\n if (index === undefined) {\n index = keyedIndex(\n () => (typeof scene.getVersion === 'function' ? [scene.getVersion()] : undefined),\n () => {\n const labels = [...draggableLabels(scene)];\n return {\n labels,\n boxes: boxIndex(labels.map(({ box: b }) => [\n Math.min(b.x, b.x + b.width), Math.min(b.y, b.y + b.height),\n Math.max(b.x, b.x + b.width), Math.max(b.y, b.y + b.height),\n ] as const)),\n };\n },\n );\n INDEXES.set(scene, index);\n }\n return index;\n}\n\n/** The draggable labels whose box can hold `at`, in render order: every one, without an index. */\nfunction labelsAt(scene: AnyScene, at: Vec2): Iterable<DraggableLabel> {\n const built = labelIndexOf(scene)();\n const near = built && boxesMeeting(built.boxes, at.x, at.y, at.x, at.y);\n if (!built || !near) return draggableLabels(scene);\n return near.map((i) => built.labels[i]!);\n}\n\n/** The topmost draggable label whose box holds `at`, as its press scratch. */\nexport function labelUnder(scene: AnyScene, at: Vec2): LabelScratch | null {\n let found: LabelScratch | null = null;\n for (const { labelId, edgeId, box } of labelsAt(scene, at)) {\n if (holds(box, at)) found = { targetId: labelId, labelId, edgeId };\n }\n return found;\n}\n\nfunction createLabelDragAffordance(scene: AnyScene, cursor: CursorSpec): Affordance {\n const regionsOf = (labels: Iterable<DraggableLabel>): readonly AffordanceRegion[] => {\n const out: AffordanceRegion[] = [];\n for (const { labelId, edgeId, box } of labels) {\n out.push({\n id: labelId,\n targetId: null,\n shape: { kind: 'rect', x: box.x, y: box.y, width: box.width, height: box.height },\n cursor,\n strength: 'exclusive',\n claimedKinds: ['pointer'],\n bind: () => ({ initialScratch: { targetId: labelId, labelId, edgeId } satisfies LabelScratch }),\n });\n }\n return out;\n };\n return {\n id: LABEL_DRAG_LAYER_ID,\n regions: () => regionsOf(draggableLabels(scene)),\n regionsAt: (_state, wx, wy) => regionsOf(labelsAt(scene, { x: wx, y: wy })),\n };\n}\n\n/** The composed layer, for `CanvasExtensionApi.registerLayer`. Register it\n * before the port layer: the last registered is hit first, and a port or a\n * route handle must win over a label beside it. */\nexport function labelDragLayer(\n scene: Scene<unknown, string, unknown>,\n opts: { cursor?: CursorSpec } = {},\n): RenderLayer<unknown> {\n return composeAffordanceLayer(\n LABEL_DRAG_LAYER_ID,\n 'Diagram edge labels',\n [createLabelDragAffordance(scene, opts.cursor ?? 'move')],\n ) as unknown as RenderLayer<unknown>;\n}\n","/**\n * Edge labels: the one place a label node's spec is made, and the action that\n * adds or edits an edge's label on a double-click.\n */\nimport {\n ActionDisabledReason,\n bodyPredicate,\n type Action,\n type ActionDeps,\n type AddNodeSpec,\n type GestureBinding,\n type InvocationCtx,\n type RectPose,\n type Scene,\n} from '@weasel-js/core';\nimport type { MeasureRowText, RowTextStyle } from './body';\nimport { diagramEdgeOf } from './edgeTrait';\nimport { LABEL_DERIVE_POSE } from './label';\nimport { labelScratchOf, labelUnder } from './labelDragLayer';\nimport { LABEL_PLACEMENT, diagramLabelOf, type DiagramLabel } from './labelTrait';\nimport type { ImmediateParams } from '@weasel-js/core';\n\n/** The face an edge label is set in: the diagram's, two sizes down. */\nexport const labelStyleOf = (font: { fontFamily: string; fontSize: number }) => ({ ...font, fontSize: font.fontSize - 2 });\n\n/** The diagram's face when the scene names none. */\nexport const DEFAULT_FONT = { fontFamily: 'sans-serif', fontSize: 12 };\n/** Advance width per character, in font sizes, where nothing measures text. */\nexport const GLYPH = 0.6;\n\nconst LABEL_STYLE: RowTextStyle = labelStyleOf(DEFAULT_FONT);\nconst LABEL_FILL = '#dbe7f2';\n\n/** The box a label's text takes: measured width, and a height of the font size\n * whatever the measure reports. */\nexport function labelSize(text: string, style: RowTextStyle, measure?: MeasureRowText): { width: number; height: number } {\n const size = style.fontSize ?? LABEL_STYLE.fontSize!;\n return { width: measure !== undefined ? measure(text, style).width : text.length * size * GLYPH, height: size };\n}\n\n/** Options for {@link edgeLabelSpec}. */\nexport interface EdgeLabelOptions<TLayer extends string> {\n layer: TLayer;\n /** Where along the edge it sits. Default {@link LABEL_PLACEMENT}. */\n label?: DiagramLabel;\n style?: RowTextStyle;\n /** Text color. */\n fill?: string;\n /** Sizes the box. Default: a per-character estimate. */\n measure?: MeasureRowText;\n}\n\n/** The label node for edge `edgeId`: a leaf that derives its pose from the edge's route. */\nexport function edgeLabelSpec<TLayer extends string>(\n edgeId: string, text: string, opts: EdgeLabelOptions<TLayer>,\n): AddNodeSpec<unknown, TLayer, RectPose> {\n const style = opts.style ?? LABEL_STYLE;\n return {\n id: `${edgeId}/label` as never,\n kind: 'mark',\n layer: opts.layer,\n pickable: false,\n pose: { x: 0, y: 0, ...labelSize(text, style, opts.measure) },\n data: {\n diagram: { label: opts.label ?? LABEL_PLACEMENT },\n text,\n style,\n fill: { paint: { color: opts.fill ?? LABEL_FILL } },\n },\n dependsOn: [edgeId as never],\n derivePose: LABEL_DERIVE_POSE as never,\n } as AddNodeSpec<unknown, TLayer, RectPose>;\n}\n\n/**\n * Removes node `id` if it is an edge label left with no text, and says whether\n * it did. The default edit adds a label before its text is typed, so a host\n * passes this as its text edit's `onEnd` to drop one that ends empty.\n */\nexport function dropEmptyEdgeLabel(scene: Scene<unknown, string, unknown>, id: string): boolean {\n const node = scene.get(id as never);\n if (node === undefined || diagramLabelOf(node) === null) return false;\n const text = (node.data as { text?: unknown }).text;\n if (typeof text === 'string' && text.trim() !== '') return false;\n scene.remove(id as never);\n return true;\n}\n\n/** The action that adds or edits an edge's label. */\nexport const EDIT_EDGE_LABEL_ACTION_ID = 'diagram.editEdgeLabel';\n\n/** Options for {@link editEdgeLabelAction}. */\nexport interface EditEdgeLabelOptions {\n /** Runs in place of the default add-then-edit. */\n commit?: (edgeId: string, ctx: InvocationCtx) => void;\n /** The face a new label is set in. Default the diagram's, two sizes down. Ignored when `commit` is given. */\n style?: RowTextStyle;\n /** A new label's text color. Ignored when `commit` is given. */\n fill?: string;\n}\n\nfunction edgeUnder(deps: ActionDeps | undefined, at: { x: number; y: number } | undefined): string | null {\n if (deps === undefined || at === undefined) return null;\n // A label is not pickable, so a connector passing under it would win the pick.\n const label = deps.scene === undefined ? null : labelUnder(deps.scene, at);\n if (label !== null) return label.edgeId;\n const id = deps.nodeAtPoint?.(at);\n const node = id == null ? undefined : deps.scene?.get(id);\n return node !== undefined && diagramEdgeOf(node) !== null ? id! : null;\n}\n\nfunction beginEditing(edgeId: string, ctx: InvocationCtx, look: Pick<EditEdgeLabelOptions, 'style' | 'fill'>): void {\n const { scene, textEdit } = ctx.deps;\n if (scene === undefined) return;\n const labelId = `${edgeId}/label`;\n if (scene.get(labelId as never) === undefined) {\n const edge = scene.get(edgeId as never);\n if (edge === undefined) return;\n scene.add(edgeLabelSpec(edgeId, '', {\n layer: edge.layer,\n ...(look.style ? { style: look.style } : {}),\n ...(look.fill !== undefined ? { fill: look.fill } : {}),\n }) as never);\n }\n textEdit?.startEdit(labelId);\n}\n\n/**\n * Creates an edge's label, or edits the one it has, where a double-click\n * lands on the edge. It declines a double-click on anything else.\n *\n * An immediate invoker is handed no `InvocationCtx`, so `commit` gets one\n * built from the deps and the click point.\n */\nexport function editEdgeLabelAction(opts: EditEdgeLabelOptions = {}): Action {\n const commit = opts.commit ?? ((edgeId: string, ctx: InvocationCtx) => beginEditing(edgeId, ctx, opts));\n return {\n id: EDIT_EDGE_LABEL_ACTION_ID,\n label: 'Edit edge label',\n group: 'diagram',\n requires: ['scene', 'nodeAtPoint', 'textEdit'],\n eligible: { mode: 'normal' },\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const p = params as ImmediateParams | undefined;\n const world = p?.world;\n if (!world) return;\n const pressed = labelScratchOf(p.affordance as { payload?: unknown } | undefined);\n const edgeId = pressed?.edgeId ?? edgeUnder(deps, world);\n if (edgeId === null) return;\n const ctx = { world, modifiers: { alt: false, shift: false, meta: false, ctrl: false }, deps } as InvocationCtx;\n commit(edgeId, ctx);\n },\n },\n enabled: (deps, at) => (edgeUnder(deps, at) !== null ? true : ActionDisabledReason.NotApplicable),\n };\n}\n\nconst onBody = bodyPredicate((target) => target === 'selected-body' || target === 'unselected-body');\n\n/** A double-click on a node's body; the action itself declines unless that node is an edge. */\nexport function editEdgeLabelBinding(actionId: string = EDIT_EDGE_LABEL_ACTION_ID): GestureBinding {\n return { spec: { kind: 'doubleClick', target: { kindOf: onBody } }, actionId, opts: { id: `${actionId}.doubleClick` } };\n}\n","import type { NodeStyle } from '../fromData';\nimport type { DiagramTheme } from './types';\n\nconst SANS = { family: 'sans-serif', size: 12 };\n\nconst INK = '#1f2933';\nconst paper: DiagramTheme = {\n id: 'paper',\n name: 'Paper',\n roles: {\n default: { fill: '#ffffff', stroke: '#3e4c59', text: INK },\n accent: { fill: '#e6f0ff', stroke: '#2f6fd6', text: INK },\n muted: { fill: '#f3f5f7', stroke: '#9aa5b1', text: '#616e7c' },\n positive: { fill: '#e8f6ec', stroke: '#2f9e57', text: INK },\n warning: { fill: '#fdf4dc', stroke: '#c98a0b', text: INK },\n negative: { fill: '#fdecec', stroke: '#d14343', text: INK },\n },\n defaultRole: 'default',\n edge: { stroke: '#3e4c59', width: 2, markerEnd: 'arrow' },\n label: { fill: INK },\n container: { fill: 'rgba(62, 76, 89, 0.04)', stroke: '#7b8794', text: '#52606d', strokeWidth: 1, dash: [4, 3] },\n lane: {\n header: { fill: '#e4e7eb', stroke: '#9aa5b1', text: INK, strokeWidth: 1 },\n bodies: [\n { fill: '#ffffff', stroke: '#cbd2d9', text: INK, strokeWidth: 1 },\n { fill: '#f5f7fa', stroke: '#cbd2d9', text: INK, strokeWidth: 1 },\n ],\n },\n page: '#ffffff',\n font: SANS,\n series: ['#2f6fd6', '#8b5cf6', '#c98a0b', '#2f9e57', '#e8590c', '#0f9b8e', '#d6336c', '#7b8794'],\n};\n\n// The effect looks' and `lanes`' own dark colors, so a look drawn under it is unchanged.\nconst NIGHT_TEXT = '#dbe7f2';\nconst night: DiagramTheme = {\n id: 'night',\n name: 'Night',\n roles: {\n default: { fill: '#16222c', stroke: '#3d566b', text: NIGHT_TEXT, strokeWidth: 1.5 },\n accent: { fill: '#13263a', stroke: '#6fb3ff', text: NIGHT_TEXT, strokeWidth: 1.5 },\n muted: { fill: '#121a21', stroke: '#3d566b', text: '#6d8496', strokeWidth: 1.5 },\n positive: { fill: '#14261c', stroke: '#5ad07f', text: NIGHT_TEXT, strokeWidth: 1.5 },\n warning: { fill: '#2a2414', stroke: '#f2c14e', text: NIGHT_TEXT, strokeWidth: 1.5 },\n negative: { fill: '#2c1618', stroke: '#ff5d5d', text: NIGHT_TEXT, strokeWidth: 1.5 },\n },\n defaultRole: 'default',\n edge: { stroke: '#7ba7c7', width: 2, markerEnd: 'arrow' },\n label: { fill: NIGHT_TEXT },\n container: { fill: 'rgba(123, 167, 199, 0.08)', stroke: '#7ba7c7', text: '#9fbdd6', strokeWidth: 1, dash: [4, 3] },\n lane: {\n header: { fill: 'rgba(255, 255, 255, 0.06)', stroke: 'rgba(255, 255, 255, 0.06)', text: '#9fbdd6', strokeWidth: 1 },\n bodies: [\n { fill: 'rgba(255, 255, 255, 0.035)', stroke: 'rgba(255, 255, 255, 0.06)', text: '#9fbdd6', strokeWidth: 1 },\n { fill: 'rgba(255, 255, 255, 0)', stroke: 'rgba(255, 255, 255, 0.06)', text: '#9fbdd6', strokeWidth: 1 },\n ],\n },\n page: '#0e151b',\n font: SANS,\n series: ['#6fb3ff', '#c58bff', '#f2c14e', '#5ad07f', '#ff8a6b', '#4fd1c5', '#e58fb8', '#b0bec5'],\n};\n\nconst LINE = '#e8f1ff';\nconst blueprint: DiagramTheme = {\n id: 'blueprint',\n name: 'Blueprint',\n roles: {\n default: { fill: '#1d4a85', stroke: LINE, text: LINE },\n accent: { fill: '#2560a8', stroke: '#ffe28a', text: '#ffffff' },\n muted: { fill: '#183f72', stroke: '#8fb1dc', text: '#b9cfee' },\n positive: { fill: '#1d4a85', stroke: '#8ff0b0', text: LINE },\n warning: { fill: '#1d4a85', stroke: '#ffd166', text: LINE },\n negative: { fill: '#1d4a85', stroke: '#ff9b9b', text: LINE },\n },\n defaultRole: 'default',\n edge: { stroke: LINE, width: 1.5, markerEnd: 'arrow' },\n label: { fill: LINE },\n container: { fill: 'rgba(232, 241, 255, 0.06)', stroke: '#8fb1dc', text: '#b9cfee', strokeWidth: 1, dash: [6, 4] },\n lane: {\n header: { fill: '#1d4a85', stroke: '#8fb1dc', text: LINE, strokeWidth: 1 },\n bodies: [\n { fill: 'rgba(232, 241, 255, 0.05)', stroke: '#8fb1dc', text: LINE, strokeWidth: 1 },\n { fill: 'rgba(232, 241, 255, 0)', stroke: '#8fb1dc', text: LINE, strokeWidth: 1 },\n ],\n },\n page: '#163a6b',\n font: { family: 'ui-monospace, monospace', size: 12 },\n series: ['#ffe28a', '#8ff0b0', '#9fd3ff', '#ffb38a', '#d9b8ff', '#7fe3d8', '#ff9b9b', '#c9d6e8'],\n};\n\nconst PLUM = '#4a3b40';\nconst pastel: DiagramTheme = {\n id: 'pastel',\n name: 'Pastel',\n roles: {\n default: { fill: '#e3f0ff', stroke: '#7d9cc4', text: PLUM },\n accent: { fill: '#fde2e4', stroke: '#c9848f', text: PLUM },\n muted: { fill: '#f4f1ee', stroke: '#bfb5ad', text: '#8a7f78' },\n positive: { fill: '#dcf5e3', stroke: '#6fb487', text: PLUM },\n warning: { fill: '#fff1cc', stroke: '#d4a84a', text: PLUM },\n negative: { fill: '#ffdcd6', stroke: '#d77f73', text: PLUM },\n },\n defaultRole: 'default',\n edge: { stroke: '#8a7f99', width: 2, markerEnd: 'arrow' },\n label: { fill: PLUM },\n container: { fill: 'rgba(201, 132, 143, 0.06)', stroke: '#c9b8c2', text: '#7a6670', strokeWidth: 1, dash: [4, 3] },\n lane: {\n header: { fill: '#efe6f5', stroke: '#c9b8c2', text: PLUM, strokeWidth: 1 },\n bodies: [\n { fill: '#fffaf3', stroke: '#e6dccf', text: PLUM, strokeWidth: 1 },\n { fill: '#fbf3ea', stroke: '#e6dccf', text: PLUM, strokeWidth: 1 },\n ],\n },\n page: '#fffaf3',\n font: SANS,\n series: ['#7d9cc4', '#c9848f', '#d4a84a', '#6fb487', '#b48fd1', '#5fb3ad', '#e08fb0', '#a3a3a3'],\n};\n\nconst BLACK = '#111111';\nconst shade = (fill: string): NodeStyle => ({ fill, stroke: BLACK, text: BLACK });\nconst mono: DiagramTheme = {\n id: 'mono',\n name: 'Mono',\n roles: {\n default: shade('#ffffff'),\n accent: shade('#d9d9d9'),\n muted: { fill: '#f5f5f5', stroke: '#9e9e9e', text: '#757575' },\n positive: shade('#ededed'),\n warning: shade('#c4c4c4'),\n negative: { fill: '#595959', stroke: BLACK, text: '#ffffff' },\n },\n defaultRole: 'default',\n edge: { stroke: BLACK, width: 1.5, markerEnd: 'arrow' },\n label: { fill: BLACK },\n container: { fill: 'rgba(0, 0, 0, 0.03)', stroke: '#757575', text: '#424242', strokeWidth: 1, dash: [4, 3] },\n lane: {\n header: { fill: '#e0e0e0', stroke: '#757575', text: BLACK, strokeWidth: 1 },\n bodies: [\n { fill: '#ffffff', stroke: '#bdbdbd', text: BLACK, strokeWidth: 1 },\n { fill: '#f5f5f5', stroke: '#bdbdbd', text: BLACK, strokeWidth: 1 },\n ],\n },\n page: '#ffffff',\n font: SANS,\n series: ['#111111', '#555555', '#888888', '#333333', '#777777', '#222222', '#666666', '#999999'],\n};\n\n/** The themes that ship, by id, in the order a picker lists them. `paper` is ink on white;\n * `night` is the effect looks' own dark colors. */\nexport const DIAGRAM_THEMES: Readonly<Record<string, DiagramTheme>> = Object.freeze({ paper, night, blueprint, pastel, mono });\n","import type { EdgeStyle, NodeStyle } from '../fromData';\n\n/** The roles every shipped theme styles, with the name a picker shows. */\nexport const DIAGRAM_ROLES = [\n { id: 'default', label: 'Default' },\n { id: 'accent', label: 'Accent' },\n { id: 'muted', label: 'Muted' },\n { id: 'positive', label: 'Positive' },\n { id: 'warning', label: 'Warning' },\n { id: 'negative', label: 'Negative' },\n] as const;\n\n/** The id of one of {@link DIAGRAM_ROLES}. A theme may style roles of its own besides. */\nexport type DiagramRole = (typeof DIAGRAM_ROLES)[number]['id'];\n\nexport type { FontField, StyleField } from './styleField';\n\n/** The face a theme sets diagram text in. A text row keeps its own size. */\nexport interface DiagramFont {\n family: string;\n size: number;\n}\n\n/**\n * A document's colors and face. Applying one writes literal colors into the\n * scene, so nothing that reads the scene needs the theme to draw it.\n */\nexport interface DiagramTheme {\n id: string;\n name: string;\n /** A shape's fill, stroke and text by role id. A connector given a role takes that role's stroke. */\n roles: Readonly<Record<string, NodeStyle>>;\n /** The names a picker shows for roles beyond {@link DIAGRAM_ROLES}, or for a shipped role renamed. */\n roleLabels?: Readonly<Record<string, string>>;\n /** The role a shape or connector naming none, or naming one this theme lacks, is drawn in. */\n defaultRole: string;\n /** A connector naming no role. */\n edge: EdgeStyle;\n /** A connector's label, where the connector names no role. */\n label: { fill: string; font?: DiagramFont };\n /** A group's or a container's box, its `text` the title's color. */\n container: NodeStyle;\n /** A pool's header, and its lanes' bodies in turn. */\n lane: { header: NodeStyle; bodies: readonly NodeStyle[] };\n /** The page a document is drawn on. */\n page: string;\n font: DiagramFont;\n /** Colors for a series of things the theme cannot name in advance: an effect look's value types. */\n series: readonly string[];\n}\n\n/** The document value a theme is saved under: a shipped theme's id, or a whole custom theme. */\nexport const DIAGRAM_THEME_KEY = 'diagram:theme';\n","import type { Stroke } from '@weasel-js/core';\nimport { labelStyleOf } from '../edgeLabel';\nimport type { EdgeStyle, NodeStyle } from '../fromData';\nimport { DIAGRAM_THEMES } from './themes';\nimport { DIAGRAM_THEME_KEY, type DiagramTheme } from './types';\n\n/** The style a shape naming `role` is drawn in: that role's, or the theme's default role's. */\nexport function roleStyle(theme: DiagramTheme, role?: string): NodeStyle {\n return (role !== undefined ? theme.roles[role] : undefined) ?? theme.roles[theme.defaultRole]!;\n}\n\n/** The style a connector naming `role` is drawn in: the role's stroke, its label in that stroke too;\n * with no role, the theme's own connector and label colors. */\nexport function roleEdgeStyle(theme: DiagramTheme, role?: string): EdgeStyle {\n const own = role !== undefined ? theme.roles[role] : undefined;\n if (own !== undefined) return { ...theme.edge, stroke: own.stroke, label: own.stroke };\n return { ...theme.edge, label: theme.edge.label ?? theme.label.fill };\n}\n\n/** The stroke a connector drawn under `theme` starts with, for a connect action's `edgeStroke`. */\nexport function themeEdgeStroke(theme: DiagramTheme): Stroke {\n const { stroke, width, dash, markerStart, markerEnd } = theme.edge;\n return {\n paint: { color: stroke },\n width: width ?? 2,\n ...(dash ? { dash } : {}),\n ...(markerStart ? { markerStart } : {}),\n ...(markerEnd !== null ? { markerEnd: markerEnd ?? 'arrow' } : {}),\n };\n}\n\n/** The theme's face as `diagramScene` and the stencils take one. */\nexport const themeFont = (theme: DiagramTheme): { fontFamily: string; fontSize: number } =>\n ({ fontFamily: theme.font.family, fontSize: theme.font.size });\n\n/** The family a connector's label is set in: the label's own, else the theme's. */\nexport const themeLabelFamily = (theme: DiagramTheme): string => theme.label.font?.family ?? theme.font.family;\n\n/** The face edge labels are sized from, before `labelStyleOf` takes two sizes off: the theme's label\n * face where it names one, else `font`. */\nexport const themeLabelFont = (theme: DiagramTheme, font = themeFont(theme)): { fontFamily: string; fontSize: number } =>\n theme.label.font ? { fontFamily: theme.label.font.family, fontSize: theme.label.font.size } : font;\n\n/** The face a new connector label is set in under `theme`. */\nexport const themeLabelStyle = (theme: DiagramTheme) => labelStyleOf(themeLabelFont(theme));\n\n/** The theme a document value names: a shipped theme by id, or a whole theme. `fallback` for none,\n * or for an id no shipped theme has. */\nexport function diagramThemeFrom(value: unknown, fallback: DiagramTheme = DIAGRAM_THEMES.night!): DiagramTheme {\n if (typeof value === 'string') return DIAGRAM_THEMES[value] ?? fallback;\n if (value !== null && typeof value === 'object' && 'roles' in value) return value as DiagramTheme;\n return fallback;\n}\n\n/** The theme a scene's `diagram:theme` value names. */\nexport function diagramThemeOf(scene: { doc: { get(key: string): unknown } }, fallback?: DiagramTheme): DiagramTheme {\n return diagramThemeFrom(scene.doc.get(DIAGRAM_THEME_KEY), fallback);\n}\n\n/** What `diagram:theme` holds for `theme`: a shipped theme's id, or the whole theme. */\nexport const themeDocValue = (theme: DiagramTheme): string | DiagramTheme =>\n DIAGRAM_THEMES[theme.id] === theme ? theme.id : theme;\n","/**\n * Off-page markers as data: what a connector cut at the page gap holds, and\n * what each of its two tags holds. The pass that writes both is `install`.\n */\n\n/** A connector whose ends sit on different pages: its reference letter, and\n * the pages its `from` and `to` ends are on. */\nexport interface OffPageSplit {\n ref: string;\n from: string;\n to: string;\n}\n\n/** Which end of which connector a tag names the far page for. */\nexport interface OffPageTag {\n edge: string;\n end: 'from' | 'to';\n}\n\n/** The id of the tag at end `end` of connector `edgeId`. */\nexport const offPageTagId = (edgeId: string, end: 'from' | 'to'): string => `${edgeId}/offpage-${end}`;\n\n/** The off-page tag trait on a node's data (`data.diagram.offPageTag`), or `null`. */\nexport function offPageTagOf(node: { data: unknown }): OffPageTag | null {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const trait = (data as { diagram?: { offPageTag?: unknown } }).diagram;\n const tag = trait !== null && typeof trait === 'object' ? trait.offPageTag : undefined;\n if (tag === null || typeof tag !== 'object') return null;\n const { edge, end } = tag as Partial<OffPageTag>;\n return typeof edge === 'string' && (end === 'from' || end === 'to') ? { edge, end } : null;\n}\n","/**\n * An off-page tag: a text leaf with a background that names the far page and\n * the reference, and stations itself past the tip of its connector's stub.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n translatePoseViaDescriptor,\n type AddNodeSpec,\n pageName,\n type DerivedDep,\n type PlacedPage,\n type PoseDescriptor,\n type RectPose,\n type Vec2,\n} from '@weasel-js/core';\nimport type { MeasureRowText, RowTextStyle } from '../body';\nimport { labelSize } from '../edgeLabel';\nimport { subpathOf } from '../subpaths';\nimport { themeLabelStyle } from '../theme/resolve';\nimport type { DiagramTheme } from '../theme/types';\nimport { offPageTagId, offPageTagOf, type OffPageSplit } from './trait';\nimport { worldCoords } from '@weasel-js/geom';\n\n/** How a tag is drawn: its face, its text color, and the box behind the text. */\nexport interface OffPageTagLook {\n style: RowTextStyle;\n fill: string;\n background: string;\n /** World units between the box and the text. Default {@link OFF_PAGE_TAG_PADDING}. */\n padding?: number;\n /** Sizes the text. Default: a per-character estimate. */\n measure?: MeasureRowText;\n}\n\n/** A tag's default padding, in world units. */\nexport const OFF_PAGE_TAG_PADDING = 3;\n\n/** World units between a stub's tip and its tag. */\nconst GAP = 2;\n\n/** A tag's look under `theme`: the theme's connector-label face and color, on its page color. */\nexport const offPageTagLook = (theme: DiagramTheme): OffPageTagLook =>\n ({ style: themeLabelStyle(theme), fill: theme.label.fill, background: theme.page });\n\n/** What a tag reads: the far page's name and the connector's reference. */\nexport const offPageTagText = (pageName: string, ref: string): string => `${pageName} · ${ref}`;\n\n/** What the tag at `end` of a split reads: the page at the other end, by name or place, else its raw id, and the reference. */\nexport function offPageFarText(pages: readonly PlacedPage[], split: OffPageSplit, end: 'from' | 'to'): string {\n const far = end === 'from' ? split.to : split.from;\n const index = pages.findIndex((p) => p.id === far);\n return offPageTagText(index < 0 ? far : pageName(pages[index]!, index), split.ref);\n}\n\n/** The box a tag of `text` takes in `look`. */\nexport function offPageTagSize(text: string, look: OffPageTagLook): { width: number; height: number } {\n const pad = look.padding ?? OFF_PAGE_TAG_PADDING;\n const size = labelSize(text, look.style, look.measure);\n return { width: size.width + 2 * pad, height: size.height + 2 * pad };\n}\n\n/** The tag `data` for end `end` of `edgeId`, reading `text` in `look`. */\nexport function offPageTagData(edgeId: string, end: 'from' | 'to', text: string, look: OffPageTagLook) {\n return {\n diagram: { offPageTag: { edge: edgeId, end } },\n text,\n style: look.style,\n fill: { paint: { color: look.fill } },\n background: { paint: { color: look.background } },\n padding: look.padding ?? OFF_PAGE_TAG_PADDING,\n };\n}\n\n/** The tag node at end `end` of connector `edgeId`, on `layer`: it derives its pose from the connector's stub. */\nexport function offPageTagSpec<TLayer extends string>(\n edgeId: string, end: 'from' | 'to', text: string, look: OffPageTagLook & { layer: TLayer },\n): AddNodeSpec<unknown, TLayer, RectPose> {\n return {\n id: offPageTagId(edgeId, end) as never,\n kind: 'mark',\n layer: look.layer,\n pose: { x: 0, y: 0, ...offPageTagSize(text, look) },\n data: offPageTagData(edgeId, end, text, look),\n dependsOn: [edgeId as never],\n derivePose: OFF_PAGE_TAG_DERIVE_POSE as never,\n } as AddNodeSpec<unknown, TLayer, RectPose>;\n}\n\n/** A split connector's two tag specs, `from` then `to`. */\nexport function offPageTagSpecs<TLayer extends string>(\n edgeId: string, split: OffPageSplit, pages: readonly PlacedPage[], look: OffPageTagLook & { layer: TLayer },\n): AddNodeSpec<unknown, TLayer, RectPose>[] {\n return (['from', 'to'] as const).map((end) => offPageTagSpec(edgeId, end, offPageFarText(pages, split, end), look));\n}\n\n/** The tip of the stub at `end` of a split connector's path, and the way the stub runs out to it. */\nfunction stubTip(path: Parameters<typeof subpathOf>[0], end: 'from' | 'to'): { tip: Vec2; out: Vec2 } | null {\n const stub = subpathOf(path, end === 'from' ? 0 : 1);\n if (stub === null || stub.kind !== 'polygon' || stub.coords.length < 4) return null;\n const c = worldCoords(stub);\n const n = c.length;\n const [tip, base] = end === 'from'\n ? [{ x: c[n - 2]!, y: c[n - 1]! }, { x: c[0]!, y: c[1]! }]\n : [{ x: c[0]!, y: c[1]! }, { x: c[n - 2]!, y: c[n - 1]! }];\n const len = Math.hypot(tip.x - base.x, tip.y - base.y);\n return len === 0 ? null : { tip, out: { x: (tip.x - base.x) / len, y: (tip.y - base.y) / len } };\n}\n\n/**\n * A `derivePose` that stations a tag just past its stub's tip, on the far\n * side from the shape. `null`, so the tag keeps its authored pose, while its\n * connector draws no stub at that end.\n */\nexport function offPageTagDerivePose<TPose>(\n opts: { geometry?: PoseDescriptor<TPose> } = {},\n): (node: { pose: TPose; data: unknown }, deps: readonly (DerivedDep<TPose> | undefined)[]) => TPose | null {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n return (node, deps) => {\n const tag = offPageTagOf(node);\n const path = deps[0]?.path ?? null;\n if (tag === null || path === null) return null;\n const at = stubTip(path, tag.end);\n if (at === null) return null;\n const b = geometry.getBounds(node.pose);\n const reach = GAP + (Math.abs(at.out.x) * b.width + Math.abs(at.out.y) * b.height) / 2;\n const cx = at.tip.x + at.out.x * reach;\n const cy = at.tip.y + at.out.y * reach;\n return translatePoseViaDescriptor(node.pose, cx - (b.x + b.width / 2), cy - (b.y + b.height / 2), geometry);\n };\n}\n\n/** Registry key for {@link OFF_PAGE_TAG_DERIVE_POSE}. */\nexport const DIAGRAM_OFF_PAGE_TAG = 'diagram:offPageTag';\n\n/** The default tag derivation, as one stable function reference so `toJSON` can find its key. */\nexport const OFF_PAGE_TAG_DERIVE_POSE = offPageTagDerivePose<unknown>();\n","import type { Vec2 } from '@weasel-js/core';\nimport type { Port } from './types';\n\n/** How a self-edge with no ports named leaves its node and comes back. */\nexport interface SelfLoop {\n from: Port;\n to: Port;\n /** A point outside the node, off the corner between the two sides. */\n via: Vec2;\n}\n\nconst dot = (a: Vec2, b: Vec2): number => a.x * b.x + a.y * b.y;\n\n/**\n * The route a self-edge takes when neither end names a port: out by one side\n * and back by the next one round, past a point `standoff` clear of both.\n *\n * Both ends of such an edge aim at their own node's center, so every port\n * faces it equally, both pick the same one, and the edge has no length. The\n * sides are taken by where they face on the page, east and then north, so the\n * loop sits at the same corner of every node however its ports are listed.\n * `null` where the node has no two ports facing different ways.\n */\nexport function selfLoop(ports: readonly Port[], standoff: number): SelfLoop | null {\n const facing = ports.filter((p): p is Port & { normal: Vec2 } => p.normal !== null);\n const most = (dir: Vec2, among: typeof facing) =>\n among.reduce<(typeof facing)[number] | undefined>(\n (best, p) => (best === undefined || dot(p.normal, dir) > dot(best.normal, dir) ? p : best),\n undefined,\n );\n const from = most({ x: 1, y: 0 }, facing);\n if (from === undefined) return null;\n // Across, not along: a second port on the same side would fold the loop flat.\n const to = most({ x: 0, y: -1 }, facing.filter((p) => Math.abs(dot(p.normal, from.normal)) < 0.5));\n if (to === undefined) return null;\n // Out along the first side's facing, then along the second's until level with its own standoff.\n const out = { x: from.point.x + from.normal.x * standoff, y: from.point.y + from.normal.y * standoff };\n const reach = dot({ x: to.point.x - out.x, y: to.point.y - out.y }, to.normal) + standoff;\n return { from, to, via: { x: out.x + to.normal.x * reach, y: out.y + to.normal.y * reach } };\n}\n","/**\n * A connector's route drawn with its hops: each one a half circle in place of\n * the stretch of route it spans.\n */\nimport { PathBuilder, polylineFromPoints, type Path } from '@weasel-js/geom';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { EdgeHop } from './types';\n\n/** How far off its route a hop may lie and still draw. */\nconst ON_ROUTE = 0.5;\n\n/** The control distance that makes a cubic a quarter circle, per unit radius. */\nconst KAPPA = 0.5523;\n\n/** A hop placed on one segment: its center `t` units along it. */\ninterface Placed {\n t: number;\n r: number;\n}\n\n/** The side a hop bulges to: −y on a horizontal run and −x on a vertical one,\n * whichever way it travels, so every hop on a page bulges alike; else the\n * left of travel. */\nfunction bulge(u: Vec2): Vec2 {\n if (Math.abs(u.y) < 1e-9) return { x: 0, y: -1 };\n if (Math.abs(u.x) < 1e-9) return { x: -1, y: 0 };\n return { x: u.y, y: -u.x };\n}\n\n/** The hops of `hops` that lie on segment `a`–`b` and fit on it, by distance\n * along it, each starting past the end of the one before. */\nfunction placedOn(a: Vec2, b: Vec2, hops: readonly EdgeHop[]): Placed[] {\n const len = Math.hypot(b.x - a.x, b.y - a.y);\n if (len === 0) return [];\n const ux = (b.x - a.x) / len;\n const uy = (b.y - a.y) / len;\n const found: Placed[] = [];\n for (const hop of hops) {\n const dx = hop.at.x - a.x;\n const dy = hop.at.y - a.y;\n const t = dx * ux + dy * uy;\n if (Math.abs(dx * uy - dy * ux) > ON_ROUTE || t - hop.r < 0 || t + hop.r > len) continue;\n found.push({ t, r: hop.r });\n }\n found.sort((m, n) => m.t - n.t);\n const out: Placed[] = [];\n for (const p of found) {\n const last = out[out.length - 1];\n if (last === undefined || p.t - p.r >= last.t + last.r) out.push(p);\n }\n return out;\n}\n\n/**\n * The open path through `points`, bowing over each of `hops` in a half circle\n * of its radius. A hop more than half a unit off the route, or too near a bend\n * or an end for its half circle to fit on one segment, is stale and does not\n * draw; nor does one overlapping the hop before it.\n */\nexport function withHops(points: readonly Vec2[], hops: readonly EdgeHop[]): Path {\n const b = new PathBuilder();\n const first = points[0];\n if (first === undefined || hops.length === 0) return polylineFromPoints(points);\n b.moveTo(first.x, first.y);\n let arcs = 0;\n for (let i = 1; i < points.length; i++) {\n const p = points[i - 1]!;\n const q = points[i]!;\n const len = Math.hypot(q.x - p.x, q.y - p.y);\n const u = len === 0 ? { x: 1, y: 0 } : { x: (q.x - p.x) / len, y: (q.y - p.y) / len };\n const n = bulge(u);\n for (const { t, r } of placedOn(p, q, hops)) {\n const c = { x: p.x + u.x * t, y: p.y + u.y * t };\n const top = { x: c.x + n.x * r, y: c.y + n.y * r };\n const k = KAPPA * r;\n b.lineTo(c.x - u.x * r, c.y - u.y * r);\n b.curveTo(c.x - u.x * r + n.x * k, c.y - u.y * r + n.y * k, top.x - u.x * k, top.y - u.y * k, top.x, top.y);\n b.curveTo(top.x + u.x * k, top.y + u.y * k, c.x + u.x * r + n.x * k, c.y + u.y * r + n.y * k, c.x + u.x * r, c.y + u.y * r);\n arcs++;\n }\n b.lineTo(q.x, q.y);\n }\n return arcs === 0 ? polylineFromPoints(points) : b.build();\n}\n","/**\n * The routers an edge is drawn with: functions from two resolved ends and the\n * waypoints between them to the points the edge runs through. `edge` resolves\n * the ends and calls one by the key the edge names.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { PORT_REACH, portCurvePoints } from '@weasel-js/geom';\nimport { routeHolds } from './avoid/holds';\nimport type { Port } from './types';\n\n/** What a router is given: the two resolved ends, the author's waypoints\n * between them, and the route stored on the edge, when it holds one. */\nexport interface RouteRequest {\n from: Port;\n to: Port;\n waypoints: readonly Vec2[];\n route?: readonly Vec2[] | undefined;\n}\n\n/** A router returns the points the edge runs through, `from.point` first and\n * `to.point` last. */\nexport type Router = (req: RouteRequest) => readonly Vec2[];\n\n/** The straight run between the two ends, through any waypoints. */\nexport const straight: Router = (req) => [req.from.point, ...req.waypoints, req.to.point];\n\n/**\n * An axis-aligned route: leave along the departing end's normal and arrive\n * against the receiving one's.\n *\n * A leg is one elbow where the two ends face different axes and two where they\n * face the same one, turning at the midpoint of the axis they share. Arriving\n * along the port's own facing is what makes the arrowhead point *into* the\n * shape.\n */\nexport const orthogonal: Router = (req) => {\n const stops = [req.from.point, ...req.waypoints, req.to.point];\n const out: Vec2[] = [stops[0]!];\n for (let i = 1; i < stops.length; i++) {\n const a = out[out.length - 1]!;\n const b = stops[i]!;\n if (a.x === b.x || a.y === b.y) {\n out.push(b);\n continue;\n }\n // Only the first leg has a port to leave along; later legs follow the\n // one before them so the route does not alternate for no reason.\n const leaveHorizontal = i === 1\n ? isHorizontal(req.from.normal)\n : out.length > 1 && out[out.length - 2]!.y === a.y;\n // Likewise only the last leg has a port to arrive against. Without a\n // facing there is nothing to satisfy, so it keeps the single elbow.\n const arriving = i === stops.length - 1 ? req.to.normal : null;\n const arriveHorizontal = arriving == null ? !leaveHorizontal : isHorizontal(arriving);\n if (leaveHorizontal !== arriveHorizontal) {\n out.push(leaveHorizontal ? { x: b.x, y: a.y } : { x: a.x, y: b.y });\n out.push(b);\n continue;\n }\n // Splitting the leg at its midpoint starts back the way the route just\n // came when the last stop overshot this one; turning at once does not.\n const prev = out.length > 1 ? out[out.length - 2]! : null;\n if (leaveHorizontal) {\n const mid = (a.x + b.x) / 2;\n if (prev !== null && (mid - a.x) * (a.x - prev.x) < 0) out.push({ x: a.x, y: b.y }, b);\n else out.push({ x: mid, y: a.y }, { x: mid, y: b.y }, b);\n } else {\n const mid = (a.y + b.y) / 2;\n if (prev !== null && (mid - a.y) * (a.y - prev.y) < 0) out.push({ x: b.x, y: a.y }, b);\n else out.push({ x: a.x, y: mid }, { x: b.x, y: mid }, b);\n }\n }\n return out;\n};\n\n/** Which axis a port faces. A port with no facing counts as horizontal. */\nfunction isHorizontal(normal: Vec2 | null | undefined): boolean {\n return Math.abs(normal?.x ?? 1) >= Math.abs(normal?.y ?? 0);\n}\n\n/**\n * A smooth route, sampled into points.\n *\n * Each leg is a cubic that leaves along the departing end's normal and arrives\n * against the receiving one's, and passes each waypoint without a corner.\n * Sampled rather than emitted as curve commands so every router returns the\n * same thing.\n */\nexport const bezier: Router = (req) => {\n const stops = [req.from.point, ...req.waypoints, req.to.point];\n const out: Vec2[] = [stops[0]!];\n for (let i = 1; i < stops.length; i++) {\n const a = stops[i - 1]!;\n const b = stops[i]!;\n const outN = i === 1 ? req.from.normal : through(stops, i - 1);\n const inN = i === stops.length - 1 ? req.to.normal : negated(through(stops, i));\n const leg = portCurvePoints(\n a.x, a.y, b.x, b.y,\n outN == null ? null : [outN.x, outN.y],\n inN == null ? null : [inN.x, inN.y],\n BEZIER_SAMPLES,\n legReach(a, b, outN, inN),\n );\n for (const [x, y] of leg) out.push({ x, y });\n }\n return out;\n};\n\nconst BEZIER_SAMPLES = 16;\n\n/**\n * How far a leg's control points reach, as `portCurvePoints` reads it. Where\n * the leg leaves and arrives along one axis, facing on, the reach goes no\n * further along that axis than the leg travels, so the curve stays between\n * its two ends there rather than swinging past them into whatever sits beside\n * either: a long leg between two near ranks otherwise sweeps through the rank\n * it left.\n */\nfunction legReach(a: Vec2, b: Vec2, outN: Vec2 | null | undefined, inN: Vec2 | null | undefined): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const chord = Math.hypot(dx, dy);\n if (outN == null || inN == null || chord === 0 || outN.x * inN.x + outN.y * inN.y > -0.999) return PORT_REACH;\n const along = dx * outN.x + dy * outN.y;\n return along > 0 ? Math.min(PORT_REACH, along / chord) : PORT_REACH;\n}\n\n/**\n * The direction a smooth route passes an interior stop: along the straight run\n * it makes with a neighboring waypoint level with it on one axis, else from\n * the stop before it toward the one after. Two such waypoints are a run the\n * route was meant to hold, the way `layered` lays one through each rank.\n */\nfunction through(stops: readonly Vec2[], i: number): Vec2 | null {\n const last = stops.length - 1;\n const run = (a: number, b: number) => a >= 1 && b <= last - 1 && (stops[a]!.x === stops[b]!.x || stops[a]!.y === stops[b]!.y);\n const [from, to] = run(i, i + 1) ? [i, i + 1] : run(i - 1, i) ? [i - 1, i] : [i - 1, i + 1];\n const dx = stops[to]!.x - stops[from]!.x;\n const dy = stops[to]!.y - stops[from]!.y;\n const len = Math.hypot(dx, dy);\n return len === 0 ? null : { x: dx / len, y: dy / len };\n}\n\nconst negated = (v: Vec2 | null): Vec2 | null => (v === null ? null : { x: -v.x, y: -v.y });\n\n/**\n * The route the obstacle-avoiding router stored on the edge, while it still\n * fits the ends and passes every waypoint; else `orthogonal` through the stops,\n * so an end moved by something that did not reroute still draws sensibly.\n * The route itself is computed at edit time (`useAvoidRouting`).\n */\nexport const avoid: Router = (req) =>\n (req.route !== undefined && routeHolds(req.from, req.to, req.waypoints, req.route)\n ? [req.from.point, ...req.route, req.to.point]\n : orthogonal(req));\n\n/** The routers this package ships. A consumer's own go in the same shape. */\nexport const ROUTERS: Readonly<Record<string, Router>> = Object.freeze({\n straight,\n orthogonal,\n bezier,\n avoid,\n});\n","/**\n * `DiagramEdge` — a connection between two participants.\n *\n * An edge is an ordinary leaf scene node with `dependsOn: [from, to]` and a\n * `derivePath` that runs a **router**. Being a scene node rather than a\n * plugin-owned render layer buys selection, hit-testing, hover, styling,\n * z-order, SVG export, undo, and copy/paste. The cost is that an edge costs\n * what a node costs — right for tens to hundreds of edges, wrong for a\n * 10k-edge force graph.\n *\n * **Author-dragged waypoints are data on the edge and the router routes\n * through them**, so a moved endpoint still re-routes.\n *\n * Arrowheads are not here. They are stroke markers, the same\n * `markerStart` / `markerEnd` any other stroke carries.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n PathBuilder,\n polylineFromPoints,\n type DerivedDep,\n type Path,\n type PoseDescriptor,\n type SceneRegistry,\n type Vec2,\n} from '@weasel-js/core';\nimport { ANCHOR_DERIVE_POSE, DIAGRAM_ANCHOR, DIAGRAM_GROUP, GROUP_DERIVE_POSE } from './group';\nimport { CONTAINER_LAYOUTS } from './containers/layouts';\nimport { DIAGRAM_LABEL, LABEL_DERIVE_POSE } from './label';\nimport { DIAGRAM_OFF_PAGE_TAG, OFF_PAGE_TAG_DERIVE_POSE } from './offPage/tag';\nimport { portSitesOf, portsOf, type PortsOptions } from './ports';\nimport { selfLoop } from './selfLoop';\nimport { diagramEdgeOf, type EdgeEnd } from './edgeTrait';\nimport { withHops } from './hops/draw';\nimport { ROUTERS, straight, type Router } from './routers';\nimport type { Port } from './types';\n\nexport { avoid, bezier, orthogonal, ROUTERS, straight } from './routers';\nexport type { RouteRequest, Router } from './routers';\n\n/**\n * The port an end resolves to: the one it named, at whichever of its places\n * faces `toward` most directly, else the port facing `toward` most directly.\n *\n * \"Facing\" rather than \"nearest\": a port on the far side of a wide node can be\n * closer in a straight line than the one pointing at the target.\n */\nexport function resolveEnd<TPose>(\n end: EdgeEnd,\n dep: DerivedDep<TPose>,\n toward: Vec2,\n opts: PortsOptions<TPose>,\n allPorts: (d: DerivedDep<TPose>) => Port[],\n): Port | undefined {\n if (end.port !== undefined) {\n const sites = portSitesOf(dep.node as never, dep.pose, end.port, opts);\n // A place counts only when it faces `toward` at all; else the port sits\n // at `at`, as a self-loop's does.\n const ahead = sites.filter((p) => p.normal !== null && p.normal.x * (toward.x - p.point.x) + p.normal.y * (toward.y - p.point.y) > 0);\n if (sites.length > 0) return ahead.length > 0 ? facing(ahead, toward) : sites[0];\n }\n return facing(allPorts(dep), toward);\n}\n\n/** The point an end aims at when it names none: the center of its bounds. */\nexport function boxCenter<TPose>(geometry: PoseDescriptor<TPose>, pose: TPose): Vec2 {\n const b = geometry.getBounds(pose);\n return { x: b.x + b.width / 2, y: b.y + b.height / 2 };\n}\n\n/**\n * Where each end of an edge aims as it resolves: the nearest bend of its\n * stored route, else its nearest authored waypoint, else the other end's\n * center. Centers are stable while both ends resolve; aiming at the other\n * *port* would be circular.\n */\nexport function endAims(\n fromCenter: Vec2,\n toCenter: Vec2,\n waypoints: readonly Vec2[],\n route: readonly Vec2[] = [],\n): { from: Vec2; to: Vec2 } {\n return {\n from: route[0] ?? waypoints[0] ?? toCenter,\n to: route[route.length - 1] ?? waypoints[waypoints.length - 1] ?? fromCenter,\n };\n}\n\n/** The port pointing at `toward` most directly, tie-broken toward the closer. */\nfunction facing(ports: readonly Port[], toward: Vec2): Port | undefined {\n let best: Port | undefined;\n let bestScore = -Infinity;\n for (const port of ports) {\n const dx = toward.x - port.point.x;\n const dy = toward.y - port.point.y;\n const len = Math.hypot(dx, dy) || 1;\n // Alignment with the port's own facing, tie-broken toward the closer port.\n const aim = port.normal === null\n ? 0\n : (port.normal.x * dx + port.normal.y * dy) / len;\n const score = aim - len / 1e6;\n if (score > bestScore) {\n bestScore = score;\n best = port;\n }\n }\n return best;\n}\n\n/** The router an edge is drawn with: the one it names, else `straight`. */\nexport function routerOf(edge: { router?: string }, routers: Readonly<Record<string, Router>> = ROUTERS): Router {\n return (edge.router !== undefined && routers[edge.router]) || straight;\n}\n\n/** Options for {@link edgeDerivePath}. */\nexport interface EdgeRouteOptions<TPose> extends PortsOptions<TPose> {\n /** Routers by key. Defaults to {@link ROUTERS}. */\n routers?: Readonly<Record<string, Router>>;\n /** How far outside its node a self-edge with no ports named turns, in\n * world units. Defaults to half the node's shorter side. */\n selfLoopStandoff?: number;\n}\n\n/**\n * A `derivePath` that routes an edge between its two dependencies.\n *\n * An edge from a node to itself that names no ports leaves and returns by the\n * sides {@link selfLoop} picks, and where the author set no waypoints the\n * router is handed that rule's point outside the node as one.\n *\n * An edge carrying `hops` bows over each one that still lies on its route.\n *\n * Returns `null` — nothing to draw — when the node is not an edge, when either\n * dependency is gone, or when an endpoint offers no ports at all.\n */\nexport function edgeDerivePath<TPose>(\n opts: EdgeRouteOptions<TPose> = {},\n): (node: { data: unknown }, deps: readonly (DerivedDep<TPose> | undefined)[]) => Path | null {\n const routeOf = edgeRouter(opts);\n return (node, deps) => {\n const route = routeOf(node, deps);\n if (route?.stubs !== undefined) return stubsPath(route.stubs);\n const points = route?.points;\n if (points === undefined || points.length < 2) return null;\n const hops = diagramEdgeOf(node)?.hops;\n return hops !== undefined && hops.length > 0 ? withHops(points, hops) : polylineFromPoints(points as { x: number; y: number }[]);\n };\n}\n\n/** An edge's route as {@link edgeDerivePath} draws it, before it becomes a path. */\nexport interface ResolvedRoute {\n /** The two ends, resolved. */\n from: Port;\n to: Port;\n /** What the router was handed between them: the author's waypoints, or a\n * self-loop's turning point. */\n waypoints: readonly Vec2[];\n /** The router's answer, `from.point` first and `to.point` last. */\n points: readonly Vec2[];\n /** Set while the edge is split across pages (`DiagramEdge.offPage`): the\n * two runs drawn in place of `points`, one out of `from` to its tag's\n * side and one from the other tag's side into `to`. */\n stubs?: readonly [readonly Vec2[], readonly Vec2[]];\n}\n\n/** How far a split edge's stub runs out of its shape, in world units. */\nexport const OFF_PAGE_STUB = 24;\n\n/** The stub end `port` leaves by: along its normal, else toward `toward`. */\nfunction stubTip(port: Port, toward: Vec2): Vec2 {\n const n = port.normal ?? unit(toward.x - port.point.x, toward.y - port.point.y);\n return { x: port.point.x + n.x * OFF_PAGE_STUB, y: port.point.y + n.y * OFF_PAGE_STUB };\n}\n\nfunction unit(x: number, y: number): Vec2 {\n const len = Math.hypot(x, y);\n return len === 0 ? { x: 1, y: 0 } : { x: x / len, y: y / len };\n}\n\nfunction stubsPath(stubs: readonly (readonly Vec2[])[]): Path {\n const b = new PathBuilder();\n for (const run of stubs) run.forEach((p, i) => (i === 0 ? b.moveTo(p.x, p.y) : b.lineTo(p.x, p.y)));\n return b.build();\n}\n\n/** Routes an edge between its two dependencies the way {@link edgeDerivePath}\n * does, answering the route itself; null where that draws nothing. */\nexport function edgeRouter<TPose>(\n opts: EdgeRouteOptions<TPose> = {},\n): (node: { data: unknown }, deps: readonly (DerivedDep<TPose> | undefined)[]) => ResolvedRoute | null {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n const portOpts: PortsOptions<TPose> = { geometry, ...(opts.read ? { read: opts.read } : {}) };\n const allPorts = (d: DerivedDep<TPose>): Port[] =>\n portsOf(d.node as never, d.pose, portOpts);\n const standoffOf = (d: DerivedDep<TPose>): number => {\n const b = geometry.getBounds(d.pose);\n return Math.min(b.width, b.height) / 2;\n };\n\n return (node, deps) => {\n const edge = diagramEdgeOf(node);\n if (edge === null) return null;\n const [fromDep, toDep] = deps;\n if (fromDep === undefined || toDep === undefined) return null;\n\n const loop = fromDep.node.id === toDep.node.id && edge.from.port === undefined && edge.to.port === undefined\n ? selfLoop(allPorts(fromDep), opts.selfLoopStandoff ?? standoffOf(fromDep))\n : null;\n const authored = edge.waypoints ?? [];\n const aims = endAims(boxCenter(geometry, fromDep.pose), boxCenter(geometry, toDep.pose), authored, edge.route);\n const from = loop?.from ?? resolveEnd(edge.from, fromDep, aims.from, portOpts, allPorts);\n const to = loop?.to ?? resolveEnd(edge.to, toDep, aims.to, portOpts, allPorts);\n if (from === undefined || to === undefined) return null;\n\n const waypoints = loop !== null && authored.length === 0 ? [loop.via] : authored;\n const points = routerOf(edge, opts.routers)({ from, to, waypoints, route: edge.route });\n if (edge.offPage === undefined) return { from, to, waypoints, points };\n const stubs = [[from.point, stubTip(from, to.point)], [stubTip(to, from.point), to.point]] as const;\n return { from, to, waypoints, points, stubs };\n };\n}\n\n/** Registry key for {@link EDGE_DERIVE_PATH}. */\nexport const DIAGRAM_EDGE = 'diagram:edge';\n\n/** The default edge router, as one stable function reference so `toJSON` can\n * find its key. A consumer wanting different options registers their own\n * `edgeDerivePath(...)` under a key of their choosing. */\nexport const EDGE_DERIVE_PATH = edgeDerivePath<unknown>();\n\n/** Merge this package's registry entries under a consumer's, so an edge\n * round-trips through `toJSON` without the consumer wiring the key. */\nexport function withDiagramRegistry<TPose, TData = unknown, TLayer extends string = string>(\n registry: SceneRegistry<TPose, TData, TLayer> = {},\n): SceneRegistry<TPose, TData, TLayer> {\n return {\n ...registry,\n derivePath: {\n [DIAGRAM_EDGE]: EDGE_DERIVE_PATH,\n ...registry.derivePath,\n },\n derivePose: {\n [DIAGRAM_LABEL]: LABEL_DERIVE_POSE as NonNullable<SceneRegistry<TPose, TData, TLayer>['derivePose']>[string],\n [DIAGRAM_GROUP]: GROUP_DERIVE_POSE as NonNullable<SceneRegistry<TPose, TData, TLayer>['derivePose']>[string],\n [DIAGRAM_ANCHOR]: ANCHOR_DERIVE_POSE as NonNullable<SceneRegistry<TPose, TData, TLayer>['derivePose']>[string],\n [DIAGRAM_OFF_PAGE_TAG]: OFF_PAGE_TAG_DERIVE_POSE as NonNullable<SceneRegistry<TPose, TData, TLayer>['derivePose']>[string],\n ...registry.derivePose,\n },\n layout: {\n ...(CONTAINER_LAYOUTS as unknown as NonNullable<SceneRegistry<TPose, TData, TLayer>['layout']>),\n ...registry.layout,\n },\n };\n}\n","/**\n * Laying a built body out again once its text changes size. A body whose\n * rows are all text or dividers records how it stacks them (`DiagramNode.body`),\n * and each text row records its place (`bodyRow`), so the rows can be read\n * back from the scene and handed to the same layout `buildBody` used.\n */\nimport {\n layoutBody, measureBody, rowHeights, sizeToBody, type BodySpec, type MeasureRowText, type Row, type RowTextStyle,\n} from './body';\nimport type { BodyDivider, BodyLayout, DiagramNode } from './types';\n\n/** The `body` record a body built from `spec` carries, or `undefined` for one that cannot be laid\n * out again from its text: one with a `ports` or `slot` row, or with port labels drawn outside it. */\nexport function bodyLayoutOf(spec: BodySpec, trait: DiagramNode, measure?: MeasureRowText): { body: BodyLayout } | Record<string, never> {\n if (trait.margin !== undefined || !spec.rows.every((r) => r.kind === 'label' || r.kind === 'field' || r.kind === 'divider')) return {};\n const dividers = dividersOf(spec.rows);\n return {\n body: {\n padding: spec.padding ?? 8, gap: spec.gap ?? 4, verticalAlign: spec.verticalAlign ?? 'center', rows: spec.rows.length,\n heights: rowHeights(spec, measure), ...(dividers.length > 0 ? { dividers } : {}),\n },\n };\n}\n\nconst dividerRow = (d: BodyDivider): Row => (d.inset === undefined ? { kind: 'divider' } : { kind: 'divider', inset: d.inset });\n\nfunction dividersOf(rows: readonly Row[]): BodyDivider[] {\n return rows.flatMap((r, index) => (r.kind !== 'divider' ? [] : [r.inset === undefined ? { index } : { index, inset: r.inset }]));\n}\n\n/** `layout`'s rows with no text to measure: each divider as itself, every other row as a slot of\n * the height it was last laid out at. Null for a body saved without its heights. */\nexport function recordedRows(layout: BodyLayout): Row[] | null {\n if (layout.heights === undefined) return null;\n const dividers = new Map((layout.dividers ?? []).map((d) => [d.index, d]));\n return layout.heights.map((height, i): Row => {\n const d = dividers.get(i);\n return d === undefined ? { kind: 'slot', height } : dividerRow(d);\n });\n}\n\ntype Box = { x: number; y: number; width: number; height: number };\ntype TextData = { text?: unknown; bodyRow?: unknown; style?: { fontSize?: number; fontFamily?: string; fontWeight?: number; fontStyle?: string } };\n\n/** A scene as {@link relayoutBodies} reads and writes it. */\nexport interface RelayoutScene {\n get(id: never): { pose: unknown; data: unknown } | undefined;\n childrenOf(id: never): readonly string[];\n setPose(id: never, pose: never): void;\n update(id: never, patch: never): void;\n}\n\nconst rowStyle = (s: TextData['style']): RowTextStyle => ({\n ...(s?.fontSize !== undefined ? { fontSize: s.fontSize } : {}),\n ...(s?.fontFamily !== undefined ? { fontFamily: s.fontFamily } : {}),\n ...((s?.fontWeight ?? 400) >= 700 ? { bold: true } : {}),\n ...(s?.fontStyle === 'italic' ? { italic: true } : {}),\n});\n\nconst same = (a: Box, b: Box) => a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n\n/**\n * Lays each body among `ids` out again from its text rows as they are now:\n * the body grows to what its rows need, never shrinks, and its rows are\n * stacked again inside it. Anything that is not a body carrying a `body`\n * record is left alone. Call inside the batch that changed the text, so it is\n * the same undo entry.\n */\nexport function relayoutBodies(scene: RelayoutScene, ids: Iterable<string>, measure?: MeasureRowText): void {\n for (const id of new Set(ids)) {\n const node = scene.get(id as never);\n const trait = (node?.data as { diagram?: DiagramNode } | undefined)?.diagram;\n if (node === undefined || trait?.body === undefined || trait.outline === undefined) continue;\n const layout = trait.body;\n const rowNodes = new Map<number, string>();\n for (const child of scene.childrenOf(id as never)) {\n const index = (scene.get(child as never)?.data as TextData | undefined)?.bodyRow;\n if (typeof index === 'number') rowNodes.set(index, child);\n }\n const dividers = new Map((layout.dividers ?? []).map((d) => [d.index, d]));\n const rows: Row[] = Array.from({ length: layout.rows }, (_, i): Row => {\n const divider = dividers.get(i);\n if (divider !== undefined) return dividerRow(divider);\n const data = scene.get(rowNodes.get(i) as never)?.data as TextData | undefined;\n return { kind: 'label', text: typeof data?.text === 'string' ? data.text : '', style: rowStyle(data?.style) };\n });\n const spec: BodySpec = { outline: trait.outline, rows, padding: layout.padding, gap: layout.gap, verticalAlign: layout.verticalAlign };\n const heights = rowHeights(spec, measure);\n if (layout.heights === undefined || heights.some((h, i) => h !== layout.heights![i])) {\n const data = node.data as { diagram: DiagramNode };\n scene.update(id as never, { data: { ...data, diagram: { ...trait, body: { ...layout, heights } } } } as never);\n }\n const pose = node.pose as Box;\n const grown = sizeToBody(pose, measureBody(spec, measure));\n if (grown !== pose) scene.setPose(id as never, grown as never);\n // Rows are stored in the body's own frame.\n for (const box of layoutBody(spec, { x: 0, y: 0, width: grown.width, height: grown.height }, measure)) {\n const child = rowNodes.get(box.index);\n const at = child === undefined ? undefined : scene.get(child as never)?.pose as Box | undefined;\n if (at === undefined) continue;\n const next = { ...at, x: box.x, y: box.y, width: box.width, height: box.height };\n if (!same(at, next)) scene.setPose(child as never, next as never);\n }\n }\n}\n","/**\n * The plain data `diagramScene` reads, and the options and styles it takes.\n */\nimport type { AddNodeSpec, MarkerRef, Page, PageLayoutOptions, PoseComposition, RectPose, Stroke } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { BodySpec, MeasureRowText, Row } from './body';\nimport type { DiagramEdge } from './edgeTrait';\nimport type { DiagramAnchor } from './group';\nimport type { DiagramLabel } from './labelTrait';\nimport type { LayoutFn, LayoutOptions, LayoutPorts } from './layout';\nimport type { DataMark, DiagramMark } from './marks';\nimport type { OffPageTag } from './offPage/trait';\nimport type { Outline } from './outline';\nimport type { DiagramTextStyle } from './rowStyle';\nimport type { DiagramTheme } from './theme/types';\nimport type { DiagramNode, PortSpec } from './types';\n\n/** One node of a {@link DiagramData}: its rows of text, and optionally its outline, ports, size, and starting place. */\nexport interface DataNode {\n id: string;\n /** Shorthand for one `label` row per line. Ignored when `rows` is given. */\n lines?: readonly string[];\n rows?: readonly Row[];\n /** Default `DiagramSceneOptions.outline`, which defaults to `'rect'`. */\n outline?: Outline;\n /** Perimeter ports, replacing the four compass midpoints. */\n ports?: readonly PortSpec[];\n /** Labels for the perimeter ports by id, drawn outside the box beside each. */\n portLabels?: Readonly<Record<string, string>>;\n /** Layout leaves this node at `at`. */\n pinned?: boolean;\n /** Where the node starts, before layout. Unset, nodes start on the\n * diagonal in source order, which is what within-rank order is seeded\n * from. */\n at?: Vec2;\n /** The smallest the box may be. Its content grows it past this. */\n width?: number;\n height?: number;\n /** Default `DiagramSceneOptions.padding`. */\n padding?: number;\n /** Default `DiagramSceneOptions.gap`. */\n gap?: number;\n /** Default `DiagramSceneOptions.verticalAlign`. */\n verticalAlign?: BodySpec['verticalAlign'];\n /** Drawn over the box besides its rows: shapes in a unit square stretched\n * over it, and text pinned to a point on it. */\n marks?: readonly DataMark[];\n /** The theme role it is drawn in, under `DiagramSceneOptions.theme`. Kept on its trait. */\n style?: string;\n /** Colors of its own, over its role's. Each one set is listed in the trait's `ownStyle`, so a\n * theme change leaves it. */\n colors?: Partial<NodeStyle>;\n}\n\n/** One edge of a {@link DiagramData}, between two nodes or groups by id. */\nexport interface DataEdge {\n /** The scene node id this edge gets, for an editor that must find it again\n * after its ends, ports or label change. Unset, {@link edgeIdOf} derives\n * one from those. */\n id?: string;\n /** A node's id, or a group's: an edge naming a group meets its box. */\n from: string;\n to: string;\n /** The port to leave from or arrive at. Unset, the end facing the other\n * node most directly. */\n fromPort?: string;\n toPort?: string;\n label?: string;\n /** Where along the edge the label sits. Unset or at `'mid'`, under\n * `layered` the label sits in the room layout leaves it beside its wire,\n * at this placement's offset, else `DiagramSceneOptions.labelPlacement`'s;\n * otherwise at the placement. */\n labelPlacement?: DiagramLabel;\n /** Default `DiagramSceneOptions.router`. */\n router?: DiagramRouter;\n /** World points the route passes through. Layout does not move them. */\n waypoints?: readonly Vec2[];\n /** A route a layout run wrote, as `DiagramView`'s `onMove` reports it: drawn\n * until layout runs again, which may replace it. `waypoints` wins. */\n routed?: readonly Vec2[];\n /** Ports a layout run named, as `onMove` reports them: used like `routed`,\n * and not part of the edge's id. `fromPort` and `toPort` win. */\n routedPorts?: LayoutPorts;\n /** The theme role it is drawn in, under `DiagramSceneOptions.theme`: that role's stroke. Kept on its trait. */\n style?: string;\n /** Its stroke, markers, and label color of its own, over the theme's. `stroke` and `label` are\n * listed in the trait's `ownStyle` (as `stroke` and `text`), so a theme change leaves them. */\n colors?: Partial<EdgeStyle>;\n}\n\n/** A box drawn around some nodes, which layout keeps together. */\nexport interface DataGroup {\n /** Shares one namespace with node ids. */\n id: string;\n /** Node ids, and the ids of groups nested in this one. A node or group a\n * later group also names stays in this one; an id that is neither is\n * ignored, and so is one that would put a group inside itself. */\n members: readonly string[];\n /** Drawn inside the box, above its members. */\n label?: string;\n /** Between the box and its members, and around the label. Default\n * `DiagramSceneOptions.groupPadding`. */\n padding?: number;\n /** The axis its members can be dragged along to change their order, in a\n * `DiagramView` given `onReorder`. A member that is a group carries\n * everything inside it. */\n reorder?: 'x' | 'y';\n}\n\n/** A diagram as plain data, the input to `diagramScene`. */\nexport interface DiagramData {\n nodes: readonly DataNode[];\n edges: readonly DataEdge[];\n /** A group may be a member of another. `layered`, `tree`, `force`, and `chain`\n * keep each group's members together; `'none'` ignores groups but still\n * draws them. */\n groups?: readonly DataGroup[];\n /** Containers and pools: regions drawn as scene containers that hold their\n * members, which a `DiagramView` drags shapes into and out of. */\n containers?: readonly DataContainer[];\n /** The sheets the diagram is drawn on, in world space as `layoutPages` places them; a node\n * belongs to the page its box overlaps most (`pageOfBounds`). A connector whose ends belong\n * to different pages is split into two stubs, each with an off-page tag. A node in the gap\n * between pages belongs to none, and its connectors stay whole. */\n pages?: readonly Page[];\n /** How `pages` are laid out in world space. */\n pageLayout?: PageLayoutOptions;\n}\n\n/**\n * A container or a pool, drawn as a region that holds its members. Its id\n * shares one namespace with node, group, and lane ids.\n *\n * With a `box` it is laid out as one node of that size, and its members ride\n * along with it: a member with no `at` is seeded inside its body, in rows.\n * With none, a container is laid out as a group and its box fits its members.\n * A pool always has a box, {@link DEFAULT_POOL_ACROSS} across and\n * {@link DEFAULT_LANE_SIZE} along per lane when none is given. An edge with\n * an end inside a boxed region ranks against the outermost one holding it.\n */\nexport interface DataContainer {\n id: string;\n role: 'container' | 'pool';\n /** Its title, drawn in its header. */\n label?: string;\n /** A container's direct members: node ids and container ids. A member\n * already claimed by an earlier container, a pool, an unknown id, and one\n * that would put a container inside itself are ignored. */\n members?: readonly string[];\n /** A pool's lanes, in the order they stack. */\n lanes?: readonly DataLane[];\n /** Lets a container's members be dragged along this axis among each other\n * with `onReorder`, which hears the container and its members in their\n * new order, as a group's do. Nothing moves until the members do: write\n * the order to `members`, and place them by it. Not for a pool. */\n reorder?: 'x' | 'y';\n /** The axis a pool stacks its lanes along: `'y'` for rows. Default `'y'`. */\n axis?: 'x' | 'y';\n /** Where it stands and how big it is, in world units. A pool's size along\n * its stack is shared by the lanes that give no `size`. */\n box?: { x: number; y: number; width: number; height: number };\n /** Layout leaves its box where it is. */\n pinned?: boolean;\n /** The theme role it is drawn in. Unset, a container takes the theme's\n * `container` style, a pool its `lane.header`. */\n style?: string;\n /** Colors of its own, over its style's, listed in its trait's `ownStyle` as a node's are. */\n colors?: Partial<NodeStyle>;\n}\n\n/** One lane of a pool. Its id shares the node id namespace. */\nexport interface DataLane {\n id: string;\n label?: string;\n /** Its depth along the pool's stack, in world units. */\n size?: number;\n /** Node ids and container ids, claimed as a container's are. */\n members?: readonly string[];\n /** Colors of its own, as a container's. A lane draws no fill. */\n colors?: Partial<NodeStyle>;\n}\n\n/** A pool's size across its stack when it gives no box. */\nexport const DEFAULT_POOL_ACROSS = 600;\n/** A lane's size along its pool's stack when neither it nor the pool's box gives one. */\nexport const DEFAULT_LANE_SIZE = 120;\n\n/** The colors and outline a node is drawn with. */\nexport interface NodeStyle {\n fill: string;\n stroke: string;\n text: string;\n strokeWidth?: number;\n dash?: number[];\n}\n\n/** What a node is drawn with when nothing says otherwise. */\nexport const DEFAULT_NODE_STYLE: NodeStyle = { fill: '#16222c', stroke: '#7ba7c7', text: '#dbe7f2' };\n/** A node's or region's outline width when its style gives none. */\nexport const NODE_STROKE_WIDTH = 2;\n/** A lane's outline width, which its style does not change. */\nexport const LANE_STROKE_WIDTH = 1;\n/** An edge's stroke width when its style gives none. */\nexport const EDGE_STROKE_WIDTH = 1.5;\n\n/** The stroke, markers, and label color an edge is drawn with. */\nexport interface EdgeStyle {\n stroke: string;\n width?: number;\n dash?: number[];\n /** `null` for none. Default none. */\n markerStart?: MarkerRef | null;\n /** `null` for none. Default `'arrow'`. */\n markerEnd?: MarkerRef | null;\n /** Default `stroke`. */\n label?: string;\n}\n\n/** How an edge is drawn between its ends. */\nexport type DiagramRouter = 'straight' | 'bezier' | 'orthogonal' | 'avoid';\n/** The `data` of a scene node `diagramScene` makes: its diagram role, and what it paints. */\nexport interface DiagramSceneData {\n diagram?: DiagramNode | DiagramEdge | { label: DiagramLabel } | { anchor: DiagramAnchor } | { mark: DiagramMark } | { offPageTag: OffPageTag };\n fill?: { paint: { color: string; opacity?: number } };\n stroke?: Stroke;\n text?: string;\n style?: DiagramTextStyle;\n verticalAlign?: 'top' | 'center' | 'bottom';\n /** What a slot is filled with: an image the kit's image painter draws. */\n image?: { src: string; opacity?: number };\n /** A body's text row: its place among the body's rows (see `DiagramNode.body`). */\n bodyRow?: number;\n /** An off-page tag's box, behind its text, and the room between them. */\n background?: { paint: { color: string } };\n padding?: number;\n}\n\n/** A scene node spec, as `diagramScene` returns them. */\nexport type DiagramSpec<TLayer extends string = 'main'> = AddNodeSpec<DiagramSceneData, TLayer, RectPose>;\n\n/** How `diagramScene` lays out, routes, and styles a {@link DiagramData}. */\nexport interface DiagramSceneOptions<TLayer extends string = 'main'> {\n /** The layer every spec goes on. Default `'main'`. */\n layer?: TLayer;\n /** A layout by name, or any `LayoutFn`. Default `'layered'`. `'none'`\n * leaves every node at its `at`. */\n layout?: 'layered' | 'tree' | 'force' | 'chain' | 'none' | LayoutFn;\n /** Merged over `{ order: 'barycenter' }`. */\n layoutOptions?: LayoutOptions;\n /** Default `'bezier'`. */\n router?: DiagramRouter;\n /** The text style rows fall back on. Default 12px sans-serif. */\n font?: { fontFamily: string; fontSize: number };\n /** Measures one run of text. Default an estimate from character count, so\n * layout needs no canvas; pass `canvasMeasure(ctx)` for real widths. */\n measure?: MeasureRowText;\n /** Default `'rect'`. */\n outline?: Outline;\n /** Between a box's outline and its rows. Default 8. */\n padding?: number;\n /** Between adjacent rows. Default 4. */\n gap?: number;\n /** Where a box's rows sit when it is taller than they need. Default `'center'`. */\n verticalAlign?: BodySpec['verticalAlign'];\n /** The narrowest a box may be. Default 64. */\n minWidth?: number;\n /** Where edge labels sit. Default `{ at: 'mid', offset: 9 }`. */\n labelPlacement?: DiagramLabel;\n /** A node's look; `undefined` keeps the theme's, else {@link DEFAULT_NODE_STYLE}. */\n nodeStyle?: (node: DataNode) => NodeStyle | undefined;\n /** Default 12. */\n groupPadding?: number;\n /** A group's box and label. `text` colors the label. `undefined` keeps the theme's\n * container, else `DEFAULT_GROUP_STYLE`. */\n groupStyle?: (group: DataGroup) => NodeStyle | undefined;\n /** An edge's look; `undefined` keeps the theme's, else `DEFAULT_EDGE_STYLE`. */\n edgeStyle?: (edge: DataEdge) => EdgeStyle | undefined;\n /** Styles nodes by their `style` role, and edges, groups and text by the theme, where the\n * functions above leave them; and its face is the default `font`. */\n theme?: DiagramTheme;\n /** How the scene the specs go into folds a child's pose into its container's: each\n * spec's pose is stored in its container's frame under it. Default\n * `RIGID_POSE_COMPOSITION`, a scene's own default. */\n composition?: PoseComposition<RectPose>;\n}\n","/**\n * The node specs of a region — a container, a pool, or a lane — and its title,\n * which a stencil drawn on the canvas and a `DiagramData` container both build\n * from.\n */\nimport type { AddNodeSpec, NodeId, RectPose } from '@weasel-js/core';\nimport { LANE_STROKE_WIDTH, DEFAULT_NODE_STYLE, NODE_STROKE_WIDTH, type DiagramSceneData, type NodeStyle } from '../dataTypes';\nimport { DEFAULT_FONT } from '../edgeLabel';\nimport { CONTAINER_LAYOUTS, containerShape } from './layouts';\nimport { MIN_LANE_SIZE } from './laneStack';\nimport { titlePose } from './titlePose';\nimport { titleIdOf, type ContainerRole, type DiagramContainer } from './trait';\n\n/** How many lanes a new pool starts with. */\nconst NEW_POOL_LANES = 2;\n\n/** A region's node spec, always with an id. */\nexport type RegionSpec<TLayer extends string> = AddNodeSpec<DiagramSceneData, TLayer, RectPose> & { id: NodeId };\n\n/** Options for `containerBuild`. */\nexport interface ContainerBuildOptions<TLayer extends string> {\n layer: TLayer;\n newId: () => string;\n /** The box's fill, stroke and title colors. Default `diagramScene`'s node style. */\n style?: NodeStyle;\n /** The container the new one goes in. Default the top level. */\n parent?: string | null;\n /** A pool's header colors and its lanes' bodies in turn. Default `style` for both. */\n laneStyles?: { header: NodeStyle; bodies: readonly NodeStyle[] };\n}\n\n/** Options for {@link regionSpecs}. */\nexport interface RegionOptions<TLayer extends string> {\n id: string;\n layer: TLayer;\n /** Default the top level. */\n parent?: string | null;\n /** Default `diagramScene`'s node style. */\n style?: NodeStyle;\n /** Marks a region whose box is fitted to its members each time it is built from data. */\n fitted?: boolean;\n /** A container's reorder axis. */\n reorder?: 'x' | 'y';\n /** The title's family. Default sans-serif. */\n fontFamily?: string;\n}\n\nfunction regionData(role: ContainerRole, axis: 'x' | 'y', style: NodeStyle, fitted: boolean, reorder?: 'x' | 'y'): DiagramSceneData {\n const container: DiagramContainer = {\n role, header: containerShape(role, axis).header, ...(fitted ? { fitted: true } : {}), ...(reorder !== undefined ? { reorder } : {}),\n };\n return {\n diagram: { outline: 'rect', container },\n ...(role === 'lane' ? {} : { fill: { paint: { color: style.fill } } }),\n stroke: { paint: { color: style.stroke }, width: role === 'lane' ? LANE_STROKE_WIDTH : style.strokeWidth ?? NODE_STROKE_WIDTH },\n };\n}\n\nconst titleData = (text: string, style: NodeStyle, fontFamily = DEFAULT_FONT.fontFamily): DiagramSceneData => ({\n text,\n style: { fontFamily, fontSize: 13, fontWeight: 700, align: 'center' },\n verticalAlign: 'center',\n fill: { paint: { color: style.text } },\n});\n\n/** The node specs of one region, and its title unless `title` is null. */\nexport function regionSpecs<TLayer extends string>(\n role: ContainerRole, axis: 'x' | 'y', pose: RectPose, title: string | null, opts: RegionOptions<TLayer>,\n): RegionSpec<TLayer>[] {\n const style = opts.style ?? DEFAULT_NODE_STYLE;\n const { layout, header } = containerShape(role, axis);\n const region: RegionSpec<TLayer> = {\n id: opts.id as NodeId, kind: 'mark', layer: opts.layer, pose, parent: (opts.parent ?? null) as NodeId | null,\n data: regionData(role, axis, style, opts.fitted === true, opts.reorder), layout: CONTAINER_LAYOUTS[layout],\n };\n if (title === null) return [region];\n return [region, {\n id: titleIdOf(opts.id) as NodeId, kind: 'mark', layer: opts.layer, parent: opts.id as NodeId, pickable: false,\n pose: titlePose(pose, header), data: titleData(title, style, opts.fontFamily),\n }];\n}\n\n/** The lane specs a new pool at `at` starts with. */\nexport function firstLanes<TLayer extends string>(\n poolId: string, axis: 'x' | 'y', at: RectPose, opts: ContainerBuildOptions<TLayer>,\n): RegionSpec<TLayer>[] {\n const { header } = containerShape('pool', axis);\n const size = Math.max(MIN_LANE_SIZE, (axis === 'y' ? at.height : at.width) / NEW_POOL_LANES);\n const out: RegionSpec<TLayer>[] = [];\n for (let i = 0; i < NEW_POOL_LANES; i++) {\n const pose: RectPose = axis === 'y'\n ? { x: at.x + header.size, y: at.y + i * size, width: at.width - header.size, height: size }\n : { x: at.x + i * size, y: at.y + header.size, width: size, height: at.height - header.size };\n const bodies = opts.laneStyles?.bodies ?? [];\n const style = bodies.length > 0 ? bodies[i % bodies.length] : opts.style;\n out.push(...regionSpecs('lane', axis, pose, `Lane ${i + 1}`, {\n id: opts.newId(), layer: opts.layer, parent: poolId, ...(style ? { style } : {}),\n }));\n }\n return out;\n}\n","/** Which of a data item's own colors `diagramScene` lists in its trait's `ownStyle`. */\nimport type { EdgeStyle, NodeStyle } from './dataTypes';\nimport type { StyleField } from './theme/styleField';\n\nconst NODE_FIELDS: readonly StyleField[] = ['fill', 'stroke', 'text'];\n\n/** The `ownStyle` a node, container, or lane given `colors` carries: `{}` when it sets no color. */\nexport function ownNodeStyle(colors: Partial<NodeStyle> | undefined): { ownStyle?: StyleField[] } {\n const own = NODE_FIELDS.filter((f) => colors?.[f] !== undefined);\n return own.length > 0 ? { ownStyle: own } : {};\n}\n\n/** The `ownStyle` an edge given `colors` carries: its stroke as `stroke`, its label as `text`. */\nexport function ownEdgeStyle(colors: Partial<EdgeStyle> | undefined): { ownStyle?: StyleField[] } {\n const own: StyleField[] = [];\n if (colors?.stroke !== undefined) own.push('stroke');\n if (colors?.label !== undefined) own.push('text');\n return own.length > 0 ? { ownStyle: own } : {};\n}\n\n/** `style` with every color `colors` sets over it. */\nexport function withColors<T extends object>(style: T, colors: Partial<T> | undefined): T {\n if (colors === undefined) return style;\n const out = { ...style };\n for (const [k, v] of Object.entries(colors)) if (v !== undefined) (out as Record<string, unknown>)[k] = v;\n return out;\n}\n","/**\n * The style each item of a `DiagramData` is drawn in: its own colors over its\n * theme role's, over the theme's defaults. `diagramScene` draws with these, and\n * a format writing a document's colors out reads them the same way.\n */\nimport { withColors } from './dataColors';\nimport { DEFAULT_NODE_STYLE, type DataContainer, type DataEdge, type DataNode, type EdgeStyle, type NodeStyle } from './dataTypes';\nimport { roleEdgeStyle, roleStyle } from './theme/resolve';\nimport type { DiagramTheme } from './theme/types';\n\n/** What an edge is drawn with when there is no theme and nothing says otherwise. */\nexport const DEFAULT_EDGE_STYLE: EdgeStyle = { stroke: '#7ba7c7' };\n\n/** A node's style: its colors over its role's under `theme`, else over {@link DEFAULT_NODE_STYLE}. */\nexport function dataNodeStyle(node: Pick<DataNode, 'style' | 'colors'>, theme?: DiagramTheme): NodeStyle {\n return withColors(theme ? roleStyle(theme, node.style) : DEFAULT_NODE_STYLE, node.colors);\n}\n\n/** An edge's style: its colors over its role's stroke under `theme`, else over the theme's connector, else over {@link DEFAULT_EDGE_STYLE}. */\nexport function dataEdgeStyle(edge: Pick<DataEdge, 'style' | 'colors'>, theme?: DiagramTheme): EdgeStyle {\n return withColors(theme ? roleEdgeStyle(theme, edge.style) : DEFAULT_EDGE_STYLE, edge.colors);\n}\n\n/** A region as {@link dataRegionStyle} reads it: a container, a pool, or a lane. */\nexport interface StyledRegion {\n role: DataContainer['role'] | 'lane';\n style?: string;\n colors?: Partial<NodeStyle>;\n}\n\n/**\n * A region's style: its colors over its theme role's, else over the theme's\n * container, its pool header, or the lane body at `laneIndex` in turn; with no\n * theme, over {@link DEFAULT_NODE_STYLE}.\n */\nexport function dataRegionStyle(region: StyledRegion, theme?: DiagramTheme, laneIndex = 0): NodeStyle {\n return withColors(themeRegionStyle(region, theme, laneIndex), region.colors);\n}\n\nfunction themeRegionStyle(r: StyledRegion, theme: DiagramTheme | undefined, laneIndex: number): NodeStyle {\n if (theme === undefined) return DEFAULT_NODE_STYLE;\n const own = r.style !== undefined ? theme.roles[r.style] : undefined;\n if (own !== undefined) return own;\n if (r.role === 'pool') return theme.lane.header;\n if (r.role === 'lane') return theme.lane.bodies[laneIndex % Math.max(1, theme.lane.bodies.length)] ?? theme.container;\n return theme.container;\n}\n","import type { DataEdge } from './fromData';\n\n/** A part of an edge id with its separators, and the `/` sub-specs append\n * after one, escaped by a backslash. */\nconst idPart = (s: string) => s.replace(/[\\\\.>:/]/g, '\\\\$&');\n\n/** The scene node id `diagramScene` gives an edge: its `id` when set, else one\n * built from its ends, ports, and label. Two edges differing in any of those\n * get different ids, an empty port or label included: a `.`, `>`, `:`, `/` or\n * `\\` in one of them is escaped with a backslash. */\nexport const edgeIdOf = (e: DataEdge) => {\n if (e.id !== undefined) return e.id;\n const part = (mark: string, p: string | undefined) => (p === undefined ? '' : `${mark}${idPart(p)}`);\n return `edge:${idPart(e.from)}${part('.', e.fromPort)}->${idPart(e.to)}${part('.', e.toPort)}${part(':', e.label)}`;\n};\n","/**\n * Which connectors cross from one page to another, as arithmetic: page\n * rects and end boxes in, splits out. Nothing here reads a scene.\n */\nimport { pageOfBounds, type PlacedPage } from '@weasel-js/core';\nimport type { OffPageSplit } from './trait';\n\ntype Box = { x: number; y: number; width: number; height: number };\n\n/** One connector as {@link offPageSplits} reads it: its two ends' world boxes,\n * and the split it holds now, if any. */\nexport interface OffPageEdgeInput {\n id: string;\n from: Box;\n to: Box;\n offPage?: OffPageSplit | undefined;\n}\n\n/** What {@link offPageSplits} reads. */\nexport interface OffPageSplitInput {\n pages: readonly PlacedPage[];\n edges: readonly OffPageEdgeInput[];\n /** Refs held by split connectors not in `edges`, which no edge here may take. */\n used?: Iterable<string>;\n}\n\n/** The letters of the `n`th ref, counting from 0: A…Z, then AA, AB, … */\nfunction refAt(n: number): string {\n let out = '';\n for (let k = n + 1; k > 0; k = Math.floor((k - 1) / 26)) out = String.fromCharCode(65 + ((k - 1) % 26)) + out;\n return out;\n}\n\n/** The first ref, in A…Z, AA… order, that `used` does not hold. */\nexport function nextOffPageRef(used: ReadonlySet<string>): string {\n let n = 0;\n while (used.has(refAt(n))) n++;\n return refAt(n);\n}\n\n/**\n * Each connector's split, or `null` where it stays whole. A connector splits\n * when its two ends belong to different pages (`pageOfBounds`); an end in a\n * gap belongs to none, and never splits. A split keeps the ref it holds while\n * no earlier connector here or `used` holds it too; a new one takes the next\n * free ref.\n */\nexport function offPageSplits(input: OffPageSplitInput): Map<string, OffPageSplit | null> {\n const used = new Set(input.used ?? []);\n const out = new Map<string, OffPageSplit | null>();\n const fresh: { id: string; from: string; to: string }[] = [];\n for (const edge of input.edges) {\n const from = pageOfBounds(input.pages, edge.from);\n const to = pageOfBounds(input.pages, edge.to);\n if (from === null || to === null || from.id === to.id) {\n out.set(edge.id, null);\n continue;\n }\n const held = edge.offPage?.ref;\n if (held !== undefined && !used.has(held)) {\n used.add(held);\n out.set(edge.id, { ref: held, from: from.id, to: to.id });\n } else {\n out.set(edge.id, null);\n fresh.push({ id: edge.id, from: from.id, to: to.id });\n }\n }\n for (const split of fresh) {\n const ref = nextOffPageRef(used);\n used.add(ref);\n out.set(split.id, { ref, from: split.from, to: split.to });\n }\n return out;\n}\n","/** The pages a {@link DiagramData} is drawn on, and the connectors that cross between them. */\nimport { layoutPages, type Bounds, type PlacedPage } from '@weasel-js/core';\nimport type { DiagramData, DiagramSpec } from './dataTypes';\nimport { diagramGroupOf } from './group';\nimport { offPageSplits } from './offPage/split';\nimport { offPageTagSpecs, type OffPageTagLook } from './offPage/tag';\nimport type { OffPageSplit } from './offPage/trait';\n\n/** `data`'s pages, placed in world space. */\nexport function diagramPages(data: DiagramData): PlacedPage[] {\n return layoutPages(data.pages ?? [], data.pageLayout);\n}\n\n/**\n * Which of `edges` cross between `pages`, lettered in their order, and the two\n * off-page tags of each that does. An edge with an end `boxOf` has no box for\n * is left whole.\n */\nexport function dataOffPage(\n edges: readonly { id: string; from: string; to: string }[],\n pages: readonly PlacedPage[],\n boxOf: (id: string) => Bounds | undefined,\n look: OffPageTagLook,\n): { splits: ReadonlyMap<string, OffPageSplit>; tags: DiagramSpec[] } {\n const input = edges.flatMap((e) => {\n const from = boxOf(e.from);\n const to = boxOf(e.to);\n return from === undefined || to === undefined ? [] : [{ id: e.id, from, to }];\n });\n const splits = new Map<string, OffPageSplit>();\n const tags: DiagramSpec[] = [];\n for (const [id, split] of offPageSplits({ pages, edges: input })) {\n if (split === null) continue;\n splits.set(id, split);\n tags.push(...(offPageTagSpecs(id, split, pages, { ...look, layer: 'main' }) as DiagramSpec[]));\n }\n return { splits, tags };\n}\n\n/** {@link dataOffPage} for `diagramScene`: ends are boxed by where nodes and regions were\n * placed, and by the group specs already made. Nothing when `data` has no pages. */\nexport function scenePageSplits(\n data: DiagramData,\n placedAt: ReadonlyMap<string, Bounds>,\n specs: readonly DiagramSpec[],\n edges: readonly { id: string; from: string; to: string }[],\n look: () => OffPageTagLook,\n): { splits: ReadonlyMap<string, OffPageSplit>; tags: DiagramSpec[] } | null {\n const pages = diagramPages(data);\n if (pages.length === 0) return null;\n const groups = new Map(specs.filter((s) => diagramGroupOf(s) !== null).map((s) => [String(s.id), s.pose as Bounds]));\n return dataOffPage(edges, pages, (id) => placedAt.get(id) ?? groups.get(id), look());\n}\n","/**\n * Which group holds what, settled once for both readers of groups: the scene\n * graph a layout runs over, and the data a diagram is built from.\n *\n * A group names nodes and other groups. A node belongs to the first group that\n * names it and a group to the first group that names it, in source order; a\n * membership that would make a group its own ancestor is ignored, and so is an\n * id that is neither. A group with no node anywhere inside it is dropped.\n */\n\n/** A group as declared: its id and the ids it names. */\nexport interface DeclaredGroup {\n id: string;\n members: readonly string[];\n}\n\n/** A group with its place in the tree settled. */\nexport interface NestedGroup {\n id: string;\n /** The nodes and groups directly inside, in the order they were named. */\n direct: string[];\n /** Every node inside, through any nested group, in that same order. */\n members: string[];\n /** The group this one is directly inside. */\n parent?: string;\n}\n\nexport function nestGroups(\n declared: readonly DeclaredGroup[],\n isNode: (id: string) => boolean,\n): NestedGroup[] {\n const groupIds = new Set(declared.map((g) => g.id));\n const parentOf = new Map<string, string>();\n const claimedNodes = new Set<string>();\n const direct = new Map<string, string[]>();\n\n const isAncestorOrSelf = (candidate: string, of: string): boolean => {\n for (let at: string | undefined = of; at !== undefined; at = parentOf.get(at)) {\n if (at === candidate) return true;\n }\n return false;\n };\n\n for (const group of declared) {\n const own: string[] = [];\n for (const id of group.members) {\n if (isNode(id)) {\n if (claimedNodes.has(id)) continue;\n claimedNodes.add(id);\n own.push(id);\n } else if (groupIds.has(id) && !parentOf.has(id) && !isAncestorOrSelf(id, group.id)) {\n parentOf.set(id, group.id);\n own.push(id);\n }\n }\n direct.set(group.id, own);\n }\n\n const flat = new Map<string, string[]>();\n const flatten = (id: string): string[] => {\n const known = flat.get(id);\n if (known !== undefined) return known;\n const out: string[] = [];\n for (const member of direct.get(id)!) {\n if (groupIds.has(member)) out.push(...flatten(member));\n else out.push(member);\n }\n flat.set(id, out);\n return out;\n };\n\n const live = new Set(declared.filter((g) => flatten(g.id).length > 0).map((g) => g.id));\n return declared.filter((g) => live.has(g.id)).map((g) => {\n const parent = parentOf.get(g.id);\n return {\n id: g.id,\n direct: direct.get(g.id)!.filter((id) => !groupIds.has(id) || live.has(id)),\n members: flat.get(g.id)!,\n ...(parent !== undefined ? { parent } : {}),\n };\n });\n}\n","/**\n * `Graph` — the adjacency index a layout runs over.\n *\n * Built from the scene on demand, used, and thrown away. Rebuilding per layout\n * invocation is deliberate — a maintained index is a cache to invalidate on\n * every add, delete, reparent, and `dependsOn` edit, and layout is not on the\n * hot path.\n */\nimport { AUTO_POSE_DESCRIPTOR, type PoseDescriptor, type Vec2 } from '@weasel-js/core/math';\nimport { expandGroupEdges, insetOf, type GroupInset } from './cluster';\nimport { diagramEdgeOf, layoutOwnsRoute } from './edgeTrait';\nimport { nestGroups } from './groupTree';\nimport { diagramLabelOf, type DiagramLabel } from './labelTrait';\nimport type { Bounds, Outline } from './outline';\nimport { diagramNodeOf, type DiagramNodeLike, type DiagramNodeReader } from './trait';\nimport type { PortSpec } from './types';\n\n/** A scene node as the graph reads it. `dependsOn` is what an edge's two\n * endpoints are: the edge trait names *ports*, and the nodes those ports are\n * on are the dependencies the derivation already runs on. */\nexport interface GraphNodeLike extends DiagramNodeLike {\n dependsOn?: readonly string[] | 'children';\n}\n\n/** Where the graph gets its nodes. The same thunk shape the port affordance\n * takes, so one source answers both. */\nexport type GraphSource<TPose> = () => Iterable<{ node: GraphNodeLike; pose: TPose }>;\n\n/** One participant. */\nexport interface GraphNode {\n id: string;\n /** Where it is now, in world coordinates. */\n bounds: Bounds;\n /** Layout must not move it. */\n pinned: boolean;\n /** The innermost group it belongs to, when it belongs to one. */\n group?: string;\n /** Where its ports sit. Absent, the four compass midpoints\n * (`DEFAULT_PORTS`). */\n ports?: readonly PortSpec[];\n /** The shape its ports are cast onto, as `portsOf` casts them. Absent,\n * its bounds. */\n outline?: Outline;\n /** How far past `bounds` it reaches (`DiagramNode.margin`). `planOf` lays\n * it out as that much bigger. */\n margin?: GroupInset;\n}\n\n/** A box drawn around some participants, which a layout keeps together and\n * leaves room for. */\nexport interface GraphGroup {\n id: string;\n /** Every participant inside, through any group nested in this one, in\n * source order. */\n members: readonly string[];\n /** Room the box keeps around what it holds, in world units. */\n inset: GroupInset;\n /** The narrowest its box may be across the world x axis, which a layout\n * leaves room for. */\n minWidth?: number;\n /** The group this one is directly inside. */\n parent?: string;\n /** Its direct members, nodes and groups, in the order a layered layout\n * keeps them across every rank: set for a group that reorders. */\n ordered?: readonly string[];\n}\n\n/** One connection. `id` is the edge node's own id, so a caller can go back to\n * the scene for its trait. */\nexport interface GraphEdge {\n id: string;\n from: string;\n to: string;\n /** The port it leaves `from` by, when it names one. */\n fromPort?: string;\n /** The port it arrives at `to` by, when it names one. */\n toPort?: string;\n /** Room its label needs: the label's box, and how far its near side sits\n * from the wire (`DiagramLabel.offset`). `layered` sets the label beside\n * its wire in a rank of its own. */\n label?: EdgeLabelRoom;\n /** Where its route runs now, from `from` to `to`. `layered` starts each\n * placeholder where the route already crosses that rank, so a re-run keeps\n * the order the last one settled on. */\n waypoints?: readonly Vec2[];\n /** Its route is someone's own: layout leaves it, and keeps no room for it\n * in the ranks it crosses. */\n authored?: boolean;\n /** The edge as drawn, when this one stands in for an edge to or from a\n * group (see `expandGroupEdges`). */\n origin?: { id: string; from: string; to: string };\n}\n\n/** The room a {@link GraphEdge}'s label takes, in world units. */\nexport interface EdgeLabelRoom {\n width: number;\n height: number;\n /** Between the wire and the label's near side, to the left of the\n * direction of travel; negative for the right. Default 0, which centers\n * the label on the wire. */\n offset?: number;\n}\n\n/**\n * Nodes, edges, and the two adjacency reads a layout needs.\n *\n * Every list is in source order — render order, when the source is a scene —\n * which is what a layout's tiebreaks resolve against.\n */\nexport interface Graph {\n readonly nodes: readonly GraphNode[];\n readonly edges: readonly GraphEdge[];\n /** Absent or empty for a graph with no groups. */\n readonly groups?: readonly GraphGroup[];\n node(id: string): GraphNode | undefined;\n /** Edges leaving `id`, in source order. */\n outgoing(id: string): readonly GraphEdge[];\n /** Edges arriving at `id`, in source order. */\n incoming(id: string): readonly GraphEdge[];\n}\n\n/** Options for {@link buildGraph}: how the trait is read, and how a pose\n * yields bounds. Both default to the kit's own. */\nexport interface BuildGraphOptions<TPose> {\n read?: DiagramNodeReader;\n geometry?: PoseDescriptor<TPose>;\n}\n\n/**\n * Read a graph out of a source of scene nodes.\n *\n * A node is an edge if it carries the edge trait and names exactly two\n * dependencies; a group if its trait carries `group`, with its dependencies as\n * its members, which may be groups themselves (see `nestGroups`); a participant if the reader hands back any other\n * `DiagramNode`; and otherwise not in the diagram at all. An edge whose\n * endpoints are not both participants or groups is dropped, and an edge to a\n * group ranks against its members (see `expandGroupEdges`).\n */\nexport function buildGraph<TPose>(\n source: GraphSource<TPose>,\n opts: BuildGraphOptions<TPose> = {},\n): Graph {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n const nodes: GraphNode[] = [];\n const byId = new Map<string, GraphNode>();\n const candidates: GraphEdge[] = [];\n const groupNodes: { id: string; members: readonly string[]; inset: GroupInset; minWidth?: number; reorders?: boolean }[] = [];\n const routed = new Set<string>();\n const rooms = new Map<string, EdgeLabelRoom>();\n\n for (const { node, pose } of source()) {\n const edge = diagramEdgeOf(node);\n if (edge !== null) {\n const deps = node.dependsOn;\n if (Array.isArray(deps) && deps.length === 2) {\n candidates.push({\n id: node.id,\n from: deps[0]!,\n to: deps[1]!,\n ...(edge.from.port !== undefined ? { fromPort: edge.from.port } : {}),\n ...(edge.to.port !== undefined ? { toPort: edge.to.port } : {}),\n ...(edge.waypoints !== undefined && edge.waypoints.length > 0 ? { waypoints: edge.waypoints } : {}),\n ...(layoutOwnsRoute(edge) ? {} : { authored: true }),\n });\n if (layoutOwnsRoute(edge)) routed.add(node.id);\n }\n continue;\n }\n const label = diagramLabelOf(node);\n if (label !== null) {\n const deps = node.dependsOn;\n if (Array.isArray(deps) && deps.length === 1 && labelFollowsLayout(label.at) && !rooms.has(deps[0]!)) {\n const { width, height } = geometry.getBounds(pose);\n rooms.set(deps[0]!, { width, height, ...(label.offset ? { offset: label.offset } : {}) });\n }\n continue;\n }\n const trait = diagramNodeOf(node, opts.read);\n if (trait === null) continue;\n if (trait.group !== undefined) {\n const deps = node.dependsOn;\n groupNodes.push({\n id: node.id,\n members: Array.isArray(deps) ? deps : [],\n inset: insetOf(trait.group.inset),\n ...(trait.group.minWidth !== undefined ? { minWidth: trait.group.minWidth } : {}),\n ...(trait.group.reorder !== undefined ? { reorders: true } : {}),\n });\n continue;\n }\n const entry: GraphNode = {\n id: node.id,\n bounds: geometry.getBounds(pose),\n pinned: trait.pinned === true,\n ...(trait.ports !== undefined ? { ports: trait.ports } : {}),\n ...(trait.outline !== undefined ? { outline: trait.outline } : {}),\n ...(trait.margin !== undefined ? { margin: trait.margin } : {}),\n };\n nodes.push(entry);\n byId.set(entry.id, entry);\n }\n\n const declared = new Map(groupNodes.map((g) => [g.id, g]));\n const live: GraphGroup[] = nestGroups(groupNodes, (id) => byId.has(id)).map((g) => {\n for (const id of g.direct) {\n const node = byId.get(id);\n if (node !== undefined) node.group = g.id;\n }\n return {\n id: g.id,\n members: g.members,\n inset: declared.get(g.id)!.inset,\n ...(declared.get(g.id)!.minWidth !== undefined ? { minWidth: declared.get(g.id)!.minWidth } : {}),\n ...(g.parent !== undefined ? { parent: g.parent } : {}),\n ...(declared.get(g.id)!.reorders === true ? { ordered: g.direct } : {}),\n };\n });\n const known = (id: string) => byId.has(id) || live.some((g) => g.id === id);\n // Room beside layout's own route only: an author's waypoints say where the\n // wire goes, and the label goes with it.\n const roomed = candidates.map((e) => {\n const room = rooms.get(e.id);\n return room !== undefined && routed.has(e.id) ? { ...e, label: room } : e;\n });\n return graphOf(nodes, expandGroupEdges(roomed.filter((e) => known(e.from) && known(e.to)), live), live);\n}\n\nconst NONE: readonly GraphEdge[] = Object.freeze([]);\n\n/** The graph over `nodes`, `edges`, and `groups`, indexed for lookup. */\nexport function graphOf(nodes: GraphNode[], edges: GraphEdge[], groups: GraphGroup[] = []): Graph {\n const byId = new Map(nodes.map((n) => [n.id, n]));\n const out = new Map<string, GraphEdge[]>();\n const into = new Map<string, GraphEdge[]>();\n for (const edge of edges) {\n push(out, edge.from, edge);\n push(into, edge.to, edge);\n }\n return {\n nodes,\n edges,\n groups,\n node: (id) => byId.get(id),\n outgoing: (id) => out.get(id) ?? NONE,\n incoming: (id) => into.get(id) ?? NONE,\n };\n}\n\n/** Whether layout stations a label stationed at `at`: the default middle, or a\n * place among its edge's waypoints, which only layout hands out. A label put\n * at an end or a fraction stays there. */\nexport function labelFollowsLayout(at: DiagramLabel['at']): boolean {\n return at === 'mid' || typeof at === 'object';\n}\n\nfunction push(index: Map<string, GraphEdge[]>, key: string, edge: GraphEdge): void {\n const list = index.get(key);\n if (list === undefined) index.set(key, [edge]);\n else list.push(edge);\n}\n","import type { Row, RowTextStyle } from './body';\n\n/** The face a diagram node's text is set in. */\nexport type DiagramTextStyle = { fontFamily: string; fontSize: number; fontWeight?: number; fontStyle?: 'italic'; align?: 'center' };\n\ntype Font = { fontFamily: string; fontSize: number };\n\n/** The face `s` names, `font` filling in what it leaves out. */\nexport const textFace = (s: RowTextStyle | undefined, font: Font): DiagramTextStyle => ({\n fontFamily: s?.fontFamily ?? font.fontFamily,\n fontSize: s?.fontSize ?? font.fontSize,\n ...(s?.bold === true ? { fontWeight: 700 } : {}),\n ...(s?.italic === true ? { fontStyle: 'italic' as const } : {}),\n});\n\n/** The face a body row's text is set in. A label row's is centered in the row. */\nexport function rowTextStyle(row: Row | undefined, font: Font): DiagramTextStyle {\n const face = textFace(row?.kind === 'label' || row?.kind === 'field' ? row.style : undefined, font);\n return row?.kind === 'label' ? { ...face, align: 'center' } : face;\n}\n","/**\n * Marks: what a data node draws besides its rows. A drawn mark is SVG path\n * data in a unit square, stretched over the node's box, so it follows the node\n * wherever layout or a drag puts it. A text mark is pinned to a point on the box.\n */\nimport {\n commandFill,\n commandStroke,\n pathFromD,\n RECT_POSE_DESCRIPTOR,\n registerNodeShape,\n resolveFill,\n resolveStroke,\n transformPath,\n type Fill,\n type Inherit,\n type NodeShapeEntry,\n type Path,\n type PoseDescriptor,\n type Stroke,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { MeasureRowText, RowTextStyle } from './body';\nimport type { DiagramSpec, DiagramTextStyle, NodeStyle } from './fromData';\nimport { ANCHOR_DERIVE_POSE } from './group';\nimport type { Bounds } from './outline';\nimport { DIAGRAM_TRAIT_KEY } from './trait';\nimport type { PortAnchor } from './types';\n\n/** One mark on a `DataNode`. Colors default to the node's stroke and text. */\nexport type DataMark =\n | { d: string; fill?: string; stroke?: string; strokeWidth?: number; dash?: number[]; opacity?: number }\n | { text: string; at: PortAnchor; self?: PortAnchor; offset?: Vec2; color?: string; style?: RowTextStyle };\n\n/** The trait on a drawn mark's `data`: path data in a unit square. */\nexport interface DiagramMark { d: string }\n\n/** The mark a scene node carries, or null for a node that is not a drawn\n * mark: how `markShape` tells which nodes it paints. */\nexport function diagramMarkOf(node: { data: unknown }): DiagramMark | null {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const trait = (data as Record<string, unknown>)[DIAGRAM_TRAIT_KEY];\n if (trait === null || typeof trait !== 'object' || !('mark' in trait)) return null;\n const mark = (trait as { mark: unknown }).mark;\n return mark !== null && typeof mark === 'object' && typeof (mark as DiagramMark).d === 'string'\n ? (mark as DiagramMark)\n : null;\n}\n\nconst PARSED = new Map<string, Path>();\nconst PARSED_MAX = 256;\n\nfunction unitPath(d: string, onWarn?: (message: string) => void): Path {\n let path = PARSED.get(d);\n if (path === undefined) {\n let warned = false;\n path = pathFromD(d, (message) => {\n warned = true;\n onWarn?.(message);\n });\n if (path.kind === 'polygon' && path.commands.length === 0) onWarn?.('it draws nothing');\n else if (!warned) {\n if (PARSED.size >= PARSED_MAX) PARSED.clear();\n PARSED.set(d, path);\n }\n }\n return path;\n}\n\n/** Parse a drawn mark's path data now, so a typo surfaces where the diagram\n * is built rather than at first paint. */\nfunction checkMarkPath(nodeId: string, index: number, d: string): void {\n unitPath(d, (message) => {\n throw new Error(`diagramScene: node \"${nodeId}\", mark ${index}: path data ${JSON.stringify(d)} does not parse: ${message}`);\n });\n}\n\n/** The painter for a drawn mark. */\nexport function markShape<TPose>(\n opts: { geometry?: PoseDescriptor<TPose> } = {},\n): NodeShapeEntry<unknown, TPose> {\n const geometry = opts.geometry ?? (RECT_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n return {\n id: 'diagram:mark',\n matches: (node) => diagramMarkOf(node) !== null,\n paint: (node, pose, ctx) => {\n const mark = diagramMarkOf(node);\n if (mark === null) return [];\n const box = geometry.getBounds(pose);\n const d = node.data as { fill?: Fill | Inherit | null; stroke?: Stroke | Inherit | null };\n const declaredFill = resolveFill(d.fill, ctx?.inherited?.fill);\n const declaredStroke = resolveStroke(d.stroke, ctx?.inherited?.stroke);\n const fill = declaredFill && commandFill(declaredFill, box);\n const stroke = declaredStroke && commandStroke(declaredStroke, box);\n return [{\n kind: 'path',\n path: transformPath(unitPath(mark.d), [box.width, 0, 0, box.height, box.x, box.y]),\n ...(fill ? { fill } : {}),\n ...(stroke ? { stroke } : {}),\n }];\n },\n };\n}\n\n/** Register {@link markShape}; returns the disposer. */\nexport function registerMarkShape<TPose>(opts: { geometry?: PoseDescriptor<TPose> } = {}): () => void {\n return registerNodeShape(markShape(opts), { priority: 'high' });\n}\n\n/** The specs for one node's marks. `box` is where the node stands. */\nexport function markSpecs(\n nodeId: string,\n marks: readonly DataMark[],\n box: Bounds,\n ctx: { style: NodeStyle; textStyle: (s: RowTextStyle | undefined) => DiagramTextStyle; measure: MeasureRowText },\n): DiagramSpec[] {\n return marks.map((mark, i): DiagramSpec => {\n const id = `${nodeId}/mark:${i}` as never;\n if ('d' in mark) {\n checkMarkPath(nodeId, i, mark.d);\n const paint = (color: string) => ({ color, ...(mark.opacity !== undefined ? { opacity: mark.opacity } : {}) });\n const stroke = mark.stroke ?? (mark.fill === undefined ? ctx.style.stroke : undefined);\n return {\n id,\n kind: 'mark',\n layer: 'main',\n parent: nodeId as never,\n pickable: false,\n pose: { x: box.x, y: box.y, width: box.width, height: box.height },\n data: {\n diagram: { mark: { d: mark.d } },\n ...(mark.fill !== undefined ? { fill: { paint: paint(mark.fill) } } : {}),\n ...(stroke !== undefined\n ? { stroke: { paint: paint(stroke), width: mark.strokeWidth ?? 1.5, ...(mark.dash ? { dash: mark.dash } : {}) } }\n : {}),\n },\n };\n }\n const size = ctx.measure(mark.text, mark.style ?? {});\n const self = mark.self ?? mark.at;\n return {\n id,\n kind: 'mark',\n layer: 'main',\n pickable: false,\n pose: {\n x: box.x + mark.at.u * box.width + (mark.offset?.x ?? 0) - self.u * size.width,\n y: box.y + mark.at.v * box.height + (mark.offset?.y ?? 0) - self.v * size.height,\n width: size.width,\n height: size.height,\n },\n data: {\n diagram: { anchor: { at: mark.at, self, ...(mark.offset ? { offset: mark.offset } : {}) } },\n text: mark.text,\n style: ctx.textStyle(mark.style),\n fill: { paint: { color: mark.color ?? ctx.style.text } },\n },\n dependsOn: [nodeId as never],\n derivePose: ANCHOR_DERIVE_POSE as never,\n };\n });\n}\n","/**\n * `diagramScene`'s containers and pools: which nodes and regions each region\n * holds, and what layout sees of them. `dataContainerPlace.ts` places them and\n * builds their specs.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { GroupInset } from './cluster';\nimport { CONTAINER_HEADER } from './containers/layouts';\nimport { MIN_LANE_SIZE } from './containers/laneStack';\nimport type { ContainerRole } from './containers/trait';\nimport { DEFAULT_LANE_SIZE, DEFAULT_POOL_ACROSS, type DataContainer, type NodeStyle } from './dataTypes';\nimport type { GraphGroup, GraphNode } from './graph';\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/** A container's size when it gives no box and holds nothing to fit. */\nexport const EMPTY_CONTAINER = { width: 240, height: 160 };\n\n/** A container, pool, or lane with its members settled. */\nexport interface DataRegion {\n id: string;\n role: ContainerRole;\n /** The axis its pool stacks along; `'y'` for a plain container. */\n axis: 'x' | 'y';\n label?: string;\n style?: string;\n colors?: Partial<NodeStyle>;\n /** The region it is directly inside. */\n parent?: string;\n /** What it holds directly: a pool its lanes, else node and container ids. */\n direct: string[];\n /** A container's or a pool's own box. */\n box?: Rect;\n /** A lane's size along its pool's stack. */\n size?: number;\n pinned: boolean;\n /** A container whose box fits what it holds: one with no `box` that holds something. */\n fitted: boolean;\n /** A lane's place in its pool. */\n index: number;\n /** A container's reorder axis. */\n reorder?: 'x' | 'y';\n}\n\n/** Every region, outer before inner, and the region each node or region is directly inside. */\nexport interface DataRegions {\n regions: readonly DataRegion[];\n parentOf: ReadonlyMap<string, string>;\n}\n\n/**\n * Settle what each region holds. A member already claimed, a pool, an\n * unknown id, and a claim that would put a container inside itself are\n * passed over. Throws on a container or lane id already in `ids`, and adds\n * each to it.\n */\nexport function resolveContainers(\n containers: readonly DataContainer[],\n ids: Set<string>,\n nodeIds: ReadonlySet<string>,\n): DataRegions {\n const byId = new Map<string, DataRegion>();\n const parentOf = new Map<string, string>();\n const declare = (r: DataRegion) => {\n if (ids.has(r.id)) throw new Error(`diagramScene: container id \"${r.id}\" is already a node, group, or container id`);\n ids.add(r.id);\n byId.set(r.id, r);\n };\n const base = { direct: [], pinned: false, fitted: false, index: 0 };\n for (const c of containers) {\n const axis = c.role === 'pool' ? c.axis ?? 'y' : 'y';\n declare({\n ...base, direct: [], id: c.id, role: c.role, axis, pinned: c.pinned === true,\n ...(c.label !== undefined ? { label: c.label } : {}), ...(c.style !== undefined ? { style: c.style } : {}),\n ...(c.colors !== undefined ? { colors: c.colors } : {}),\n ...(c.box !== undefined ? { box: { ...c.box } } : {}),\n ...(c.role === 'container' && c.reorder !== undefined ? { reorder: c.reorder } : {}),\n });\n if (c.role !== 'pool') continue;\n (c.lanes ?? []).forEach((l, index) => {\n declare({\n ...base, direct: [], id: l.id, role: 'lane', axis, index, parent: c.id,\n ...(l.label !== undefined ? { label: l.label } : {}), ...(l.size !== undefined ? { size: l.size } : {}),\n ...(l.colors !== undefined ? { colors: l.colors } : {}),\n });\n parentOf.set(l.id, c.id);\n byId.get(c.id)!.direct.push(l.id);\n });\n }\n const claim = (holder: DataRegion, id: string) => {\n if (parentOf.has(id)) return;\n const region = byId.get(id);\n if (region === undefined ? !nodeIds.has(id) : region.role !== 'container') return;\n for (let at: string | undefined = holder.id; at !== undefined; at = parentOf.get(at)) if (at === id) return;\n parentOf.set(id, holder.id);\n holder.direct.push(id);\n };\n for (const c of containers) {\n if (c.role === 'container') for (const m of c.members ?? []) claim(byId.get(c.id)!, m);\n else for (const l of c.lanes ?? []) for (const m of l.members ?? []) claim(byId.get(l.id)!, m);\n }\n const regions: DataRegion[] = [];\n const visit = (r: DataRegion) => {\n const parent = parentOf.get(r.id);\n if (parent !== undefined) r.parent = parent;\n r.fitted = r.role === 'container' && r.box === undefined && r.direct.length > 0;\n regions.push(r);\n for (const id of r.direct) {\n const inner = byId.get(id);\n if (inner !== undefined) visit(inner);\n }\n };\n for (const r of byId.values()) if (!parentOf.has(r.id)) visit(r);\n return { regions, parentOf };\n}\n\n/** What layout sees of the regions. */\nexport interface ContainerLayout {\n /** Each outermost boxed region, as one node at its box. */\n nodes: GraphNode[];\n /** Each fitted container outside every boxed region, kept together as a group. */\n groups: GraphGroup[];\n /** The fitted container each node layout sees is directly inside. */\n groupOf: ReadonlyMap<string, string>;\n /** Every node and region inside a boxed region, which layout does not see. */\n hidden: ReadonlySet<string>;\n /** The outermost boxed region holding `id` or being it, else `id`: what an edge's end ranks against. */\n endOf(id: string): string;\n}\n\n/** The inset a fitted container keeps around what it holds: its header, and `pad` all round. */\nexport const fittedInset = (pad: number): GroupInset => ({ top: CONTAINER_HEADER.size + pad, right: pad, bottom: pad, left: pad });\n\n/** A pool's lane sizes along its stack, the lanes giving none sharing what the box leaves. */\nexport function laneSizes(lanes: readonly DataRegion[], along: number | undefined): number[] {\n if (along === undefined) return lanes.map((l) => Math.max(MIN_LANE_SIZE, l.size ?? DEFAULT_LANE_SIZE));\n const given = lanes.reduce((s, l) => s + (l.size ?? 0), 0);\n const unsized = lanes.filter((l) => l.size === undefined).length;\n const share = unsized === 0 ? 0 : (along - given) / unsized;\n const sizes = lanes.map((l) => Math.max(MIN_LANE_SIZE, l.size ?? share));\n if (sizes.length > 0) sizes[sizes.length - 1] = Math.max(MIN_LANE_SIZE, sizes[sizes.length - 1]! + along - sizes.reduce((s, n) => s + n, 0));\n return sizes;\n}\n\n/** The box a boxed region starts at: its own, or a default size at `seed`. */\nfunction startBox(r: DataRegion, lanes: readonly DataRegion[], seed: Vec2): Rect {\n if (r.box !== undefined) return r.box;\n if (r.role !== 'pool') return { ...seed, ...EMPTY_CONTAINER };\n const along = Math.max(MIN_LANE_SIZE, laneSizes(lanes, undefined).reduce((s, n) => s + n, 0));\n return r.axis === 'y'\n ? { ...seed, width: DEFAULT_POOL_ACROSS, height: along }\n : { ...seed, width: along, height: DEFAULT_POOL_ACROSS };\n}\n\n/**\n * What layout sees of `regions`: an outermost boxed region is one node, a\n * fitted container outside every boxed region is a group around what it\n * holds, and everything inside a boxed region is hidden. `seed` is where a\n * region giving no box starts, by its place among the regions.\n */\nexport function containerLayoutNodes(\n { regions, parentOf }: DataRegions,\n opts: { padding: number; seed: (k: number) => Vec2 },\n): ContainerLayout {\n const byId = new Map(regions.map((r) => [r.id, r]));\n const rootOf = new Map<string, string>();\n for (const r of regions) {\n const outer = r.parent === undefined ? undefined : rootOf.get(r.parent);\n const root = outer ?? (r.fitted ? undefined : r.id);\n if (root !== undefined) rootOf.set(r.id, root);\n }\n const endOf = (id: string): string => {\n if (byId.has(id)) return rootOf.get(id) ?? id;\n const parent = parentOf.get(id);\n return (parent === undefined ? undefined : rootOf.get(parent)) ?? id;\n };\n const hidden = new Set<string>([...parentOf.keys()].filter((id) => endOf(id) !== id));\n const nodes: GraphNode[] = [];\n regions.forEach((r, k) => {\n if (rootOf.get(r.id) !== r.id) return;\n const lanes = r.direct.flatMap((id) => { const l = byId.get(id); return l?.role === 'lane' ? [l] : []; });\n nodes.push({ id: r.id, bounds: startBox(r, lanes, opts.seed(k)), pinned: r.pinned });\n });\n const seen = (id: string) => !hidden.has(id) && !(byId.get(id)?.fitted ?? false);\n const below = (r: DataRegion): string[] =>\n r.direct.flatMap((id) => (seen(id) ? [id] : byId.get(id)?.fitted === true && !hidden.has(id) ? below(byId.get(id)!) : []));\n const groups: GraphGroup[] = [];\n const groupOf = new Map<string, string>();\n for (const r of regions) {\n if (!r.fitted || hidden.has(r.id) || rootOf.has(r.id)) continue;\n groups.push({ id: r.id, members: below(r), inset: fittedInset(opts.padding), ...(r.parent !== undefined ? { parent: r.parent } : {}) });\n for (const id of r.direct) if (seen(id)) groupOf.set(id, r.id);\n }\n return { nodes, groups, groupOf, hidden, endOf };\n}\n","/**\n * Where `diagramScene`'s regions and the nodes inside boxed regions land once\n * layout has run, and the specs the regions are drawn with.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { GroupInset } from './cluster';\nimport { containerShape } from './containers/layouts';\nimport { stackedLanes } from './containers/laneStack';\nimport { regionSpecs } from './containers/regionSpecs';\nimport { bodyBox } from './containers/trait';\nimport { EMPTY_CONTAINER, fittedInset, laneSizes, type ContainerLayout, type DataRegion, type DataRegions } from './dataContainers';\nimport type { DiagramSpec } from './dataTypes';\nimport { ownNodeStyle } from './dataColors';\nimport { dataRegionStyle } from './dataStyles';\nimport { grownBy } from './footprint';\nimport type { DiagramTheme } from './theme/types';\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/** A data node as placement reads it: where it asked to start, its size, and how far past its box it reaches. */\nexport interface PlacedNodeSize {\n at?: Vec2;\n width: number;\n height: number;\n margin?: GroupInset;\n}\n\n/** Fill `out` with where the nodes no `at` places sit: in rows across `seat`'s body, in order. */\nfunction seedRows(out: Map<string, Rect>, ids: readonly string[], body: Rect, sizes: ReadonlyMap<string, PlacedNodeSize>, pad: number): void {\n let x = body.x + pad;\n let y = body.y + pad;\n let row = 0;\n for (const id of ids) {\n const { width, height } = sizes.get(id)!;\n if (x > body.x + pad && x + width > body.x + body.width - pad) {\n x = body.x + pad;\n y += row + pad;\n row = 0;\n }\n out.set(id, { x, y, width, height });\n x += width + pad;\n row = Math.max(row, height);\n }\n}\n\n/**\n * Every region's box, and where each node inside a boxed region sits. A node\n * with an `at` moves by as much as layout moved its outermost boxed region;\n * one without is seeded in its nearest boxed region's body. A fitted\n * container's box is the union of what it holds, grown by its inset.\n * `placed` is where layout put everything it saw.\n */\nexport function placeContainers(\n { regions, parentOf }: DataRegions,\n layout: ContainerLayout,\n placed: ReadonlyMap<string, Rect>,\n sizes: ReadonlyMap<string, PlacedNodeSize>,\n pad: number,\n): Map<string, Rect> {\n const byId = new Map(regions.map((r) => [r.id, r]));\n const start = new Map(layout.nodes.map((n) => [n.id, n.bounds]));\n const delta = (id: string): Vec2 => {\n const root = layout.endOf(id);\n const from = start.get(root);\n const to = placed.get(root);\n return from === undefined || to === undefined ? { x: 0, y: 0 } : { x: to.x - from.x, y: to.y - from.y };\n };\n const out = new Map<string, Rect>();\n const seated = new Map(sizes);\n const empty: string[] = [];\n for (const r of regions) {\n if (r.fitted || r.role === 'lane') continue;\n const own = placed.get(r.id);\n const d = delta(r.id);\n const box = own ?? (r.box !== undefined ? { ...r.box, x: r.box.x + d.x, y: r.box.y + d.y } : null);\n if (box === null) {\n empty.push(r.id);\n seated.set(r.id, EMPTY_CONTAINER);\n continue;\n }\n out.set(r.id, box);\n if (r.role !== 'pool') continue;\n const lanes = r.direct.map((id) => byId.get(id)!);\n const along = r.axis === 'y' ? box.height : box.width;\n const sizes = laneSizes(lanes, r.box === undefined ? undefined : along);\n const stacked = stackedLanes(r.axis, box, containerShape('pool', r.axis).header, lanes.map((l, i) => ({ id: l.id, size: sizes[i]! })));\n for (const [id, pose] of stacked) out.set(id, pose);\n }\n const seatOf = (id: string): DataRegion | undefined => {\n let at = byId.get(parentOf.get(id) ?? '');\n while (at !== undefined && at.fitted) at = byId.get(at.parent ?? '');\n return at;\n };\n const unseated = new Map<DataRegion, string[]>();\n for (const [id, size] of seated) {\n if (!layout.hidden.has(id) || (byId.has(id) && !empty.includes(id))) continue;\n if (size.at !== undefined) {\n const d = delta(id);\n out.set(id, { x: size.at.x + d.x, y: size.at.y + d.y, width: size.width, height: size.height });\n continue;\n }\n const seat = seatOf(id)!;\n unseated.set(seat, [...(unseated.get(seat) ?? []), id]);\n }\n for (const [seat, ids] of unseated) {\n seedRows(out, ids, bodyBox(out.get(seat.id)!, containerShape(seat.role, seat.axis).header), seated, pad);\n }\n const footprint = (id: string): Rect | undefined => {\n if (byId.has(id)) return out.get(id);\n const at = out.get(id) ?? placed.get(id);\n return at === undefined ? undefined : grownBy(at, sizes.get(id)?.margin);\n };\n for (const r of [...regions].reverse()) {\n if (!r.fitted) continue;\n const rs = r.direct.map(footprint).filter((b): b is Rect => b !== undefined);\n const inset = fittedInset(pad);\n const x = Math.min(...rs.map((b) => b.x)) - inset.left;\n const y = Math.min(...rs.map((b) => b.y)) - inset.top;\n out.set(r.id, {\n x, y,\n width: Math.max(...rs.map((b) => b.x + b.width)) + inset.right - x,\n height: Math.max(...rs.map((b) => b.y + b.height)) + inset.bottom - y,\n });\n }\n return out;\n}\n\n/** Each region's specs and its title's, outer regions first, as `createScene` needs parents before what they hold.\n * Titles are set in `fontFamily`, the diagram's face. */\nexport function containerSpecs(\n { regions }: DataRegions,\n boxes: ReadonlyMap<string, Rect>,\n theme: DiagramTheme | undefined,\n fontFamily: string,\n): DiagramSpec[] {\n return regions.flatMap((r) => {\n const box = boxes.get(r.id);\n if (box === undefined) return [];\n const specs = regionSpecs(r.role, r.axis, { ...box }, r.label ?? null, {\n id: r.id, layer: 'main', parent: r.parent ?? null, style: dataRegionStyle(r, theme, r.index), fitted: r.fitted, fontFamily,\n ...(r.reorder !== undefined ? { reorder: r.reorder } : {}),\n });\n const marks = { ...(r.pinned ? { pinned: true } : {}), ...ownNodeStyle(r.colors) };\n if (Object.keys(marks).length === 0) return specs as DiagramSpec[];\n const [region, ...rest] = specs;\n return [{ ...region!, data: { ...region!.data, diagram: { ...region!.data.diagram, ...marks } as never } }, ...rest] as DiagramSpec[];\n });\n}\n","/**\n * `diagramScene`'s groups: which nodes each one holds, and the box and label\n * it draws around them.\n */\nimport type { GroupInset } from './cluster';\nimport type { DataGroup, DiagramSceneData, DiagramSpec, NodeStyle } from './fromData';\nimport { ANCHOR_DERIVE_POSE, GROUP_DERIVE_POSE, boxAround, type DiagramAnchor } from './group';\nimport { nestGroups } from './groupTree';\n\n/** A group with its members settled and its inset worked out. */\nexport interface ResolvedGroup {\n group: DataGroup;\n /** The nodes and groups directly inside, which the box derives from. */\n direct: readonly string[];\n /** Every node inside, through any nested group. */\n members: readonly string[];\n /** The group this one is directly inside. */\n parent?: string;\n inset: GroupInset;\n pad: number;\n title: { width: number; height: number } | null;\n /** Room for the title across the box, when there is one. */\n minWidth?: number;\n}\n\n/** The width a group's box needs to hold a title `title` wide, `pad` in from either side. */\nexport const groupMinWidth = (title: number, pad: number): number => title + 2 * pad;\n\n/**\n * Settle what each group holds (see `nestGroups`), outer groups ahead of the\n * groups inside them. A group left with no node inside it is dropped. Throws\n * on a group id already in `ids`, and adds each group's id to it.\n */\nexport function resolveGroups(\n groups: readonly DataGroup[],\n ids: Set<string>,\n nodeIds: ReadonlySet<string>,\n opts: { padding: number; title: (text: string) => { width: number; height: number } },\n): ResolvedGroup[] {\n for (const group of groups) {\n if (ids.has(group.id)) throw new Error(`diagramScene: group id \"${group.id}\" is already a node or group id`);\n ids.add(group.id);\n }\n const declared = new Map(groups.map((g) => [g.id, g]));\n const nested = nestGroups(groups, (id) => nodeIds.has(id));\n const depthOf = new Map<string, number>();\n const byId = new Map(nested.map((g) => [g.id, g]));\n const depth = (id: string): number => {\n const parent = byId.get(id)!.parent;\n let d = depthOf.get(id);\n if (d === undefined) depthOf.set(id, (d = parent === undefined ? 0 : depth(parent) + 1));\n return d;\n };\n // Stable, so groups at one depth keep the order they were declared in.\n return nested.map((g, i) => ({ g, i })).sort((a, b) => depth(a.g.id) - depth(b.g.id) || a.i - b.i).map(({ g }) => {\n const group = declared.get(g.id)!;\n const pad = group.padding ?? opts.padding;\n const title = group.label ? opts.title(group.label) : null;\n // The label sits in the top inset, half a pad above what the box holds.\n const inset = { top: pad + (title ? title.height + pad / 2 : 0), right: pad, bottom: pad, left: pad };\n return {\n group, direct: g.direct, members: g.members, inset, pad, title,\n ...(title ? { minWidth: groupMinWidth(title.width, pad) } : {}),\n ...(g.parent !== undefined ? { parent: g.parent } : {}),\n };\n });\n}\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/** The node id of a group's title. */\nexport const groupLabelIdOf = (id: string): string => `${id}/label`;\n\n/** A label on a wire, as a group box takes it in: the label node's id, and\n * where it sits when that is known before the scene derives it. */\nexport interface WireLabel {\n id: string;\n from: string;\n to: string;\n at: Rect | null;\n}\n\n/** The labels each group's box takes in: those on wires with both ends\n * inside it, each in the innermost group holding both. */\nexport function labelsByGroup(groups: readonly ResolvedGroup[], labels: readonly WireLabel[]): Map<string, WireLabel[]> {\n const byId = new Map(groups.map((g) => [g.group.id, g]));\n const holder = new Map<string, string>();\n for (const g of groups) for (const m of g.direct) holder.set(m, g.group.id);\n const ancestry = (id: string): string[] => {\n const out: string[] = [];\n for (let at = byId.has(id) ? byId.get(id)!.parent : holder.get(id); at !== undefined; at = byId.get(at)?.parent) out.push(at);\n return out;\n };\n const out = new Map<string, WireLabel[]>();\n for (const label of labels) {\n const up = new Set(ancestry(label.to));\n const shared = ancestry(label.from).find((g) => up.has(g));\n if (shared !== undefined) out.set(shared, [...(out.get(shared) ?? []), label]);\n }\n return out;\n}\n\n/** Each group's box around where its members were placed, and the labels\n * it takes in where they are known. */\nexport function groupBoxes(\n groups: readonly ResolvedGroup[],\n placedAt: ReadonlyMap<string, Rect>,\n labels: ReadonlyMap<string, readonly WireLabel[]> = new Map(),\n): Map<string, Rect> {\n const byId = new Map(groups.map((g) => [g.group.id, g]));\n const boxes = new Map<string, Rect>();\n const boxOf = (id: string): Rect => {\n const known = boxes.get(id);\n if (known !== undefined) return known;\n const g = byId.get(id)!;\n const rs = g.direct.map((m) => (byId.has(m) ? boxOf(m) : placedAt.get(m)!));\n for (const label of labels.get(id) ?? []) if (label.at !== null) rs.push(label.at);\n const x = Math.min(...rs.map((r) => r.x));\n const y = Math.min(...rs.map((r) => r.y));\n const box = boxAround({\n x,\n y,\n width: Math.max(...rs.map((r) => r.x + r.width)) - x,\n height: Math.max(...rs.map((r) => r.y + r.height)) - y,\n }, g);\n boxes.set(id, box);\n return box;\n };\n for (const g of groups) boxOf(g.group.id);\n return boxes;\n}\n\n/**\n * Each group's box, and its label when it has one, around where its members\n * were placed. In the order given, so an outer box paints behind the boxes\n * inside it. A box depends on its members and on the labels it takes in\n * (see {@link labelsByGroup}), so a wire's label stays inside it.\n */\nexport function groupSpecs(\n groups: readonly ResolvedGroup[],\n placedAt: ReadonlyMap<string, Rect>,\n styleOf: (group: DataGroup) => { style: NodeStyle; text: NonNullable<DiagramSceneData['style']> },\n wireLabels: readonly WireLabel[] = [],\n): DiagramSpec[] {\n const labels = labelsByGroup(groups, wireLabels);\n const boxes = groupBoxes(groups, placedAt, labels);\n const specs: DiagramSpec[] = [];\n for (const g of groups) {\n const { style, text } = styleOf(g.group);\n const { x, y, width, height } = boxes.get(g.group.id)!;\n specs.push({\n id: g.group.id as never,\n kind: 'mark',\n layer: 'main',\n pose: { x, y, width, height },\n data: {\n diagram: {\n outline: 'rect',\n group: {\n inset: g.inset,\n ...(g.minWidth !== undefined ? { minWidth: g.minWidth } : {}),\n ...(g.group.reorder !== undefined ? { reorder: g.group.reorder } : {}),\n },\n },\n fill: { paint: { color: style.fill } },\n stroke: {\n paint: { color: style.stroke },\n width: style.strokeWidth ?? 1,\n ...(style.dash ? { dash: style.dash } : {}),\n },\n },\n dependsOn: [...g.direct, ...(labels.get(g.group.id) ?? []).map((l) => l.id)] as never[],\n derivePose: GROUP_DERIVE_POSE as never,\n });\n if (g.title === null || !g.group.label) continue;\n const anchor: DiagramAnchor = { at: { u: 0, v: 0 }, offset: { x: g.pad, y: g.pad } };\n specs.push({\n id: groupLabelIdOf(g.group.id) as never,\n kind: 'mark',\n layer: 'main',\n pickable: false,\n pose: { x: x + g.pad, y: y + g.pad, width: g.title.width, height: g.title.height },\n data: { diagram: { anchor }, text: g.group.label, style: text, fill: { paint: { color: style.text } } },\n dependsOn: [g.group.id as never],\n derivePose: ANCHOR_DERIVE_POSE as never,\n });\n }\n return specs;\n}\n","/** The scene specs `diagramScene` makes for edges and their labels. */\nimport { polylineFromPoints } from '@weasel-js/core';\nimport type { WireLabel } from './dataGroups';\nimport { EDGE_DERIVE_PATH } from './edge';\nimport type { MeasureRowText } from './body';\nimport type { DataEdge, DiagramSceneOptions, DiagramSpec } from './fromData';\nimport { ownEdgeStyle, withColors } from './dataColors';\nimport { edgeLabelSpec, labelSize, labelStyleOf } from './edgeLabel';\nimport { labelCenter } from './label';\nimport type { DiagramLabel } from './labelTrait';\nimport type { LayeredRoute } from './route';\nimport { dataEdgeStyle } from './dataStyles';\nimport { EDGE_STROKE_WIDTH } from './dataTypes';\nimport type { DiagramTheme } from './theme/types';\nimport type { OffPageSplit } from './offPage/trait';\n\nexport interface EdgeSpecContext {\n idOf: (edge: DataEdge) => string;\n font: { fontFamily: string; fontSize: number };\n /** The face labels are sized from. Default `font`. */\n labelFont?: { fontFamily: string; fontSize: number };\n measure: MeasureRowText;\n /** Styles each edge under its role. Unset, edges take `dataEdgeStyle`'s defaults. */\n theme?: DiagramTheme;\n labelPlacement: DiagramLabel;\n /** Ports and waypoints by edge id, overriding the edge's own (from `layeredRoutes`). */\n routes?: ReadonlyMap<string, LayeredRoute> | null;\n opts: Pick<DiagramSceneOptions, 'edgeStyle' | 'router' | 'labelPlacement'>;\n /** The off-page split of each edge, by id, that crosses between pages. */\n splits?: ReadonlyMap<string, OffPageSplit>;\n}\n\n/** Where a label sits: beside the room layout left it, at the edge's own\n * offset or else the diagram's; else the edge's own placement, else the\n * diagram's. */\nfunction placementOf(e: DataEdge, route: LayeredRoute | undefined, ctx: EdgeSpecContext): DiagramLabel {\n const placement = e.labelPlacement ?? ctx.opts.labelPlacement ?? ctx.labelPlacement;\n return route?.labelAt === undefined ? placement : { ...placement, at: { near: route.labelAt } };\n}\n\n/** Each edge's label as a group's box takes it in: where it sits, when layout\n * stationed it beside its waypoints, else only its id. */\nexport function wireLabels(edges: readonly DataEdge[], ctx: EdgeSpecContext): WireLabel[] {\n const out: WireLabel[] = [];\n for (const e of edges) {\n if (!e.label) continue;\n const id = ctx.idOf(e);\n const route = ctx.routes?.get(id);\n const size = labelSize(e.label, labelStyleOf(ctx.labelFont ?? ctx.font), ctx.measure);\n const placement = placementOf(e, route, ctx);\n const center = route?.waypoints !== undefined && typeof placement.at === 'object'\n ? labelCenter(polylineFromPoints([...route.waypoints]), placement, size)\n : null;\n out.push({\n id: `${id}/label`,\n from: e.from,\n to: e.to,\n at: center === null ? null : { x: center.x - size.width / 2, y: center.y - size.height / 2, ...size },\n });\n }\n return out;\n}\n\n/** An edge end naming `port`, marked as layout's when the author named none. */\nconst endOf = (own: string | undefined, port: string | undefined) =>\n !port ? {} : own === undefined ? { port, laidOut: port } : { port };\n\nexport function edgeSpecs(edges: readonly DataEdge[], ctx: EdgeSpecContext): DiagramSpec[] {\n const specs: DiagramSpec[] = [];\n for (const e of edges) {\n const id = ctx.idOf(e);\n const route = ctx.routes?.get(id);\n const router = e.router ?? ctx.opts.router ?? 'bezier';\n const planned = route ?? {\n fromPort: e.fromPort ?? e.routedPorts?.from,\n toPort: e.toPort ?? e.routedPorts?.to,\n waypoints: e.waypoints ?? e.routed,\n };\n const { fromPort, toPort } = planned;\n // An avoid connector's bends are routed, never stops.\n const waypoints = router === 'avoid' ? e.waypoints : planned.waypoints;\n // Layout's own route, marked so a later layout of the live scene owns it.\n const laidOut = e.waypoints === undefined && waypoints !== undefined;\n const own = ctx.opts.edgeStyle?.(e);\n const style = own !== undefined ? withColors(own, e.colors) : dataEdgeStyle(e, ctx.theme);\n const markerStart = style.markerStart ?? null;\n const markerEnd = style.markerEnd === undefined ? 'arrow' : style.markerEnd;\n const split = ctx.splits?.get(id);\n specs.push({\n id: id as never,\n kind: 'mark',\n layer: 'main',\n pickable: false,\n pose: { x: 0, y: 0, width: 0, height: 0 },\n data: {\n diagram: {\n from: endOf(e.fromPort, fromPort),\n to: endOf(e.toPort, toPort),\n router,\n ...(waypoints ? { waypoints } : {}),\n ...(laidOut ? { laidOut: waypoints } : {}),\n ...(e.style !== undefined ? { style: e.style } : {}),\n ...ownEdgeStyle(e.colors),\n ...(split !== undefined ? { offPage: split } : {}),\n },\n stroke: {\n paint: { color: style.stroke },\n width: style.width ?? EDGE_STROKE_WIDTH,\n ...(style.dash ? { dash: style.dash } : {}),\n ...(markerStart !== null ? { markerStart } : {}),\n ...(markerEnd !== null ? { markerEnd } : {}),\n },\n },\n dependsOn: [e.from as never, e.to as never],\n derivePath: EDGE_DERIVE_PATH,\n });\n if (!e.label) continue;\n specs.push(edgeLabelSpec(id, e.label, {\n layer: 'main',\n label: placementOf(e, route, ctx),\n style: labelStyleOf(ctx.labelFont ?? ctx.font),\n fill: style.label ?? style.stroke,\n measure: ctx.measure,\n }) as DiagramSpec);\n }\n return specs;\n}\n","/**\n * `diagramScene` — a laid-out diagram from plain `{ nodes, edges }`.\n *\n * Every box is a `buildBody` body, so a data node can say anything a body\n * can: outline, rows, padding, ports. Sizes are estimated from character\n * counts unless `measure` is given, so layout runs without a canvas and gives\n * the same answer in node and in a browser.\n */\nimport { RIGID_POSE_COMPOSITION, localizeWorldPoses, type RectPose } from '@weasel-js/core';\nimport { DEFAULT_GROUP_INSET, expandGroupEdges } from './cluster';\nimport { placeContainers, containerSpecs } from './dataContainerPlace';\nimport { containerLayoutNodes, resolveContainers, type ContainerLayout } from './dataContainers';\nimport { groupSpecs, resolveGroups, type ResolvedGroup } from './dataGroups';\nimport { bodyLayoutOf } from './bodyRelayout';\nimport { bodyTrait, measureBody, sizeToBody, type BodySpec, type MeasureRowText, type Row, type RowTextStyle } from './body';\nimport { buildBody } from './buildBody';\nimport { edgeIdOf } from './edgeId';\nimport { ownNodeStyle, withColors } from './dataColors';\nimport { dataNodeStyle } from './dataStyles';\nimport { scenePageSplits } from './dataPages';\nimport { edgeSpecs, wireLabels } from './dataEdges';\nimport {\n DEFAULT_NODE_STYLE, NODE_STROKE_WIDTH,\n type DataEdge, type DataGroup, type DataNode, type DiagramData, type DiagramSceneData, type DiagramSceneOptions, type DiagramSpec,\n type NodeStyle,\n} from './dataTypes';\nimport { DEFAULT_FONT, GLYPH, labelSize, labelStyleOf } from './edgeLabel';\nimport { force } from './force';\nimport { grownBy } from './footprint';\nimport { graphOf, labelFollowsLayout, type EdgeLabelRoom, type GraphEdge, type GraphGroup, type GraphNode } from './graph';\nimport { LABEL_PLACEMENT } from './labelTrait';\nimport { chain } from './chain';\nimport { rowTextStyle, textFace, type DiagramTextStyle } from './rowStyle';\nimport { layered } from './layered';\nimport { planOf, type LayoutFn, type LayoutOptions, type LayoutPlan } from './layout';\nimport { markSpecs } from './marks';\nimport { authoredOver } from './route';\nimport { diagramThemeFrom, themeFont, themeLabelFont } from './theme/resolve';\nimport { offPageTagLook } from './offPage/tag';\nimport { tree } from './tree';\nimport type { Vec2 } from '@weasel-js/core/math';\n\nexport type { DiagramTextStyle };\nexport { DEFAULT_NODE_STYLE };\nexport type {\n DataEdge, DataGroup, DataNode, DiagramData, DiagramRouter, DiagramSceneData, DiagramSceneOptions, DiagramSpec, EdgeStyle, NodeStyle,\n} from './dataTypes';\n\n/** The frame an empty slot with an id draws, in the unit square a mark is drawn in. */\nexport const SLOT_FRAME = 'M0 0H1V1H0Z';\n\n/** What a group is drawn with when there is no theme and nothing says otherwise. */\nexport const DEFAULT_GROUP_STYLE: NodeStyle = { fill: 'rgba(123, 167, 199, 0.08)', stroke: '#7ba7c7', text: '#9fbdd6', strokeWidth: 1, dash: [4, 3] };\nexport { LABEL_PLACEMENT };\nconst LINE = 1.4;\nconst MIN_WIDTH = 64;\nconst LAYOUTS = { layered, tree, force, chain } as const;\n\nexport { edgeIdOf };\n\n/** The room an edge's label asks layout for: none when the edge puts its\n * label somewhere layout does not station it, or routes itself through\n * waypoints of its own. */\nfunction labelRoomOf(e: DataEdge, opts: DiagramSceneOptions, font: { fontFamily: string; fontSize: number },\n measure: MeasureRowText): EdgeLabelRoom | null {\n if (!e.label || e.waypoints !== undefined) return null;\n if (e.labelPlacement !== undefined && !labelFollowsLayout(e.labelPlacement.at)) return null;\n const style = labelStyleOf(font);\n const offset = (e.labelPlacement ?? opts.labelPlacement ?? LABEL_PLACEMENT).offset;\n return { ...labelSize(e.label, style, measure), ...(offset !== undefined ? { offset } : {}) };\n}\n\n/** A data edge as layout reads it: its ends, the ports it names, and the room\n * its label asks for. */\nfunction graphEdgeOf(e: DataEdge, room: EdgeLabelRoom | null): GraphEdge {\n return {\n id: edgeIdOf(e),\n from: e.from,\n to: e.to,\n ...(e.fromPort ? { fromPort: e.fromPort } : {}),\n ...(e.toPort ? { toPort: e.toPort } : {}),\n ...(room !== null ? { label: room } : {}),\n };\n}\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/** A node's box, its rows' text and slots, and its port labels, laid out in `box`. */\nfunction nodeSpecs(\n n: DataNode, body: BodySpec, box: { x: number; y: number; width: number; height: number },\n look: { style: NodeStyle; text: (row: Row | undefined) => DiagramTextStyle; measure: MeasureRowText },\n): DiagramSpec[] {\n const { style } = look;\n const textData = (text: string, row: Row | undefined): DiagramSceneData =>\n ({ text, style: look.text(row), fill: { paint: { color: style.text } } });\n const built = buildBody<DiagramSceneData, 'main', RectPose>(body, box, {\n id: n.id,\n layer: 'main',\n measure: look.measure,\n body: (trait) => ({\n diagram: {\n ...trait, ...bodyLayoutOf(body, trait, look.measure), ...(n.pinned === true ? { pinned: true } : {}), ...(n.style !== undefined ? { style: n.style } : {}),\n ...ownNodeStyle(n.colors),\n },\n fill: { paint: { color: style.fill } },\n stroke: { paint: { color: style.stroke }, width: style.strokeWidth ?? NODE_STROKE_WIDTH, ...(style.dash ? { dash: style.dash } : {}) },\n }),\n row: (text, at) =>\n at.row.kind === 'slot'\n ? (at.row.id === undefined ? null : { diagram: { mark: { d: SLOT_FRAME } }, stroke: { paint: { color: style.stroke }, width: 1 } })\n : text === '' ? null : { ...textData(text, at.row), bodyRow: at.index },\n portLabel: (text) => textData(text, undefined),\n });\n return built.specs.map((s, k) => ({ ...s, ...(s.id !== undefined ? {} : { id: `${n.id}/${k}` }) }) as DiagramSpec);\n}\n\n/** Every spec carries an id — a node's own, `<id>/<k>` for its text,\n * `<id>/mark:<i>` for its marks, `<edge id>/label`, a group's own and\n * `<group id>/label`, a region's own and `<region id>/title` — so a later call's\n * specs can be reconciled against this one's. Throws on a repeated id among\n * nodes, groups, containers and lanes, which names two things as one. An edge whose\n * end is not a node is dropped, and so is a repeat of an earlier edge with\n * the same ends, ports and label: it would draw exactly on top of the first. */\nexport function diagramScene<TLayer extends string>(data: DiagramData, opts: DiagramSceneOptions<TLayer> & { layer: TLayer }): DiagramSpec<TLayer>[];\nexport function diagramScene(data: DiagramData, opts?: DiagramSceneOptions): DiagramSpec[];\nexport function diagramScene<TLayer extends string>(data: DiagramData, opts: DiagramSceneOptions<TLayer> = {}): DiagramSpec<TLayer>[] {\n const { layer, composition = RIGID_POSE_COMPOSITION, ...rest } = opts;\n // Laid out in world; each spec is stored in its container's frame.\n const specs = localizeWorldPoses(mainSpecs(data, rest), composition);\n return (layer === undefined ? specs : specs.map((s) => ({ ...s, layer }))) as DiagramSpec<TLayer>[];\n}\n\n/** {@link diagramScene}'s specs, on `main`. */\nfunction mainSpecs(data: DiagramData, opts: DiagramSceneOptions): DiagramSpec[] {\n const { theme } = opts;\n const font = opts.font ?? (theme ? themeFont(theme) : DEFAULT_FONT);\n const labelFont = theme ? themeLabelFont(theme, font) : font;\n const styleOf = (s: RowTextStyle | undefined) => textFace(s, font);\n const measure: MeasureRowText = opts.measure\n ? (text, s) => opts.measure!(text, { ...s, fontFamily: s.fontFamily ?? font.fontFamily, fontSize: s.fontSize ?? font.fontSize })\n : (text, s) => {\n const size = s.fontSize ?? font.fontSize;\n return { width: text.length * GLYPH * size, height: Math.ceil(LINE * size) };\n };\n\n const ids = new Set<string>();\n for (const n of data.nodes) {\n if (ids.has(n.id)) throw new Error(`diagramScene: node id \"${n.id}\" appears more than once`);\n ids.add(n.id);\n }\n const nodeIds = new Set(ids);\n const pad = opts.groupPadding ?? DEFAULT_GROUP_INSET;\n const regions = resolveContainers(data.containers ?? [], ids, nodeIds);\n // A region is a node's scene parent and a group only gathers it for layout and draws around it: a\n // node in both would have two owners whose boxes disagree, so the data is refused rather than guessed at.\n for (const g of data.groups ?? []) {\n for (const m of g.members) {\n const region = nodeIds.has(m) ? regions.parentOf.get(m) : undefined;\n if (region !== undefined) throw new Error(`diagramScene: node \"${m}\" is in group \"${g.id}\" and in region \"${region}\"; a node may be in one or the other`);\n }\n }\n const boxes = containerLayoutNodes(regions, { padding: pad, seed: (k) => ({ x: data.nodes.length + k, y: data.nodes.length + k }) });\n const titleStyle = { ...font, fontSize: font.fontSize - 1 };\n const groups = resolveGroups(data.groups ?? [], ids, new Set([...nodeIds].filter((id) => !boxes.hidden.has(id))), {\n padding: pad,\n title: (text) => measure(text, titleStyle),\n });\n const seen = new Set<string>();\n const edges = data.edges.filter((e) => {\n const id = edgeIdOf(e);\n if (seen.has(id) || !ids.has(e.from) || !ids.has(e.to)) return false;\n seen.add(id);\n return true;\n });\n\n const bodies = data.nodes.map((n) => ({\n outline: n.outline ?? opts.outline ?? 'rect',\n rows: n.rows ?? (n.lines ?? []).map((text): Row => ({ kind: 'label', text })),\n padding: n.padding ?? opts.padding ?? 8,\n gap: n.gap ?? opts.gap ?? 4,\n verticalAlign: n.verticalAlign ?? opts.verticalAlign ?? 'center',\n ...(n.ports ? { ports: n.ports } : {}),\n ...(n.portLabels ? { portLabels: n.portLabels } : {}),\n }));\n // Seeded on the diagonal in source order, so whichever axis a layout reads\n // for in-rank order, it starts from the data's own order.\n const seeds: GraphNode[] = data.nodes.map((n, i) => {\n const pose = sizeToBody(\n { ...(n.at ?? { x: i, y: i }), width: n.width ?? opts.minWidth ?? MIN_WIDTH, height: n.height ?? 0 },\n measureBody(bodies[i]!, measure),\n );\n const { ports, outline, margin } = bodyTrait(bodies[i]!, pose, measure);\n return { id: n.id, bounds: pose, pinned: n.pinned === true, ...(ports !== undefined ? { ports } : {}),\n ...(outline !== undefined ? { outline } : {}), ...(margin !== undefined ? { margin } : {}) };\n });\n const laid = layOut(seeds, edges, groups, boxes, opts, (e) => labelRoomOf(e, opts, labelFont, measure));\n\n const specs: DiagramSpec[] = [];\n const sizes = new Map(data.nodes.map((n, i) => [n.id, { ...seeds[i]!.bounds, ...(n.at ? { at: n.at } : {}),\n ...(seeds[i]!.margin ? { margin: seeds[i]!.margin } : {}) }]));\n const placedAt = new Map([...laid.placed, ...placeContainers(regions, boxes, laid.placed, sizes, pad)]);\n // The author's own ports and waypoints win over the plan's; an edge layout ranked against a region keeps none of the plan's.\n const routes = laid.plan === null ? null\n : authoredOver(edges.filter((e) => !laid.remapped.has(e)).map((e) => ({ ...e, id: edgeIdOf(e) })), laid.plan);\n const edgeCtx = { idOf: edgeIdOf, font, labelFont, measure, labelPlacement: LABEL_PLACEMENT, routes, opts, ...(theme ? { theme } : {}) };\n const groupLook = (g: DataGroup) => ({ style: opts.groupStyle?.(g) ?? theme?.container ?? DEFAULT_GROUP_STYLE, text: styleOf(titleStyle) });\n const footprints = new Map([...placedAt, ...seeds.map((s) => [s.id, grownBy(placedAt.get(s.id)!, s.margin)] as const)]);\n // Regions and group boxes first, so a box never paints over what it holds.\n specs.push(...containerSpecs(regions, placedAt, theme, font.fontFamily));\n specs.push(...groupSpecs(groups, footprints, groupLook, wireLabels(edges, edgeCtx)));\n for (const [i, n] of data.nodes.entries()) {\n const seed = seeds[i]!.bounds;\n const at = placedAt.get(n.id)!;\n const own = opts.nodeStyle?.(n);\n const style = own !== undefined ? withColors(own, n.colors) : dataNodeStyle(n, theme);\n const parent = regions.parentOf.get(n.id);\n const built = nodeSpecs(n, bodies[i]!, { x: at.x, y: at.y, width: seed.width, height: seed.height }, { style, text: (row) => rowTextStyle(row, font), measure });\n specs.push(...(parent === undefined ? built : built.map((s) => (s.id === n.id ? { ...s, parent: parent as never } : s))));\n if (n.marks) specs.push(...markSpecs(n.id, n.marks, at, { style, textStyle: styleOf, measure }));\n }\n const pages = scenePageSplits(data, placedAt, specs, edges.map((e) => ({ id: edgeIdOf(e), from: e.from, to: e.to })),\n () => ({ ...offPageTagLook(theme ?? diagramThemeFrom(undefined)), measure }));\n specs.push(...edgeSpecs(edges, pages === null ? edgeCtx : { ...edgeCtx, splits: pages.splits }), ...(pages?.tags ?? []));\n return specs;\n}\n\n/**\n * Lay out what layout sees: every node outside a boxed region, each outermost\n * boxed region as one node, and the groups and fitted containers around\n * them. An edge with an end inside a boxed region ranks against the\n * outermost one, and one with both ends inside the same one ranks nothing.\n */\nfunction layOut(\n seeds: readonly GraphNode[],\n edges: readonly DataEdge[],\n groups: readonly ResolvedGroup[],\n boxes: ContainerLayout,\n opts: DiagramSceneOptions,\n room: (e: DataEdge) => EdgeLabelRoom | null,\n): { placed: Map<string, Rect>; plan: LayoutPlan | null; remapped: ReadonlySet<DataEdge> } {\n const graphGroups: GraphGroup[] = [...groups.map((g) => ({\n id: g.group.id,\n members: g.members,\n inset: g.inset,\n ...(g.minWidth !== undefined ? { minWidth: g.minWidth } : {}),\n ...(g.parent !== undefined ? { parent: g.parent } : {}),\n ...(g.group.reorder !== undefined ? { ordered: g.direct } : {}),\n })), ...boxes.groups];\n const visible = [...seeds.filter((s) => !boxes.hidden.has(s.id)), ...boxes.nodes];\n const seedOf = new Map(visible.map((n) => [n.id, n]));\n for (const [id, group] of boxes.groupOf) seedOf.get(id)!.group = group;\n for (const g of groups) {\n for (const m of g.direct) {\n const seed = seedOf.get(m);\n if (seed !== undefined) seed.group = g.group.id;\n }\n }\n const remapped = new Set<DataEdge>();\n const graphEdges = edges.flatMap((e): GraphEdge[] => {\n const edge = graphEdgeOf(e, room(e));\n const from = boxes.endOf(e.from);\n const to = boxes.endOf(e.to);\n if (from === e.from && to === e.to) return [edge];\n remapped.add(e);\n if (from === to) return [];\n const { fromPort: _f, toPort: _t, ...rest } = edge;\n return [{ ...rest, from, to, ...(from === e.from && e.fromPort ? { fromPort: e.fromPort } : {}),\n ...(to === e.to && e.toPort ? { toPort: e.toPort } : {}) }];\n });\n const graph = graphOf(visible, expandGroupEdges(graphEdges, graphGroups), graphGroups);\n const layout: LayoutFn | null = typeof opts.layout === 'function' ? opts.layout\n : opts.layout === 'none' ? null\n : LAYOUTS[opts.layout ?? 'layered'];\n const layoutOptions: LayoutOptions = { order: 'barycenter', ...opts.layoutOptions };\n const plan = layout === null ? null : planOf(layout, graph, layoutOptions);\n const moved = plan?.moves ?? new Map<string, Vec2>();\n const placed = new Map(visible.map((n) => {\n const at = moved.get(n.id) ?? n.bounds;\n return [n.id, { x: at.x, y: at.y, width: n.bounds.width, height: n.bounds.height }];\n }));\n return { placed, plan: layout?.plan === undefined ? null : plan, remapped };\n}\n"]}
|