@aiquants/markdown 1.6.1 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{abnfDiagram-VRR7QNED-DVICL1SS.cjs → abnfDiagram-VRR7QNED-BKvRUGcR.cjs} +2 -2
- package/dist/{abnfDiagram-VRR7QNED-DVICL1SS.cjs.map → abnfDiagram-VRR7QNED-BKvRUGcR.cjs.map} +1 -1
- package/dist/{abnfDiagram-VRR7QNED-RZnm_ZZC.js → abnfDiagram-VRR7QNED-C-27Yna6.js} +4 -4
- package/dist/{abnfDiagram-VRR7QNED-RZnm_ZZC.js.map → abnfDiagram-VRR7QNED-C-27Yna6.js.map} +1 -1
- package/dist/{arc-BmnitkkN.cjs → arc-CUOoCqkh.cjs} +2 -2
- package/dist/{arc-BmnitkkN.cjs.map → arc-CUOoCqkh.cjs.map} +1 -1
- package/dist/{arc-C-DBDbuo.js → arc-UxDDNW0x.js} +2 -2
- package/dist/{arc-C-DBDbuo.js.map → arc-UxDDNW0x.js.map} +1 -1
- package/dist/{architectureDiagram-ZJ3FMSHR-_FBgGrSC.js → architectureDiagram-ZJ3FMSHR-Ch5Nf0Ae.js} +3 -3
- package/dist/{architectureDiagram-ZJ3FMSHR-_FBgGrSC.js.map → architectureDiagram-ZJ3FMSHR-Ch5Nf0Ae.js.map} +1 -1
- package/dist/{architectureDiagram-ZJ3FMSHR-CCAJeMnU.cjs → architectureDiagram-ZJ3FMSHR-kO8dZQKK.cjs} +2 -2
- package/dist/{architectureDiagram-ZJ3FMSHR-CCAJeMnU.cjs.map → architectureDiagram-ZJ3FMSHR-kO8dZQKK.cjs.map} +1 -1
- package/dist/{blockDiagram-677ZJIJ3-W3Ryiu2c.cjs → blockDiagram-677ZJIJ3-BbjxBeAD.cjs} +2 -2
- package/dist/{blockDiagram-677ZJIJ3-W3Ryiu2c.cjs.map → blockDiagram-677ZJIJ3-BbjxBeAD.cjs.map} +1 -1
- package/dist/{blockDiagram-677ZJIJ3-CLkOcrVQ.js → blockDiagram-677ZJIJ3-CuCBVVNa.js} +4 -4
- package/dist/{blockDiagram-677ZJIJ3-CLkOcrVQ.js.map → blockDiagram-677ZJIJ3-CuCBVVNa.js.map} +1 -1
- package/dist/{c4Diagram-LMCZKHZV-FhSkJ7-q.js → c4Diagram-LMCZKHZV-BdJV5ivG.js} +3 -3
- package/dist/{c4Diagram-LMCZKHZV-FhSkJ7-q.js.map → c4Diagram-LMCZKHZV-BdJV5ivG.js.map} +1 -1
- package/dist/{c4Diagram-LMCZKHZV-B--cDHXw.cjs → c4Diagram-LMCZKHZV-BgTfc_W8.cjs} +2 -2
- package/dist/{c4Diagram-LMCZKHZV-B--cDHXw.cjs.map → c4Diagram-LMCZKHZV-BgTfc_W8.cjs.map} +1 -1
- package/dist/channel-BaZK7NhX.js +6 -0
- package/dist/{channel-B6gYWXtQ.js.map → channel-BaZK7NhX.js.map} +1 -1
- package/dist/channel-DcZBUEY6.cjs +2 -0
- package/dist/{channel-CZceKK2b.cjs.map → channel-DcZBUEY6.cjs.map} +1 -1
- package/dist/{chunk-2Q5K7J3B-CLA9LZQs.js → chunk-2Q5K7J3B-CSlHTmMh.js} +2 -2
- package/dist/{chunk-2Q5K7J3B-CLA9LZQs.js.map → chunk-2Q5K7J3B-CSlHTmMh.js.map} +1 -1
- package/dist/{chunk-2Q5K7J3B-UoZ4tiIj.cjs → chunk-2Q5K7J3B-D9s6eCoM.cjs} +2 -2
- package/dist/{chunk-2Q5K7J3B-UoZ4tiIj.cjs.map → chunk-2Q5K7J3B-D9s6eCoM.cjs.map} +1 -1
- package/dist/{chunk-32BRIVSS-CrDpazxa.js → chunk-32BRIVSS-CXH5EQUk.js} +2 -2
- package/dist/{chunk-32BRIVSS-CrDpazxa.js.map → chunk-32BRIVSS-CXH5EQUk.js.map} +1 -1
- package/dist/{chunk-32BRIVSS-CyUS1-2x.cjs → chunk-32BRIVSS-D2F2B9TZ.cjs} +2 -2
- package/dist/{chunk-32BRIVSS-CyUS1-2x.cjs.map → chunk-32BRIVSS-D2F2B9TZ.cjs.map} +1 -1
- package/dist/{chunk-5VM5RSS4-DnTlok-Z.js → chunk-5VM5RSS4-BhTMtA9l.js} +2 -2
- package/dist/{chunk-5VM5RSS4-DnTlok-Z.js.map → chunk-5VM5RSS4-BhTMtA9l.js.map} +1 -1
- package/dist/{chunk-5VM5RSS4-DCM2evxn.cjs → chunk-5VM5RSS4-CxjaLXsB.cjs} +2 -2
- package/dist/{chunk-5VM5RSS4-DCM2evxn.cjs.map → chunk-5VM5RSS4-CxjaLXsB.cjs.map} +1 -1
- package/dist/{chunk-EX3LRPZG-CDcYLfTb.cjs → chunk-EX3LRPZG-BCQ_eMbL.cjs} +2 -2
- package/dist/{chunk-EX3LRPZG-CDcYLfTb.cjs.map → chunk-EX3LRPZG-BCQ_eMbL.cjs.map} +1 -1
- package/dist/{chunk-EX3LRPZG-BXZN3BP6.js → chunk-EX3LRPZG-BOcBE4jP.js} +5 -5
- package/dist/{chunk-EX3LRPZG-BXZN3BP6.js.map → chunk-EX3LRPZG-BOcBE4jP.js.map} +1 -1
- package/dist/{chunk-JWPE2WC7-BOZsBb5v.js → chunk-JWPE2WC7-C20BXRVN.js} +2 -2
- package/dist/{chunk-JWPE2WC7-BOZsBb5v.js.map → chunk-JWPE2WC7-C20BXRVN.js.map} +1 -1
- package/dist/{chunk-JWPE2WC7-u2Y2E01t.cjs → chunk-JWPE2WC7-CLCAyxUO.cjs} +2 -2
- package/dist/{chunk-JWPE2WC7-u2Y2E01t.cjs.map → chunk-JWPE2WC7-CLCAyxUO.cjs.map} +1 -1
- package/dist/{chunk-MOJQB5TN-CODLoYka.js → chunk-MOJQB5TN-B_C5dwTy.js} +2 -2
- package/dist/{chunk-MOJQB5TN-CODLoYka.js.map → chunk-MOJQB5TN-B_C5dwTy.js.map} +1 -1
- package/dist/{chunk-MOJQB5TN-D9XmnzfN.cjs → chunk-MOJQB5TN-Bbpbi357.cjs} +2 -2
- package/dist/{chunk-MOJQB5TN-D9XmnzfN.cjs.map → chunk-MOJQB5TN-Bbpbi357.cjs.map} +1 -1
- package/dist/{chunk-PUDLZKDR-Vzafz0p_.js → chunk-PUDLZKDR-C0EKSRvH.js} +7 -7
- package/dist/{chunk-PUDLZKDR-Vzafz0p_.js.map → chunk-PUDLZKDR-C0EKSRvH.js.map} +1 -1
- package/dist/{chunk-PUDLZKDR-DIlJh7gW.cjs → chunk-PUDLZKDR-Cpp-nasK.cjs} +2 -2
- package/dist/{chunk-PUDLZKDR-DIlJh7gW.cjs.map → chunk-PUDLZKDR-Cpp-nasK.cjs.map} +1 -1
- package/dist/{chunk-RYQCIY6F-D7RgZ_ri.js → chunk-RYQCIY6F-BuIkG6A2.js} +2 -2
- package/dist/{chunk-RYQCIY6F-D7RgZ_ri.js.map → chunk-RYQCIY6F-BuIkG6A2.js.map} +1 -1
- package/dist/{chunk-RYQCIY6F-BgbNR_-2.cjs → chunk-RYQCIY6F-he5fUSYo.cjs} +2 -2
- package/dist/{chunk-RYQCIY6F-BgbNR_-2.cjs.map → chunk-RYQCIY6F-he5fUSYo.cjs.map} +1 -1
- package/dist/{chunk-V7JOEXUC-BtRbpCVo.cjs → chunk-V7JOEXUC-BcBXzffo.cjs} +2 -2
- package/dist/{chunk-V7JOEXUC-BtRbpCVo.cjs.map → chunk-V7JOEXUC-BcBXzffo.cjs.map} +1 -1
- package/dist/{chunk-V7JOEXUC-Csiot9oO.js → chunk-V7JOEXUC-DWnZRQBl.js} +6 -6
- package/dist/{chunk-V7JOEXUC-Csiot9oO.js.map → chunk-V7JOEXUC-DWnZRQBl.js.map} +1 -1
- package/dist/{chunk-VR4S4FIN-DH6f42Mu.js → chunk-VR4S4FIN-BWCLM0a0.js} +2 -2
- package/dist/{chunk-VR4S4FIN-DH6f42Mu.js.map → chunk-VR4S4FIN-BWCLM0a0.js.map} +1 -1
- package/dist/{chunk-VR4S4FIN-y0SDmoh2.cjs → chunk-VR4S4FIN-Bd3wwAe8.cjs} +2 -2
- package/dist/{chunk-VR4S4FIN-y0SDmoh2.cjs.map → chunk-VR4S4FIN-Bd3wwAe8.cjs.map} +1 -1
- package/dist/{chunk-XXDRQBXY-rC42S5QT.cjs → chunk-XXDRQBXY-C2UaLfce.cjs} +2 -2
- package/dist/{chunk-XXDRQBXY-rC42S5QT.cjs.map → chunk-XXDRQBXY-C2UaLfce.cjs.map} +1 -1
- package/dist/{chunk-XXDRQBXY-Csac6tCf.js → chunk-XXDRQBXY-qt9x9red.js} +2 -2
- package/dist/{chunk-XXDRQBXY-Csac6tCf.js.map → chunk-XXDRQBXY-qt9x9red.js.map} +1 -1
- package/dist/{classDiagram-OUVF2IWQ-Dd9EcDqY.js → classDiagram-OUVF2IWQ-B0lJPbAq.js} +3 -3
- package/dist/{classDiagram-OUVF2IWQ-Dd9EcDqY.js.map → classDiagram-OUVF2IWQ-B0lJPbAq.js.map} +1 -1
- package/dist/{classDiagram-OUVF2IWQ-Vq3KKBUy.cjs → classDiagram-OUVF2IWQ-BoGCNSIO.cjs} +2 -2
- package/dist/{classDiagram-OUVF2IWQ-Vq3KKBUy.cjs.map → classDiagram-OUVF2IWQ-BoGCNSIO.cjs.map} +1 -1
- package/dist/{classDiagram-v2-EOCWNBFH-Dd9EcDqY.js → classDiagram-v2-EOCWNBFH-B0lJPbAq.js} +3 -3
- package/dist/{classDiagram-v2-EOCWNBFH-Dd9EcDqY.js.map → classDiagram-v2-EOCWNBFH-B0lJPbAq.js.map} +1 -1
- package/dist/{classDiagram-v2-EOCWNBFH-Vq3KKBUy.cjs → classDiagram-v2-EOCWNBFH-BoGCNSIO.cjs} +2 -2
- package/dist/{classDiagram-v2-EOCWNBFH-Vq3KKBUy.cjs.map → classDiagram-v2-EOCWNBFH-BoGCNSIO.cjs.map} +1 -1
- package/dist/{cose-bilkent-JH36ORCC-BAYFBSur.js → cose-bilkent-JH36ORCC-BXH9dl_0.js} +2 -2
- package/dist/{cose-bilkent-JH36ORCC-BAYFBSur.js.map → cose-bilkent-JH36ORCC-BXH9dl_0.js.map} +1 -1
- package/dist/{cose-bilkent-JH36ORCC-CsHaaKi1.cjs → cose-bilkent-JH36ORCC-DRBzHIcA.cjs} +2 -2
- package/dist/{cose-bilkent-JH36ORCC-CsHaaKi1.cjs.map → cose-bilkent-JH36ORCC-DRBzHIcA.cjs.map} +1 -1
- package/dist/{cynefinDiagram-TSTJHNR4-CSZqIj_l.js → cynefinDiagram-TSTJHNR4-2jnqksgG.js} +3 -3
- package/dist/{cynefinDiagram-TSTJHNR4-CSZqIj_l.js.map → cynefinDiagram-TSTJHNR4-2jnqksgG.js.map} +1 -1
- package/dist/{cynefinDiagram-TSTJHNR4-BEPBV57_.cjs → cynefinDiagram-TSTJHNR4-Ge9B88rS.cjs} +2 -2
- package/dist/{cynefinDiagram-TSTJHNR4-BEPBV57_.cjs.map → cynefinDiagram-TSTJHNR4-Ge9B88rS.cjs.map} +1 -1
- package/dist/{dagre-VKFMJZFB-D9fBL_yM.js → dagre-VKFMJZFB-BqLynzOx.js} +3 -3
- package/dist/{dagre-VKFMJZFB-D9fBL_yM.js.map → dagre-VKFMJZFB-BqLynzOx.js.map} +1 -1
- package/dist/{dagre-VKFMJZFB-BlRE-U3S.cjs → dagre-VKFMJZFB-C7QheUvc.cjs} +2 -2
- package/dist/{dagre-VKFMJZFB-BlRE-U3S.cjs.map → dagre-VKFMJZFB-C7QheUvc.cjs.map} +1 -1
- package/dist/{diagram-FQU43EPY-Di26xB9f.cjs → diagram-FQU43EPY-CSPyECaU.cjs} +2 -2
- package/dist/{diagram-FQU43EPY-Di26xB9f.cjs.map → diagram-FQU43EPY-CSPyECaU.cjs.map} +1 -1
- package/dist/{diagram-FQU43EPY-DPR8KMs9.js → diagram-FQU43EPY-DUwsAw4u.js} +3 -3
- package/dist/{diagram-FQU43EPY-DPR8KMs9.js.map → diagram-FQU43EPY-DUwsAw4u.js.map} +1 -1
- package/dist/{diagram-G47NLZAW-71hjWkYs.cjs → diagram-G47NLZAW-BaP0Lyg0.cjs} +2 -2
- package/dist/{diagram-G47NLZAW-71hjWkYs.cjs.map → diagram-G47NLZAW-BaP0Lyg0.cjs.map} +1 -1
- package/dist/{diagram-G47NLZAW-BfL1Ut0H.js → diagram-G47NLZAW-h09HILJg.js} +4 -4
- package/dist/{diagram-G47NLZAW-BfL1Ut0H.js.map → diagram-G47NLZAW-h09HILJg.js.map} +1 -1
- package/dist/{diagram-NH7WQ7WH-BjJctDxT.js → diagram-NH7WQ7WH-BE3XRcGY.js} +3 -3
- package/dist/{diagram-NH7WQ7WH-BjJctDxT.js.map → diagram-NH7WQ7WH-BE3XRcGY.js.map} +1 -1
- package/dist/{diagram-NH7WQ7WH-B4uTamuE.cjs → diagram-NH7WQ7WH-DyJw7-Gl.cjs} +2 -2
- package/dist/{diagram-NH7WQ7WH-B4uTamuE.cjs.map → diagram-NH7WQ7WH-DyJw7-Gl.cjs.map} +1 -1
- package/dist/{diagram-OA4YK3LP-BoFOwiXF.js → diagram-OA4YK3LP-BfAM9MZv.js} +4 -4
- package/dist/{diagram-OA4YK3LP-BoFOwiXF.js.map → diagram-OA4YK3LP-BfAM9MZv.js.map} +1 -1
- package/dist/{diagram-OA4YK3LP-C1ORbLEL.cjs → diagram-OA4YK3LP-DqYpt5F6.cjs} +2 -2
- package/dist/{diagram-OA4YK3LP-C1ORbLEL.cjs.map → diagram-OA4YK3LP-DqYpt5F6.cjs.map} +1 -1
- package/dist/{diagram-WEI45ONY-COXEDGCZ.js → diagram-WEI45ONY-DtFOpBM4.js} +3 -3
- package/dist/{diagram-WEI45ONY-COXEDGCZ.js.map → diagram-WEI45ONY-DtFOpBM4.js.map} +1 -1
- package/dist/{diagram-WEI45ONY-BzuHWp9D.cjs → diagram-WEI45ONY-fz5dqgqy.cjs} +2 -2
- package/dist/{diagram-WEI45ONY-BzuHWp9D.cjs.map → diagram-WEI45ONY-fz5dqgqy.cjs.map} +1 -1
- package/dist/{ebnfDiagram-CCIWWBDH-N0w7QwtK.js → ebnfDiagram-CCIWWBDH-CyKVhKIb.js} +4 -4
- package/dist/{ebnfDiagram-CCIWWBDH-N0w7QwtK.js.map → ebnfDiagram-CCIWWBDH-CyKVhKIb.js.map} +1 -1
- package/dist/{ebnfDiagram-CCIWWBDH-DE7OPvSn.cjs → ebnfDiagram-CCIWWBDH-Haez4su4.cjs} +2 -2
- package/dist/{ebnfDiagram-CCIWWBDH-DE7OPvSn.cjs.map → ebnfDiagram-CCIWWBDH-Haez4su4.cjs.map} +1 -1
- package/dist/{erDiagram-Q63AITRT-CqsM_S0E.js → erDiagram-Q63AITRT-9hM3kPUW.js} +5 -5
- package/dist/{erDiagram-Q63AITRT-CqsM_S0E.js.map → erDiagram-Q63AITRT-9hM3kPUW.js.map} +1 -1
- package/dist/{erDiagram-Q63AITRT-KvBvwG4T.cjs → erDiagram-Q63AITRT-BGEWGa_b.cjs} +2 -2
- package/dist/{erDiagram-Q63AITRT-KvBvwG4T.cjs.map → erDiagram-Q63AITRT-BGEWGa_b.cjs.map} +1 -1
- package/dist/{extractHeadings-BiNpEj-K.js → extractHeadings-BH0T7P4n.js} +3834 -3824
- package/dist/{extractHeadings-BiNpEj-K.js.map → extractHeadings-BH0T7P4n.js.map} +1 -1
- package/dist/{extractHeadings-vnYM8Eet.cjs → extractHeadings-BsiIYa_e.cjs} +62 -62
- package/dist/{extractHeadings-vnYM8Eet.cjs.map → extractHeadings-BsiIYa_e.cjs.map} +1 -1
- package/dist/flowDiagram-23GEKE2U-B9LX4RXy.cjs +2 -0
- package/dist/flowDiagram-23GEKE2U-B9LX4RXy.cjs.map +1 -0
- package/dist/flowDiagram-23GEKE2U-Dk7STu-u.js +8 -0
- package/dist/flowDiagram-23GEKE2U-Dk7STu-u.js.map +1 -0
- package/dist/{ganttDiagram-NO4QXBWP-DvdToLYa.cjs → ganttDiagram-NO4QXBWP-4BbeHi64.cjs} +2 -2
- package/dist/{ganttDiagram-NO4QXBWP-DvdToLYa.cjs.map → ganttDiagram-NO4QXBWP-4BbeHi64.cjs.map} +1 -1
- package/dist/{ganttDiagram-NO4QXBWP-C2P9ON6O.js → ganttDiagram-NO4QXBWP-DtM5HL0C.js} +3 -3
- package/dist/{ganttDiagram-NO4QXBWP-C2P9ON6O.js.map → ganttDiagram-NO4QXBWP-DtM5HL0C.js.map} +1 -1
- package/dist/{gitGraphDiagram-IHSO6WYX-BkZsK9Hm.cjs → gitGraphDiagram-IHSO6WYX-D1NSh545.cjs} +2 -2
- package/dist/{gitGraphDiagram-IHSO6WYX-BkZsK9Hm.cjs.map → gitGraphDiagram-IHSO6WYX-D1NSh545.cjs.map} +1 -1
- package/dist/{gitGraphDiagram-IHSO6WYX-DVSslxqP.js → gitGraphDiagram-IHSO6WYX-DFSd1OPO.js} +4 -4
- package/dist/{gitGraphDiagram-IHSO6WYX-DVSslxqP.js.map → gitGraphDiagram-IHSO6WYX-DFSd1OPO.js.map} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.client.cjs +1 -1
- package/dist/index.client.js +1 -1
- package/dist/index.js +1 -1
- package/dist/{infoDiagram-FWYZ7A6U-Cd3TPtAG.cjs → infoDiagram-FWYZ7A6U-4wrBBE6X.cjs} +2 -2
- package/dist/{infoDiagram-FWYZ7A6U-Cd3TPtAG.cjs.map → infoDiagram-FWYZ7A6U-4wrBBE6X.cjs.map} +1 -1
- package/dist/{infoDiagram-FWYZ7A6U-vPnKgn2w.js → infoDiagram-FWYZ7A6U-ZRUjO8nW.js} +2 -2
- package/dist/{infoDiagram-FWYZ7A6U-vPnKgn2w.js.map → infoDiagram-FWYZ7A6U-ZRUjO8nW.js.map} +1 -1
- package/dist/{ishikawaDiagram-FXEZZL3T-CR9ySQXh.cjs → ishikawaDiagram-FXEZZL3T-DE9GPbED.cjs} +2 -2
- package/dist/{ishikawaDiagram-FXEZZL3T-CR9ySQXh.cjs.map → ishikawaDiagram-FXEZZL3T-DE9GPbED.cjs.map} +1 -1
- package/dist/{ishikawaDiagram-FXEZZL3T-BkgUhFd7.js → ishikawaDiagram-FXEZZL3T-DNgqlFhZ.js} +2 -2
- package/dist/{ishikawaDiagram-FXEZZL3T-BkgUhFd7.js.map → ishikawaDiagram-FXEZZL3T-DNgqlFhZ.js.map} +1 -1
- package/dist/{journeyDiagram-5HDEW3XC-CeLukjGs.js → journeyDiagram-5HDEW3XC-BXlXmDhR.js} +5 -5
- package/dist/{journeyDiagram-5HDEW3XC-CeLukjGs.js.map → journeyDiagram-5HDEW3XC-BXlXmDhR.js.map} +1 -1
- package/dist/{journeyDiagram-5HDEW3XC-C_kouMqJ.cjs → journeyDiagram-5HDEW3XC-jcXDYbA9.cjs} +2 -2
- package/dist/{journeyDiagram-5HDEW3XC-C_kouMqJ.cjs.map → journeyDiagram-5HDEW3XC-jcXDYbA9.cjs.map} +1 -1
- package/dist/{kanban-definition-HUTT4EX6-B7sK7KKo.js → kanban-definition-HUTT4EX6-C9IdgWIg.js} +3 -3
- package/dist/{kanban-definition-HUTT4EX6-B7sK7KKo.js.map → kanban-definition-HUTT4EX6-C9IdgWIg.js.map} +1 -1
- package/dist/{kanban-definition-HUTT4EX6-C72m9SkW.cjs → kanban-definition-HUTT4EX6-D5_pDh9h.cjs} +2 -2
- package/dist/{kanban-definition-HUTT4EX6-C72m9SkW.cjs.map → kanban-definition-HUTT4EX6-D5_pDh9h.cjs.map} +1 -1
- package/dist/{linear-DA8CNisd.js → linear-CTibpBci.js} +2 -2
- package/dist/{linear-DA8CNisd.js.map → linear-CTibpBci.js.map} +1 -1
- package/dist/{linear-BgdXLHZt.cjs → linear-DDWdtbxq.cjs} +2 -2
- package/dist/{linear-BgdXLHZt.cjs.map → linear-DDWdtbxq.cjs.map} +1 -1
- package/dist/{mindmap-definition-LN4V7U3C-C7YrqUCf.js → mindmap-definition-LN4V7U3C-CXaKAu6n.js} +4 -4
- package/dist/{mindmap-definition-LN4V7U3C-C7YrqUCf.js.map → mindmap-definition-LN4V7U3C-CXaKAu6n.js.map} +1 -1
- package/dist/{mindmap-definition-LN4V7U3C-CirMzlY5.cjs → mindmap-definition-LN4V7U3C-gBn938NF.cjs} +2 -2
- package/dist/{mindmap-definition-LN4V7U3C-CirMzlY5.cjs.map → mindmap-definition-LN4V7U3C-gBn938NF.cjs.map} +1 -1
- package/dist/{pegDiagram-2B236MQR-DpzcFesN.js → pegDiagram-2B236MQR-BiQyejnD.js} +4 -4
- package/dist/{pegDiagram-2B236MQR-DpzcFesN.js.map → pegDiagram-2B236MQR-BiQyejnD.js.map} +1 -1
- package/dist/{pegDiagram-2B236MQR-BWo1kluM.cjs → pegDiagram-2B236MQR-fR_9AvHk.cjs} +2 -2
- package/dist/{pegDiagram-2B236MQR-BWo1kluM.cjs.map → pegDiagram-2B236MQR-fR_9AvHk.cjs.map} +1 -1
- package/dist/{pieDiagram-ENE6RG2P-iRoOiNc4.cjs → pieDiagram-ENE6RG2P-BZtqlfyU.cjs} +2 -2
- package/dist/{pieDiagram-ENE6RG2P-iRoOiNc4.cjs.map → pieDiagram-ENE6RG2P-BZtqlfyU.cjs.map} +1 -1
- package/dist/{pieDiagram-ENE6RG2P-B6RHvEHE.js → pieDiagram-ENE6RG2P-CZTZpVqy.js} +4 -4
- package/dist/{pieDiagram-ENE6RG2P-B6RHvEHE.js.map → pieDiagram-ENE6RG2P-CZTZpVqy.js.map} +1 -1
- package/dist/{quadrantDiagram-ABIIQ3AL-9Gb8LEQi.js → quadrantDiagram-ABIIQ3AL-ByHTxHrm.js} +3 -3
- package/dist/{quadrantDiagram-ABIIQ3AL-9Gb8LEQi.js.map → quadrantDiagram-ABIIQ3AL-ByHTxHrm.js.map} +1 -1
- package/dist/{quadrantDiagram-ABIIQ3AL-DKbTOjNz.cjs → quadrantDiagram-ABIIQ3AL-CC5w4CkE.cjs} +2 -2
- package/dist/{quadrantDiagram-ABIIQ3AL-DKbTOjNz.cjs.map → quadrantDiagram-ABIIQ3AL-CC5w4CkE.cjs.map} +1 -1
- package/dist/{railroadDiagram-RFXS5EU6-CXgCaCb_.js → railroadDiagram-RFXS5EU6-C99zfAzl.js} +4 -4
- package/dist/{railroadDiagram-RFXS5EU6-CXgCaCb_.js.map → railroadDiagram-RFXS5EU6-C99zfAzl.js.map} +1 -1
- package/dist/{railroadDiagram-RFXS5EU6-SOxzO7C3.cjs → railroadDiagram-RFXS5EU6-_YckPr2T.cjs} +2 -2
- package/dist/{railroadDiagram-RFXS5EU6-SOxzO7C3.cjs.map → railroadDiagram-RFXS5EU6-_YckPr2T.cjs.map} +1 -1
- package/dist/{requirementDiagram-TGXJPOKE-B6RQ9Kpp.cjs → requirementDiagram-TGXJPOKE-BCeWSLF4.cjs} +2 -2
- package/dist/{requirementDiagram-TGXJPOKE-B6RQ9Kpp.cjs.map → requirementDiagram-TGXJPOKE-BCeWSLF4.cjs.map} +1 -1
- package/dist/{requirementDiagram-TGXJPOKE-DbSm2ehr.js → requirementDiagram-TGXJPOKE-DBzuXzE9.js} +4 -4
- package/dist/{requirementDiagram-TGXJPOKE-DbSm2ehr.js.map → requirementDiagram-TGXJPOKE-DBzuXzE9.js.map} +1 -1
- package/dist/{sankeyDiagram-HTMAVEWB-BNqZ6R3H.js → sankeyDiagram-HTMAVEWB-ChQ2ozXn.js} +2 -2
- package/dist/{sankeyDiagram-HTMAVEWB-BNqZ6R3H.js.map → sankeyDiagram-HTMAVEWB-ChQ2ozXn.js.map} +1 -1
- package/dist/{sankeyDiagram-HTMAVEWB-DgGDy2eG.cjs → sankeyDiagram-HTMAVEWB-DQOfpr04.cjs} +2 -2
- package/dist/{sankeyDiagram-HTMAVEWB-DgGDy2eG.cjs.map → sankeyDiagram-HTMAVEWB-DQOfpr04.cjs.map} +1 -1
- package/dist/{sequenceDiagram-DBY2YBRQ-Bf3EtJcL.js → sequenceDiagram-DBY2YBRQ-CCzsdQ__.js} +4 -4
- package/dist/{sequenceDiagram-DBY2YBRQ-Bf3EtJcL.js.map → sequenceDiagram-DBY2YBRQ-CCzsdQ__.js.map} +1 -1
- package/dist/{sequenceDiagram-DBY2YBRQ-BuKDthxK.cjs → sequenceDiagram-DBY2YBRQ-D2R8WWiq.cjs} +2 -2
- package/dist/{sequenceDiagram-DBY2YBRQ-BuKDthxK.cjs.map → sequenceDiagram-DBY2YBRQ-D2R8WWiq.cjs.map} +1 -1
- package/dist/{sizeCapture-X5ZJPWSS-CNWx6elV.js → sizeCapture-X5ZJPWSS-9Q2RBacx.js} +2 -2
- package/dist/{sizeCapture-X5ZJPWSS-CNWx6elV.js.map → sizeCapture-X5ZJPWSS-9Q2RBacx.js.map} +1 -1
- package/dist/{sizeCapture-X5ZJPWSS-NRqA0pmT.cjs → sizeCapture-X5ZJPWSS-CedNWC9b.cjs} +2 -2
- package/dist/{sizeCapture-X5ZJPWSS-NRqA0pmT.cjs.map → sizeCapture-X5ZJPWSS-CedNWC9b.cjs.map} +1 -1
- package/dist/src/components/MarkdownRenderer.d.ts +31 -1
- package/dist/src/components/MarkdownRenderer.d.ts.map +1 -1
- package/dist/src/components/MarkdownViewer.d.ts +9 -1
- package/dist/src/components/MarkdownViewer.d.ts.map +1 -1
- package/dist/src/index.client.d.ts +1 -1
- package/dist/src/index.client.d.ts.map +1 -1
- package/dist/{stateDiagram-2N3HPSRC-DqhvonPY.cjs → stateDiagram-2N3HPSRC-BFjEDzN5.cjs} +2 -2
- package/dist/{stateDiagram-2N3HPSRC-DqhvonPY.cjs.map → stateDiagram-2N3HPSRC-BFjEDzN5.cjs.map} +1 -1
- package/dist/{stateDiagram-2N3HPSRC-Bdphi4r-.js → stateDiagram-2N3HPSRC-DVXBUdgS.js} +3 -3
- package/dist/{stateDiagram-2N3HPSRC-Bdphi4r-.js.map → stateDiagram-2N3HPSRC-DVXBUdgS.js.map} +1 -1
- package/dist/{stateDiagram-v2-6OUMAXLB-p9rvsC9-.cjs → stateDiagram-v2-6OUMAXLB-BpxIqbgw.cjs} +2 -2
- package/dist/{stateDiagram-v2-6OUMAXLB-p9rvsC9-.cjs.map → stateDiagram-v2-6OUMAXLB-BpxIqbgw.cjs.map} +1 -1
- package/dist/{stateDiagram-v2-6OUMAXLB-DdB47j1a.js → stateDiagram-v2-6OUMAXLB-etkgI8XE.js} +3 -3
- package/dist/{stateDiagram-v2-6OUMAXLB-DdB47j1a.js.map → stateDiagram-v2-6OUMAXLB-etkgI8XE.js.map} +1 -1
- package/dist/{swimlanes-5IMT3BWC-JZVn9oCR.cjs → swimlanes-5IMT3BWC-ByyaHYdJ.cjs} +2 -2
- package/dist/{swimlanes-5IMT3BWC-JZVn9oCR.cjs.map → swimlanes-5IMT3BWC-ByyaHYdJ.cjs.map} +1 -1
- package/dist/{swimlanes-5IMT3BWC-BMZk0Lp2.js → swimlanes-5IMT3BWC-CRF_hU5-.js} +4 -4
- package/dist/{swimlanes-5IMT3BWC-BMZk0Lp2.js.map → swimlanes-5IMT3BWC-CRF_hU5-.js.map} +1 -1
- package/dist/{swimlanesDiagram-G3AALYLV-DxEegQkl.cjs → swimlanesDiagram-G3AALYLV-DmAVTn1y.cjs} +2 -2
- package/dist/{swimlanesDiagram-G3AALYLV-DxEegQkl.cjs.map → swimlanesDiagram-G3AALYLV-DmAVTn1y.cjs.map} +1 -1
- package/dist/{swimlanesDiagram-G3AALYLV-DNhrqmqB.js → swimlanesDiagram-G3AALYLV-qE56wCfv.js} +3 -3
- package/dist/{swimlanesDiagram-G3AALYLV-DNhrqmqB.js.map → swimlanesDiagram-G3AALYLV-qE56wCfv.js.map} +1 -1
- package/dist/{timeline-definition-FHXFAJF6-BjxOaDZF.cjs → timeline-definition-FHXFAJF6-CYpydtqC.cjs} +2 -2
- package/dist/{timeline-definition-FHXFAJF6-BjxOaDZF.cjs.map → timeline-definition-FHXFAJF6-CYpydtqC.cjs.map} +1 -1
- package/dist/{timeline-definition-FHXFAJF6-C4kHuqGr.js → timeline-definition-FHXFAJF6-U6tU13YO.js} +3 -3
- package/dist/{timeline-definition-FHXFAJF6-C4kHuqGr.js.map → timeline-definition-FHXFAJF6-U6tU13YO.js.map} +1 -1
- package/dist/{vennDiagram-L72KCM5P-nQ40EeIj.cjs → vennDiagram-L72KCM5P-CfbVR5CF.cjs} +2 -2
- package/dist/{vennDiagram-L72KCM5P-nQ40EeIj.cjs.map → vennDiagram-L72KCM5P-CfbVR5CF.cjs.map} +1 -1
- package/dist/{vennDiagram-L72KCM5P-faE6oCYZ.js → vennDiagram-L72KCM5P-q79Xn7UV.js} +2 -2
- package/dist/{vennDiagram-L72KCM5P-faE6oCYZ.js.map → vennDiagram-L72KCM5P-q79Xn7UV.js.map} +1 -1
- package/dist/{wardleyDiagram-EHGQE667-COQa-JdJ.js → wardleyDiagram-EHGQE667-BG3W74MX.js} +3 -3
- package/dist/{wardleyDiagram-EHGQE667-COQa-JdJ.js.map → wardleyDiagram-EHGQE667-BG3W74MX.js.map} +1 -1
- package/dist/{wardleyDiagram-EHGQE667-ByYfznTT.cjs → wardleyDiagram-EHGQE667-CSJ22zfj.cjs} +2 -2
- package/dist/{wardleyDiagram-EHGQE667-ByYfznTT.cjs.map → wardleyDiagram-EHGQE667-CSJ22zfj.cjs.map} +1 -1
- package/dist/{xychartDiagram-FW5EYKEG-D7FhqNeM.js → xychartDiagram-FW5EYKEG-BISI4a7c.js} +3 -3
- package/dist/{xychartDiagram-FW5EYKEG-D7FhqNeM.js.map → xychartDiagram-FW5EYKEG-BISI4a7c.js.map} +1 -1
- package/dist/{xychartDiagram-FW5EYKEG-BHBIM0-w.cjs → xychartDiagram-FW5EYKEG-Df8hBgvh.cjs} +2 -2
- package/dist/{xychartDiagram-FW5EYKEG-BHBIM0-w.cjs.map → xychartDiagram-FW5EYKEG-Df8hBgvh.cjs.map} +1 -1
- package/package.json +1 -1
- package/dist/channel-B6gYWXtQ.js +0 -6
- package/dist/channel-CZceKK2b.cjs +0 -2
- package/dist/flowDiagram-23GEKE2U-BNIQEPQk.cjs +0 -2
- package/dist/flowDiagram-23GEKE2U-BNIQEPQk.cjs.map +0 -1
- package/dist/flowDiagram-23GEKE2U-Cu3z7Hd2.js +0 -8
- package/dist/flowDiagram-23GEKE2U-Cu3z7Hd2.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swimlanes-5IMT3BWC-JZVn9oCR.cjs","sources":["../../../node_modules/.pnpm/mermaid@11.16.0/node_modules/mermaid/dist/chunks/mermaid.core/swimlanes-5IMT3BWC.mjs"],"sourcesContent":["import {\n clear as clear4\n} from \"./chunk-RYQCIY6F.mjs\";\nimport {\n clear as clear2,\n edgeLabels,\n insertEdge,\n insertEdgeLabel,\n markers_default,\n terminalLabels\n} from \"./chunk-52WLFC77.mjs\";\nimport {\n clear,\n clear2 as clear3,\n insertCluster,\n insertNode,\n positionNode\n} from \"./chunk-ZGVPDNZ5.mjs\";\nimport \"./chunk-C7G6YPKG.mjs\";\nimport {\n markerOffsets\n} from \"./chunk-7BUUIJ7U.mjs\";\nimport {\n getSubGraphTitleMargins\n} from \"./chunk-OGEWGWER.mjs\";\nimport \"./chunk-Q4XR5HBZ.mjs\";\nimport \"./chunk-HOUHSVGY.mjs\";\nimport {\n utils_default\n} from \"./chunk-ICXQ74PX.mjs\";\nimport {\n getConfig,\n getConfig2\n} from \"./chunk-WYO6CB5R.mjs\";\nimport {\n log\n} from \"./chunk-X3CZISLH.mjs\";\nimport {\n __name\n} from \"./chunk-Y2CYZVJY.mjs\";\n\n// src/rendering-util/createGraph.ts\nimport * as graphlib from \"dagre-d3-es/src/graphlib/index.js\";\nasync function createGraphWithElements(element, data4Layout) {\n const graph = new graphlib.Graph({\n multigraph: true,\n compound: true\n });\n const edgesToProcess = [...data4Layout.edges];\n const config = getConfig2();\n const rootGroups = element.insert(\"g\").attr(\"class\", \"root\");\n const clusters = rootGroups.insert(\"g\").attr(\"class\", \"clusters\");\n const edgePaths = rootGroups.insert(\"g\").attr(\"class\", \"edges edgePath\");\n const edgeLabels2 = rootGroups.insert(\"g\").attr(\"class\", \"edgeLabels\");\n const nodesGroup = rootGroups.insert(\"g\").attr(\"class\", \"nodes\");\n const nodeElements = /* @__PURE__ */ new Map();\n const hasDom = element.node() != null;\n await Promise.all(\n data4Layout.nodes.map(async (node) => {\n if (node.isGroup) {\n graph.setNode(node.id, { ...node });\n } else {\n if (hasDom) {\n const childNodeEl = await insertNode(nodesGroup, node, { config, dir: node.dir });\n const boundingBox = childNodeEl.node()?.getBBox() ?? { width: 0, height: 0 };\n nodeElements.set(node.id, childNodeEl);\n node.width = boundingBox.width;\n node.height = boundingBox.height;\n }\n graph.setNode(node.id, { ...node });\n }\n })\n );\n for (const edge of edgesToProcess) {\n graph.setEdge(edge.start, edge.end, { ...edge }, edge.id);\n const edgeExists = data4Layout.edges.some((existingEdge) => existingEdge.id === edge.id);\n if (!edgeExists) {\n data4Layout.edges.push(edge);\n }\n }\n if (globalThis.mermaidCaptureSizes) {\n const { captureNodeSizes } = await import(\"./sizeCapture-X5ZJPWSS.mjs\");\n captureNodeSizes(element, data4Layout);\n }\n return {\n graph,\n groups: { clusters, edgePaths, edgeLabels: edgeLabels2, nodes: nodesGroup, rootGroups },\n nodeElements\n };\n}\n__name(createGraphWithElements, \"createGraphWithElements\");\n\n// src/rendering-util/rendering-elements/lineJump.ts\nvar ROUNDED_CORNER_RADIUS = 5;\nvar CORNER_EPSILON = 1e-5;\nvar ENDPOINT_EPSILON = 1e-6;\nfunction buildSegmentList(points) {\n const segments = [];\n for (let i = 0; i < points.length - 1; i++) {\n segments.push({ a: points[i], b: points[i + 1] });\n }\n return segments;\n}\n__name(buildSegmentList, \"buildSegmentList\");\nfunction segmentIntersection(a1, a2, b1, b2) {\n const dxA = a2.x - a1.x;\n const dyA = a2.y - a1.y;\n const dxB = b2.x - b1.x;\n const dyB = b2.y - b1.y;\n const denom = dxA * dyB - dyA * dxB;\n if (denom === 0) {\n return null;\n }\n const dx = b1.x - a1.x;\n const dy = b1.y - a1.y;\n const tA = (dx * dyB - dy * dxB) / denom;\n const tB = (dx * dyA - dy * dxA) / denom;\n if (tA <= ENDPOINT_EPSILON || tA >= 1 - ENDPOINT_EPSILON || tB <= ENDPOINT_EPSILON || tB >= 1 - ENDPOINT_EPSILON) {\n return null;\n }\n return {\n point: { x: a1.x + tA * dxA, y: a1.y + tA * dyA },\n tA,\n tB\n };\n}\n__name(segmentIntersection, \"segmentIntersection\");\nfunction isHorizontalSeg(seg) {\n return Math.abs(seg.b.x - seg.a.x) >= Math.abs(seg.b.y - seg.a.y);\n}\n__name(isHorizontalSeg, \"isHorizontalSeg\");\nfunction findEdgeIntersections(edges) {\n const crossings = [];\n for (let i = 0; i < edges.length; i++) {\n const edgeA = edges[i];\n const segmentsA = buildSegmentList(edgeA.points);\n for (let j = i + 1; j < edges.length; j++) {\n const edgeB = edges[j];\n const segmentsB = buildSegmentList(edgeB.points);\n for (const [si, segA] of segmentsA.entries()) {\n for (const [sj, segB] of segmentsB.entries()) {\n const hit = segmentIntersection(segA.a, segA.b, segB.a, segB.b);\n if (!hit) {\n continue;\n }\n const aHoriz = isHorizontalSeg(segA);\n const bHoriz = isHorizontalSeg(segB);\n const orthogonalPair = aHoriz !== bHoriz;\n const jumpOnA = orthogonalPair ? aHoriz : false;\n if (jumpOnA) {\n crossings.push({\n jumpEdgeId: edgeA.id,\n otherEdgeId: edgeB.id,\n segIndex: si,\n t: hit.tA,\n point: hit.point\n });\n } else {\n crossings.push({\n jumpEdgeId: edgeB.id,\n otherEdgeId: edgeA.id,\n segIndex: sj,\n t: hit.tB,\n point: hit.point\n });\n }\n }\n }\n }\n }\n return crossings;\n}\n__name(findEdgeIntersections, \"findEdgeIntersections\");\nfunction fmt(n) {\n const rounded = Math.round(n * 1e3) / 1e3;\n return Number.isInteger(rounded) ? `${rounded}` : `${rounded}`;\n}\n__name(fmt, \"fmt\");\nfunction pointToString(p) {\n return `${fmt(p.x)},${fmt(p.y)}`;\n}\n__name(pointToString, \"pointToString\");\nfunction getArcSweepFlag(seg) {\n const dx = seg.b.x - seg.a.x;\n const dy = seg.b.y - seg.a.y;\n if (Math.abs(dx) >= Math.abs(dy)) {\n return dx >= 0 ? 1 : 0;\n }\n return dy >= 0 ? 1 : 0;\n}\n__name(getArcSweepFlag, \"getArcSweepFlag\");\nvar MIN_JUMP_RADIUS = 1e-3;\nfunction applyMarkerOffsets(points, edge) {\n if (points.length < 2) {\n return points.map((p) => ({ ...p }));\n }\n const out = points.map((p) => ({ ...p }));\n const startOff = edge.arrowTypeStart && markerOffsets[edge.arrowTypeStart];\n if (startOff) {\n const a = points[0];\n const b = points[1];\n const ang = Math.atan2(b.y - a.y, b.x - a.x);\n out[0].x = a.x + startOff * Math.cos(ang);\n out[0].y = a.y + startOff * Math.sin(ang);\n }\n const endOff = edge.arrowTypeEnd && markerOffsets[edge.arrowTypeEnd];\n if (endOff) {\n const n = points.length;\n const a = points[n - 2];\n const b = points[n - 1];\n const ang = Math.atan2(b.y - a.y, b.x - a.x);\n out[n - 1].x = b.x - endOff * Math.cos(ang);\n out[n - 1].y = b.y - endOff * Math.sin(ang);\n }\n return out;\n}\n__name(applyMarkerOffsets, \"applyMarkerOffsets\");\nfunction emitJump(jump, ux, uy, sweep, style) {\n const cx = jump.point.x;\n const cy = jump.point.y;\n const pre = { x: cx - ux * jump.r, y: cy - uy * jump.r };\n const post = { x: cx + ux * jump.r, y: cy + uy * jump.r };\n const out = [`L${pointToString(pre)}`];\n if (style === \"arc\") {\n out.push(`A${fmt(jump.r)},${fmt(jump.r)} 0 0 ${sweep} ${pointToString(post)}`);\n } else {\n out.push(`M${pointToString(post)}`);\n }\n return out;\n}\n__name(emitJump, \"emitJump\");\nfunction computeRoundedCorner(prev, curr, next, radius) {\n const dx1 = curr.x - prev.x;\n const dy1 = curr.y - prev.y;\n const dx2 = next.x - curr.x;\n const dy2 = next.y - curr.y;\n const len1 = Math.hypot(dx1, dy1);\n const len2 = Math.hypot(dx2, dy2);\n if (len1 < CORNER_EPSILON || len2 < CORNER_EPSILON) {\n return null;\n }\n const nx1 = dx1 / len1;\n const ny1 = dy1 / len1;\n const nx2 = dx2 / len2;\n const ny2 = dy2 / len2;\n const dot = nx1 * nx2 + ny1 * ny2;\n const clamped = Math.max(-1, Math.min(1, dot));\n const angle = Math.acos(clamped);\n if (angle < CORNER_EPSILON || Math.abs(Math.PI - angle) < CORNER_EPSILON) {\n return null;\n }\n const cutLen = Math.min(radius / Math.sin(angle / 2), len1 / 2, len2 / 2);\n return {\n startX: curr.x - nx1 * cutLen,\n startY: curr.y - ny1 * cutLen,\n endX: curr.x + nx2 * cutLen,\n endY: curr.y + ny2 * cutLen,\n ctrlX: curr.x,\n ctrlY: curr.y,\n cutLen\n };\n}\n__name(computeRoundedCorner, \"computeRoundedCorner\");\nfunction rewriteEdgePath(edge, jumps, config) {\n const rawPoints = edge.points;\n if (rawPoints.length < 2) {\n return \"\";\n }\n const points = applyMarkerOffsets(rawPoints, edge);\n const rounded = edge.curve === \"rounded\";\n const segments = buildSegmentList(points);\n const bySeg = /* @__PURE__ */ new Map();\n for (const j of jumps) {\n const seg = segments[j.segIndex];\n if (!seg) {\n continue;\n }\n const segLen = Math.hypot(seg.b.x - seg.a.x, seg.b.y - seg.a.y);\n const list = bySeg.get(j.segIndex) ?? [];\n list.push({\n t: j.t,\n point: j.point,\n d: j.t * segLen,\n r: config.jumpRadius\n });\n bySeg.set(j.segIndex, list);\n }\n const parts = [`M${pointToString(points[0])}`];\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n const segLen = Math.hypot(seg.b.x - seg.a.x, seg.b.y - seg.a.y);\n const ux = segLen === 0 ? 0 : (seg.b.x - seg.a.x) / segLen;\n const uy = segLen === 0 ? 0 : (seg.b.y - seg.a.y) / segLen;\n const sweep = getArcSweepFlag(seg);\n let segStartConsumed = 0;\n if (rounded && i > 0) {\n const corner = computeRoundedCorner(\n points[i - 1],\n points[i],\n points[i + 1] ?? points[i],\n ROUNDED_CORNER_RADIUS\n );\n if (corner) {\n segStartConsumed = corner.cutLen;\n }\n }\n let segEndStop = segLen;\n let upcomingCorner = null;\n if (rounded && i < segments.length - 1) {\n upcomingCorner = computeRoundedCorner(\n points[i],\n points[i + 1],\n points[i + 2] ?? points[i + 1],\n ROUNDED_CORNER_RADIUS\n );\n if (upcomingCorner) {\n segEndStop = segLen - upcomingCorner.cutLen;\n }\n }\n const segJumps = [...bySeg.get(i) ?? []].sort((a, b) => a.t - b.t);\n for (const j of segJumps) {\n j.r = Math.min(j.r, j.d - segStartConsumed, segEndStop - j.d);\n }\n for (let k = 0; k < segJumps.length - 1; k++) {\n const gap = segJumps[k + 1].d - segJumps[k].d;\n if (segJumps[k].r + segJumps[k + 1].r > gap) {\n const half = gap / 2;\n segJumps[k].r = Math.min(segJumps[k].r, half);\n segJumps[k + 1].r = Math.min(segJumps[k + 1].r, half);\n }\n }\n for (const j of segJumps) {\n if (j.r < MIN_JUMP_RADIUS) {\n continue;\n }\n parts.push(...emitJump(j, ux, uy, sweep, config.jumpStyle));\n }\n if (rounded && upcomingCorner) {\n parts.push(`L${fmt(upcomingCorner.startX)},${fmt(upcomingCorner.startY)}`);\n parts.push(\n `Q${fmt(upcomingCorner.ctrlX)},${fmt(upcomingCorner.ctrlY)} ${fmt(upcomingCorner.endX)},${fmt(upcomingCorner.endY)}`\n );\n } else {\n parts.push(`L${pointToString(seg.b)}`);\n }\n }\n return parts.join(\" \");\n}\n__name(rewriteEdgePath, \"rewriteEdgePath\");\nfunction isStraightPath(d) {\n return /^[\\d\\s+,.LMelm-]*$/.test(d);\n}\n__name(isStraightPath, \"isStraightPath\");\nfunction curveSupportsLineHops(curve) {\n if (!curve) {\n return true;\n }\n return curve === \"linear\" || curve === \"rounded\" || curve === \"step\" || curve === \"stepBefore\" || curve === \"stepAfter\";\n}\n__name(curveSupportsLineHops, \"curveSupportsLineHops\");\nfunction decodeDataPoints(raw) {\n if (!raw) {\n return null;\n }\n try {\n const json = typeof atob === \"function\" ? atob(raw) : Buffer.from(raw, \"base64\").toString();\n const parsed = JSON.parse(json);\n if (!Array.isArray(parsed)) {\n return null;\n }\n const pts = [];\n for (const p of parsed) {\n if (p && typeof p.x === \"number\" && typeof p.y === \"number\") {\n pts.push({ x: p.x, y: p.y });\n }\n }\n return pts.length >= 2 ? pts : null;\n } catch {\n return null;\n }\n}\n__name(decodeDataPoints, \"decodeDataPoints\");\nfunction applyLineJumpsToSvg(edgePathsGroup, edges, config) {\n if (!config.enabled) {\n return;\n }\n const groupNode = edgePathsGroup.node();\n if (!groupNode) {\n return;\n }\n const edgeMeta = /* @__PURE__ */ new Map();\n for (const e of edges) {\n edgeMeta.set(e.id, e);\n }\n const renderedEdges = [];\n const pathById = /* @__PURE__ */ new Map();\n for (const e of edges) {\n const escapedId = typeof CSS !== \"undefined\" && CSS.escape ? CSS.escape(e.id) : e.id;\n const pathEl = groupNode.querySelector(`path[data-id=\"${escapedId}\"]`);\n if (!pathEl) {\n continue;\n }\n pathById.set(e.id, pathEl);\n const decoded = decodeDataPoints(pathEl.getAttribute(\"data-points\"));\n const points = decoded ?? e.points;\n renderedEdges.push({ ...e, points });\n }\n const crossings = findEdgeIntersections(renderedEdges);\n if (crossings.length === 0) {\n return;\n }\n const jumpsByEdge = /* @__PURE__ */ new Map();\n for (const c of crossings) {\n const list = jumpsByEdge.get(c.jumpEdgeId) ?? [];\n list.push(c);\n jumpsByEdge.set(c.jumpEdgeId, list);\n }\n for (const renderedEdge of renderedEdges) {\n const jumps = jumpsByEdge.get(renderedEdge.id);\n if (!jumps || jumps.length === 0) {\n continue;\n }\n const meta = edgeMeta.get(renderedEdge.id);\n const curveHint = meta?.curve;\n if (curveHint !== void 0 && !curveSupportsLineHops(curveHint)) {\n continue;\n }\n const pathEl = pathById.get(renderedEdge.id);\n if (!pathEl) {\n continue;\n }\n if (curveHint === void 0) {\n const currentD = pathEl.getAttribute(\"d\") ?? \"\";\n if (!isStraightPath(currentD)) {\n continue;\n }\n }\n const originalStyle = pathEl.getAttribute(\"style\") ?? \"\";\n const dasharrayMatch = /stroke-dasharray\\s*:\\s*0\\s+([\\d.]+)\\s+[\\d.]+\\s+([\\d.]+)/.exec(\n originalStyle\n );\n const preservedOValueS = dasharrayMatch ? Number.parseFloat(dasharrayMatch[1]) : null;\n const preservedOValueE = dasharrayMatch ? Number.parseFloat(dasharrayMatch[2]) : null;\n const newD = rewriteEdgePath(renderedEdge, jumps, config);\n pathEl.setAttribute(\"d\", newD);\n if (preservedOValueS !== null && preservedOValueE !== null && typeof pathEl.getTotalLength === \"function\") {\n const newLen = pathEl.getTotalLength();\n const onLen = Math.max(0, newLen - preservedOValueS - preservedOValueE);\n const newDasharray = `0 ${preservedOValueS} ${onLen} ${preservedOValueE}`;\n const cleaned = originalStyle.replace(/stroke-dasharray\\s*:[^;]*;?/g, `stroke-dasharray: ${newDasharray};`).replace(/;\\s*;+/g, \";\");\n pathEl.setAttribute(\"style\", cleaned);\n }\n }\n}\n__name(applyLineJumpsToSvg, \"applyLineJumpsToSvg\");\n\n// src/rendering-util/layout-algorithms/swimlanes/adjustLayout.ts\nasync function adjustLayout(data4Layout, groups) {\n for (const node of data4Layout.nodes) {\n if (node.isGroup) {\n await insertCluster(groups.clusters, node);\n } else {\n positionNode(node);\n }\n }\n const nodeById = /* @__PURE__ */ new Map();\n for (const node of data4Layout.nodes) {\n if (node?.id) {\n nodeById.set(node.id, node);\n }\n }\n for (const edge of data4Layout.edges) {\n const startNode = edge.start ? nodeById.get(edge.start) ?? {} : {};\n const endNode = edge.end ? nodeById.get(edge.end) ?? {} : {};\n const paths = insertEdge(\n groups.edgePaths,\n { ...edge },\n {},\n data4Layout.type,\n startNode,\n endNode,\n data4Layout.diagramId\n );\n if (edge.label) {\n await insertEdgeLabel(groups.rootGroups, edge);\n }\n if (edge.label) {\n positionEdgeLabel(edge, paths);\n }\n }\n const lineHopsConfig = data4Layout.config?.swimlane?.lineHops;\n if (lineHopsConfig !== false) {\n const jumpStyle = lineHopsConfig === \"gap\" ? \"gap\" : \"arc\";\n const edgeGeometries = data4Layout.edges.filter((e) => Array.isArray(e.points) && e.points.length >= 2).map((e) => ({\n id: e.id,\n points: e.points,\n curve: e.curve,\n arrowTypeStart: e.arrowTypeStart,\n arrowTypeEnd: e.arrowTypeEnd\n }));\n applyLineJumpsToSvg(groups.edgePaths, edgeGeometries, {\n enabled: true,\n jumpRadius: 6,\n jumpStyle\n });\n }\n}\n__name(adjustLayout, \"adjustLayout\");\nfunction positionEdgeLabel(edge, paths) {\n const path = paths?.updatedPath ?? paths?.originalPath;\n const siteConfig = getConfig();\n const { subGraphTitleTotalMargin } = getSubGraphTitleMargins({\n flowchart: siteConfig.flowchart ?? {}\n });\n if (edge.label) {\n const el = edgeLabels.get(edge.id);\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcLabelPosition(path);\n log.debug(\n \"Moving label \" + edge.label + \" from (\",\n x,\n \",\",\n y,\n \") to (\",\n pos.x,\n \",\",\n pos.y,\n \") abc88\"\n );\n if (paths) {\n x = pos.x;\n y = pos.y;\n }\n }\n el.attr(\"transform\", `translate(${x}, ${y + subGraphTitleTotalMargin / 2})`);\n }\n if (edge?.startLabelLeft) {\n const el = terminalLabels.get(edge.id).startLeft;\n let x = edge?.x;\n let y = edge?.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeStart ? 10 : 0, \"start_left\", path);\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n if (edge.startLabelRight) {\n const el = terminalLabels.get(edge.id).startRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(\n edge.arrowTypeStart ? 10 : 0,\n \"start_right\",\n path\n );\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n if (edge.endLabelLeft) {\n const el = terminalLabels.get(edge.id).endLeft;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, \"end_left\", path);\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n if (edge.endLabelRight) {\n const el = terminalLabels.get(edge.id).endRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, \"end_right\", path);\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n}\n__name(positionEdgeLabel, \"positionEdgeLabel\");\n\n// src/rendering-util/layout-algorithms/swimlanes/helpers.ts\nvar DEFAULT_SWIMLANE_ID = \"__swimlane_default__\";\nvar TOP_LANE_TITLE_BAND_HEIGHT = 21;\nvar MIN_TOP_LANE_HORIZONTAL_PADDING = 20;\nfunction topLaneHorizontalPadding(lane) {\n return Math.max(lane.padding ?? MIN_TOP_LANE_HORIZONTAL_PADDING, MIN_TOP_LANE_HORIZONTAL_PADDING);\n}\n__name(topLaneHorizontalPadding, \"topLaneHorizontalPadding\");\nfunction assignTopLaneTitleRect(lane) {\n const { x, y, width, height } = lane;\n const contentTop = lane.swimlaneContentTop;\n if (typeof x !== \"number\" || typeof y !== \"number\" || typeof width !== \"number\" || typeof height !== \"number\" || typeof contentTop !== \"number\" || !Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(width) || !Number.isFinite(height) || !Number.isFinite(contentTop) || width <= 0 || height <= 0) {\n delete lane.groupTitleRect;\n return;\n }\n const top = y - height / 2;\n const headerBottom = Math.min(contentTop, y + height / 2);\n const titleHeight = Math.min(TOP_LANE_TITLE_BAND_HEIGHT, Math.max(0, headerBottom - top));\n const bottom = top + titleHeight;\n if (bottom <= top) {\n delete lane.groupTitleRect;\n return;\n }\n lane.groupTitleRect = {\n left: x - width / 2,\n right: x + width / 2,\n top,\n bottom\n };\n}\n__name(assignTopLaneTitleRect, \"assignTopLaneTitleRect\");\nfunction prepareLayoutForSwimlanes(layout) {\n const direction = layout.direction;\n const nodes = layout.nodes ??= [];\n for (const node of layout.nodes ?? []) {\n if (node.isGroup && !node.parentId) {\n node.shape = \"swimlane\";\n if (direction) {\n node.direction = direction;\n }\n }\n }\n const looseNodes = nodes.filter((node) => !node.isGroup && !node.parentId);\n if (looseNodes.length === 0) {\n return;\n }\n let defaultLane = nodes.find((node) => node.id === DEFAULT_SWIMLANE_ID);\n if (!defaultLane) {\n defaultLane = {\n id: DEFAULT_SWIMLANE_ID,\n label: \"\",\n isGroup: true,\n shape: \"swimlane\",\n padding: 20,\n ...direction ? { direction } : {}\n };\n nodes.push(defaultLane);\n } else if (defaultLane.isGroup) {\n defaultLane.shape = \"swimlane\";\n if (direction) {\n defaultLane.direction = direction;\n }\n }\n for (const node of looseNodes) {\n node.parentId = DEFAULT_SWIMLANE_ID;\n }\n}\n__name(prepareLayoutForSwimlanes, \"prepareLayoutForSwimlanes\");\nfunction toGraphView(layout) {\n const nodeById = /* @__PURE__ */ new Map();\n for (const n of layout.nodes ?? []) {\n nodeById.set(n.id, n);\n }\n const edges = [];\n for (const e of layout.edges ?? []) {\n const src = typeof e.start === \"string\" ? e.start : void 0;\n const dst = typeof e.end === \"string\" ? e.end : void 0;\n if (!src || !dst) {\n continue;\n }\n if (e.labelNodeId) {\n continue;\n }\n edges.push({ id: e.id, src, dst, ref: e });\n }\n const allNodes = layout.nodes ?? [];\n const groupNodes = allNodes.filter((n) => n.isGroup);\n const nonGroupNodes = allNodes.filter((n) => !n.isGroup);\n const nodesInGroupOrder = [...groupNodes].reverse();\n const nodes = [...nodesInGroupOrder, ...nonGroupNodes].map((n) => n.id);\n return { nodes, edges, layout, nodeById };\n}\n__name(toGraphView, \"toGraphView\");\nfunction writeBackToLayoutData(g, ordered, coords, opts) {\n const { layout } = g;\n const nodeMap = g.nodeById;\n const layerGap = opts?.layerGap ?? 100;\n const nodeGap = opts?.nodeGap ?? 40;\n let layerIndex = 0;\n for (const layer of ordered.layers) {\n let orderIndex = 0;\n for (const id of layer) {\n const node = nodeMap.get(id);\n if (!node) {\n orderIndex++;\n continue;\n }\n node.layer = layerIndex;\n node.order = orderIndex;\n const x = coords.x[id] ?? orderIndex * nodeGap;\n const y = coords.y[id] ?? layerIndex * layerGap;\n node.x = x;\n node.y = y;\n orderIndex++;\n }\n layerIndex++;\n }\n const allNodes = layout.nodes ?? [];\n const groupBounds = /* @__PURE__ */ new Map();\n const topLevelGroups = [];\n for (const group of allNodes) {\n if (!group?.isGroup) {\n continue;\n }\n if (!group.parentId) {\n topLevelGroups.push(group);\n }\n const children = allNodes.filter((n) => n.parentId === group.id);\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n for (const child of children) {\n const cx = child.x ?? coords.x[child.id];\n const cy = child.y ?? coords.y[child.id];\n const cw = child.width ?? 0;\n const ch = child.height ?? 0;\n if (cx != null && cy != null) {\n minX = Math.min(minX, cx - cw / 2);\n maxX = Math.max(maxX, cx + cw / 2);\n minY = Math.min(minY, cy - ch / 2);\n maxY = Math.max(maxY, cy + ch / 2);\n }\n }\n if (minX === Infinity || minY === Infinity) {\n group.x = group.x ?? 0;\n group.y = group.y ?? 0;\n group.width = group.width ?? 0;\n group.height = group.height ?? 0;\n } else {\n const pad = group.padding ?? 20;\n const horizontalPad = group.parentId ? pad : 2 * topLaneHorizontalPadding(group);\n const verticalPad = pad;\n const w = Math.max(0, maxX - minX) + horizontalPad;\n const h = Math.max(0, maxY - minY) + verticalPad;\n const cx = (minX + maxX) / 2;\n const cy = (minY + maxY) / 2;\n group.x = cx;\n group.y = cy;\n group.width = w;\n group.height = h;\n groupBounds.set(group.id, { minX, maxX, minY, maxY });\n }\n }\n if (topLevelGroups.length > 0 && groupBounds.size > 0) {\n let globalMinY = Infinity;\n let globalMaxY = -Infinity;\n let maxPad = 0;\n for (const lane of topLevelGroups) {\n const pad = lane.padding ?? 20;\n if (pad > maxPad) {\n maxPad = pad;\n }\n const b = groupBounds.get(lane.id);\n if (!b) {\n continue;\n }\n globalMinY = Math.min(globalMinY, b.minY);\n globalMaxY = Math.max(globalMaxY, b.maxY);\n }\n if (globalMinY !== Infinity && globalMaxY !== -Infinity) {\n const contentHeight = Math.max(0, globalMaxY - globalMinY);\n const minHeaderMargin = 36;\n const verticalMargin = Math.max(maxPad, minHeaderMargin);\n const laneHeight = contentHeight + 2 * verticalMargin;\n const centerY = (globalMinY + globalMaxY) / 2;\n for (const lane of topLevelGroups) {\n lane.y = centerY;\n lane.height = laneHeight;\n lane.swimlaneContentTop = globalMinY;\n }\n const sortedLanes = [...topLevelGroups].sort((a, b) => {\n const ax = a.x ?? 0;\n const bx = b.x ?? 0;\n return ax - bx;\n });\n const laneIds = [];\n const centers = [];\n const baseWidths = [];\n for (const lane of sortedLanes) {\n const b = groupBounds.get(lane.id);\n if (!b) {\n continue;\n }\n const contentWidth = Math.max(0, b.maxX - b.minX) + 2 * topLaneHorizontalPadding(lane);\n const cx = (b.minX + b.maxX) / 2;\n laneIds.push(lane.id);\n centers.push(cx);\n baseWidths.push(contentWidth);\n }\n const count = laneIds.length;\n if (count > 0) {\n const laneWidths = /* @__PURE__ */ new Map();\n if (count === 1) {\n laneWidths.set(laneIds[0], baseWidths[0]);\n } else {\n const d = [];\n for (let i = 0; i < count - 1; i++) {\n d.push(centers[i + 1] - centers[i]);\n }\n const u = new Array(count);\n u[0] = 0;\n for (let i = 0; i < count - 1; i++) {\n u[i + 1] = 2 * d[i] - u[i];\n }\n let lowerBound = 0;\n let upperBound = Number.POSITIVE_INFINITY;\n for (let i = 0; i < count; i++) {\n const baseW = baseWidths[i];\n if (i % 2 === 0) {\n lowerBound = Math.max(lowerBound, baseW - u[i]);\n } else {\n upperBound = Math.min(upperBound, u[i] - baseW);\n }\n }\n let x = lowerBound;\n if (lowerBound <= upperBound) {\n x = (lowerBound + upperBound) / 2;\n } else {\n x = lowerBound;\n }\n for (let i = 0; i < count; i++) {\n const w = u[i] + (i % 2 === 0 ? x : -x);\n const finalWidth = Math.max(baseWidths[i], w);\n laneWidths.set(laneIds[i], finalWidth);\n }\n }\n for (const lane of topLevelGroups) {\n const w = laneWidths.get(lane.id);\n if (w != null) {\n lane.width = w;\n }\n assignTopLaneTitleRect(lane);\n }\n }\n }\n }\n}\n__name(writeBackToLayoutData, \"writeBackToLayoutData\");\n\n// src/rendering-util/layout-algorithms/swimlanes/edgeLabelNodes.ts\nvar EDGE_LABEL_LOG_PREFIX = \"[EdgeLabelNodes]\";\nfunction createEdgeLabelNodes(data) {\n const nodesToAdd = [];\n const layoutOnlyEdges = [];\n const nodeById = /* @__PURE__ */ new Map();\n for (const node of data.nodes) {\n nodeById.set(node.id, node);\n }\n for (const edge of data.edges) {\n if (!edge.label || edge.label.length === 0) {\n continue;\n }\n if (edge.isLayoutOnly) {\n continue;\n }\n if (edge.labelNodeId) {\n continue;\n }\n const sourceNode = edge.start ? nodeById.get(edge.start) : void 0;\n const targetNode = edge.end ? nodeById.get(edge.end) : void 0;\n if (!sourceNode || !targetNode) {\n log.warn(EDGE_LABEL_LOG_PREFIX, `Edge ${edge.id} has missing source or target node`);\n continue;\n }\n const labelNodeId = `edge-label-${edge.start}-${edge.end}-${edge.id}`;\n const isCrossLane = sourceNode.parentId !== targetNode.parentId;\n const labelLane = isCrossLane ? targetNode.parentId : sourceNode.parentId;\n const labelNode = {\n id: labelNodeId,\n label: edge.label,\n edgeStart: edge.start ?? \"\",\n edgeEnd: edge.end ?? \"\",\n shape: \"labelRect\",\n width: 0,\n // populated when rendered / applied from fixture\n height: 0,\n isEdgeLabel: true,\n isDummy: true,\n parentId: labelLane,\n isGroup: false,\n labelStyle: Array.isArray(edge.labelStyle) ? edge.labelStyle[0] : edge.labelStyle ?? \"\",\n ...sourceNode.dir ? { dir: sourceNode.dir } : {}\n };\n nodesToAdd.push(labelNode);\n edge.labelNodeId = labelNodeId;\n edge.label = void 0;\n edge.text = void 0;\n const toLabelVirtual = {\n id: `${edge.id}-to-label`,\n start: edge.start,\n end: labelNodeId,\n type: \"normal\",\n isLayoutOnly: true\n };\n const fromLabelVirtual = {\n id: `${edge.id}-from-label`,\n start: labelNodeId,\n end: edge.end,\n type: \"normal\",\n isLayoutOnly: true\n };\n layoutOnlyEdges.push(toLabelVirtual, fromLabelVirtual);\n }\n const newNodes = [...data.nodes, ...nodesToAdd];\n const newEdges = [...data.edges, ...layoutOnlyEdges];\n return {\n ...data,\n nodes: newNodes,\n edges: newEdges\n };\n}\n__name(createEdgeLabelNodes, \"createEdgeLabelNodes\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/geometry.ts\nvar EPS = 1e-3;\nfunction measuredNodeRect(node) {\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const width = node.width ?? 0;\n const height = node.height ?? 0;\n return width > 0 && height > 0 ? { cx, cy, rect: rectFromCenterSize(cx, cy, width, height) } : void 0;\n}\n__name(measuredNodeRect, \"measuredNodeRect\");\nfunction nodeBoundsInfoFor(node) {\n if (node.isGroup) {\n return void 0;\n }\n const measured = measuredNodeRect(node);\n if (!measured) {\n return void 0;\n }\n const id = String(node.id ?? \"\");\n return {\n id,\n cx: measured.cx,\n cy: measured.cy,\n rect: measured.rect\n };\n}\n__name(nodeBoundsInfoFor, \"nodeBoundsInfoFor\");\nfunction samePoint(a, b, epsilon = EPS) {\n return Math.abs(a.x - b.x) < epsilon && Math.abs(a.y - b.y) < epsilon;\n}\n__name(samePoint, \"samePoint\");\nfunction sameX(a, b, epsilon = EPS) {\n return Math.abs(a.x - b.x) < epsilon;\n}\n__name(sameX, \"sameX\");\nfunction sameY(a, b, epsilon = EPS) {\n return Math.abs(a.y - b.y) < epsilon;\n}\n__name(sameY, \"sameY\");\nfunction isHorizontalSegment(a, b, epsilon = EPS) {\n return sameY(a, b, epsilon) && Math.abs(a.x - b.x) > epsilon;\n}\n__name(isHorizontalSegment, \"isHorizontalSegment\");\nfunction isVerticalSegment(a, b, epsilon = EPS) {\n return sameX(a, b, epsilon) && Math.abs(a.y - b.y) > epsilon;\n}\n__name(isVerticalSegment, \"isVerticalSegment\");\nfunction overlapLength(a1, a2, b1, b2) {\n return Math.max(\n 0,\n Math.min(Math.max(a1, a2), Math.max(b1, b2)) - Math.max(Math.min(a1, a2), Math.min(b1, b2))\n );\n}\n__name(overlapLength, \"overlapLength\");\nfunction sameAxisSegmentOverlapLength(a, b, epsilon = EPS) {\n if (a.horizontal && b.horizontal && sameY(a.a, b.a, epsilon)) {\n return overlapLength(a.a.x, a.b.x, b.a.x, b.b.x);\n }\n if (a.vertical && b.vertical && sameX(a.a, b.a, epsilon)) {\n return overlapLength(a.a.y, a.b.y, b.a.y, b.b.y);\n }\n return 0;\n}\n__name(sameAxisSegmentOverlapLength, \"sameAxisSegmentOverlapLength\");\nfunction orthogonalSegmentsForPoints(points, epsilon = EPS) {\n const result = [];\n for (let i = 0; i < points.length - 1; i++) {\n const a = points[i];\n const b = points[i + 1];\n const horizontal = isHorizontalSegment(a, b, epsilon);\n const vertical = isVerticalSegment(a, b, epsilon);\n if (horizontal || vertical) {\n result.push({ index: i, a, b, horizontal, vertical });\n }\n }\n return result;\n}\n__name(orthogonalSegmentsForPoints, \"orthogonalSegmentsForPoints\");\nfunction countOrthogonalBends(points, epsilon = EPS) {\n const segments = orthogonalSegmentsForPoints(points, epsilon);\n let bends = 0;\n for (let i = 1; i < segments.length; i++) {\n if (segments[i - 1].horizontal !== segments[i].horizontal) {\n bends++;\n }\n }\n return bends;\n}\n__name(countOrthogonalBends, \"countOrthogonalBends\");\nfunction dedupeConsecutivePoints(points, epsilon = EPS) {\n const result = [];\n for (const point of points) {\n const last = result.length > 0 ? result[result.length - 1] : void 0;\n if (!last || !samePoint(last, point, epsilon)) {\n result.push({ x: point.x, y: point.y });\n }\n }\n return result;\n}\n__name(dedupeConsecutivePoints, \"dedupeConsecutivePoints\");\nfunction classifyThreeSegmentRoute(points, epsilon = EPS) {\n if (!points || points.length !== 4) {\n return void 0;\n }\n const [p0, p1, p2, p3] = points;\n const isHVH = isHorizontalSegment(p0, p1, epsilon) && isVerticalSegment(p1, p2, epsilon) && isHorizontalSegment(p2, p3, epsilon);\n if (isHVH) {\n return { kind: \"HVH\", p0, p1, p2, p3 };\n }\n const isVHV = isVerticalSegment(p0, p1, epsilon) && isHorizontalSegment(p1, p2, epsilon) && isVerticalSegment(p2, p3, epsilon);\n return isVHV ? { kind: \"VHV\", p0, p1, p2, p3 } : void 0;\n}\n__name(classifyThreeSegmentRoute, \"classifyThreeSegmentRoute\");\nfunction segmentBoundsOverlapRect(a, b, rect, buffer = 0) {\n const segMinX = Math.min(a.x, b.x);\n const segMaxX = Math.max(a.x, b.x);\n const segMinY = Math.min(a.y, b.y);\n const segMaxY = Math.max(a.y, b.y);\n return segMaxX > rect.left - buffer && segMinX < rect.right + buffer && segMaxY > rect.top - buffer && segMinY < rect.bottom + buffer;\n}\n__name(segmentBoundsOverlapRect, \"segmentBoundsOverlapRect\");\nfunction pointInsideRect(point, rect, buffer = 0) {\n return point.x > rect.left + buffer && point.x < rect.right - buffer && point.y > rect.top + buffer && point.y < rect.bottom - buffer;\n}\n__name(pointInsideRect, \"pointInsideRect\");\nfunction rectContainsRect(outer, inner) {\n return outer.left <= inner.left && outer.right >= inner.right && outer.top <= inner.top && outer.bottom >= inner.bottom;\n}\n__name(rectContainsRect, \"rectContainsRect\");\nfunction rectsOverlap(a, b) {\n return a.left < b.right && a.right > b.left && a.top < b.bottom && a.bottom > b.top;\n}\n__name(rectsOverlap, \"rectsOverlap\");\nfunction inflateRect(rect, margin) {\n return {\n left: rect.left - margin,\n right: rect.right + margin,\n top: rect.top - margin,\n bottom: rect.bottom + margin\n };\n}\n__name(inflateRect, \"inflateRect\");\nfunction rectFromCenterSize(cx, cy, width, height) {\n return {\n left: cx - width / 2,\n right: cx + width / 2,\n top: cy - height / 2,\n bottom: cy + height / 2\n };\n}\n__name(rectFromCenterSize, \"rectFromCenterSize\");\nfunction rectOfNodeBounds(node) {\n return measuredNodeRect(node)?.rect;\n}\n__name(rectOfNodeBounds, \"rectOfNodeBounds\");\nfunction portForRectSide(node, side) {\n switch (side) {\n case \"top\":\n return { x: node.cx, y: node.rect.top };\n case \"bottom\":\n return { x: node.cx, y: node.rect.bottom };\n case \"left\":\n return { x: node.rect.left, y: node.cy };\n case \"right\":\n return { x: node.rect.right, y: node.cy };\n }\n}\n__name(portForRectSide, \"portForRectSide\");\nfunction buildOrthogonalPortPath(src, srcSide, dst, dstSide, anchor, epsilon = EPS) {\n const srcH = srcSide === \"left\" || srcSide === \"right\";\n const dstH = dstSide === \"left\" || dstSide === \"right\";\n if (srcH && dstH) {\n const opposingDir = srcSide === \"right\" && dstSide === \"left\" && src.x < dst.x || srcSide === \"left\" && dstSide === \"right\" && src.x > dst.x;\n if (opposingDir) {\n if (sameY(src, dst, epsilon)) {\n return [src, dst];\n }\n const midX = (src.x + dst.x) / 2;\n return [src, { x: midX, y: src.y }, { x: midX, y: dst.y }, dst];\n }\n if (srcSide === dstSide) {\n if (sameY(src, dst, epsilon)) {\n return void 0;\n }\n const intX = srcSide === \"left\" ? Math.min(src.x, dst.x) - anchor : Math.max(src.x, dst.x) + anchor;\n return [src, { x: intX, y: src.y }, { x: intX, y: dst.y }, dst];\n }\n return void 0;\n }\n if (!srcH && !dstH) {\n if (srcSide === dstSide) {\n if (sameX(src, dst, epsilon)) {\n return void 0;\n }\n const intY = srcSide === \"top\" ? Math.min(src.y, dst.y) - anchor : Math.max(src.y, dst.y) + anchor;\n return [src, { x: src.x, y: intY }, { x: dst.x, y: intY }, dst];\n }\n const sameDir = srcSide === \"bottom\" && dstSide === \"top\" && src.y < dst.y || srcSide === \"top\" && dstSide === \"bottom\" && src.y > dst.y;\n if (!sameDir) {\n return void 0;\n }\n if (sameX(src, dst, epsilon)) {\n return [src, dst];\n }\n const midY = (src.y + dst.y) / 2;\n return [src, { x: src.x, y: midY }, { x: dst.x, y: midY }, dst];\n }\n if (srcH && !dstH) {\n const sameDirSrc2 = srcSide === \"right\" && dst.x > src.x || srcSide === \"left\" && dst.x < src.x;\n const sameDirDst2 = dstSide === \"top\" && src.y < dst.y || dstSide === \"bottom\" && src.y > dst.y;\n return sameDirSrc2 && sameDirDst2 ? [src, { x: dst.x, y: src.y }, dst] : void 0;\n }\n const sameDirSrc = srcSide === \"bottom\" && dst.y > src.y || srcSide === \"top\" && dst.y < src.y;\n const sameDirDst = dstSide === \"left\" && src.x < dst.x || dstSide === \"right\" && src.x > dst.x;\n return sameDirSrc && sameDirDst ? [src, { x: src.x, y: dst.y }, dst] : void 0;\n}\n__name(buildOrthogonalPortPath, \"buildOrthogonalPortPath\");\nfunction buildSameSideTrackPath(src, side, dst, track) {\n return side === \"left\" || side === \"right\" ? [src, { x: track, y: src.y }, { x: track, y: dst.y }, dst] : [src, { x: src.x, y: track }, { x: dst.x, y: track }, dst];\n}\n__name(buildSameSideTrackPath, \"buildSameSideTrackPath\");\nfunction collectRealNodeBounds(nodes) {\n const nodeInfoById = /* @__PURE__ */ new Map();\n const realNodeRects = [];\n for (const node of nodes) {\n if (node.isEdgeLabel) {\n continue;\n }\n const info = nodeBoundsInfoFor(node);\n if (!info) {\n continue;\n }\n nodeInfoById.set(info.id, info);\n realNodeRects.push({ id: info.id, rect: info.rect });\n }\n return { nodeInfoById, realNodeRects };\n}\n__name(collectRealNodeBounds, \"collectRealNodeBounds\");\nfunction collectNodeRectEntries(nodes) {\n const realNodeRects = [];\n const labelNodeRects = [];\n for (const node of nodes) {\n const info = nodeBoundsInfoFor(node);\n if (!info) {\n continue;\n }\n const entry = { id: info.id, rect: info.rect };\n if (node.isEdgeLabel) {\n labelNodeRects.push(entry);\n } else {\n realNodeRects.push(entry);\n }\n }\n return { realNodeRects, labelNodeRects };\n}\n__name(collectNodeRectEntries, \"collectNodeRectEntries\");\nfunction collectLayoutNodeRects(nodes, { includeEdgeLabels = true } = {}) {\n const result = [];\n for (const node of nodes) {\n if (node.isGroup || !includeEdgeLabels && node.isEdgeLabel) {\n continue;\n }\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const width = node.width ?? 0;\n const height = node.height ?? 0;\n result.push({\n nodeId: node.id,\n ...rectFromCenterSize(cx, cy, width, height)\n });\n }\n return result;\n}\n__name(collectLayoutNodeRects, \"collectLayoutNodeRects\");\nfunction getNodePairGeometry(edge, nodeInfoById, epsilon = EPS) {\n const srcId = edge.start;\n const dstId = edge.end;\n if (!srcId || !dstId) {\n return void 0;\n }\n const srcInfo = nodeInfoById.get(srcId);\n const dstInfo = nodeInfoById.get(dstId);\n if (!srcInfo || !dstInfo) {\n return void 0;\n }\n return {\n srcId,\n dstId,\n srcInfo,\n dstInfo,\n collinearX: Math.abs(srcInfo.cx - dstInfo.cx) < epsilon,\n collinearY: Math.abs(srcInfo.cy - dstInfo.cy) < epsilon\n };\n}\n__name(getNodePairGeometry, \"getNodePairGeometry\");\nfunction segmentHitsAnyRect(a, b, rects, excludeIds = [], shrink = 0) {\n for (const entry of rects) {\n if (excludeIds.includes(entry.id)) {\n continue;\n }\n if (segmentBoundsOverlapRect(a, b, entry.rect, -shrink)) {\n return true;\n }\n }\n return false;\n}\n__name(segmentHitsAnyRect, \"segmentHitsAnyRect\");\nfunction orthogonalSegmentsCross(a1, b1, a2, b2, epsilon = EPS, endpointTolerance = 1e-6) {\n const s1H = sameY(a1, b1, epsilon);\n const s1V = sameX(a1, b1, epsilon);\n const s2H = sameY(a2, b2, epsilon);\n const s2V = sameX(a2, b2, epsilon);\n if (s1H && s2H || s1V && s2V) {\n return false;\n }\n if (!(s1H || s1V) || !(s2H || s2V)) {\n return false;\n }\n const horiz = s1H ? { a: a1, b: b1 } : { a: a2, b: b2 };\n const vert = s1V ? { a: a1, b: b1 } : { a: a2, b: b2 };\n const hY = horiz.a.y;\n const hX1 = Math.min(horiz.a.x, horiz.b.x);\n const hX2 = Math.max(horiz.a.x, horiz.b.x);\n const vX = vert.a.x;\n const vY1 = Math.min(vert.a.y, vert.b.y);\n const vY2 = Math.max(vert.a.y, vert.b.y);\n if (vX < hX1 || vX > hX2 || hY < vY1 || hY > vY2) {\n return false;\n }\n const matchesHorizEndpoint = Math.abs(vX - horiz.a.x) < endpointTolerance && Math.abs(hY - horiz.a.y) < endpointTolerance || Math.abs(vX - horiz.b.x) < endpointTolerance && Math.abs(hY - horiz.b.y) < endpointTolerance;\n const matchesVertEndpoint = Math.abs(vX - vert.a.x) < endpointTolerance && Math.abs(hY - vert.a.y) < endpointTolerance || Math.abs(vX - vert.b.x) < endpointTolerance && Math.abs(hY - vert.b.y) < endpointTolerance;\n return !(matchesHorizEndpoint && matchesVertEndpoint);\n}\n__name(orthogonalSegmentsCross, \"orthogonalSegmentsCross\");\nfunction sameAxisSegmentsOverlap(a1, b1, a2, b2, epsilon = EPS) {\n const s1H = sameY(a1, b1, epsilon);\n const s1V = sameX(a1, b1, epsilon);\n const s2H = sameY(a2, b2, epsilon);\n const s2V = sameX(a2, b2, epsilon);\n if (s1V && s2V && sameX(a1, a2, epsilon)) {\n return overlapLength(a1.y, b1.y, a2.y, b2.y) > epsilon;\n }\n if (s1H && s2H && sameY(a1, a2, epsilon)) {\n return overlapLength(a1.x, b1.x, a2.x, b2.x) > epsilon;\n }\n return false;\n}\n__name(sameAxisSegmentsOverlap, \"sameAxisSegmentsOverlap\");\nfunction segmentConflictsWithAnyEdge(a, b, edges, excludeEdge, {\n epsilon = EPS,\n skipDegenerateOther = false\n} = {}) {\n for (const other of edges) {\n if (other === excludeEdge || other.isLayoutOnly) {\n continue;\n }\n const points = other.points;\n if (!points || points.length < 2) {\n continue;\n }\n for (let i = 0; i < points.length - 1; i++) {\n const oa = points[i];\n const ob = points[i + 1];\n if (skipDegenerateOther && samePoint(oa, ob, epsilon)) {\n continue;\n }\n if (orthogonalSegmentsCross(a, b, oa, ob, epsilon) || sameAxisSegmentsOverlap(a, b, oa, ob, epsilon)) {\n return true;\n }\n }\n }\n return false;\n}\n__name(segmentConflictsWithAnyEdge, \"segmentConflictsWithAnyEdge\");\nfunction orthogonalSegmentsStrictlyCross(a1, b1, a2, b2, epsilon = EPS) {\n const aHoriz = sameY(a1, b1, epsilon);\n const aVert = sameX(a1, b1, epsilon);\n const bHoriz = sameY(a2, b2, epsilon);\n const bVert = sameX(a2, b2, epsilon);\n if (!(aHoriz && bVert || aVert && bHoriz)) {\n return false;\n }\n const horiz = aHoriz ? { a: a1, b: b1 } : { a: a2, b: b2 };\n const vert = aHoriz ? { a: a2, b: b2 } : { a: a1, b: b1 };\n const hY = horiz.a.y;\n const hXmin = Math.min(horiz.a.x, horiz.b.x);\n const hXmax = Math.max(horiz.a.x, horiz.b.x);\n const vX = vert.a.x;\n const vYmin = Math.min(vert.a.y, vert.b.y);\n const vYmax = Math.max(vert.a.y, vert.b.y);\n return vX > hXmin + epsilon && vX < hXmax - epsilon && hY > vYmin + epsilon && hY < vYmax - epsilon;\n}\n__name(orthogonalSegmentsStrictlyCross, \"orthogonalSegmentsStrictlyCross\");\nfunction strictlyBetween(value, a, b) {\n const lo = Math.min(a, b);\n const hi = Math.max(a, b);\n return value > lo + EPS && value < hi - EPS;\n}\n__name(strictlyBetween, \"strictlyBetween\");\nfunction isCollinearIntermediate(prev, cur, next) {\n if (sameX(prev, cur) && sameX(cur, next)) {\n return strictlyBetween(cur.y, prev.y, next.y);\n }\n if (sameY(prev, cur) && sameY(cur, next)) {\n return strictlyBetween(cur.x, prev.x, next.x);\n }\n return false;\n}\n__name(isCollinearIntermediate, \"isCollinearIntermediate\");\nfunction simplifyPolylineOnce(points) {\n let changed = false;\n const out = [];\n for (let i = 0; i < points.length; i++) {\n const prev = out[out.length - 1];\n const cur = points[i];\n const next = i + 1 < points.length ? points[i + 1] : void 0;\n if (prev && next) {\n if (samePoint(prev, next)) {\n i++;\n changed = true;\n continue;\n }\n if (isCollinearIntermediate(prev, cur, next)) {\n changed = true;\n continue;\n }\n }\n out.push(cur);\n }\n return { points: out, changed };\n}\n__name(simplifyPolylineOnce, \"simplifyPolylineOnce\");\nfunction orthogonalizePolyline(pts) {\n const cleaned = [pts[0]];\n for (let i = 1; i < pts.length; i++) {\n const prev = cleaned[cleaned.length - 1];\n const curr = pts[i];\n if (!sameX(prev, curr) && !sameY(prev, curr)) {\n const prevPrev = cleaned.length >= 2 ? cleaned[cleaned.length - 2] : void 0;\n const incomingVertical = prevPrev ? sameX(prevPrev, prev) : false;\n const corner = incomingVertical ? { x: prev.x, y: curr.y } : { x: curr.x, y: prev.y };\n cleaned.push(corner);\n }\n cleaned.push(curr);\n }\n const deduped = [];\n for (const p of cleaned) {\n const last = deduped[deduped.length - 1];\n if (!last || !samePoint(last, p)) {\n deduped.push(p);\n }\n }\n return deduped;\n}\n__name(orthogonalizePolyline, \"orthogonalizePolyline\");\nfunction simplifyPolyline(pts) {\n if (pts.length < 3) {\n return pts;\n }\n let work = [...pts];\n for (let guard = 0; guard < 32; guard++) {\n const result = simplifyPolylineOnce(work);\n work = result.points;\n if (!result.changed) {\n break;\n }\n }\n return work;\n}\n__name(simplifyPolyline, \"simplifyPolyline\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/endpointClip.ts\nvar EPS2 = 1e-3;\nvar INSIDE_EPS = 0.5;\nvar CORNER_CLEARANCE = 4;\nfunction endpointContextFor(edge, nodeByIdMap, minPoints) {\n const candidate = edge;\n if (candidate.isLayoutOnly || !candidate.points || candidate.points.length < minPoints) {\n return void 0;\n }\n const src = candidate.start ? nodeByIdMap.get(candidate.start) : void 0;\n const dst = candidate.end ? nodeByIdMap.get(candidate.end) : void 0;\n return {\n edge: candidate,\n points: candidate.points,\n srcRect: src ? rectOfNodeBounds(src) : void 0,\n dstRect: dst ? rectOfNodeBounds(dst) : void 0\n };\n}\n__name(endpointContextFor, \"endpointContextFor\");\nfunction segmentEnterPoint(outside, inside, r) {\n if (sameY(outside, inside, EPS2)) {\n const x = outside.x < r.left ? r.left : r.right;\n return { x, y: outside.y };\n }\n if (sameX(outside, inside, EPS2)) {\n const y = outside.y < r.top ? r.top : r.bottom;\n return { x: outside.x, y };\n }\n return {\n x: Math.min(r.right, Math.max(r.left, outside.x)),\n y: Math.min(r.bottom, Math.max(r.top, outside.y))\n };\n}\n__name(segmentEnterPoint, \"segmentEnterPoint\");\nfunction clipEndpoint(points, rect, atStart) {\n const step = atStart ? 1 : -1;\n let outsideIndex = atStart ? 0 : points.length - 1;\n while (outsideIndex >= 0 && outsideIndex < points.length && pointInsideRect(points[outsideIndex], rect, INSIDE_EPS)) {\n outsideIndex += step;\n }\n if (outsideIndex < 0 || outsideIndex >= points.length) {\n return points;\n }\n const insideIndex = outsideIndex - step;\n if (insideIndex < 0 || insideIndex >= points.length) {\n return points;\n }\n const entry = segmentEnterPoint(points[outsideIndex], points[insideIndex], rect);\n return atStart ? [entry, ...points.slice(outsideIndex)] : [...points.slice(0, outsideIndex + 1), entry];\n}\n__name(clipEndpoint, \"clipEndpoint\");\nfunction clipEdgeEndpointsToNodeBoundaries(edges, nodeByIdMap) {\n for (const edge of edges) {\n const context = endpointContextFor(edge, nodeByIdMap, 2);\n if (!context) {\n continue;\n }\n let next = [...context.points];\n if (context.srcRect) {\n next = clipEndpoint(next, context.srcRect, true);\n }\n if (context.dstRect) {\n next = clipEndpoint(next, context.dstRect, false);\n }\n next = simplifyPolyline(orthogonalizePolyline(next));\n next = clearStraightEndpointCornerConnections(next, context.srcRect, context.dstRect);\n context.edge.points = simplifyPolyline(orthogonalizePolyline(next));\n }\n}\n__name(clipEdgeEndpointsToNodeBoundaries, \"clipEdgeEndpointsToNodeBoundaries\");\nfunction snapEndpointToBoundary(inner, endpoint, r, useApproachSide = false) {\n if (sameY(inner, endpoint, EPS2)) {\n if (endpoint.y < r.top - EPS2 || endpoint.y > r.bottom + EPS2) {\n return endpoint;\n }\n if (useApproachSide) {\n if (inner.x < r.left - EPS2) {\n return { x: r.left, y: inner.y };\n }\n if (inner.x > r.right + EPS2) {\n return { x: r.right, y: inner.y };\n }\n }\n const toLeft = Math.abs(endpoint.x - r.left) <= Math.abs(endpoint.x - r.right);\n return { x: toLeft ? r.left : r.right, y: inner.y };\n }\n if (sameX(inner, endpoint, EPS2)) {\n if (endpoint.x < r.left - EPS2 || endpoint.x > r.right + EPS2) {\n return endpoint;\n }\n if (useApproachSide) {\n if (inner.y < r.top - EPS2) {\n return { x: inner.x, y: r.top };\n }\n if (inner.y > r.bottom + EPS2) {\n return { x: inner.x, y: r.bottom };\n }\n }\n const toTop = Math.abs(endpoint.y - r.top) <= Math.abs(endpoint.y - r.bottom);\n return { x: inner.x, y: toTop ? r.top : r.bottom };\n }\n return endpoint;\n}\n__name(snapEndpointToBoundary, \"snapEndpointToBoundary\");\nfunction firstDistinctAdjacent(points, endpointIndex, step) {\n const endpoint = points[endpointIndex];\n for (let index = endpointIndex + step; index >= 0 && index < points.length; index += step) {\n const candidate = points[index];\n if (!samePoint(candidate, endpoint, EPS2)) {\n return candidate;\n }\n }\n return points[endpointIndex + step];\n}\n__name(firstDistinctAdjacent, \"firstDistinctAdjacent\");\nfunction cornerClearanceRange(min, max) {\n const lo = min + CORNER_CLEARANCE;\n const hi = max - CORNER_CLEARANCE;\n return lo <= hi ? { lo, hi } : { lo: (min + max) / 2, hi: (min + max) / 2 };\n}\n__name(cornerClearanceRange, \"cornerClearanceRange\");\nfunction clampToCornerClearance(value, min, max) {\n const { lo, hi } = cornerClearanceRange(min, max);\n return Math.min(hi, Math.max(lo, value));\n}\n__name(clampToCornerClearance, \"clampToCornerClearance\");\nfunction intersectRanges(ranges) {\n const lo = Math.max(...ranges.map((range) => range.lo));\n const hi = Math.min(...ranges.map((range) => range.hi));\n if (lo > hi) {\n return void 0;\n }\n return { lo, hi };\n}\n__name(intersectRanges, \"intersectRanges\");\nfunction clearanceRangeForSide(r, side) {\n return side === \"left\" || side === \"right\" ? cornerClearanceRange(r.top, r.bottom) : cornerClearanceRange(r.left, r.right);\n}\n__name(clearanceRangeForSide, \"clearanceRangeForSide\");\nfunction terminalSideForSegment(endpoint, adjacent, r) {\n const yWithin = endpoint.y >= r.top - EPS2 && endpoint.y <= r.bottom + EPS2;\n const xWithin = endpoint.x >= r.left - EPS2 && endpoint.x <= r.right + EPS2;\n if (sameY(endpoint, adjacent, EPS2) && yWithin) {\n if (Math.abs(endpoint.x - r.left) < EPS2) {\n return \"left\";\n }\n if (Math.abs(endpoint.x - r.right) < EPS2) {\n return \"right\";\n }\n }\n if (sameX(endpoint, adjacent, EPS2) && xWithin) {\n if (Math.abs(endpoint.y - r.top) < EPS2) {\n return \"top\";\n }\n if (Math.abs(endpoint.y - r.bottom) < EPS2) {\n return \"bottom\";\n }\n }\n return void 0;\n}\n__name(terminalSideForSegment, \"terminalSideForSegment\");\nfunction isHorizontalSide(side) {\n return side === \"left\" || side === \"right\";\n}\n__name(isHorizontalSide, \"isHorizontalSide\");\nfunction straightClearanceRange(start, end, srcRect, dstRect, horizontal) {\n const ranges = [];\n const srcSide = srcRect ? terminalSideForSegment(start, end, srcRect) : void 0;\n const dstSide = dstRect ? terminalSideForSegment(end, start, dstRect) : void 0;\n if (srcRect && srcSide && isHorizontalSide(srcSide) === horizontal) {\n ranges.push(clearanceRangeForSide(srcRect, srcSide));\n }\n if (dstRect && dstSide && isHorizontalSide(dstSide) === horizontal) {\n ranges.push(clearanceRangeForSide(dstRect, dstSide));\n }\n return ranges.length > 0 ? intersectRanges(ranges) : void 0;\n}\n__name(straightClearanceRange, \"straightClearanceRange\");\nfunction clearStraightEndpointCornerAxis(start, end, srcRect, dstRect, horizontal) {\n const range = straightClearanceRange(start, end, srcRect, dstRect, horizontal);\n if (!range) {\n return void 0;\n }\n const current = horizontal ? start.y : start.x;\n const next = Math.min(range.hi, Math.max(range.lo, current));\n if (Math.abs(next - current) < EPS2) {\n return void 0;\n }\n return horizontal ? [\n { x: start.x, y: next },\n { x: end.x, y: next }\n ] : [\n { x: next, y: start.y },\n { x: next, y: end.y }\n ];\n}\n__name(clearStraightEndpointCornerAxis, \"clearStraightEndpointCornerAxis\");\nfunction clearStraightEndpointCornerConnections(points, srcRect, dstRect) {\n if (points.length !== 2) {\n return points;\n }\n const [start, end] = points;\n if (sameY(start, end, EPS2)) {\n return clearStraightEndpointCornerAxis(start, end, srcRect, dstRect, true) ?? points;\n }\n if (sameX(start, end, EPS2)) {\n return clearStraightEndpointCornerAxis(start, end, srcRect, dstRect, false) ?? points;\n }\n return points;\n}\n__name(clearStraightEndpointCornerConnections, \"clearStraightEndpointCornerConnections\");\nfunction cornerClearedEndpoint(endpoint, r, side) {\n return isHorizontalSide(side) ? { x: endpoint.x, y: clampToCornerClearance(endpoint.y, r.top, r.bottom) } : { x: clampToCornerClearance(endpoint.x, r.left, r.right), y: endpoint.y };\n}\n__name(cornerClearedEndpoint, \"cornerClearedEndpoint\");\nfunction moveCollinearEndpointRun(points, endpointIndex, step, endpoint, adjusted, horizontalTerminal) {\n const next = points.map((point) => ({ ...point }));\n for (let index = endpointIndex; index >= 0 && index < points.length; index += step) {\n const point = points[index];\n if (horizontalTerminal && !sameY(point, endpoint, EPS2)) {\n break;\n }\n if (!horizontalTerminal && !sameX(point, endpoint, EPS2)) {\n break;\n }\n if (horizontalTerminal) {\n next[index].y = adjusted.y;\n } else {\n next[index].x = adjusted.x;\n }\n }\n return next;\n}\n__name(moveCollinearEndpointRun, \"moveCollinearEndpointRun\");\nfunction clearEndpointCornerConnection(points, r, atStart) {\n if (points.length < 2) {\n return points;\n }\n const endpointIndex = atStart ? 0 : points.length - 1;\n const step = atStart ? 1 : -1;\n const endpoint = points[endpointIndex];\n const adjacent = firstDistinctAdjacent(points, endpointIndex, step);\n if (!adjacent) {\n return points;\n }\n const side = terminalSideForSegment(endpoint, adjacent, r);\n if (!side) {\n return points;\n }\n const horizontalTerminal = isHorizontalSide(side);\n const adjusted = cornerClearedEndpoint(endpoint, r, side);\n if (samePoint(endpoint, adjusted, EPS2)) {\n return points;\n }\n return moveCollinearEndpointRun(\n points,\n endpointIndex,\n step,\n endpoint,\n adjusted,\n horizontalTerminal\n );\n}\n__name(clearEndpointCornerConnection, \"clearEndpointCornerConnection\");\nfunction borderSideForSegment(a, b, r) {\n const xWithin = Math.min(a.x, b.x) >= r.left - EPS2 && Math.max(a.x, b.x) <= r.right + EPS2;\n const yWithin = Math.min(a.y, b.y) >= r.top - EPS2 && Math.max(a.y, b.y) <= r.bottom + EPS2;\n if (Math.abs(a.y - r.top) < EPS2 && Math.abs(b.y - r.top) < EPS2 && xWithin) {\n return \"top\";\n }\n if (Math.abs(a.y - r.bottom) < EPS2 && Math.abs(b.y - r.bottom) < EPS2 && xWithin) {\n return \"bottom\";\n }\n if (Math.abs(a.x - r.left) < EPS2 && Math.abs(b.x - r.left) < EPS2 && yWithin) {\n return \"left\";\n }\n if (Math.abs(a.x - r.right) < EPS2 && Math.abs(b.x - r.right) < EPS2 && yWithin) {\n return \"right\";\n }\n return void 0;\n}\n__name(borderSideForSegment, \"borderSideForSegment\");\nfunction leavesOutward(side, from, to, r) {\n switch (side) {\n case \"top\":\n return sameX(from, to, EPS2) && to.y < r.top - EPS2;\n case \"bottom\":\n return sameX(from, to, EPS2) && to.y > r.bottom + EPS2;\n case \"left\":\n return sameY(from, to, EPS2) && to.x < r.left - EPS2;\n case \"right\":\n return sameY(from, to, EPS2) && to.x > r.right + EPS2;\n }\n}\n__name(leavesOutward, \"leavesOutward\");\nfunction collapseOwnBorderStub(points, r, atStart) {\n if (points.length < 3) {\n return points;\n }\n if (atStart) {\n const side2 = borderSideForSegment(points[0], points[1], r);\n if (side2 && leavesOutward(side2, points[1], points[2], r)) {\n return points.slice(1);\n }\n return points;\n }\n const last = points.length - 1;\n const side = borderSideForSegment(points[last - 1], points[last], r);\n if (side && leavesOutward(side, points[last - 1], points[last - 2], r)) {\n return points.slice(0, last);\n }\n return points;\n}\n__name(collapseOwnBorderStub, \"collapseOwnBorderStub\");\nfunction snapAndCollapseEndpoints(points, srcRect, dstRect) {\n let next = points;\n if (srcRect) {\n const adjacent = firstDistinctAdjacent(next, 0, 1);\n if (adjacent) {\n const snapped = snapEndpointToBoundary(adjacent, next[0], srcRect);\n if (snapped !== next[0]) {\n next = [snapped, ...next.slice(1)];\n }\n }\n next = collapseOwnBorderStub(next, srcRect, true);\n }\n if (dstRect) {\n const last = next.length - 1;\n const adjacent = firstDistinctAdjacent(next, last, -1);\n if (adjacent) {\n const snapped = snapEndpointToBoundary(adjacent, next[last], dstRect, true);\n if (snapped !== next[last]) {\n next = [...next.slice(0, last), snapped];\n }\n }\n next = collapseOwnBorderStub(next, dstRect, false);\n }\n const straightCleared = clearStraightEndpointCornerConnections(next, srcRect, dstRect);\n if (straightCleared !== next || next.length === 2) {\n return straightCleared;\n }\n if (srcRect) {\n next = clearEndpointCornerConnection(next, srcRect, true);\n }\n if (dstRect) {\n next = clearEndpointCornerConnection(next, dstRect, false);\n }\n return next;\n}\n__name(snapAndCollapseEndpoints, \"snapAndCollapseEndpoints\");\nfunction prepareEdgeEndpointsForRenderer(edges, nodeByIdMap) {\n for (const edge of edges) {\n const context = endpointContextFor(edge, nodeByIdMap, 2);\n if (!context) {\n continue;\n }\n const input = dedupeConsecutivePoints(context.points, EPS2);\n const newPts = snapAndCollapseEndpoints(input, context.srcRect, context.dstRect);\n if (newPts.length < 3) {\n context.edge.points = newPts;\n continue;\n }\n const duplicated = [\n newPts[0],\n { ...newPts[0] },\n ...newPts.slice(1, -1),\n newPts[newPts.length - 1],\n { ...newPts[newPts.length - 1] }\n ];\n context.edge.points = duplicated;\n }\n}\n__name(prepareEdgeEndpointsForRenderer, \"prepareEdgeEndpointsForRenderer\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/lrTransform.ts\nfunction buildNodeMap(nodes) {\n return new Map(nodes.map((node) => [node.id, node]));\n}\n__name(buildNodeMap, \"buildNodeMap\");\nfunction resolveTopLevelGroupId(node, nodeById) {\n let parentId = node.parentId;\n let topLevelGroupId = null;\n while (parentId) {\n const parent = nodeById.get(parentId);\n if (!parent?.isGroup) {\n break;\n }\n topLevelGroupId = parent.id;\n parentId = parent.parentId;\n }\n return topLevelGroupId;\n}\n__name(resolveTopLevelGroupId, \"resolveTopLevelGroupId\");\nfunction groupDepth(group, nodeById) {\n let depth = 0;\n let parentId = group.parentId;\n while (parentId) {\n const parent = nodeById.get(parentId);\n if (!parent?.isGroup) {\n break;\n }\n depth++;\n parentId = parent.parentId;\n }\n return depth;\n}\n__name(groupDepth, \"groupDepth\");\nfunction boundsForChildren(children) {\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n for (const child of children) {\n const cx = child.x;\n const cy = child.y;\n if (typeof cx !== \"number\" || typeof cy !== \"number\") {\n continue;\n }\n const w = child.width ?? 0;\n const h = child.height ?? 0;\n minX = Math.min(minX, cx - w / 2);\n maxX = Math.max(maxX, cx + w / 2);\n minY = Math.min(minY, cy - h / 2);\n maxY = Math.max(maxY, cy + h / 2);\n }\n if (minX === Infinity || minY === Infinity) {\n return null;\n }\n return { minX, maxX, minY, maxY };\n}\n__name(boundsForChildren, \"boundsForChildren\");\nfunction applyGroupBounds(group, bounds) {\n const pad = group.padding ?? 20;\n group.x = (bounds.minX + bounds.maxX) / 2;\n group.y = (bounds.minY + bounds.maxY) / 2;\n group.width = Math.max(0, bounds.maxX - bounds.minX) + pad;\n group.height = Math.max(0, bounds.maxY - bounds.minY) + pad;\n}\n__name(applyGroupBounds, \"applyGroupBounds\");\nfunction recomputeNestedGroupBounds(nodes) {\n const nodeById = buildNodeMap(nodes);\n const groupsByDepth = nodes.filter((node) => node.isGroup && node.parentId).sort((a, b) => groupDepth(b, nodeById) - groupDepth(a, nodeById));\n for (const group of groupsByDepth) {\n const children = nodes.filter((node) => node.parentId === group.id);\n const bounds = boundsForChildren(children);\n if (bounds) {\n applyGroupBounds(group, bounds);\n }\n }\n}\n__name(recomputeNestedGroupBounds, \"recomputeNestedGroupBounds\");\nfunction mirrorAxis(layout, axis) {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const contentNodes = nodes.filter((node) => !node.isGroup);\n let min = Infinity;\n let max = -Infinity;\n for (const node of contentNodes) {\n const value = node[axis];\n if (typeof value !== \"number\") {\n continue;\n }\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\n return false;\n }\n const mirror = /* @__PURE__ */ __name((value) => min + max - value, \"mirror\");\n for (const node of nodes) {\n const value = node[axis];\n if (typeof value === \"number\") {\n node[axis] = mirror(value);\n }\n const titleRect = node.groupTitleRect;\n if (titleRect) {\n node.groupTitleRect = axis === \"x\" ? {\n ...titleRect,\n left: mirror(titleRect.right),\n right: mirror(titleRect.left)\n } : {\n ...titleRect,\n top: mirror(titleRect.bottom),\n bottom: mirror(titleRect.top)\n };\n }\n }\n for (const edge of edges) {\n for (const point of edge.points ?? []) {\n point[axis] = mirror(point[axis]);\n }\n }\n return true;\n}\n__name(mirrorAxis, \"mirrorAxis\");\nfunction applyBtDirectionTransform(layout) {\n const nodes = layout.nodes ?? [];\n if (!nodes.some((node) => !node.isGroup)) {\n return true;\n }\n return mirrorAxis(layout, \"y\");\n}\n__name(applyBtDirectionTransform, \"applyBtDirectionTransform\");\nfunction applyLrDirectionTransform(layout, direction = \"LR\") {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const contentNodes = nodes.filter((n) => !n.isGroup);\n let minX = Infinity;\n let minY = Infinity;\n for (const n of contentNodes) {\n const x0 = n.x ?? 0;\n const y0 = n.y ?? 0;\n if (x0 < minX) {\n minX = x0;\n }\n if (y0 < minY) {\n minY = y0;\n }\n }\n if (!Number.isFinite(minX) || !Number.isFinite(minY)) {\n return false;\n }\n const titleBandSize = 36;\n let totalWidth = 0;\n let totalHeight = 0;\n for (const n of contentNodes) {\n totalWidth += n.width ?? 0;\n totalHeight += n.height ?? 0;\n }\n const avgWidth = totalWidth / contentNodes.length;\n const avgHeight = totalHeight / contentNodes.length;\n const horizontalScaleFactor = avgHeight > 0 ? Math.max(1, avgWidth / avgHeight) : 1;\n for (const n of contentNodes) {\n const x0 = n.x ?? 0;\n const y0 = n.y ?? 0;\n const newX = (y0 - minY) * horizontalScaleFactor + titleBandSize;\n const newY = x0 - minX;\n n.x = newX;\n n.y = newY;\n }\n for (const e of edges) {\n if (!e.points) {\n continue;\n }\n for (const p of e.points) {\n const x0 = p.x;\n const y0 = p.y;\n const newX = (y0 - minY) * horizontalScaleFactor + titleBandSize;\n const newY = x0 - minX;\n p.x = newX;\n p.y = newY;\n }\n }\n recomputeNestedGroupBounds(nodes);\n const laneNodes = nodes.filter((n) => n.isGroup && !n.parentId);\n if (laneNodes.length === 0) {\n if (direction === \"RL\") {\n mirrorAxis(layout, \"x\");\n }\n return true;\n }\n const nodeById = buildNodeMap(nodes);\n const childrenByLane = /* @__PURE__ */ new Map();\n for (const n of nodes) {\n if (n.isGroup) {\n continue;\n }\n const laneId = resolveTopLevelGroupId(n, nodeById);\n if (!laneId) {\n continue;\n }\n const bucket = childrenByLane.get(laneId) ?? [];\n bucket.push(n);\n childrenByLane.set(laneId, bucket);\n }\n let maxPad = 0;\n for (const lane of laneNodes) {\n const pad = lane.padding ?? 0;\n if (pad > maxPad) {\n maxPad = pad;\n }\n }\n const laneBounds = [];\n let globalMinXChild = Infinity;\n let globalMaxXChild = -Infinity;\n for (const lane of laneNodes) {\n const children = childrenByLane.get(lane.id) ?? [];\n const bounds = boundsForChildren(children);\n if (!bounds) {\n continue;\n }\n globalMinXChild = Math.min(globalMinXChild, bounds.minX);\n globalMaxXChild = Math.max(globalMaxXChild, bounds.maxX);\n laneBounds.push({\n lane,\n contentTop: bounds.minY,\n contentBottom: bounds.maxY,\n centerY: (bounds.minY + bounds.maxY) / 2\n });\n }\n if (globalMinXChild === Infinity || globalMaxXChild === -Infinity) {\n return true;\n }\n const fullContentWidth = Math.max(0, globalMaxXChild - globalMinXChild);\n const horizontalMargin = Math.max(maxPad, 10);\n const bodyWidth = fullContentWidth + 2 * horizontalMargin;\n const laneWidth = titleBandSize + bodyWidth;\n const bodyCenter = (globalMinXChild + globalMaxXChild) / 2;\n const bodyLeft = bodyCenter - bodyWidth / 2;\n const laneLeft = bodyLeft - titleBandSize;\n const centerX = laneLeft + laneWidth / 2;\n const verticalMargin = Math.max(maxPad, titleBandSize);\n laneBounds.sort((a, b) => a.centerY - b.centerY);\n for (let i = 0; i < laneBounds.length; i++) {\n const curr = laneBounds[i];\n let laneTop;\n let laneBottom;\n if (i === 0) {\n laneTop = curr.contentTop - verticalMargin;\n } else {\n const prev = laneBounds[i - 1];\n laneTop = (prev.contentBottom + curr.contentTop) / 2;\n }\n if (i === laneBounds.length - 1) {\n laneBottom = curr.contentBottom + verticalMargin;\n } else {\n const next = laneBounds[i + 1];\n laneBottom = (curr.contentBottom + next.contentTop) / 2;\n }\n const laneHeight = Math.max(0, laneBottom - laneTop);\n const centerY = (laneTop + laneBottom) / 2;\n curr.lane.x = centerX;\n curr.lane.y = centerY;\n curr.lane.width = laneWidth;\n curr.lane.height = laneHeight;\n curr.lane.swimlaneContentTop = curr.contentTop;\n curr.lane.groupTitleRect = {\n left: laneLeft,\n right: laneLeft + titleBandSize,\n top: laneTop,\n bottom: laneBottom\n };\n }\n if (direction === \"RL\") {\n mirrorAxis(layout, \"x\");\n }\n return true;\n}\n__name(applyLrDirectionTransform, \"applyLrDirectionTransform\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/portSwap.ts\nvar EPS3 = 1e-6;\nvar MIN_PORT_SPACING = 8;\nvar PORT_SHIFT = MIN_PORT_SPACING;\nvar TRY_DELTAS = [0, PORT_SHIFT, -PORT_SHIFT, 2 * PORT_SHIFT, -2 * PORT_SHIFT];\nfunction portSwapToLShape(edges, nodes) {\n const { nodeInfoById, realNodeRects } = collectRealNodeBounds(nodes);\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 4) {\n continue;\n }\n const route = classifyThreeSegmentRoute(dedupeConsecutivePoints(pts, EPS3), EPS3);\n if (!route) {\n continue;\n }\n const { p3 } = route;\n const isHVH = route.kind === \"HVH\";\n const nodePair = getNodePairGeometry(edge, nodeInfoById, EPS3);\n if (!nodePair) {\n continue;\n }\n const { srcId, dstId, srcInfo, dstInfo, collinearX, collinearY } = nodePair;\n if (collinearX || collinearY) {\n continue;\n }\n let newPts;\n const srcRect = srcInfo.rect;\n for (const delta of TRY_DELTAS) {\n let np0;\n let np1;\n let np2;\n if (isHVH) {\n const dstBelow = dstInfo.cy > srcInfo.cy;\n const newSrcY = dstBelow ? srcRect.bottom : srcRect.top;\n const newSrcX = srcInfo.cx + delta;\n if (newSrcX <= srcRect.left + EPS3 || newSrcX >= srcRect.right - EPS3) {\n continue;\n }\n np0 = { x: newSrcX, y: newSrcY };\n np1 = { x: newSrcX, y: p3.y };\n np2 = { x: p3.x, y: p3.y };\n } else {\n const dstEast = dstInfo.cx > srcInfo.cx;\n const newSrcX = dstEast ? srcRect.right : srcRect.left;\n const newSrcY = srcInfo.cy + delta;\n if (newSrcY <= srcRect.top + EPS3 || newSrcY >= srcRect.bottom - EPS3) {\n continue;\n }\n np0 = { x: newSrcX, y: newSrcY };\n np1 = { x: p3.x, y: newSrcY };\n np2 = { x: p3.x, y: p3.y };\n }\n const firstSegDegenerate = samePoint(np0, np1, EPS3);\n const secondSegDegenerate = samePoint(np1, np2, EPS3);\n if (firstSegDegenerate && secondSegDegenerate) {\n continue;\n }\n if (!firstSegDegenerate && segmentHitsAnyRect(np0, np1, realNodeRects, [srcId], 1)) {\n continue;\n }\n if (!secondSegDegenerate && segmentHitsAnyRect(np1, np2, realNodeRects, [dstId], 1)) {\n continue;\n }\n const firstSegConflicts = !firstSegDegenerate && segmentConflictsWithAnyEdge(np0, np1, edges, edge, {\n epsilon: EPS3,\n skipDegenerateOther: true\n });\n const secondSegConflicts = !secondSegDegenerate && segmentConflictsWithAnyEdge(np1, np2, edges, edge, {\n epsilon: EPS3,\n skipDegenerateOther: true\n });\n if (firstSegConflicts || secondSegConflicts) {\n continue;\n }\n if (firstSegDegenerate) {\n newPts = [np1, np2];\n } else if (secondSegDegenerate) {\n newPts = [np0, np1];\n } else {\n newPts = [np0, np1, np2];\n }\n break;\n }\n if (newPts) {\n edge.points = newPts;\n }\n }\n}\n__name(portSwapToLShape, \"portSwapToLShape\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/terminalStub.ts\nfunction collapseShortTerminalStub(edges, nodeByIdMap) {\n const MIN_STUB = 10;\n const EPS_LOCAL2 = 1e-3;\n const BUFFER = 2;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const rawPts = edge.points;\n if (!rawPts || rawPts.length < 4) {\n continue;\n }\n const pts = dedupeConsecutivePoints(rawPts, EPS_LOCAL2);\n if (pts.length < 4) {\n continue;\n }\n const nLast = pts.length - 1;\n const endPt = pts[nLast];\n const penultPt = pts[nLast - 1];\n const prevPt = pts[nLast - 2];\n const lastDx = endPt.x - penultPt.x;\n const lastDy = endPt.y - penultPt.y;\n const lastLen = Math.hypot(lastDx, lastDy);\n if (lastLen >= MIN_STUB || lastLen < EPS_LOCAL2) {\n continue;\n }\n const penultDx = penultPt.x - prevPt.x;\n const penultDy = penultPt.y - prevPt.y;\n const penultLen = Math.hypot(penultDx, penultDy);\n if (penultLen < EPS_LOCAL2) {\n continue;\n }\n const lastIsHoriz = isHorizontalSegment(penultPt, endPt, EPS_LOCAL2);\n const lastIsVert = isVerticalSegment(penultPt, endPt, EPS_LOCAL2);\n const penultIsHoriz = isHorizontalSegment(prevPt, penultPt, EPS_LOCAL2);\n const penultIsVert = isVerticalSegment(prevPt, penultPt, EPS_LOCAL2);\n if (!(lastIsHoriz && penultIsVert || lastIsVert && penultIsHoriz)) {\n continue;\n }\n const dstId = edge.end;\n const srcId = edge.start;\n const dst = dstId ? nodeByIdMap.get(dstId) : void 0;\n if (!dst) {\n continue;\n }\n const dstCx = dst.x ?? 0;\n const dstCy = dst.y ?? 0;\n const dstRect = rectOfNodeBounds(dst);\n if (!dstRect) {\n continue;\n }\n let newPrev;\n let newEnd;\n if (penultIsVert) {\n const approachFromBelow = penultDy < 0;\n newPrev = { x: dstCx, y: prevPt.y };\n newEnd = { x: dstCx, y: approachFromBelow ? dstRect.bottom : dstRect.top };\n } else {\n const approachFromLeft = penultDx > 0;\n newPrev = { x: prevPt.x, y: dstCy };\n newEnd = { x: approachFromLeft ? dstRect.right : dstRect.left, y: dstCy };\n }\n if (segmentHitsAnyRect(newPrev, newEnd, realNodeRects, dstId ? [dstId] : [], -BUFFER)) {\n continue;\n }\n if (segmentHitsAnyRect(newPrev, newEnd, labelRects, [], -BUFFER)) {\n continue;\n }\n if (srcId) {\n const src = nodeByIdMap.get(srcId);\n const srcRect = src ? rectOfNodeBounds(src) : void 0;\n if (srcRect && pointInsideRect(newPrev, srcRect, BUFFER)) {\n continue;\n }\n }\n const ownSegmentKey = /* @__PURE__ */ __name((a, b) => `${a.x.toFixed(3)},${a.y.toFixed(3)}|${b.x.toFixed(3)},${b.y.toFixed(3)}`, \"ownSegmentKey\");\n const selfSegments = /* @__PURE__ */ new Set();\n for (let i = 0; i < pts.length - 1; i++) {\n selfSegments.add(ownSegmentKey(pts[i], pts[i + 1]));\n }\n const segmentCrossesOtherEdge = /* @__PURE__ */ __name((from, to) => {\n for (const other of edges) {\n if (other === edge) {\n continue;\n }\n if (other.isLayoutOnly) {\n continue;\n }\n const oPts = other.points;\n if (!oPts || oPts.length < 2) {\n continue;\n }\n for (let i = 0; i < oPts.length - 1; i++) {\n const a = oPts[i];\n const b = oPts[i + 1];\n if (selfSegments.has(ownSegmentKey(a, b))) {\n continue;\n }\n if (orthogonalSegmentsStrictlyCross(from, to, a, b, EPS_LOCAL2)) {\n return true;\n }\n }\n }\n return false;\n }, \"segmentCrossesOtherEdge\");\n if (segmentCrossesOtherEdge(newPrev, newEnd)) {\n continue;\n }\n if (nLast - 3 >= 0) {\n const beforePrev = pts[nLast - 3];\n const endpointIds = [srcId, dstId].filter((id) => Boolean(id));\n if (segmentHitsAnyRect(beforePrev, newPrev, realNodeRects, endpointIds, -BUFFER)) {\n continue;\n }\n if (segmentCrossesOtherEdge(beforePrev, newPrev)) {\n continue;\n }\n }\n const head = pts.slice(0, nLast - 2);\n const newPts = [...head, newPrev, newEnd];\n edge.points = newPts;\n const labelId = edge.labelNodeId;\n if (labelId) {\n const labelNode = nodeByIdMap.get(labelId);\n if (labelNode) {\n const lw = labelNode.width ?? 0;\n const lh = labelNode.height ?? 0;\n if (lw > 0 && lh > 0) {\n let bestMidX;\n let bestMidY;\n let bestLen = -1;\n for (let i = 0; i < newPts.length - 1; i++) {\n const a = newPts[i];\n const b = newPts[i + 1];\n const segLen = Math.hypot(b.x - a.x, b.y - a.y);\n const isHoriz = sameY(a, b, EPS_LOCAL2);\n const isVert = sameX(a, b, EPS_LOCAL2);\n const fits = isHoriz && segLen >= lw + 2 || isVert && segLen >= lh + 2;\n if (!fits) {\n continue;\n }\n if (segLen > bestLen) {\n bestLen = segLen;\n bestMidX = (a.x + b.x) / 2;\n bestMidY = (a.y + b.y) / 2;\n }\n }\n if (bestMidX !== void 0 && bestMidY !== void 0) {\n labelNode.x = bestMidX;\n labelNode.y = bestMidY;\n }\n }\n }\n }\n }\n}\n__name(collapseShortTerminalStub, \"collapseShortTerminalStub\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/materializedGeometry.ts\nvar EPS_LOCAL = 1e-3;\nvar MIN_SHARED = 8;\nvar segmentsFor = orthogonalSegmentsForPoints;\nvar orthogonallyAligned = /* @__PURE__ */ __name((a, b) => sameX(a, b, EPS_LOCAL) || sameY(a, b, EPS_LOCAL), \"orthogonallyAligned\");\nfunction separateSharedRenderedTerminalLanes(edges, nodeByIdMap) {\n const MIN_FACE_CLEARANCE = 16;\n const TRACK_SHIFT = 7;\n const rectIntersect = /* @__PURE__ */ __name((node, point) => {\n const x = node.x ?? 0;\n const y = node.y ?? 0;\n const dx = point.x - x;\n const dy = point.y - y;\n let w = (node.width ?? 0) / 2;\n let h = (node.height ?? 0) / 2;\n if (Math.abs(dy) * w > Math.abs(dx) * h) {\n if (dy < 0) {\n h = -h;\n }\n return { x: x + (dy === 0 ? 0 : h * dx / dy), y: y + h };\n }\n if (dx < 0) {\n w = -w;\n }\n return { x: x + w, y: y + (dx === 0 ? 0 : w * dy / dx) };\n }, \"rectIntersect\");\n const terminalLaneFor = /* @__PURE__ */ __name((edge, atStart) => {\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length < 2) {\n return void 0;\n }\n const nodeId = atStart ? edge.start : edge.end;\n const node = nodeId ? nodeByIdMap.get(nodeId) : void 0;\n const rect = node ? rectOfNodeBounds(node) : void 0;\n if (!node || !nodeId || !rect) {\n return void 0;\n }\n const endpoint = atStart ? points[0] : points[points.length - 1];\n const adjacent = atStart ? points[1] : points[points.length - 2];\n const boundary = rectIntersect(node, endpoint);\n let railEnd = endpoint;\n if (orthogonallyAligned(adjacent, boundary)) {\n railEnd = adjacent;\n }\n if (sameX(boundary, railEnd, EPS_LOCAL)) {\n return {\n edge,\n edgeId: String(edge.id ?? \"\"),\n nodeId,\n atStart,\n orientation: \"V\",\n coord: boundary.x,\n min: Math.min(boundary.y, railEnd.y),\n max: Math.max(boundary.y, railEnd.y),\n boundary,\n railEnd,\n rect\n };\n }\n if (sameY(boundary, railEnd, EPS_LOCAL)) {\n return {\n edge,\n edgeId: String(edge.id ?? \"\"),\n nodeId,\n atStart,\n orientation: \"H\",\n coord: boundary.y,\n min: Math.min(boundary.x, railEnd.x),\n max: Math.max(boundary.x, railEnd.x),\n boundary,\n railEnd,\n rect\n };\n }\n return void 0;\n }, \"terminalLaneFor\");\n const projectedOverlapLength = /* @__PURE__ */ __name((a, b) => Math.max(0, Math.min(a.max, b.max) - Math.max(a.min, b.min)), \"projectedOverlapLength\");\n const sameTerminalFace = /* @__PURE__ */ __name((a, b) => {\n if (a.nodeId !== b.nodeId || a.orientation !== b.orientation) {\n return false;\n }\n if (a.orientation === \"H\") {\n const aOnHorizontalFace = Math.abs(a.boundary.x - a.rect.left) < 1 || Math.abs(a.boundary.x - a.rect.right) < 1;\n return aOnHorizontalFace && sameX(a.boundary, b.boundary, 1);\n }\n const aOnVerticalFace = Math.abs(a.boundary.y - a.rect.top) < 1 || Math.abs(a.boundary.y - a.rect.bottom) < 1;\n return aOnVerticalFace && sameY(a.boundary, b.boundary, 1);\n }, \"sameTerminalFace\");\n const exactTerminalLaneConflict = /* @__PURE__ */ __name((a, b) => {\n if (a.nodeId !== b.nodeId || a.orientation !== b.orientation) {\n return false;\n }\n const shared = projectedOverlapLength(a, b);\n return shared >= MIN_SHARED && Math.abs(a.coord - b.coord) < 0.5;\n }, \"exactTerminalLaneConflict\");\n const nearTerminalLaneConflict = /* @__PURE__ */ __name((a, b) => {\n if (a.nodeId !== b.nodeId || a.orientation !== b.orientation || a.orientation !== \"H\" || a.atStart === b.atStart) {\n return false;\n }\n const shared = projectedOverlapLength(a, b);\n if (shared < MIN_SHARED) {\n return false;\n }\n const faceSpan = a.rect.bottom - a.rect.top;\n if (shared < faceSpan || shared > 2 * faceSpan) {\n return false;\n }\n return sameTerminalFace(a, b) && Math.abs(a.coord - b.coord) < MIN_FACE_CLEARANCE;\n }, \"nearTerminalLaneConflict\");\n const shiftedCandidate = /* @__PURE__ */ __name((lane, shift) => {\n const points = dedupeConsecutivePoints(lane.edge.points ?? []);\n if (points.length < 2) {\n return void 0;\n }\n const shiftedBoundary = lane.orientation === \"V\" ? { x: lane.boundary.x + shift, y: lane.boundary.y } : { x: lane.boundary.x, y: lane.boundary.y + shift };\n const shiftedRailEnd = lane.orientation === \"V\" ? { x: lane.railEnd.x + shift, y: lane.railEnd.y } : { x: lane.railEnd.x, y: lane.railEnd.y + shift };\n const boundaryStaysOnSameFace = /* @__PURE__ */ __name(() => {\n if (Math.abs(lane.boundary.y - lane.rect.top) < 1 || Math.abs(lane.boundary.y - lane.rect.bottom) < 1) {\n return sameY(shiftedBoundary, lane.boundary, EPS_LOCAL) && shiftedBoundary.x >= lane.rect.left + 1 && shiftedBoundary.x <= lane.rect.right - 1;\n }\n if (Math.abs(lane.boundary.x - lane.rect.left) < 1 || Math.abs(lane.boundary.x - lane.rect.right) < 1) {\n return sameX(shiftedBoundary, lane.boundary, EPS_LOCAL) && shiftedBoundary.y >= lane.rect.top + 1 && shiftedBoundary.y <= lane.rect.bottom - 1;\n }\n return false;\n }, \"boundaryStaysOnSameFace\");\n if (!boundaryStaysOnSameFace()) {\n return void 0;\n }\n if (lane.atStart) {\n const railEndIsAdjacent2 = points.length > 1 && samePoint(points[1], lane.railEnd, EPS_LOCAL);\n const rest = points.slice(railEndIsAdjacent2 ? 2 : 1);\n const next = rest[0];\n if (next && !orthogonallyAligned(next, shiftedRailEnd)) {\n return void 0;\n }\n return [shiftedBoundary, shiftedRailEnd, ...rest];\n }\n const railEndIsAdjacent = points.length > 1 && samePoint(points[points.length - 2], lane.railEnd, EPS_LOCAL);\n const before = points.slice(0, railEndIsAdjacent ? -2 : -1);\n const previous = before[before.length - 1];\n if (previous && !orthogonallyAligned(previous, shiftedRailEnd)) {\n return void 0;\n }\n return [...before, shiftedRailEnd, shiftedBoundary];\n }, \"shiftedCandidate\");\n const laneIsStraightCollinearConnector = /* @__PURE__ */ __name((lane) => {\n const edge = lane.edge;\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length !== 2) {\n return false;\n }\n const startId = edge.start;\n const endId = edge.end;\n const start = startId ? nodeByIdMap.get(startId) : void 0;\n const end = endId ? nodeByIdMap.get(endId) : void 0;\n if (!start || !end) {\n return false;\n }\n const startX = start.x ?? 0;\n const startY = start.y ?? 0;\n const endX = end.x ?? 0;\n const endY = end.y ?? 0;\n const [a, b] = points;\n return sameY(a, b, EPS_LOCAL) && Math.abs(startY - endY) < 1 && Math.abs(startX - endX) > 1 || sameX(a, b, EPS_LOCAL) && Math.abs(startX - endX) < 1 && Math.abs(startY - endY) > 1;\n }, \"laneIsStraightCollinearConnector\");\n const shifts = [\n -TRACK_SHIFT,\n TRACK_SHIFT,\n -2 * TRACK_SHIFT,\n 2 * TRACK_SHIFT,\n -3 * TRACK_SHIFT,\n 3 * TRACK_SHIFT\n ];\n for (let iteration = 0; iteration < 8; iteration++) {\n const lanes = edges.filter((edge) => !edge.isLayoutOnly).flatMap((edge) => [terminalLaneFor(edge, true), terminalLaneFor(edge, false)]).filter((lane) => Boolean(lane));\n let fixed = false;\n for (let i = 0; i < lanes.length && !fixed; i++) {\n for (let j = i + 1; j < lanes.length && !fixed; j++) {\n const first = lanes[i];\n const second = lanes[j];\n if (first.edge === second.edge || !(exactTerminalLaneConflict(first, second) || nearTerminalLaneConflict(first, second))) {\n continue;\n }\n const fixingNearConflict = !exactTerminalLaneConflict(first, second);\n const candidates = [first, second].sort((a, b) => {\n const aPreservesStraight = laneIsStraightCollinearConnector(a);\n const bPreservesStraight = laneIsStraightCollinearConnector(b);\n if (aPreservesStraight !== bPreservesStraight) {\n return Number(aPreservesStraight) - Number(bPreservesStraight);\n }\n return Number(!b.atStart) - Number(!a.atStart);\n });\n for (const lane of candidates) {\n for (const shift of shifts) {\n const candidate = shiftedCandidate(lane, shift);\n if (!candidate) {\n continue;\n }\n const nextLane = terminalLaneFor({ ...lane.edge, points: candidate }, lane.atStart);\n if (!nextLane || lanes.some(\n (other) => other.edge !== lane.edge && (exactTerminalLaneConflict(nextLane, other) || fixingNearConflict && nearTerminalLaneConflict(nextLane, other))\n )) {\n continue;\n }\n lane.edge.points = candidate;\n fixed = true;\n break;\n }\n if (fixed) {\n break;\n }\n }\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(separateSharedRenderedTerminalLanes, \"separateSharedRenderedTerminalLanes\");\nfunction collapseRedundantRectangularDoglegs(edges, nodeByIdMap) {\n const BUFFER = 2;\n const MAX_ITERATIONS = 8;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate) => {\n const sourceId = edge.start;\n const targetId = edge.end;\n const candidateSegments = segmentsFor(candidate);\n if (candidateSegments.length !== candidate.length - 1) {\n return false;\n }\n const endpointIds = [sourceId, targetId].filter((id) => Boolean(id));\n for (const segment of candidateSegments) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n }\n for (const other of edges) {\n if (other === edge || other.isLayoutOnly) {\n continue;\n }\n const otherPoints = other.points;\n if (!otherPoints || otherPoints.length < 2) {\n continue;\n }\n for (const candidateSegment of candidateSegments) {\n for (const otherSegment of segmentsFor(dedupeConsecutivePoints(otherPoints))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n if (orthogonalSegmentsStrictlyCross(\n candidateSegment.a,\n candidateSegment.b,\n otherSegment.a,\n otherSegment.b,\n EPS_LOCAL\n )) {\n return false;\n }\n }\n }\n }\n return true;\n }, \"candidateIsSafe\");\n const withoutDogleg = /* @__PURE__ */ __name((points, i) => {\n if (i + 4 >= points.length) {\n return void 0;\n }\n const p0 = points[i];\n const p1 = points[i + 1];\n const p2 = points[i + 2];\n const p3 = points[i + 3];\n const p4 = points[i + 4];\n const terminalVerticalDogleg = isHorizontalSegment(p0, p1) && isVerticalSegment(p1, p2) && isHorizontalSegment(p2, p3) && isVerticalSegment(p3, p4) && sameX(p0, p3, EPS_LOCAL) && sameX(p0, p4, EPS_LOCAL) && sameX(p1, p2, EPS_LOCAL) && (p1.x - p0.x) * (p3.x - p2.x) < 0;\n const terminalHorizontalDogleg = isVerticalSegment(p0, p1) && isHorizontalSegment(p1, p2) && isVerticalSegment(p2, p3) && isHorizontalSegment(p3, p4) && sameY(p0, p3, EPS_LOCAL) && sameY(p0, p4, EPS_LOCAL) && sameY(p1, p2, EPS_LOCAL) && (p1.y - p0.y) * (p3.y - p2.y) < 0;\n if (terminalVerticalDogleg || terminalHorizontalDogleg) {\n return dedupeConsecutivePoints([...points.slice(0, i + 1), p4, ...points.slice(i + 5)]);\n }\n if (i + 5 >= points.length) {\n return void 0;\n }\n const p5 = points[i + 5];\n const verticalDogleg = isVerticalSegment(p0, p1) && isHorizontalSegment(p1, p2) && isVerticalSegment(p2, p3) && isHorizontalSegment(p3, p4) && isVerticalSegment(p4, p5) && sameX(p0, p4, EPS_LOCAL) && sameX(p0, p5, EPS_LOCAL) && sameX(p2, p3, EPS_LOCAL) && (p2.x - p1.x) * (p4.x - p3.x) < 0;\n const horizontalDogleg = isHorizontalSegment(p0, p1) && isVerticalSegment(p1, p2) && isHorizontalSegment(p2, p3) && isVerticalSegment(p3, p4) && isHorizontalSegment(p4, p5) && sameY(p0, p4, EPS_LOCAL) && sameY(p0, p5, EPS_LOCAL) && sameY(p2, p3, EPS_LOCAL) && (p2.y - p1.y) * (p4.y - p3.y) < 0;\n if (!verticalDogleg && !horizontalDogleg) {\n return void 0;\n }\n return dedupeConsecutivePoints([...points.slice(0, i + 1), p5, ...points.slice(i + 6)]);\n }, \"withoutDogleg\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n let fixed = false;\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n for (let i = 0; i <= points.length - 5; i++) {\n const candidate = withoutDogleg(points, i);\n if (!candidate || !candidateIsSafe(edge, candidate)) {\n continue;\n }\n edge.points = candidate;\n fixed = true;\n break;\n }\n if (fixed) {\n break;\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(collapseRedundantRectangularDoglegs, \"collapseRedundantRectangularDoglegs\");\nfunction liftObstacleHuggingSameSideRails(edges, nodeByIdMap) {\n const BUFFER = 2;\n const CLEARANCE = 20;\n const MAX_ITERATIONS = 8;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const pointsFor = /* @__PURE__ */ __name((edge, replacementEdge, replacement) => dedupeConsecutivePoints(\n edge === replacementEdge ? replacement ?? [] : edge.points ?? []\n ), \"pointsFor\");\n const strictCrossingCount = /* @__PURE__ */ __name((replacementEdge, replacement) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(pointsFor(visibleEdges[i], replacementEdge, replacement));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(\n pointsFor(visibleEdges[j], replacementEdge, replacement)\n );\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"strictCrossingCount\");\n const middleRail = /* @__PURE__ */ __name((points) => {\n const segments = segmentsFor(points);\n if (segments.length !== 3) {\n return void 0;\n }\n const middle = segments[1];\n if (segments[0].horizontal === middle.horizontal || segments[2].horizontal === middle.horizontal) {\n return void 0;\n }\n return {\n index: middle.index,\n horizontal: middle.horizontal,\n vertical: middle.vertical,\n segment: middle\n };\n }, \"middleRail\");\n const blockingRectsFor = /* @__PURE__ */ __name((edge, rail) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n return realNodeRects.filter((entry) => {\n if (endpointIds.includes(entry.id)) {\n return false;\n }\n const rect = entry.rect;\n if (rail.horizontal) {\n const xOverlap = overlapLength(rail.a.x, rail.b.x, rect.left, rect.right);\n return xOverlap >= MIN_SHARED && rail.a.y >= rect.top - BUFFER && rail.a.y <= rect.bottom + BUFFER;\n }\n const yOverlap = overlapLength(rail.a.y, rail.b.y, rect.top, rect.bottom);\n return yOverlap >= MIN_SHARED && rail.a.x >= rect.left - BUFFER && rail.a.x <= rect.right + BUFFER;\n });\n }, \"blockingRectsFor\");\n const candidateByMovingRail = /* @__PURE__ */ __name((points, rail, coord) => {\n const candidate = points.map((point) => ({ ...point }));\n if (rail.horizontal) {\n candidate[rail.index].y = coord;\n candidate[rail.index + 1].y = coord;\n } else if (rail.vertical) {\n candidate[rail.index].x = coord;\n candidate[rail.index + 1].x = coord;\n } else {\n return void 0;\n }\n const simplified = simplifyPolyline(dedupeConsecutivePoints(candidate));\n return segmentsFor(simplified).length === simplified.length - 1 ? simplified : void 0;\n }, \"candidateByMovingRail\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate, currentCrossings) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n const candidateSegments = segmentsFor(candidate);\n if (candidateSegments.length !== candidate.length - 1) {\n return false;\n }\n for (const segment of candidateSegments) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n }\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of candidateSegments) {\n for (const otherSegment of segmentsFor(pointsFor(other))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n }\n }\n }\n return strictCrossingCount(edge, candidate) <= currentCrossings;\n }, \"candidateIsSafe\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = strictCrossingCount();\n let fixed = false;\n for (const edge of visibleEdges) {\n const points = pointsFor(edge);\n const rail = middleRail(points);\n if (!rail) {\n continue;\n }\n const blockers = blockingRectsFor(edge, rail.segment);\n if (blockers.length === 0) {\n continue;\n }\n const coords = rail.horizontal ? [\n Math.min(...blockers.map((entry) => entry.rect.top)) - CLEARANCE,\n Math.max(...blockers.map((entry) => entry.rect.bottom)) + CLEARANCE\n ] : [\n Math.min(...blockers.map((entry) => entry.rect.left)) - CLEARANCE,\n Math.max(...blockers.map((entry) => entry.rect.right)) + CLEARANCE\n ];\n for (const coord of coords) {\n const candidate = candidateByMovingRail(points, rail.segment, coord);\n if (!candidate || !candidateIsSafe(edge, candidate, currentCrossings)) {\n continue;\n }\n edge.points = candidate;\n fixed = true;\n break;\n }\n if (fixed) {\n break;\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(liftObstacleHuggingSameSideRails, \"liftObstacleHuggingSameSideRails\");\nfunction liftTopLaneTitleBandsAboveRails(edges, nodeByIdMap) {\n const CLEARANCE = 4;\n const validTitleRect = /* @__PURE__ */ __name((node) => {\n const rect = node.groupTitleRect;\n if (!rect || typeof rect.left !== \"number\" || typeof rect.right !== \"number\" || typeof rect.top !== \"number\" || typeof rect.bottom !== \"number\" || !Number.isFinite(rect.left) || !Number.isFinite(rect.right) || !Number.isFinite(rect.top) || !Number.isFinite(rect.bottom) || rect.right <= rect.left || rect.bottom <= rect.top) {\n return void 0;\n }\n return { left: rect.left, right: rect.right, top: rect.top, bottom: rect.bottom };\n }, \"validTitleRect\");\n const topLaneTitleFor = /* @__PURE__ */ __name((node) => {\n if (!node.isGroup || node.parentId) {\n return void 0;\n }\n const rawDirection = node.direction;\n const direction = typeof rawDirection === \"string\" ? rawDirection.toUpperCase() : \"\";\n if (direction === \"LR\" || direction === \"RL\" || direction === \"BT\") {\n return void 0;\n }\n const rect = validTitleRect(node);\n const y = node.y;\n const height = node.height;\n if (!rect || typeof y !== \"number\" || typeof height !== \"number\" || !Number.isFinite(y) || !Number.isFinite(height) || height <= 0) {\n return void 0;\n }\n const titleWidth = rect.right - rect.left;\n const titleHeight = rect.bottom - rect.top;\n if (titleHeight <= 0 || titleWidth < titleHeight) {\n return void 0;\n }\n return { node, rect };\n }, \"topLaneTitleFor\");\n const horizontalSegmentIntersectsTitle = /* @__PURE__ */ __name((segment, rect) => {\n if (!segment.horizontal) {\n return false;\n }\n const y = segment.a.y;\n if (y <= rect.top + EPS_LOCAL || y >= rect.bottom - EPS_LOCAL) {\n return false;\n }\n return overlapLength(segment.a.x, segment.b.x, rect.left, rect.right) >= MIN_SHARED;\n }, \"horizontalSegmentIntersectsTitle\");\n const lanes = [...nodeByIdMap.values()].map(topLaneTitleFor).filter((lane) => Boolean(lane));\n if (lanes.length === 0) {\n return;\n }\n let topDelta = 0;\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n for (const segment of segmentsFor(points)) {\n for (const lane of lanes) {\n if (!horizontalSegmentIntersectsTitle(segment, lane.rect)) {\n continue;\n }\n topDelta = Math.max(topDelta, lane.rect.bottom - segment.a.y + CLEARANCE);\n }\n }\n }\n if (topDelta <= EPS_LOCAL) {\n return;\n }\n for (const lane of lanes) {\n const y = lane.node.y;\n const height = lane.node.height;\n if (typeof y !== \"number\" || typeof height !== \"number\" || !Number.isFinite(y) || !Number.isFinite(height) || height <= 0) {\n continue;\n }\n lane.node.y = y - topDelta / 2;\n lane.node.height = height + topDelta;\n lane.node.groupTitleRect = {\n ...lane.rect,\n top: lane.rect.top - topDelta,\n bottom: lane.rect.bottom - topDelta\n };\n }\n}\n__name(liftTopLaneTitleBandsAboveRails, \"liftTopLaneTitleBandsAboveRails\");\nfunction shiftLeftLaneTitleBandsLeftOfRails(edges, nodeByIdMap) {\n const CLEARANCE = 4;\n const validTitleRect = /* @__PURE__ */ __name((node) => {\n const rect = node.groupTitleRect;\n if (!rect || typeof rect.left !== \"number\" || typeof rect.right !== \"number\" || typeof rect.top !== \"number\" || typeof rect.bottom !== \"number\" || !Number.isFinite(rect.left) || !Number.isFinite(rect.right) || !Number.isFinite(rect.top) || !Number.isFinite(rect.bottom) || rect.right <= rect.left || rect.bottom <= rect.top) {\n return void 0;\n }\n return { left: rect.left, right: rect.right, top: rect.top, bottom: rect.bottom };\n }, \"validTitleRect\");\n const leftLaneTitleFor = /* @__PURE__ */ __name((node) => {\n if (!node.isGroup || node.parentId) {\n return void 0;\n }\n const rawDirection = node.direction;\n if (rawDirection !== \"LR\") {\n return void 0;\n }\n const rect = validTitleRect(node);\n const x = node.x;\n const width = node.width;\n if (!rect || typeof x !== \"number\" || typeof width !== \"number\" || !Number.isFinite(x) || !Number.isFinite(width) || width <= 0) {\n return void 0;\n }\n const titleWidth = rect.right - rect.left;\n const titleHeight = rect.bottom - rect.top;\n if (titleWidth <= 0 || titleHeight < titleWidth) {\n return void 0;\n }\n return { node, rect };\n }, \"leftLaneTitleFor\");\n const verticalSegmentIntersectsTitle = /* @__PURE__ */ __name((segment, rect) => {\n if (!segment.vertical) {\n return false;\n }\n const x = segment.a.x;\n if (x <= rect.left + EPS_LOCAL || x >= rect.right - EPS_LOCAL) {\n return false;\n }\n return overlapLength(segment.a.y, segment.b.y, rect.top, rect.bottom) >= MIN_SHARED;\n }, \"verticalSegmentIntersectsTitle\");\n const horizontalSegmentIntersectsTitle = /* @__PURE__ */ __name((segment, rect) => {\n if (!segment.horizontal) {\n return false;\n }\n const y = segment.a.y;\n if (y <= rect.top + EPS_LOCAL || y >= rect.bottom - EPS_LOCAL) {\n return false;\n }\n return overlapLength(segment.a.x, segment.b.x, rect.left, rect.right) >= MIN_SHARED;\n }, \"horizontalSegmentIntersectsTitle\");\n const lanes = [...nodeByIdMap.values()].map(leftLaneTitleFor).filter((lane) => Boolean(lane));\n if (lanes.length === 0) {\n return;\n }\n let leftDelta = 0;\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n for (const segment of segmentsFor(points)) {\n for (const lane of lanes) {\n if (verticalSegmentIntersectsTitle(segment, lane.rect)) {\n leftDelta = Math.max(leftDelta, lane.rect.right - segment.a.x + CLEARANCE);\n } else if (horizontalSegmentIntersectsTitle(segment, lane.rect)) {\n const segmentLeft = Math.min(segment.a.x, segment.b.x);\n leftDelta = Math.max(leftDelta, lane.rect.right - segmentLeft + CLEARANCE);\n }\n }\n }\n }\n if (leftDelta <= EPS_LOCAL) {\n return;\n }\n for (const lane of lanes) {\n const x = lane.node.x;\n const width = lane.node.width;\n if (typeof x !== \"number\" || typeof width !== \"number\" || !Number.isFinite(x) || !Number.isFinite(width) || width <= 0) {\n continue;\n }\n lane.node.x = x - leftDelta / 2;\n lane.node.width = width + leftDelta;\n lane.node.groupTitleRect = {\n ...lane.rect,\n left: lane.rect.left - leftDelta,\n right: lane.rect.right - leftDelta\n };\n }\n}\n__name(shiftLeftLaneTitleBandsLeftOfRails, \"shiftLeftLaneTitleBandsLeftOfRails\");\nfunction swapDestinationTerminalTailsToReduceCrossings(edges, nodeByIdMap) {\n const BUFFER = 2;\n const MAX_ITERATIONS = 4;\n const { realNodeRects } = collectNodeRectEntries(nodeByIdMap.values());\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const replacementPointsFor = /* @__PURE__ */ __name((edge, replacements = /* @__PURE__ */ new Map()) => dedupeConsecutivePoints(\n replacements.get(edge) ?? edge.points ?? []\n ), \"replacementPointsFor\");\n const crossingCount = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(replacementPointsFor(visibleEdges[i], replacements));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(replacementPointsFor(visibleEdges[j], replacements));\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"crossingCount\");\n const totalBends = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + countOrthogonalBends(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalBends\");\n const terminalTailFor = /* @__PURE__ */ __name((edge) => {\n const points = replacementPointsFor(edge);\n if (points.length < 4) {\n return void 0;\n }\n const tailStart = points[points.length - 2];\n const terminal = points[points.length - 1];\n if (!isHorizontalSegment(tailStart, terminal, EPS_LOCAL) && !isVerticalSegment(tailStart, terminal, EPS_LOCAL)) {\n return void 0;\n }\n return { tailStart, terminal };\n }, \"terminalTailFor\");\n const candidateWithDestinationTail = /* @__PURE__ */ __name((edge, tail) => {\n const points = replacementPointsFor(edge);\n if (points.length < 3) {\n return void 0;\n }\n const start = points[0];\n const firstTurn = points[1];\n let connector;\n if (isHorizontalSegment(start, firstTurn, EPS_LOCAL)) {\n connector = { x: firstTurn.x, y: tail.tailStart.y };\n } else if (isVerticalSegment(start, firstTurn, EPS_LOCAL)) {\n connector = { x: tail.tailStart.x, y: firstTurn.y };\n } else {\n return void 0;\n }\n const candidate = simplifyPolyline(\n dedupeConsecutivePoints([start, firstTurn, connector, tail.tailStart, tail.terminal])\n );\n return segmentsFor(candidate).length === candidate.length - 1 ? candidate : void 0;\n }, \"candidateWithDestinationTail\");\n const pathHasNodeHit = /* @__PURE__ */ __name((edge, path) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n for (const segment of segmentsFor(path)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return true;\n }\n }\n return false;\n }, \"pathHasNodeHit\");\n const pathHasSharedTrack = /* @__PURE__ */ __name((edge, path, replacements) => {\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of segmentsFor(path)) {\n for (const otherSegment of segmentsFor(replacementPointsFor(other, replacements))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return true;\n }\n }\n }\n }\n return false;\n }, \"pathHasSharedTrack\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, path, replacements) => !pathHasNodeHit(edge, path) && !pathHasSharedTrack(edge, path, replacements), \"candidateIsSafe\");\n const edgesByDestination = /* @__PURE__ */ __name(() => {\n const result = /* @__PURE__ */ new Map();\n for (const edge of visibleEdges) {\n const dstId = edge.end;\n if (!dstId || !nodeByIdMap.has(dstId)) {\n continue;\n }\n const points = replacementPointsFor(edge);\n if (points.length < 4) {\n continue;\n }\n const bucket = result.get(dstId) ?? [];\n bucket.push(edge);\n result.set(dstId, bucket);\n }\n return result;\n }, \"edgesByDestination\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = crossingCount();\n if (currentCrossings === 0) {\n return;\n }\n const currentBends = totalBends();\n let bestReplacements;\n let bestCrossings = currentCrossings;\n let bestBends = currentBends;\n for (const destinationEdges of edgesByDestination().values()) {\n for (let i = 0; i < destinationEdges.length; i++) {\n for (let j = i + 1; j < destinationEdges.length; j++) {\n const first = destinationEdges[i];\n const second = destinationEdges[j];\n const firstTail = terminalTailFor(first);\n const secondTail = terminalTailFor(second);\n if (!firstTail || !secondTail) {\n continue;\n }\n const firstCandidate = candidateWithDestinationTail(first, secondTail);\n const secondCandidate = candidateWithDestinationTail(second, firstTail);\n if (!firstCandidate || !secondCandidate) {\n continue;\n }\n const replacements = /* @__PURE__ */ new Map([\n [first, firstCandidate],\n [second, secondCandidate]\n ]);\n if (!candidateIsSafe(first, firstCandidate, replacements) || !candidateIsSafe(second, secondCandidate, replacements)) {\n continue;\n }\n const candidateCrossings = crossingCount(replacements);\n const candidateBends = totalBends(replacements);\n if (candidateCrossings >= currentCrossings) {\n continue;\n }\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && candidateBends >= bestBends) {\n continue;\n }\n bestReplacements = replacements;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n }\n }\n }\n if (!bestReplacements) {\n return;\n }\n for (const [edge, points] of bestReplacements) {\n edge.points = points;\n }\n }\n}\n__name(swapDestinationTerminalTailsToReduceCrossings, \"swapDestinationTerminalTailsToReduceCrossings\");\nfunction reassignCrossingExternalRailChannels(edges, nodeByIdMap) {\n const BUFFER = 2;\n const RAIL_CHANNEL_GAP = 12;\n const MAX_ITERATIONS = 4;\n const MAX_EXHAUSTIVE_COMPONENT = 6;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const replacementPointsFor = /* @__PURE__ */ __name((edge, replacements = /* @__PURE__ */ new Map()) => dedupeConsecutivePoints(\n replacements.get(edge) ?? edge.points ?? []\n ), \"replacementPointsFor\");\n const strictCrossingCount = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(replacementPointsFor(visibleEdges[i], replacements));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(replacementPointsFor(visibleEdges[j], replacements));\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"strictCrossingCount\");\n const totalBends = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + countOrthogonalBends(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalBends\");\n const endpointRectsFor = /* @__PURE__ */ __name((edge) => {\n const srcId = edge.start;\n const dstId = edge.end;\n const srcNode = srcId ? nodeByIdMap.get(srcId) : void 0;\n const dstNode = dstId ? nodeByIdMap.get(dstId) : void 0;\n const src = srcNode ? rectOfNodeBounds(srcNode) : void 0;\n const dst = dstNode ? rectOfNodeBounds(dstNode) : void 0;\n return src && dst ? { src, dst } : void 0;\n }, \"endpointRectsFor\");\n const externalRailForSegment = /* @__PURE__ */ __name((edge, points, segment) => {\n if (segment.index <= 0 || segment.index + 1 >= points.length - 1) {\n return void 0;\n }\n const endpointRects = endpointRectsFor(edge);\n if (!endpointRects) {\n return void 0;\n }\n if (segment.vertical) {\n const coord = segment.a.x;\n const leftBound = Math.min(endpointRects.src.left, endpointRects.dst.left);\n const rightBound = Math.max(endpointRects.src.right, endpointRects.dst.right);\n const side = coord < leftBound - EPS_LOCAL ? \"left\" : coord > rightBound + EPS_LOCAL ? \"right\" : void 0;\n if (!side) {\n return void 0;\n }\n return {\n edge,\n points,\n segmentIndex: segment.index,\n axis: \"vertical\",\n side,\n coord,\n min: Math.min(segment.a.y, segment.b.y),\n max: Math.max(segment.a.y, segment.b.y)\n };\n }\n if (segment.horizontal) {\n const coord = segment.a.y;\n const topBound = Math.min(endpointRects.src.top, endpointRects.dst.top);\n const bottomBound = Math.max(endpointRects.src.bottom, endpointRects.dst.bottom);\n const side = coord < topBound - EPS_LOCAL ? \"top\" : coord > bottomBound + EPS_LOCAL ? \"bottom\" : void 0;\n if (!side) {\n return void 0;\n }\n return {\n edge,\n points,\n segmentIndex: segment.index,\n axis: \"horizontal\",\n side,\n coord,\n min: Math.min(segment.a.x, segment.b.x),\n max: Math.max(segment.a.x, segment.b.x)\n };\n }\n return void 0;\n }, \"externalRailForSegment\");\n const collectExternalRails = /* @__PURE__ */ __name(() => {\n const rails = [];\n for (const edge of visibleEdges) {\n const points = replacementPointsFor(edge);\n for (const segment of segmentsFor(points)) {\n const rail = externalRailForSegment(edge, points, segment);\n if (rail) {\n rails.push(rail);\n }\n }\n }\n return rails;\n }, \"collectExternalRails\");\n const railsInteract = /* @__PURE__ */ __name((a, b) => a.edge !== b.edge && a.axis === b.axis && a.side === b.side && overlapLength(a.min, a.max, b.min, b.max) >= MIN_SHARED, \"railsInteract\");\n const connectedComponents = /* @__PURE__ */ __name((rails) => {\n const result = [];\n const seen = /* @__PURE__ */ new Set();\n for (const rail of rails) {\n if (seen.has(rail)) {\n continue;\n }\n const queue = [rail];\n const component = [];\n seen.add(rail);\n while (queue.length > 0) {\n const current = queue.pop();\n component.push(current);\n for (const next of rails) {\n if (!seen.has(next) && railsInteract(current, next)) {\n seen.add(next);\n queue.push(next);\n }\n }\n }\n if (component.length > 1) {\n result.push(component);\n }\n }\n return result;\n }, \"connectedComponents\");\n const uniqueCoordsFor = /* @__PURE__ */ __name((component) => {\n const coords = [];\n for (const rail of component) {\n if (!coords.some((coord) => Math.abs(coord - rail.coord) < EPS_LOCAL)) {\n coords.push(rail.coord);\n }\n }\n while (coords.length < component.length) {\n const min = Math.min(...coords);\n const max = Math.max(...coords);\n const side = component[0].side;\n coords.push(\n side === \"left\" || side === \"top\" ? min - RAIL_CHANNEL_GAP * (component.length - coords.length) : max + RAIL_CHANNEL_GAP * (component.length - coords.length)\n );\n }\n return coords;\n }, \"uniqueCoordsFor\");\n const coordinateAssignmentsFor = /* @__PURE__ */ __name((component) => {\n const current = component.map((rail) => rail.coord);\n const coords = uniqueCoordsFor(component);\n const assignments = [];\n if (component.length <= MAX_EXHAUSTIVE_COMPONENT) {\n const used = new Array(coords.length).fill(false);\n const next = [];\n const visit = /* @__PURE__ */ __name(() => {\n if (next.length === component.length) {\n if (next.some((coord, index) => Math.abs(coord - current[index]) >= EPS_LOCAL)) {\n assignments.push([...next]);\n }\n return;\n }\n for (const [i, coord] of coords.entries()) {\n if (used[i]) {\n continue;\n }\n used[i] = true;\n next.push(coord);\n visit();\n next.pop();\n used[i] = false;\n }\n }, \"visit\");\n visit();\n return assignments;\n }\n for (let i = 0; i < current.length; i++) {\n for (let j = i + 1; j < current.length; j++) {\n const assignment = [...current];\n [assignment[i], assignment[j]] = [assignment[j], assignment[i]];\n assignments.push(assignment);\n }\n }\n return assignments;\n }, \"coordinateAssignmentsFor\");\n const replacementsForAssignment = /* @__PURE__ */ __name((component, assignment) => {\n const draftByEdge = /* @__PURE__ */ new Map();\n for (const [i, rail] of component.entries()) {\n const coord = assignment[i];\n const points = draftByEdge.get(rail.edge) ?? rail.points.map((point) => ({ x: point.x, y: point.y }));\n if (rail.axis === \"vertical\") {\n points[rail.segmentIndex].x = coord;\n points[rail.segmentIndex + 1].x = coord;\n } else {\n points[rail.segmentIndex].y = coord;\n points[rail.segmentIndex + 1].y = coord;\n }\n draftByEdge.set(rail.edge, points);\n }\n const replacements = /* @__PURE__ */ new Map();\n for (const [edge, points] of draftByEdge) {\n const simplified = simplifyPolyline(dedupeConsecutivePoints(points));\n if (segmentsFor(simplified).length !== simplified.length - 1) {\n return void 0;\n }\n replacements.set(edge, simplified);\n }\n return replacements;\n }, \"replacementsForAssignment\");\n const candidateIsSafe = /* @__PURE__ */ __name((replacements) => {\n for (const [edge, points] of replacements) {\n const endpointIds = [\n edge.start,\n edge.end\n ].filter((id) => Boolean(id));\n for (const segment of segmentsFor(points)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n }\n }\n for (let i = 0; i < visibleEdges.length; i++) {\n const first = visibleEdges[i];\n const firstChanged = replacements.has(first);\n const firstSegments = segmentsFor(replacementPointsFor(first, replacements));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const second = visibleEdges[j];\n if (!firstChanged && !replacements.has(second)) {\n continue;\n }\n const secondSegments = segmentsFor(replacementPointsFor(second, replacements));\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (sameAxisSegmentOverlapLength(firstSegment, secondSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n }\n }\n }\n }\n return true;\n }, \"candidateIsSafe\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = strictCrossingCount();\n if (currentCrossings === 0) {\n return;\n }\n let bestReplacements;\n let bestCrossings = currentCrossings;\n let bestBends = totalBends();\n let bestDisplacement = Number.POSITIVE_INFINITY;\n for (const component of connectedComponents(collectExternalRails())) {\n for (const assignment of coordinateAssignmentsFor(component)) {\n const replacements = replacementsForAssignment(component, assignment);\n if (!replacements || !candidateIsSafe(replacements)) {\n continue;\n }\n const candidateCrossings = strictCrossingCount(replacements);\n if (candidateCrossings >= currentCrossings) {\n continue;\n }\n const candidateBends = totalBends(replacements);\n const candidateDisplacement = component.reduce(\n (sum, rail, index) => sum + Math.abs(assignment[index] - rail.coord),\n 0\n );\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && (candidateBends > bestBends || candidateBends === bestBends && candidateDisplacement >= bestDisplacement)) {\n continue;\n }\n bestReplacements = replacements;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n bestDisplacement = candidateDisplacement;\n }\n }\n if (!bestReplacements) {\n return;\n }\n for (const [edge, points] of bestReplacements) {\n edge.points = points;\n }\n }\n}\n__name(reassignCrossingExternalRailChannels, \"reassignCrossingExternalRailChannels\");\nfunction shortcutRedundantOrthogonalJogs(edges, nodeByIdMap) {\n const BUFFER = 2;\n const MAX_ITERATIONS = 8;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const pointsFor = /* @__PURE__ */ __name((edge, replacementEdge, replacement) => dedupeConsecutivePoints(\n edge === replacementEdge ? replacement ?? [] : edge.points ?? []\n ), \"pointsFor\");\n const pathLength = /* @__PURE__ */ __name((points) => segmentsFor(points).reduce((sum, segment) => {\n const dx = segment.a.x - segment.b.x;\n const dy = segment.a.y - segment.b.y;\n return sum + Math.hypot(dx, dy);\n }, 0), \"pathLength\");\n const strictCrossingCount = /* @__PURE__ */ __name((replacementEdge, replacement) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(pointsFor(visibleEdges[i], replacementEdge, replacement));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(\n pointsFor(visibleEdges[j], replacementEdge, replacement)\n );\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"strictCrossingCount\");\n const segmentRunsAlongRectBorder = /* @__PURE__ */ __name((segment, rect) => {\n if (segment.horizontal) {\n const y = segment.a.y;\n const onBorder = Math.abs(y - rect.top) < 1 || Math.abs(y - rect.bottom) < 1;\n return onBorder && overlapLength(segment.a.x, segment.b.x, rect.left, rect.right) >= MIN_SHARED;\n }\n if (segment.vertical) {\n const x = segment.a.x;\n const onBorder = Math.abs(x - rect.left) < 1 || Math.abs(x - rect.right) < 1;\n return onBorder && overlapLength(segment.a.y, segment.b.y, rect.top, rect.bottom) >= MIN_SHARED;\n }\n return false;\n }, \"segmentRunsAlongRectBorder\");\n const endpointRectsFor = /* @__PURE__ */ __name((edge) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n const rects = [];\n for (const id of endpointIds) {\n const node = nodeByIdMap.get(id);\n const rect = node ? rectOfNodeBounds(node) : void 0;\n if (rect) {\n rects.push(rect);\n }\n }\n return rects;\n }, \"endpointRectsFor\");\n const shortcutCandidatesAt = /* @__PURE__ */ __name((points, index) => {\n if (index + 3 >= points.length) {\n return [];\n }\n const p0 = points[index];\n const p1 = points[index + 1];\n const p2 = points[index + 2];\n const p3 = points[index + 3];\n const isHVH = isHorizontalSegment(p0, p1, EPS_LOCAL) && isVerticalSegment(p1, p2, EPS_LOCAL) && isHorizontalSegment(p2, p3, EPS_LOCAL);\n const isVHV = isVerticalSegment(p0, p1, EPS_LOCAL) && isHorizontalSegment(p1, p2, EPS_LOCAL) && isVerticalSegment(p2, p3, EPS_LOCAL);\n if (!isHVH && !isVHV) {\n return [];\n }\n const outerSegmentsOppose = isHVH ? Math.sign(p1.x - p0.x) !== Math.sign(p3.x - p2.x) : Math.sign(p1.y - p0.y) !== Math.sign(p3.y - p2.y);\n if (!outerSegmentsOppose) {\n return [];\n }\n const corners = sameX(p0, p3, EPS_LOCAL) || sameY(p0, p3, EPS_LOCAL) ? [] : [\n { x: p0.x, y: p3.y },\n { x: p3.x, y: p0.y }\n ];\n const rawCandidates = corners.length === 0 ? [[...points.slice(0, index + 1), ...points.slice(index + 3)]] : corners.map((corner) => [\n ...points.slice(0, index + 1),\n corner,\n ...points.slice(index + 3)\n ]);\n const seen = /* @__PURE__ */ new Set();\n return rawCandidates.map((candidate) => simplifyPolyline(dedupeConsecutivePoints(candidate))).filter((candidate) => {\n if (segmentsFor(candidate).length !== candidate.length - 1) {\n return false;\n }\n if (!candidate.some((point) => samePoint(point, p3, EPS_LOCAL))) {\n return false;\n }\n const key = candidate.map((point) => `${point.x.toFixed(3)},${point.y.toFixed(3)}`).join(\"|\");\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n }, \"shortcutCandidatesAt\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate, currentCrossings) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n const endpointRects = endpointRectsFor(edge);\n for (const segment of segmentsFor(candidate)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n if (endpointRects.some((rect) => segmentRunsAlongRectBorder(segment, rect))) {\n return false;\n }\n }\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of segmentsFor(candidate)) {\n for (const otherSegment of segmentsFor(pointsFor(other))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n }\n }\n }\n return strictCrossingCount(edge, candidate) <= currentCrossings;\n }, \"candidateIsSafe\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = strictCrossingCount();\n let bestEdge;\n let bestPath;\n let bestCrossings = currentCrossings;\n let bestBends = Number.POSITIVE_INFINITY;\n let bestLength = Number.POSITIVE_INFINITY;\n for (const edge of visibleEdges) {\n const currentPoints = pointsFor(edge);\n const currentBends = countOrthogonalBends(currentPoints, EPS_LOCAL);\n const currentLength = pathLength(currentPoints);\n for (let index = 0; index <= currentPoints.length - 4; index++) {\n for (const candidate of shortcutCandidatesAt(currentPoints, index)) {\n const candidateBends = countOrthogonalBends(candidate, EPS_LOCAL);\n const candidateLength = pathLength(candidate);\n const improvesShape = candidateBends < currentBends || candidateBends === currentBends && candidateLength < currentLength - EPS_LOCAL;\n if (!improvesShape || !candidateIsSafe(edge, candidate, currentCrossings)) {\n continue;\n }\n const candidateCrossings = strictCrossingCount(edge, candidate);\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && (candidateBends > bestBends || candidateBends === bestBends && candidateLength >= bestLength)) {\n continue;\n }\n bestEdge = edge;\n bestPath = candidate;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n bestLength = candidateLength;\n }\n }\n }\n if (!bestEdge || !bestPath) {\n return;\n }\n bestEdge.points = bestPath;\n }\n}\n__name(shortcutRedundantOrthogonalJogs, \"shortcutRedundantOrthogonalJogs\");\nfunction resolveRenderedOrthogonalCrossings(edges, nodeByIdMap) {\n const ANCHOR = 20;\n const EXTRA_CHANNEL_COUNT = 2;\n const MAX_ITERATIONS = 4;\n const MAX_PAIR_CANDIDATES_PER_EDGE = 48;\n const realNodes = [];\n for (const node of nodeByIdMap.values()) {\n if (node.isGroup || node.isEdgeLabel) {\n continue;\n }\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const rect = rectOfNodeBounds(node);\n if (!rect) {\n continue;\n }\n realNodes.push({\n id: String(node.id ?? \"\"),\n cx,\n cy,\n rect\n });\n }\n if (realNodes.length === 0) {\n return;\n }\n const nodeInfoById = new Map(realNodes.map((node) => [node.id, node]));\n const realNodeRects = realNodes.map((node) => ({ id: node.id, rect: node.rect }));\n const sides = [\"top\", \"bottom\", \"left\", \"right\"];\n const outsideTracks = {\n top: Math.min(...realNodes.map((node) => node.rect.top)) - ANCHOR,\n bottom: Math.max(...realNodes.map((node) => node.rect.bottom)) + ANCHOR,\n left: Math.min(...realNodes.map((node) => node.rect.left)) - ANCHOR,\n right: Math.max(...realNodes.map((node) => node.rect.right)) + ANCHOR\n };\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const edgeIndex = new Map(visibleEdges.map((edge, index) => [edge, index]));\n const outwardTracksForSide = /* @__PURE__ */ __name((side) => {\n const outward = side === \"left\" || side === \"top\" ? -1 : 1;\n const tracks = [];\n for (let channel = 0; channel <= EXTRA_CHANNEL_COUNT; channel++) {\n tracks.push(outsideTracks[side] + outward * ANCHOR * channel);\n }\n return tracks;\n }, \"outwardTracksForSide\");\n const replacementPointsFor = /* @__PURE__ */ __name((edge, replacements = /* @__PURE__ */ new Map()) => dedupeConsecutivePoints(\n replacements.get(edge) ?? edge.points ?? []\n ), \"replacementPointsFor\");\n const crossingCountBetweenSegments = /* @__PURE__ */ __name((firstSegments, secondSegments) => {\n let count = 0;\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n return count;\n }, \"crossingCountBetweenSegments\");\n const crossingCountBetweenPaths = /* @__PURE__ */ __name((first, second) => crossingCountBetweenSegments(segmentsFor(first), segmentsFor(second)), \"crossingCountBetweenPaths\");\n const crossingSnapshot = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => {\n let count = 0;\n const pairs = [];\n const edgeSet = /* @__PURE__ */ new Set();\n const edgeOrder = [];\n const addEdge = /* @__PURE__ */ __name((edge) => {\n if (!edgeSet.has(edge)) {\n edgeSet.add(edge);\n edgeOrder.push(edge);\n }\n }, \"addEdge\");\n for (let i = 0; i < visibleEdges.length; i++) {\n const first = visibleEdges[i];\n const firstPoints = replacementPointsFor(first, replacements);\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const second = visibleEdges[j];\n const pairCount = crossingCountBetweenPaths(\n firstPoints,\n replacementPointsFor(second, replacements)\n );\n if (pairCount > 0) {\n count += pairCount;\n pairs.push({ first, second, count: pairCount });\n addEdge(first);\n addEdge(second);\n }\n }\n }\n edgeOrder.sort((a, b) => (edgeIndex.get(a) ?? 0) - (edgeIndex.get(b) ?? 0));\n return {\n count,\n pairs,\n edgeSet,\n edges: edgeOrder\n };\n }, \"crossingSnapshot\");\n const crossingCountWithReplacements = /* @__PURE__ */ __name((current, replacements) => {\n const changed = new Set(replacements.keys());\n if (changed.size === 0) {\n return current.count;\n }\n let currentAffected = 0;\n for (const pair of current.pairs) {\n if (changed.has(pair.first) || changed.has(pair.second)) {\n currentAffected += pair.count;\n }\n }\n let replacementAffected = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const first = visibleEdges[i];\n const firstChanged = changed.has(first);\n const firstPoints = replacementPointsFor(first, replacements);\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const second = visibleEdges[j];\n if (!firstChanged && !changed.has(second)) {\n continue;\n }\n replacementAffected += crossingCountBetweenPaths(\n firstPoints,\n replacementPointsFor(second, replacements)\n );\n }\n }\n return current.count - currentAffected + replacementAffected;\n }, \"crossingCountWithReplacements\");\n const crossingComponents = /* @__PURE__ */ __name((snapshot) => {\n const neighbors = /* @__PURE__ */ new Map();\n for (const pair of snapshot.pairs) {\n const firstNeighbors = neighbors.get(pair.first) ?? /* @__PURE__ */ new Set();\n firstNeighbors.add(pair.second);\n neighbors.set(pair.first, firstNeighbors);\n const secondNeighbors = neighbors.get(pair.second) ?? /* @__PURE__ */ new Set();\n secondNeighbors.add(pair.first);\n neighbors.set(pair.second, secondNeighbors);\n }\n const components = [];\n const seen = /* @__PURE__ */ new Set();\n for (const edge of snapshot.edges) {\n if (seen.has(edge)) {\n continue;\n }\n const queue = [edge];\n const component = [];\n seen.add(edge);\n while (queue.length > 0) {\n const current = queue.pop();\n component.push(current);\n for (const next of neighbors.get(current) ?? []) {\n if (!seen.has(next)) {\n seen.add(next);\n queue.push(next);\n }\n }\n }\n component.sort((a, b) => (edgeIndex.get(a) ?? 0) - (edgeIndex.get(b) ?? 0));\n if (component.length > 1) {\n components.push(component);\n }\n }\n return components;\n }, \"crossingComponents\");\n const endpointIdsFor = /* @__PURE__ */ __name((edge) => [edge.start, edge.end].filter(\n (id) => Boolean(id)\n ), \"endpointIdsFor\");\n const pairSearchGroups = /* @__PURE__ */ __name((snapshot) => {\n const groups = [];\n for (const component of crossingComponents(snapshot)) {\n const componentSet = new Set(component);\n const componentEndpointIds = new Set(component.flatMap((edge) => endpointIdsFor(edge)));\n const group = [...component];\n for (const edge of visibleEdges) {\n if (componentSet.has(edge)) {\n continue;\n }\n if (endpointIdsFor(edge).some((id) => componentEndpointIds.has(id))) {\n group.push(edge);\n }\n }\n group.sort((a, b) => (edgeIndex.get(a) ?? 0) - (edgeIndex.get(b) ?? 0));\n groups.push(group);\n }\n return groups;\n }, \"pairSearchGroups\");\n const crossingCountWithSingleReplacement = /* @__PURE__ */ __name((current, edge, replacement) => crossingCountWithReplacements(\n current,\n /* @__PURE__ */ new Map([[edge, replacement]])\n ), \"crossingCountWithSingleReplacement\");\n const currentCrossingsByEdge = /* @__PURE__ */ __name((current) => {\n const result = /* @__PURE__ */ new Map();\n for (const pair of current.pairs) {\n result.set(pair.first, (result.get(pair.first) ?? 0) + pair.count);\n result.set(pair.second, (result.get(pair.second) ?? 0) + pair.count);\n }\n return result;\n }, \"currentCrossingsByEdge\");\n const pathLength = /* @__PURE__ */ __name((points) => points.slice(1).reduce((sum, point, index) => {\n const previous = points[index];\n return sum + Math.abs(point.x - previous.x) + Math.abs(point.y - previous.y);\n }, 0), \"pathLength\");\n const totalBends = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + countOrthogonalBends(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalBends\");\n const totalLength = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + pathLength(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalLength\");\n const pathHasSegmentConflict = /* @__PURE__ */ __name((edge, path, replacements = /* @__PURE__ */ new Map()) => {\n const pathSegments = segmentsFor(path);\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of pathSegments) {\n for (const otherSegment of segmentsFor(replacementPointsFor(other, replacements))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return true;\n }\n }\n }\n }\n return false;\n }, \"pathHasSegmentConflict\");\n const pathHitsNode = /* @__PURE__ */ __name((edge, path) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n for (const segment of segmentsFor(path)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -2)) {\n return true;\n }\n }\n return false;\n }, \"pathHitsNode\");\n const pushOrthogonalCandidate = /* @__PURE__ */ __name((candidates, points) => {\n const candidate = simplifyPolyline(dedupeConsecutivePoints(points));\n if (segmentsFor(candidate).length === candidate.length - 1) {\n candidates.push(candidate);\n }\n }, \"pushOrthogonalCandidate\");\n const sideIsHorizontal = /* @__PURE__ */ __name((side) => side === \"left\" || side === \"right\", \"sideIsHorizontal\");\n const localTrackForSameSide = /* @__PURE__ */ __name((src, side, dst) => {\n switch (side) {\n case \"left\":\n return Math.min(src.x, dst.x) - ANCHOR;\n case \"right\":\n return Math.max(src.x, dst.x) + ANCHOR;\n case \"top\":\n return Math.min(src.y, dst.y) - ANCHOR;\n case \"bottom\":\n return Math.max(src.y, dst.y) + ANCHOR;\n }\n }, \"localTrackForSameSide\");\n const addSameSideCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst) => {\n const outward = srcSide === \"left\" || srcSide === \"top\" ? -1 : 1;\n const trackSeeds = [localTrackForSameSide(src, srcSide, dst), outsideTracks[srcSide]];\n for (const seed of trackSeeds) {\n for (let channel = 0; channel <= EXTRA_CHANNEL_COUNT; channel++) {\n pushOrthogonalCandidate(\n candidates,\n buildSameSideTrackPath(src, srcSide, dst, seed + outward * ANCHOR * channel)\n );\n }\n }\n }, \"addSameSideCandidates\");\n const addHorizontalToVerticalCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n for (const xTrack of outwardTracksForSide(srcSide)) {\n for (const yTrack of outwardTracksForSide(dstSide)) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: xTrack, y: src.y },\n { x: xTrack, y: yTrack },\n { x: dst.x, y: yTrack },\n dst\n ]);\n }\n }\n }, \"addHorizontalToVerticalCandidates\");\n const addVerticalToHorizontalCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n for (const yTrack of outwardTracksForSide(srcSide)) {\n for (const xTrack of outwardTracksForSide(dstSide)) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: src.x, y: yTrack },\n { x: xTrack, y: yTrack },\n { x: xTrack, y: dst.y },\n dst\n ]);\n }\n }\n }, \"addVerticalToHorizontalCandidates\");\n const addHorizontalPairCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n const yTracks = [...outwardTracksForSide(\"top\"), ...outwardTracksForSide(\"bottom\")];\n for (const srcTrack of outwardTracksForSide(srcSide)) {\n for (const dstTrack of outwardTracksForSide(dstSide)) {\n for (const yTrack of yTracks) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: srcTrack, y: src.y },\n { x: srcTrack, y: yTrack },\n { x: dstTrack, y: yTrack },\n { x: dstTrack, y: dst.y },\n dst\n ]);\n }\n }\n }\n }, \"addHorizontalPairCandidates\");\n const addVerticalPairCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n const xTracks = [...outwardTracksForSide(\"left\"), ...outwardTracksForSide(\"right\")];\n for (const srcTrack of outwardTracksForSide(srcSide)) {\n for (const dstTrack of outwardTracksForSide(dstSide)) {\n for (const xTrack of xTracks) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: src.x, y: srcTrack },\n { x: xTrack, y: srcTrack },\n { x: xTrack, y: dstTrack },\n { x: dst.x, y: dstTrack },\n dst\n ]);\n }\n }\n }\n }, \"addVerticalPairCandidates\");\n const dedupeCandidatePaths = /* @__PURE__ */ __name((candidates) => {\n const seen = /* @__PURE__ */ new Set();\n return candidates.map((candidate) => dedupeConsecutivePoints(candidate)).filter((candidate) => {\n const key = candidate.map((point) => `${point.x.toFixed(3)},${point.y.toFixed(3)}`).join(\"|\");\n if (seen.has(key) || candidate.length < 2) {\n return false;\n }\n seen.add(key);\n return true;\n });\n }, \"dedupeCandidatePaths\");\n const buildCandidatesForSides = /* @__PURE__ */ __name((src, srcSide, dst, dstSide) => {\n const candidates = [];\n const base = buildOrthogonalPortPath(src, srcSide, dst, dstSide, ANCHOR, EPS_LOCAL);\n if (base) {\n pushOrthogonalCandidate(candidates, base);\n }\n if (srcSide === dstSide) {\n addSameSideCandidates(candidates, src, srcSide, dst);\n }\n const srcHorizontal = sideIsHorizontal(srcSide);\n const dstHorizontal = sideIsHorizontal(dstSide);\n if (srcHorizontal && !dstHorizontal) {\n addHorizontalToVerticalCandidates(candidates, src, srcSide, dst, dstSide);\n } else if (!srcHorizontal && dstHorizontal) {\n addVerticalToHorizontalCandidates(candidates, src, srcSide, dst, dstSide);\n } else if (srcHorizontal) {\n addHorizontalPairCandidates(candidates, src, srcSide, dst, dstSide);\n } else {\n addVerticalPairCandidates(candidates, src, srcSide, dst, dstSide);\n }\n return dedupeCandidatePaths(candidates);\n }, \"buildCandidatesForSides\");\n const addVerticalDepartureOuterTrackCandidates = /* @__PURE__ */ __name((candidates, first, departure, dstNode) => {\n const externalXTracks = [...outwardTracksForSide(\"left\"), ...outwardTracksForSide(\"right\")];\n const externalYTracks = [...outwardTracksForSide(\"top\"), ...outwardTracksForSide(\"bottom\")];\n for (const side of sides) {\n const dst = portForRectSide(dstNode, side);\n const targetYTracks = side === \"top\" || side === \"bottom\" ? outwardTracksForSide(side) : externalYTracks;\n for (const track of externalXTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: track, y: departure.y },\n { x: track, y: dst.y },\n dst\n ]);\n for (const targetTrack of targetYTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: track, y: departure.y },\n { x: track, y: targetTrack },\n { x: dst.x, y: targetTrack },\n dst\n ]);\n }\n }\n }\n }, \"addVerticalDepartureOuterTrackCandidates\");\n const addHorizontalDepartureOuterTrackCandidates = /* @__PURE__ */ __name((candidates, first, departure, dstNode) => {\n const externalXTracks = [...outwardTracksForSide(\"left\"), ...outwardTracksForSide(\"right\")];\n const externalYTracks = [...outwardTracksForSide(\"top\"), ...outwardTracksForSide(\"bottom\")];\n for (const side of sides) {\n const dst = portForRectSide(dstNode, side);\n const targetXTracks = side === \"left\" || side === \"right\" ? outwardTracksForSide(side) : externalXTracks;\n for (const track of externalYTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: departure.x, y: track },\n { x: dst.x, y: track },\n dst\n ]);\n for (const targetTrack of targetXTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: departure.x, y: track },\n { x: targetTrack, y: track },\n { x: targetTrack, y: dst.y },\n dst\n ]);\n }\n }\n }\n }, \"addHorizontalDepartureOuterTrackCandidates\");\n const terminalPreservingOuterTrackCandidates = /* @__PURE__ */ __name((edge) => {\n const srcId = edge.start;\n const dstId = edge.end;\n const dstNode = dstId ? nodeInfoById.get(dstId) : void 0;\n if (!srcId || !dstNode) {\n return [];\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length < 4) {\n return [];\n }\n const first = points[0];\n const departure = points[1];\n const candidates = [];\n if (isVerticalSegment(first, departure, EPS_LOCAL)) {\n addVerticalDepartureOuterTrackCandidates(candidates, first, departure, dstNode);\n } else if (isHorizontalSegment(first, departure, EPS_LOCAL)) {\n addHorizontalDepartureOuterTrackCandidates(candidates, first, departure, dstNode);\n }\n return candidates;\n }, \"terminalPreservingOuterTrackCandidates\");\n const candidatePathsFor = /* @__PURE__ */ __name((edge) => {\n const srcId = edge.start;\n const dstId = edge.end;\n const srcNode = srcId ? nodeInfoById.get(srcId) : void 0;\n const dstNode = dstId ? nodeInfoById.get(dstId) : void 0;\n if (!srcNode || !dstNode) {\n return [];\n }\n const candidates = [];\n for (const srcSide of sides) {\n const srcPort = portForRectSide(srcNode, srcSide);\n for (const dstSide of sides) {\n candidates.push(\n ...buildCandidatesForSides(srcPort, srcSide, portForRectSide(dstNode, dstSide), dstSide)\n );\n }\n }\n candidates.push(...terminalPreservingOuterTrackCandidates(edge));\n return candidates;\n }, \"candidatePathsFor\");\n const currentSegmentsByEdge = /* @__PURE__ */ __name(() => new Map(visibleEdges.map((edge) => [edge, segmentsFor(replacementPointsFor(edge))])), \"currentSegmentsByEdge\");\n const sharedTrackConflictsFor = /* @__PURE__ */ __name((edge, candidateSegments, baseSegments) => {\n const conflicts = /* @__PURE__ */ new Set();\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n const otherSegments = baseSegments.get(other) ?? segmentsFor(replacementPointsFor(other));\n if (candidateSegments.some(\n (candidateSegment) => otherSegments.some(\n (otherSegment) => sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED\n )\n )) {\n conflicts.add(other);\n }\n }\n return conflicts;\n }, \"sharedTrackConflictsFor\");\n const pairCandidatesFor = /* @__PURE__ */ __name((edge, current, baseSegments, crossingCountByEdge) => {\n const seen = /* @__PURE__ */ new Set();\n const candidates = candidatePathsFor(edge).map((candidate) => simplifyPolyline(dedupeConsecutivePoints(candidate))).filter((candidate) => {\n if (pathHitsNode(edge, candidate)) {\n return false;\n }\n const key = candidate.map((point) => `${point.x.toFixed(3)},${point.y.toFixed(3)}`).join(\"|\");\n if (seen.has(key) || candidate.length < 2) {\n return false;\n }\n seen.add(key);\n return true;\n }).map((candidate) => {\n const candidateSegments = segmentsFor(candidate);\n let replacementAffected = 0;\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n replacementAffected += crossingCountBetweenSegments(\n candidateSegments,\n baseSegments.get(other) ?? segmentsFor(replacementPointsFor(other))\n );\n }\n return {\n candidate,\n candidateSegments,\n crossings: current.count - (crossingCountByEdge.get(edge) ?? 0) + replacementAffected,\n bends: countOrthogonalBends(candidate, EPS_LOCAL),\n totalBends: countOrthogonalBends(candidate),\n length: pathLength(candidate)\n };\n }).filter(({ crossings }) => crossings <= current.count).sort((a, b) => a.crossings - b.crossings || a.bends - b.bends || a.length - b.length);\n return candidates.slice(0, MAX_PAIR_CANDIDATES_PER_EDGE).map((candidate) => {\n return {\n path: candidate.candidate,\n segments: candidate.candidateSegments,\n sharedTrackConflicts: sharedTrackConflictsFor(\n edge,\n candidate.candidateSegments,\n baseSegments\n ),\n totalBends: candidate.totalBends,\n length: candidate.length\n };\n });\n }, \"pairCandidatesFor\");\n const pairCrossingCount = /* @__PURE__ */ __name((current, firstEdge, firstCandidate, secondEdge, secondCandidate, baseSegments) => {\n let currentAffected = 0;\n for (const pair of current.pairs) {\n if (pair.first === firstEdge || pair.second === firstEdge || pair.first === secondEdge || pair.second === secondEdge) {\n currentAffected += pair.count;\n }\n }\n let replacementAffected = crossingCountBetweenSegments(\n firstCandidate.segments,\n secondCandidate.segments\n );\n for (const other of visibleEdges) {\n if (other === firstEdge || other === secondEdge) {\n continue;\n }\n const otherSegments = baseSegments.get(other) ?? segmentsFor(replacementPointsFor(other));\n replacementAffected += crossingCountBetweenSegments(firstCandidate.segments, otherSegments) + crossingCountBetweenSegments(secondCandidate.segments, otherSegments);\n }\n return current.count - currentAffected + replacementAffected;\n }, \"pairCrossingCount\");\n const conflictsOnlyWith = /* @__PURE__ */ __name((candidate, edge) => {\n for (const conflict of candidate.sharedTrackConflicts) {\n if (conflict !== edge) {\n return false;\n }\n }\n return true;\n }, \"conflictsOnlyWith\");\n const candidatesShareTrack = /* @__PURE__ */ __name((firstCandidate, secondCandidate) => firstCandidate.segments.some(\n (firstSegment) => secondCandidate.segments.some(\n (secondSegment) => sameAxisSegmentOverlapLength(firstSegment, secondSegment, 0.5) >= MIN_SHARED\n )\n ), \"candidatesShareTrack\");\n const pairCandidatesAreCompatible = /* @__PURE__ */ __name((first, firstCandidate, second, secondCandidate) => conflictsOnlyWith(firstCandidate, second.edge) && conflictsOnlyWith(secondCandidate, first.edge) && !candidatesShareTrack(firstCandidate, secondCandidate), \"pairCandidatesAreCompatible\");\n const scorePairReplacement = /* @__PURE__ */ __name((context, first, firstCandidate, second, secondCandidate) => {\n const crossings = pairCrossingCount(\n context.current,\n first.edge,\n firstCandidate,\n second.edge,\n secondCandidate,\n context.baseSegments\n );\n if (crossings >= context.current.count) {\n return void 0;\n }\n return {\n replacements: /* @__PURE__ */ new Map([\n [first.edge, firstCandidate.path],\n [second.edge, secondCandidate.path]\n ]),\n crossings,\n bends: context.currentBends - (context.baseBendsByEdge.get(first.edge) ?? 0) - (context.baseBendsByEdge.get(second.edge) ?? 0) + firstCandidate.totalBends + secondCandidate.totalBends,\n length: context.currentLength - (context.baseLengthByEdge.get(first.edge) ?? 0) - (context.baseLengthByEdge.get(second.edge) ?? 0) + firstCandidate.length + secondCandidate.length\n };\n }, \"scorePairReplacement\");\n const pairScoreIsBetter = /* @__PURE__ */ __name((candidate, best) => candidate.crossings < best.crossings || candidate.crossings === best.crossings && (candidate.bends < best.bends || candidate.bends === best.bends && candidate.length < best.length), \"pairScoreIsBetter\");\n const bestScoreForOptionPair = /* @__PURE__ */ __name((context, first, second, best) => {\n let pairBest = best;\n for (const firstCandidate of first.candidates) {\n for (const secondCandidate of second.candidates) {\n if (!pairCandidatesAreCompatible(first, firstCandidate, second, secondCandidate)) {\n continue;\n }\n const score = scorePairReplacement(context, first, firstCandidate, second, secondCandidate);\n if (score && pairScoreIsBetter(score, pairBest)) {\n pairBest = score;\n }\n }\n }\n return pairBest;\n }, \"bestScoreForOptionPair\");\n const bestPairedReplacement = /* @__PURE__ */ __name((current) => {\n const currentBends = totalBends();\n const currentLength = totalLength();\n const baseSegments = currentSegmentsByEdge();\n const crossingCountByEdge = currentCrossingsByEdge(current);\n const baseBendsByEdge = new Map(\n visibleEdges.map((edge) => [edge, countOrthogonalBends(replacementPointsFor(edge))])\n );\n const baseLengthByEdge = new Map(\n visibleEdges.map((edge) => [edge, pathLength(replacementPointsFor(edge))])\n );\n const optionsByEdge = /* @__PURE__ */ new Map();\n const groups = pairSearchGroups(current);\n for (const group of groups) {\n for (const edge of group) {\n if (optionsByEdge.has(edge)) {\n continue;\n }\n const candidates = pairCandidatesFor(edge, current, baseSegments, crossingCountByEdge);\n if (candidates.length > 0) {\n optionsByEdge.set(edge, { edge, candidates });\n }\n }\n }\n let best = {\n replacements: /* @__PURE__ */ new Map(),\n crossings: current.count,\n bends: currentBends,\n length: currentLength\n };\n const scoringContext = {\n current,\n currentBends,\n currentLength,\n baseBendsByEdge,\n baseLengthByEdge,\n baseSegments\n };\n for (const group of groups) {\n const crossingEdgeSet = new Set(group.filter((edge) => current.edgeSet.has(edge)));\n const options = group.map((edge) => optionsByEdge.get(edge)).filter((option) => Boolean(option));\n for (let i = 0; i < options.length; i++) {\n const first = options[i];\n for (let j = i + 1; j < options.length; j++) {\n const second = options[j];\n if (!crossingEdgeSet.has(first.edge) && !crossingEdgeSet.has(second.edge)) {\n continue;\n }\n best = bestScoreForOptionPair(scoringContext, first, second, best);\n }\n }\n }\n return best.replacements.size > 0 ? best.replacements : void 0;\n }, \"bestPairedReplacement\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const current = crossingSnapshot();\n const currentCrossings = current.count;\n if (currentCrossings === 0) {\n return;\n }\n let bestEdge;\n let bestPath;\n let bestCrossings = currentCrossings;\n let bestBends = Number.POSITIVE_INFINITY;\n for (const edge of current.edges) {\n const currentEdgeBends = countOrthogonalBends(replacementPointsFor(edge), EPS_LOCAL);\n for (const candidate of candidatePathsFor(edge)) {\n const candidateHitsNode = pathHitsNode(edge, candidate);\n const candidateHasSegmentConflict = !candidateHitsNode && pathHasSegmentConflict(edge, candidate);\n const candidateCrossings = crossingCountWithSingleReplacement(current, edge, candidate);\n const candidateBends = countOrthogonalBends(candidate, EPS_LOCAL);\n if (candidateHitsNode || candidateHasSegmentConflict) {\n continue;\n }\n const improvesCurrentEdge = candidateCrossings < currentCrossings || candidateCrossings === currentCrossings && candidateBends < currentEdgeBends;\n if (!improvesCurrentEdge) {\n continue;\n }\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && candidateBends >= bestBends) {\n continue;\n }\n bestEdge = edge;\n bestPath = candidate;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n }\n }\n if (bestEdge && bestPath) {\n bestEdge.points = bestPath;\n continue;\n }\n const pairedReplacement = bestPairedReplacement(current);\n if (!pairedReplacement) {\n return;\n }\n for (const [edge, points] of pairedReplacement) {\n edge.points = points;\n }\n }\n}\n__name(resolveRenderedOrthogonalCrossings, \"resolveRenderedOrthogonalCrossings\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/detourSimplification.ts\nvar EPS4 = 1e-3;\nvar MIN_SHARED2 = 8;\nfunction simplifyDetouredEdges(edges, nodes) {\n const { nodeInfoById, realNodeRects } = collectRealNodeBounds(nodes);\n const sides = [\"top\", \"bottom\", \"left\", \"right\"];\n const ANCHOR = 20;\n const outsideTracks = {\n top: Math.min(...realNodeRects.map((node) => node.rect.top)) - ANCHOR,\n bottom: Math.max(...realNodeRects.map((node) => node.rect.bottom)) + ANCHOR,\n left: Math.min(...realNodeRects.map((node) => node.rect.left)) - ANCHOR,\n right: Math.max(...realNodeRects.map((node) => node.rect.right)) + ANCHOR\n };\n const buildOrthogonalPathCandidates = /* @__PURE__ */ __name((src, srcSide, dst, dstSide) => {\n const paths = [];\n const base = buildOrthogonalPortPath(src, srcSide, dst, dstSide, ANCHOR, EPS4);\n if (base) {\n paths.push(base);\n }\n if (srcSide === dstSide) {\n paths.push(buildSameSideTrackPath(src, srcSide, dst, outsideTracks[srcSide]));\n }\n return paths;\n }, \"buildOrthogonalPathCandidates\");\n const pathHitsNode = /* @__PURE__ */ __name((pts, excludeIds) => {\n for (let i = 0; i < pts.length - 1; i++) {\n const a = pts[i];\n const b = pts[i + 1];\n if (segmentHitsAnyRect(a, b, realNodeRects, excludeIds, 1)) {\n return true;\n }\n }\n return false;\n }, \"pathHitsNode\");\n const pathConflictCount = /* @__PURE__ */ __name((path, currentEdge, includeIncidentEdges = false) => {\n let conflicts = 0;\n const pathSegments = orthogonalSegmentsForPoints(path, EPS4);\n const currentStart = currentEdge.start;\n const currentEnd = currentEdge.end;\n for (const other of edges) {\n if (other === currentEdge || other.isLayoutOnly) {\n continue;\n }\n const otherStart = other.start;\n const otherEnd = other.end;\n if (!includeIncidentEdges && currentStart && currentEnd && (otherStart === currentStart || otherStart === currentEnd || otherEnd === currentStart || otherEnd === currentEnd)) {\n continue;\n }\n const otherPts = other.points;\n if (!otherPts || otherPts.length < 2) {\n continue;\n }\n for (const pathSegment of pathSegments) {\n for (const otherSegment of orthogonalSegmentsForPoints(otherPts, EPS4)) {\n if (orthogonalSegmentsCross(\n pathSegment.a,\n pathSegment.b,\n otherSegment.a,\n otherSegment.b,\n EPS4,\n EPS4\n )) {\n conflicts++;\n continue;\n }\n if (sameAxisSegmentOverlapLength(pathSegment, otherSegment, EPS4) >= MIN_SHARED2) {\n conflicts++;\n }\n }\n }\n }\n return conflicts;\n }, \"pathConflictCount\");\n const BEND_THRESHOLD = 4;\n const nearestSideOfRect = /* @__PURE__ */ __name((pt, info) => {\n const dTop = Math.abs(pt.y - info.rect.top);\n const dBottom = Math.abs(pt.y - info.rect.bottom);\n const dLeft = Math.abs(pt.x - info.rect.left);\n const dRight = Math.abs(pt.x - info.rect.right);\n let best = \"top\";\n let bestDist = dTop;\n if (dBottom < bestDist) {\n best = \"bottom\";\n bestDist = dBottom;\n }\n if (dLeft < bestDist) {\n best = \"left\";\n bestDist = dLeft;\n }\n if (dRight < bestDist) {\n best = \"right\";\n bestDist = dRight;\n }\n return best;\n }, \"nearestSideOfRect\");\n const faceClaims = /* @__PURE__ */ new Map();\n const addFaceClaim = /* @__PURE__ */ __name((nodeId, side, edgeId) => {\n const claims = faceClaims.get(nodeId) ?? [];\n claims.push({ side, edgeId });\n faceClaims.set(nodeId, claims);\n }, \"addFaceClaim\");\n for (const e of edges) {\n if (e.isLayoutOnly) {\n continue;\n }\n const pts = e.points ?? [];\n if (pts.length < 1) {\n continue;\n }\n const eId = e.id ?? \"\";\n const startId = e.start;\n const endId = e.end;\n if (startId) {\n const info = nodeInfoById.get(startId);\n if (info) {\n addFaceClaim(startId, nearestSideOfRect(pts[0], info), eId);\n }\n }\n if (endId) {\n const info = nodeInfoById.get(endId);\n if (info) {\n addFaceClaim(endId, nearestSideOfRect(pts[pts.length - 1], info), eId);\n }\n }\n }\n const faceIsClaimed = /* @__PURE__ */ __name((nodeId, side, ignoreEdgeId) => {\n return faceClaims.get(nodeId)?.some((c) => c.edgeId !== ignoreEdgeId && c.side === side) ?? false;\n }, \"faceIsClaimed\");\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n const currentBends = countOrthogonalBends(pts, EPS4);\n if (currentBends < BEND_THRESHOLD) {\n continue;\n }\n const srcId = edge.start;\n const dstId = edge.end;\n if (!srcId || !dstId) {\n continue;\n }\n const srcInfo = nodeInfoById.get(srcId);\n const dstInfo = nodeInfoById.get(dstId);\n if (!srcInfo || !dstInfo) {\n continue;\n }\n const edgeId = edge.id ?? \"\";\n const currentCrossingConflicts = pathConflictCount(pts, edge, true);\n const currentNonIncidentConflicts = pathConflictCount(pts, edge);\n let bestPath;\n let bestCrossingConflicts = currentCrossingConflicts;\n let bestBends = currentBends;\n for (const srcSide of sides) {\n if (faceIsClaimed(srcId, srcSide, edgeId)) {\n continue;\n }\n const srcPort = portForRectSide(srcInfo, srcSide);\n for (const dstSide of sides) {\n if (faceIsClaimed(dstId, dstSide, edgeId)) {\n continue;\n }\n const dstPort = portForRectSide(dstInfo, dstSide);\n for (const path of buildOrthogonalPathCandidates(srcPort, srcSide, dstPort, dstSide)) {\n if (pathHitsNode(path, [srcId, dstId])) {\n continue;\n }\n const pathBends = countOrthogonalBends(path, EPS4);\n if (currentCrossingConflicts > 0) {\n const pathCrossingConflicts = pathConflictCount(path, edge, true);\n if (pathCrossingConflicts > bestCrossingConflicts || pathCrossingConflicts === bestCrossingConflicts && pathBends >= bestBends) {\n continue;\n }\n bestCrossingConflicts = pathCrossingConflicts;\n bestBends = pathBends;\n bestPath = path;\n continue;\n }\n if (pathConflictCount(path, edge) > currentNonIncidentConflicts) {\n continue;\n }\n if (pathBends < bestBends) {\n bestBends = pathBends;\n bestPath = path;\n }\n }\n }\n }\n if (bestPath) {\n edge.points = bestPath;\n const refreshSrc = faceClaims.get(srcId);\n if (refreshSrc) {\n faceClaims.set(\n srcId,\n refreshSrc.filter((c) => c.edgeId !== edgeId)\n );\n }\n const refreshDst = faceClaims.get(dstId);\n if (refreshDst) {\n faceClaims.set(\n dstId,\n refreshDst.filter((c) => c.edgeId !== edgeId)\n );\n }\n addFaceClaim(srcId, nearestSideOfRect(bestPath[0], srcInfo), edgeId);\n addFaceClaim(dstId, nearestSideOfRect(bestPath[bestPath.length - 1], dstInfo), edgeId);\n }\n }\n}\n__name(simplifyDetouredEdges, \"simplifyDetouredEdges\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/labelAnchoring.ts\nvar EPS5 = 1e-3;\nvar MARKER_CLEARANCE_LENGTH = 10;\nvar MARKER_CLEARANCE_HALF_WIDTH = 7;\nfunction markerClearanceRectFor(pts, atStart) {\n const terminalIndex = atStart ? 0 : pts.length - 1;\n const step = atStart ? 1 : -1;\n const tip = pts[terminalIndex];\n const inner = pts[terminalIndex + step];\n if (!tip || !inner) {\n return void 0;\n }\n const dx = inner.x - tip.x;\n const dy = inner.y - tip.y;\n const len = Math.abs(dx) + Math.abs(dy);\n if (len < EPS5) {\n return void 0;\n }\n if (Math.abs(dy) <= EPS5) {\n const x2 = tip.x + Math.sign(dx) * MARKER_CLEARANCE_LENGTH;\n return {\n left: Math.min(tip.x, x2),\n right: Math.max(tip.x, x2),\n top: tip.y - MARKER_CLEARANCE_HALF_WIDTH,\n bottom: tip.y + MARKER_CLEARANCE_HALF_WIDTH\n };\n }\n if (Math.abs(dx) <= EPS5) {\n const y2 = tip.y + Math.sign(dy) * MARKER_CLEARANCE_LENGTH;\n return {\n left: tip.x - MARKER_CLEARANCE_HALF_WIDTH,\n right: tip.x + MARKER_CLEARANCE_HALF_WIDTH,\n top: Math.min(tip.y, y2),\n bottom: Math.max(tip.y, y2)\n };\n }\n return {\n left: Math.min(tip.x, inner.x),\n right: Math.max(tip.x, inner.x),\n top: Math.min(tip.y, inner.y),\n bottom: Math.max(tip.y, inner.y)\n };\n}\n__name(markerClearanceRectFor, \"markerClearanceRectFor\");\nfunction normalizeRect(rect) {\n return {\n left: Math.min(rect.left, rect.right),\n right: Math.max(rect.left, rect.right),\n top: Math.min(rect.top, rect.bottom),\n bottom: Math.max(rect.top, rect.bottom)\n };\n}\n__name(normalizeRect, \"normalizeRect\");\nfunction labelOverlapsOwnMarker(rect, pts) {\n const visiblePts = dedupeConsecutivePoints(pts);\n const startMarker = markerClearanceRectFor(visiblePts, true);\n const endMarker = markerClearanceRectFor(visiblePts, false);\n return [startMarker, endMarker].some(\n (marker) => marker && rectsOverlap(rect, normalizeRect(marker))\n );\n}\n__name(labelOverlapsOwnMarker, \"labelOverlapsOwnMarker\");\nfunction anchorLabelsToPolyline(edges, nodeByIdMap) {\n const allEdgeSegments = [];\n for (const other of edges) {\n if (other.isLayoutOnly) {\n continue;\n }\n const pts = other.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n for (let i = 0; i < pts.length - 1; i++) {\n allEdgeSegments.push({ edgeId: other.id, p1: pts[i], p2: pts[i + 1] });\n }\n }\n const foreignNodeRects = [];\n const laneGroups = [];\n for (const n of nodeByIdMap.values()) {\n const isGroup = n.isGroup;\n const parentId = n.parentId;\n if (isGroup && !parentId) {\n const rect2 = rectOfNodeBounds(n);\n if (rect2) {\n laneGroups.push({\n id: n.id,\n rect: rect2\n });\n }\n continue;\n }\n if (isGroup) {\n continue;\n }\n if (n.isEdgeLabel) {\n continue;\n }\n const rect = rectOfNodeBounds(n);\n if (!rect) {\n continue;\n }\n foreignNodeRects.push({\n nodeId: n.id,\n rect\n });\n }\n const LABEL_PLACEMENT_BUFFER = 3;\n const LABEL_LANE_MARGIN = 1;\n const LABEL_ENDPOINT_CLEARANCE = 12;\n const labelOverlapsForeignNode = /* @__PURE__ */ __name((labelId, rect) => {\n const buffered = inflateRect(rect, LABEL_PLACEMENT_BUFFER);\n for (const { nodeId, rect: nr } of foreignNodeRects) {\n if (nodeId === labelId) {\n continue;\n }\n if (rectsOverlap(buffered, nr)) {\n return true;\n }\n }\n return false;\n }, \"labelOverlapsForeignNode\");\n const labelOverlapsForeignEdge = /* @__PURE__ */ __name((edgeId, rect) => {\n const buffered = inflateRect(rect, LABEL_PLACEMENT_BUFFER);\n for (const s of allEdgeSegments) {\n if (s.edgeId === edgeId) {\n continue;\n }\n if (segmentBoundsOverlapRect(s.p1, s.p2, buffered)) {\n return true;\n }\n }\n return false;\n }, \"labelOverlapsForeignEdge\");\n const labelOverlapsAnything = /* @__PURE__ */ __name((labelId, edgeId, rect) => labelOverlapsForeignNode(labelId, rect) || labelOverlapsForeignEdge(edgeId, rect), \"labelOverlapsAnything\");\n const placedLabelRects = [];\n const findContainingLane = /* @__PURE__ */ __name((rect) => {\n for (const { id, rect: laneRect } of laneGroups) {\n if (rectContainsRect(laneRect, rect)) {\n return id;\n }\n }\n return void 0;\n }, \"findContainingLane\");\n const overlapsPlacedLabel = /* @__PURE__ */ __name((labelId, rect) => placedLabelRects.some(\n (placed) => placed.labelId !== labelId && rectsOverlap(rect, placed.rect)\n ), \"overlapsPlacedLabel\");\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const labelId = edge.labelNodeId;\n if (!labelId) {\n continue;\n }\n const labelNode = nodeByIdMap.get(labelId);\n if (!labelNode) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n const lw = labelNode.width ?? 0;\n const lh = labelNode.height ?? 0;\n if (lw <= 0 || lh <= 0) {\n continue;\n }\n const segments = [];\n for (let i = 0; i < pts.length - 1; i++) {\n const a = pts[i];\n const b = pts[i + 1];\n const dx = Math.abs(a.x - b.x);\n const dy = Math.abs(a.y - b.y);\n if (dx < EPS5 && dy < EPS5) {\n continue;\n }\n if (dx >= EPS5 && dy >= EPS5) {\n continue;\n }\n segments.push({\n idx: i,\n length: dx + dy,\n orientation: dx >= EPS5 ? \"horizontal\" : \"vertical\",\n midX: (a.x + b.x) / 2,\n midY: (a.y + b.y) / 2\n });\n }\n if (segments.length === 0) {\n continue;\n }\n const middleSegments = segments.length >= 3 ? segments.filter((s) => s.idx > 0 && s.idx < segments.length - 1) : segments;\n const poolBase = middleSegments.length > 0 ? middleSegments : segments;\n const labelLongAxis = lw >= lh ? \"horizontal\" : \"vertical\";\n const rankSegments = /* @__PURE__ */ __name((pool) => {\n return [...pool].sort((a, b) => {\n const aLongAxis = a.orientation === labelLongAxis;\n const bLongAxis = b.orientation === labelLongAxis;\n if (aLongAxis !== bLongAxis) {\n return aLongAxis ? -1 : 1;\n }\n const aFits = a.length >= (a.orientation === \"horizontal\" ? lw : lh) + 2;\n const bFits = b.length >= (b.orientation === \"horizontal\" ? lw : lh) + 2;\n if (aFits !== bFits) {\n return aFits ? -1 : 1;\n }\n return b.length - a.length;\n });\n }, \"rankSegments\");\n const firstVisibleSegment = segments[0];\n const lastVisibleSegment = segments[segments.length - 1];\n const ALONG_SEGMENT_TS = [0.5, 0.25, 0.75, 0.05, 0.95, 0.15, 0.85, 0.1, 0.9];\n const anchorAtT = /* @__PURE__ */ __name((seg, t) => {\n const a = pts[seg.idx];\n const b = pts[seg.idx + 1];\n return {\n midX: a.x + (b.x - a.x) * t,\n midY: a.y + (b.y - a.y) * t\n };\n }, \"anchorAtT\");\n const clamp = /* @__PURE__ */ __name((value, min, max) => Math.min(max, Math.max(min, value)), \"clamp\");\n const pointInsideRectInclusive = /* @__PURE__ */ __name((point, rect) => point.midX >= rect.left - EPS5 && point.midX <= rect.right + EPS5 && point.midY >= rect.top - EPS5 && point.midY <= rect.bottom + EPS5, \"pointInsideRectInclusive\");\n const placementForAnchor = /* @__PURE__ */ __name((anchor) => {\n const centeredRect = rectFromCenterSize(anchor.midX, anchor.midY, lw, lh);\n const centeredLane = findContainingLane(centeredRect);\n if (centeredLane) {\n return { laneId: centeredLane, anchor, rect: centeredRect };\n }\n const containingLane = laneGroups.find(({ rect }) => pointInsideRectInclusive(anchor, rect));\n if (!containingLane) {\n return void 0;\n }\n const minX = containingLane.rect.left + lw / 2 + LABEL_LANE_MARGIN;\n const maxX = containingLane.rect.right - lw / 2 - LABEL_LANE_MARGIN;\n const minY = containingLane.rect.top + lh / 2 + LABEL_LANE_MARGIN;\n const maxY = containingLane.rect.bottom - lh / 2 - LABEL_LANE_MARGIN;\n if (minX > maxX || minY > maxY) {\n return void 0;\n }\n const clampedAnchor = {\n midX: clamp(anchor.midX, minX, maxX),\n midY: clamp(anchor.midY, minY, maxY)\n };\n const clampedRect = rectFromCenterSize(clampedAnchor.midX, clampedAnchor.midY, lw, lh);\n return pointInsideRectInclusive(anchor, clampedRect) ? { laneId: containingLane.id, anchor: clampedAnchor, rect: clampedRect } : void 0;\n }, \"placementForAnchor\");\n const distanceAlongSegment = /* @__PURE__ */ __name((seg, anchor, endpoint) => seg.orientation === \"horizontal\" ? Math.abs(anchor.midX - endpoint.x) : Math.abs(anchor.midY - endpoint.y), \"distanceAlongSegment\");\n const labelClearsTerminalEndpoints = /* @__PURE__ */ __name((seg, anchor) => {\n const labelHalfExtent = seg.orientation === \"horizontal\" ? lw / 2 : lh / 2;\n const requiredDistance = labelHalfExtent + LABEL_ENDPOINT_CLEARANCE;\n if (seg === firstVisibleSegment) {\n const start = pts[seg.idx];\n if (distanceAlongSegment(seg, anchor, start) + EPS5 < requiredDistance) {\n return false;\n }\n }\n if (seg === lastVisibleSegment) {\n const end = pts[seg.idx + 1];\n if (distanceAlongSegment(seg, anchor, end) + EPS5 < requiredDistance) {\n return false;\n }\n }\n return true;\n }, \"labelClearsTerminalEndpoints\");\n const tryPool = /* @__PURE__ */ __name((pool) => {\n const rankedPool = rankSegments(pool);\n for (const seg of rankedPool) {\n for (const t of ALONG_SEGMENT_TS) {\n const anchor = anchorAtT(seg, t);\n if (!labelClearsTerminalEndpoints(seg, anchor)) {\n continue;\n }\n const placement = placementForAnchor(anchor);\n if (!placement) {\n continue;\n }\n if (labelOverlapsOwnMarker(placement.rect, pts)) {\n continue;\n }\n if (overlapsPlacedLabel(labelId, placement.rect)) {\n continue;\n }\n if (!labelOverlapsAnything(labelId, edge.id, placement.rect)) {\n return { laneId: placement.laneId, anchor: placement.anchor };\n }\n }\n }\n return void 0;\n }, \"tryPool\");\n const findLaneContainingFallback = /* @__PURE__ */ __name((pool, requireEndpointClearance, allowForeignEdgeOverlap = false) => {\n const rankedPool = rankSegments(pool);\n for (const seg of rankedPool) {\n const anchor = { midX: seg.midX, midY: seg.midY };\n if (requireEndpointClearance && !labelClearsTerminalEndpoints(seg, anchor)) {\n continue;\n }\n const placement = placementForAnchor(anchor);\n if (placement && !labelOverlapsOwnMarker(placement.rect, pts) && !overlapsPlacedLabel(labelId, placement.rect) && !labelOverlapsForeignNode(labelId, placement.rect) && (allowForeignEdgeOverlap || !labelOverlapsForeignEdge(edge.id, placement.rect))) {\n return { laneId: placement.laneId, anchor: placement.anchor };\n }\n }\n return void 0;\n }, \"findLaneContainingFallback\");\n const chosen = tryPool(poolBase) ?? (poolBase.length < segments.length ? tryPool(segments) : void 0) ?? findLaneContainingFallback(segments, true) ?? findLaneContainingFallback(segments, false) ?? findLaneContainingFallback(segments, false, true);\n if (chosen) {\n labelNode.x = chosen.anchor.midX;\n labelNode.y = chosen.anchor.midY;\n labelNode.parentId = chosen.laneId;\n const chosenRect = rectFromCenterSize(chosen.anchor.midX, chosen.anchor.midY, lw, lh);\n const priorIdx = placedLabelRects.findIndex((placed) => placed.labelId === labelId);\n if (priorIdx >= 0) {\n placedLabelRects[priorIdx] = { labelId, rect: chosenRect };\n } else {\n placedLabelRects.push({ labelId, rect: chosenRect });\n }\n }\n }\n}\n__name(anchorLabelsToPolyline, \"anchorLabelsToPolyline\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/siblingSharedFaceRouting.ts\nvar EPS6 = 1e-6;\nvar MIN_PORT_SPACING2 = 8;\nvar PORT_SHIFT2 = MIN_PORT_SPACING2 / 2;\nvar LABEL_CLEARANCE_BUFFER = 3;\nfunction pairKey(a, b) {\n return a < b ? `${a}::${b}` : `${b}::${a}`;\n}\n__name(pairKey, \"pairKey\");\nfunction straightenCollinearSiblingDetours(edges, nodes) {\n const { nodeInfoById, realNodeRects } = collectRealNodeBounds(nodes);\n const labelDimById = /* @__PURE__ */ new Map();\n for (const n of nodes) {\n const id = n.id;\n if (n.isGroup) {\n continue;\n }\n if (n.isEdgeLabel) {\n labelDimById.set(id, {\n w: n.width ?? 0,\n h: n.height ?? 0\n });\n continue;\n }\n }\n const labelClearanceFor = /* @__PURE__ */ __name((thisEdge, thisSrcId, thisDstId, axis) => {\n const targetPair = pairKey(thisSrcId, thisDstId);\n let maxHalf = 0;\n const consider = /* @__PURE__ */ __name((labelId) => {\n if (!labelId) {\n return;\n }\n const dim = labelDimById.get(labelId);\n if (!dim) {\n return;\n }\n const half = axis === \"x\" ? dim.w / 2 : dim.h / 2;\n if (half > maxHalf) {\n maxHalf = half;\n }\n }, \"consider\");\n consider(thisEdge.labelNodeId);\n for (const other of edges) {\n if (other === thisEdge) {\n continue;\n }\n if (other.isLayoutOnly) {\n continue;\n }\n const oSrc = other.start;\n const oDst = other.end;\n if (!oSrc || !oDst) {\n continue;\n }\n if (pairKey(oSrc, oDst) !== targetPair) {\n continue;\n }\n consider(other.labelNodeId);\n }\n return maxHalf > 0 ? maxHalf + LABEL_CLEARANCE_BUFFER : 0;\n }, \"labelClearanceFor\");\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!classifyThreeSegmentRoute(pts, EPS6)) {\n continue;\n }\n const nodePair = getNodePairGeometry(edge, nodeInfoById, EPS6);\n if (!nodePair) {\n continue;\n }\n const { srcId, dstId, srcInfo, dstInfo, collinearX, collinearY } = nodePair;\n if (collinearX === collinearY) {\n continue;\n }\n let targetSrc;\n let targetDst;\n if (collinearX) {\n const dstBelow = dstInfo.cy > srcInfo.cy;\n targetSrc = { x: srcInfo.cx, y: dstBelow ? srcInfo.rect.bottom : srcInfo.rect.top };\n targetDst = { x: dstInfo.cx, y: dstBelow ? dstInfo.rect.top : dstInfo.rect.bottom };\n } else {\n const dstEast = dstInfo.cx > srcInfo.cx;\n targetSrc = { x: dstEast ? srcInfo.rect.right : srcInfo.rect.left, y: srcInfo.cy };\n targetDst = { x: dstEast ? dstInfo.rect.left : dstInfo.rect.right, y: dstInfo.cy };\n }\n if (segmentHitsAnyRect(targetSrc, targetDst, realNodeRects, [srcId, dstId], 1)) {\n continue;\n }\n const shiftAxis = collinearX ? \"x\" : \"y\";\n const labelShift = labelClearanceFor(edge, srcId, dstId, shiftAxis);\n const effectiveShift = labelShift > PORT_SHIFT2 ? labelShift : PORT_SHIFT2;\n const deltas = [0, effectiveShift, -effectiveShift];\n for (const delta of deltas) {\n const shiftedSrc = { ...targetSrc };\n const shiftedDst = { ...targetDst };\n if (collinearX) {\n shiftedSrc.x += delta;\n shiftedDst.x += delta;\n if (shiftedSrc.x <= srcInfo.rect.left || shiftedSrc.x >= srcInfo.rect.right) {\n continue;\n }\n if (shiftedDst.x <= dstInfo.rect.left || shiftedDst.x >= dstInfo.rect.right) {\n continue;\n }\n } else {\n shiftedSrc.y += delta;\n shiftedDst.y += delta;\n if (shiftedSrc.y <= srcInfo.rect.top || shiftedSrc.y >= srcInfo.rect.bottom) {\n continue;\n }\n if (shiftedDst.y <= dstInfo.rect.top || shiftedDst.y >= dstInfo.rect.bottom) {\n continue;\n }\n }\n if (segmentHitsAnyRect(shiftedSrc, shiftedDst, realNodeRects, [srcId, dstId], 1)) {\n continue;\n }\n if (segmentConflictsWithAnyEdge(shiftedSrc, shiftedDst, edges, edge, { epsilon: EPS6 })) {\n continue;\n }\n edge.points = [shiftedSrc, shiftedDst];\n break;\n }\n }\n}\n__name(straightenCollinearSiblingDetours, \"straightenCollinearSiblingDetours\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/sharedTrackNudging.ts\nfunction nudgeSharedInteriorSubpaths(edges, nodeByIdMap) {\n const EPS_LOCAL2 = 1e-3;\n const MIN_SHARED3 = 8;\n const TRACK_SHIFT = 7;\n const MIN_TRACK_GAP = TRACK_SHIFT;\n const SOURCE_DETOUR_STUB = 20;\n const BUFFER = 2;\n const MAX_ITERATIONS = 12;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const segmentsFor2 = /* @__PURE__ */ __name((edge, points) => {\n return orthogonalSegmentsForPoints(points, EPS_LOCAL2).map((segment) => ({\n ...segment,\n edge,\n interior: segment.index >= 1 && segment.index <= points.length - 3\n }));\n }, \"segmentsFor\");\n const allSegments = /* @__PURE__ */ __name(() => {\n const result = [];\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = edge.points;\n if (!points || points.length < 2) {\n continue;\n }\n result.push(...segmentsFor2(edge, dedupeConsecutivePoints(points)));\n }\n return result;\n }, \"allSegments\");\n const hasCrowdedParallelTrack = /* @__PURE__ */ __name((a, b) => {\n if (a.horizontal && b.horizontal) {\n return overlapLength(a.a.x, a.b.x, b.a.x, b.b.x) >= MIN_SHARED3 && Math.abs(a.a.y - b.a.y) < MIN_TRACK_GAP;\n }\n if (a.vertical && b.vertical) {\n return overlapLength(a.a.y, a.b.y, b.a.y, b.b.y) >= MIN_SHARED3 && Math.abs(a.a.x - b.a.x) < MIN_TRACK_GAP;\n }\n return false;\n }, \"hasCrowdedParallelTrack\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate) => {\n const sourceId = edge.start;\n const targetId = edge.end;\n const candidateSegments = segmentsFor2(edge, candidate);\n if (candidateSegments.length !== candidate.length - 1) {\n return false;\n }\n const endpointIds = [sourceId, targetId].filter((id) => Boolean(id));\n const ownLabelIds = edge.labelNodeId ? [edge.labelNodeId] : [];\n for (const segment of candidateSegments) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, ownLabelIds, -BUFFER)) {\n return false;\n }\n }\n for (const other of edges) {\n if (other === edge || other.isLayoutOnly) {\n continue;\n }\n const otherPoints = other.points;\n if (!otherPoints || otherPoints.length < 2) {\n continue;\n }\n for (const candidateSegment of candidateSegments) {\n for (const otherSegment of segmentsFor2(other, dedupeConsecutivePoints(otherPoints))) {\n if (hasCrowdedParallelTrack(candidateSegment, otherSegment)) {\n return false;\n }\n if (orthogonalSegmentsStrictlyCross(\n candidateSegment.a,\n candidateSegment.b,\n otherSegment.a,\n otherSegment.b,\n EPS_LOCAL2\n )) {\n return false;\n }\n }\n }\n }\n return true;\n }, \"candidateIsSafe\");\n const shiftedCandidate = /* @__PURE__ */ __name((segment, shift) => {\n const points = dedupeConsecutivePoints(segment.edge.points ?? []);\n if (points.length < 4 || segment.index >= points.length - 1) {\n return void 0;\n }\n const candidate = points.map((p) => ({ ...p }));\n if (segment.horizontal) {\n candidate[segment.index].y += shift;\n candidate[segment.index + 1].y += shift;\n } else if (segment.vertical) {\n candidate[segment.index].x += shift;\n candidate[segment.index + 1].x += shift;\n } else {\n return void 0;\n }\n return segmentsFor2(segment.edge, candidate).length === candidate.length - 1 ? candidate : void 0;\n }, \"shiftedCandidate\");\n const nodeCenter = /* @__PURE__ */ __name((node, rect) => ({\n x: node.x ?? (rect.left + rect.right) / 2,\n y: node.y ?? (rect.top + rect.bottom) / 2\n }), \"nodeCenter\");\n const sourceDetourContextFor = /* @__PURE__ */ __name((segment) => {\n const edge = segment.edge;\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length !== 4 || segment.index !== 1) {\n return void 0;\n }\n const sourceNode = edge.start ? nodeByIdMap.get(edge.start) : void 0;\n const targetNode = edge.end ? nodeByIdMap.get(edge.end) : void 0;\n const sourceRect = sourceNode ? rectOfNodeBounds(sourceNode) : void 0;\n const targetRect = targetNode ? rectOfNodeBounds(targetNode) : void 0;\n const tail = points.slice(segment.index + 2);\n if (!sourceNode || !targetNode || !sourceRect || !targetRect || tail.length === 0) {\n return void 0;\n }\n return {\n sourceCenter: nodeCenter(sourceNode, sourceRect),\n targetCenter: nodeCenter(targetNode, targetRect),\n sourceRect,\n tail\n };\n }, \"sourceDetourContextFor\");\n const verticalSourceDetour = /* @__PURE__ */ __name((segment, shift, sourceCenter, targetCenter, sourceRect, tail) => {\n const targetBelow = targetCenter.y >= sourceCenter.y;\n const sourcePortY = targetBelow ? sourceRect.bottom : sourceRect.top;\n const stubY = sourcePortY + (targetBelow ? SOURCE_DETOUR_STUB : -SOURCE_DETOUR_STUB);\n if (targetBelow && segment.b.y <= stubY + EPS_LOCAL2 || !targetBelow && segment.b.y >= stubY - EPS_LOCAL2) {\n return void 0;\n }\n const railX = segment.a.x + shift;\n return dedupeConsecutivePoints(\n [\n { x: sourceCenter.x, y: sourcePortY },\n { x: sourceCenter.x, y: stubY },\n { x: railX, y: stubY },\n { x: railX, y: segment.b.y },\n ...tail\n ],\n EPS_LOCAL2\n );\n }, \"verticalSourceDetour\");\n const horizontalSourceDetour = /* @__PURE__ */ __name((segment, shift, sourceCenter, targetCenter, sourceRect, tail) => {\n const targetRight = targetCenter.x >= sourceCenter.x;\n const sourcePortX = targetRight ? sourceRect.right : sourceRect.left;\n const stubX = sourcePortX + (targetRight ? SOURCE_DETOUR_STUB : -SOURCE_DETOUR_STUB);\n if (targetRight && segment.b.x <= stubX + EPS_LOCAL2 || !targetRight && segment.b.x >= stubX - EPS_LOCAL2) {\n return void 0;\n }\n const railY = segment.a.y + shift;\n return dedupeConsecutivePoints(\n [\n { x: sourcePortX, y: sourceCenter.y },\n { x: stubX, y: sourceCenter.y },\n { x: stubX, y: railY },\n { x: segment.b.x, y: railY },\n ...tail\n ],\n EPS_LOCAL2\n );\n }, \"horizontalSourceDetour\");\n const sourceDetourCandidate = /* @__PURE__ */ __name((segment, shift) => {\n const context = sourceDetourContextFor(segment);\n if (!context) {\n return void 0;\n }\n if (segment.vertical) {\n return verticalSourceDetour(\n segment,\n shift,\n context.sourceCenter,\n context.targetCenter,\n context.sourceRect,\n context.tail\n );\n }\n if (segment.horizontal) {\n return horizontalSourceDetour(\n segment,\n shift,\n context.sourceCenter,\n context.targetCenter,\n context.sourceRect,\n context.tail\n );\n }\n return void 0;\n }, \"sourceDetourCandidate\");\n const shifts = [\n -TRACK_SHIFT,\n TRACK_SHIFT,\n -2 * TRACK_SHIFT,\n 2 * TRACK_SHIFT,\n -3 * TRACK_SHIFT,\n 3 * TRACK_SHIFT\n ];\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const segments = allSegments();\n let fixed = false;\n for (let i = 0; i < segments.length && !fixed; i++) {\n for (let j = i + 1; j < segments.length && !fixed; j++) {\n const first = segments[i];\n const second = segments[j];\n if (first.edge === second.edge || !hasCrowdedParallelTrack(first, second)) {\n continue;\n }\n const candidates = [first, second].filter((segment) => segment.interior);\n for (const segment of candidates) {\n for (const shift of shifts) {\n const direct = shiftedCandidate(segment, shift);\n if (direct && candidateIsSafe(segment.edge, direct)) {\n segment.edge.points = direct;\n fixed = true;\n break;\n }\n const detoured = sourceDetourCandidate(segment, shift);\n if (detoured && candidateIsSafe(segment.edge, detoured)) {\n segment.edge.points = detoured;\n fixed = true;\n break;\n }\n }\n if (fixed) {\n break;\n }\n }\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(nudgeSharedInteriorSubpaths, \"nudgeSharedInteriorSubpaths\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/validation.ts\nfunction segmentsIntersect(p1, p2, p3, p4) {\n const d1x = p2.x - p1.x;\n const d1y = p2.y - p1.y;\n const d2x = p4.x - p3.x;\n const d2y = p4.y - p3.y;\n const cross = d1x * d2y - d1y * d2x;\n if (Math.abs(cross) < 1e-10) {\n return false;\n }\n const dx = p3.x - p1.x;\n const dy = p3.y - p1.y;\n const t = (dx * d2y - dy * d2x) / cross;\n const u = (dx * d1y - dy * d1x) / cross;\n const eps = 0.01;\n return t > eps && t < 1 - eps && u > eps && u < 1 - eps;\n}\n__name(segmentsIntersect, \"segmentsIntersect\");\nfunction validateSwimlanesLayout(layout) {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const issues = [];\n if (!edges.length || !nodes.length) {\n return issues;\n }\n const nodeRects = collectLayoutNodeRects(nodes);\n const epsilon = 1;\n const edgeSegments = [];\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = edge.points;\n if (!points || points.length < 2) {\n continue;\n }\n const edgeStart = edge.start;\n const edgeEnd = edge.end;\n const ownLabelId = edge.labelNodeId;\n const edgeId = edge.id ?? `${edgeStart}->${edgeEnd}`;\n for (const rect of nodeRects) {\n if (rect.nodeId === edgeStart || rect.nodeId === edgeEnd) {\n continue;\n }\n if (ownLabelId && rect.nodeId === ownLabelId) {\n continue;\n }\n for (let i = 0; i < points.length - 1; i++) {\n if (segmentBoundsOverlapRect(points[i], points[i + 1], rect, -epsilon)) {\n issues.push({\n type: \"edge-node-overlap\",\n edgeId,\n targetId: rect.nodeId,\n detail: `segment ${i} passes through node \"${rect.nodeId}\"`\n });\n break;\n }\n }\n }\n for (let i = 0; i < points.length - 1; i++) {\n edgeSegments.push({\n edgeId,\n start: edgeStart,\n end: edgeEnd,\n p1: points[i],\n p2: points[i + 1]\n });\n }\n }\n const crossingPairs = /* @__PURE__ */ new Set();\n for (let i = 0; i < edgeSegments.length; i++) {\n for (let j = i + 1; j < edgeSegments.length; j++) {\n const a = edgeSegments[i];\n const b = edgeSegments[j];\n if (a.edgeId === b.edgeId) {\n continue;\n }\n if (a.start === b.start || a.start === b.end || a.end === b.start || a.end === b.end) {\n continue;\n }\n if (segmentsIntersect(a.p1, a.p2, b.p1, b.p2)) {\n const pairKey2 = a.edgeId < b.edgeId ? `${a.edgeId}|${b.edgeId}` : `${b.edgeId}|${a.edgeId}`;\n if (!crossingPairs.has(pairKey2)) {\n crossingPairs.add(pairKey2);\n issues.push({\n type: \"edge-edge-crossing\",\n edgeId: a.edgeId,\n targetId: b.edgeId,\n detail: `edges \"${a.edgeId}\" and \"${b.edgeId}\" cross`\n });\n }\n }\n }\n }\n if (issues.length > 0) {\n const overlaps = issues.filter((i) => i.type === \"edge-node-overlap\").length;\n const crossings = issues.filter((i) => i.type === \"edge-edge-crossing\").length;\n log.warn(\n `[SWIMLANE_VALIDATE] ${issues.length} issue(s) detected: ${overlaps} edge-node overlap(s), ${crossings} edge crossing(s)`\n );\n for (const issue of issues) {\n log.warn(`[SWIMLANE_VALIDATE] ${issue.type}: ${issue.detail}`);\n }\n }\n return issues;\n}\n__name(validateSwimlanesLayout, \"validateSwimlanesLayout\");\n\n// src/rendering-util/layout-algorithms/swimlanes/postProcessing.ts\nfunction postProcessSwimlaneLayout(layout, direction) {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const contentNodes = nodes.filter((n) => !n.isGroup);\n if ((direction === \"LR\" || direction === \"RL\") && contentNodes.length > 0 && !applyLrDirectionTransform(layout, direction)) {\n return;\n }\n if (direction === \"BT\" && contentNodes.length > 0 && !applyBtDirectionTransform(layout)) {\n return;\n }\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n edge.points = simplifyPolyline(\n orthogonalizePolyline(pts)\n );\n }\n simplifyDetouredEdges(edges, nodes);\n straightenCollinearSiblingDetours(edges, nodes);\n portSwapToLShape(edges, nodes);\n const nodeByIdMap = /* @__PURE__ */ new Map();\n for (const n of nodes) {\n nodeByIdMap.set(String(n.id), n);\n }\n anchorLabelsToPolyline(edges, nodeByIdMap);\n clipEdgeEndpointsToNodeBoundaries(edges, nodeByIdMap);\n collapseShortTerminalStub(edges, nodeByIdMap);\n nudgeSharedInteriorSubpaths(edges, nodeByIdMap);\n separateSharedRenderedTerminalLanes(edges, nodeByIdMap);\n collapseRedundantRectangularDoglegs(edges, nodeByIdMap);\n liftObstacleHuggingSameSideRails(edges, nodeByIdMap);\n swapDestinationTerminalTailsToReduceCrossings(edges, nodeByIdMap);\n const finalizeRenderedEdges = /* @__PURE__ */ __name(() => {\n resolveRenderedOrthogonalCrossings(edges, nodeByIdMap);\n reassignCrossingExternalRailChannels(edges, nodeByIdMap);\n shortcutRedundantOrthogonalJogs(edges, nodeByIdMap);\n anchorLabelsToPolyline(edges, nodeByIdMap);\n prepareEdgeEndpointsForRenderer(edges, nodeByIdMap);\n liftObstacleHuggingSameSideRails(edges, nodeByIdMap);\n anchorLabelsToPolyline(edges, nodeByIdMap);\n prepareEdgeEndpointsForRenderer(edges, nodeByIdMap);\n }, \"finalizeRenderedEdges\");\n finalizeRenderedEdges();\n nudgeSharedInteriorSubpaths(edges, nodeByIdMap);\n finalizeRenderedEdges();\n liftTopLaneTitleBandsAboveRails(edges, nodeByIdMap);\n shiftLeftLaneTitleBandsLeftOfRails(edges, nodeByIdMap);\n liftTopLaneTitleBandsAboveRails(edges, nodeByIdMap);\n shiftLeftLaneTitleBandsLeftOfRails(edges, nodeByIdMap);\n}\n__name(postProcessSwimlaneLayout, \"postProcessSwimlaneLayout\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase0.helpers.ts\nfunction normalizeGraph(g) {\n const nodeById = new Map(g.nodeById);\n const seen = /* @__PURE__ */ new Set();\n const edges = [];\n for (const e of g.edges) {\n if (!nodeById.has(e.src) || !nodeById.has(e.dst)) {\n continue;\n }\n const key = `${e.id}:${e.src}->${e.dst}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n edges.push(e);\n }\n const nodes = [...nodeById.keys()];\n return { nodes, edges, layout: g.layout, nodeById };\n}\n__name(normalizeGraph, \"normalizeGraph\");\nfunction incoming(g, v) {\n return g.edges.filter((e) => e.dst === v);\n}\n__name(incoming, \"incoming\");\nfunction buildSuccessorMap(g) {\n const succs = /* @__PURE__ */ new Map();\n for (const v of g.nodes) {\n succs.set(v, []);\n }\n for (const e of g.edges) {\n succs.get(e.src).push(e.dst);\n }\n return succs;\n}\n__name(buildSuccessorMap, \"buildSuccessorMap\");\nfunction buildSortedSuccessorMap(g) {\n const succs = buildSuccessorMap(g);\n for (const successors of succs.values()) {\n successors.sort((a, b) => a.localeCompare(b));\n }\n return succs;\n}\n__name(buildSortedSuccessorMap, \"buildSortedSuccessorMap\");\nfunction buildInDegreeMap(g) {\n const indeg = /* @__PURE__ */ new Map();\n for (const v of g.nodes) {\n indeg.set(v, 0);\n }\n for (const e of g.edges) {\n indeg.set(e.dst, (indeg.get(e.dst) ?? 0) + 1);\n }\n return indeg;\n}\n__name(buildInDegreeMap, \"buildInDegreeMap\");\nfunction sortedZeroInDegreeNodes(indeg) {\n return [...indeg.entries()].filter(([, degree]) => degree === 0).map(([id]) => id).sort((a, b) => a.localeCompare(b));\n}\n__name(sortedZeroInDegreeNodes, \"sortedZeroInDegreeNodes\");\nfunction buildPredecessorSuccessorMaps(g, includeEdge = () => true) {\n const preds = /* @__PURE__ */ new Map();\n const succs = /* @__PURE__ */ new Map();\n for (const v of g.nodes) {\n preds.set(v, []);\n succs.set(v, []);\n }\n for (const e of g.edges) {\n if (!includeEdge(e)) {\n continue;\n }\n succs.get(e.src).push(e.dst);\n preds.get(e.dst).push(e.src);\n }\n return { preds, succs };\n}\n__name(buildPredecessorSuccessorMaps, \"buildPredecessorSuccessorMaps\");\nfunction buildLayersFromRanks(g, order, rankOf, opts) {\n let maxRank = 0;\n for (const v of g.nodes) {\n if (opts?.skipGroups && g.nodeById.get(v)?.isGroup) {\n continue;\n }\n maxRank = Math.max(maxRank, rankOf[v] ?? 0);\n }\n const layers = Array.from({ length: maxRank + 1 }, () => []);\n for (const v of order) {\n if (opts?.skipGroups && g.nodeById.get(v)?.isGroup) {\n continue;\n }\n layers[Math.max(0, rankOf[v] ?? 0)].push(v);\n }\n return layers;\n}\n__name(buildLayersFromRanks, \"buildLayersFromRanks\");\nfunction topoSortIfAcyclic(g) {\n const indeg = buildInDegreeMap(g);\n const queue = sortedZeroInDegreeNodes(indeg);\n const order = [];\n const adj = buildSortedSuccessorMap(g);\n while (queue.length) {\n const u = queue.shift();\n order.push(u);\n for (const v of adj.get(u) ?? []) {\n indeg.set(v, (indeg.get(v) ?? 0) - 1);\n if ((indeg.get(v) ?? 0) === 0) {\n let i = 0;\n while (i < queue.length && queue[i] < v) {\n i++;\n }\n queue.splice(i, 0, v);\n }\n }\n }\n return order.length === g.nodes.length ? order : null;\n}\n__name(topoSortIfAcyclic, \"topoSortIfAcyclic\");\nfunction buildLayerIndex(layer) {\n const m = /* @__PURE__ */ new Map();\n let index = 0;\n for (const id of layer) {\n m.set(id, index);\n index++;\n }\n return m;\n}\n__name(buildLayerIndex, \"buildLayerIndex\");\nfunction countInversions(values) {\n const tmp = new Array(values.length);\n const count = /* @__PURE__ */ __name((left, right) => {\n if (right - left <= 1) {\n return 0;\n }\n const mid = left + right >> 1;\n let inversions = count(left, mid) + count(mid, right);\n let i = left;\n let j = mid;\n let k = left;\n while (i < mid || j < right) {\n if (j >= right || i < mid && values[i] <= values[j]) {\n tmp[k++] = values[i++];\n } else {\n tmp[k++] = values[j++];\n inversions += mid - i;\n }\n }\n for (let t = left; t < right; t++) {\n values[t] = tmp[t];\n }\n return inversions;\n }, \"count\");\n return count(0, values.length);\n}\n__name(countInversions, \"countInversions\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase1.cycles.ts\nfunction removeCycles_DFS(g) {\n const gn = normalizeGraph(g);\n const adj = /* @__PURE__ */ new Map();\n for (const v of gn.nodes) {\n adj.set(v, []);\n }\n for (const e of gn.edges) {\n adj.get(e.src).push(e);\n }\n for (const arr of adj.values()) {\n arr.sort((a, b) => a.dst === b.dst ? a.id.localeCompare(b.id) : a.dst.localeCompare(b.dst));\n }\n const color = /* @__PURE__ */ Object.create(null);\n for (const v of gn.nodes) {\n color[v] = 0;\n }\n const reversed = [];\n const dfs = /* @__PURE__ */ __name((u) => {\n color[u] = 1;\n for (const e of adj.get(u) ?? []) {\n const v = e.dst;\n if (color[v] === 0) {\n dfs(v);\n } else if (color[v] === 1) {\n reversed.push(e);\n }\n }\n color[u] = 2;\n }, \"dfs\");\n const nodesSorted = [...gn.nodes].sort((a, b) => a.localeCompare(b));\n for (const v of nodesSorted) {\n if (color[v] === 0) {\n dfs(v);\n }\n }\n const toReverse = new Set(reversed.map((e) => `${e.id}:${e.src}->${e.dst}`));\n const acycEdges = gn.edges.map(\n (e) => toReverse.has(`${e.id}:${e.src}->${e.dst}`) ? { id: e.id, src: e.dst, dst: e.src, weight: e.weight, ref: e.ref } : e\n );\n const acyclic = {\n nodes: [...gn.nodes],\n edges: acycEdges,\n layout: gn.layout,\n nodeById: new Map(gn.nodeById)\n };\n return { acyclic, reversed };\n}\n__name(removeCycles_DFS, \"removeCycles_DFS\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.options.ts\nfunction buildTopLaneMap(g) {\n const cache = /* @__PURE__ */ new Map();\n const resolve = /* @__PURE__ */ __name((id) => {\n if (cache.has(id)) {\n return cache.get(id);\n }\n const node = g.nodeById.get(id);\n if (!node) {\n cache.set(id, null);\n return null;\n }\n const parentId = node.parentId;\n if (!parentId) {\n cache.set(id, null);\n return null;\n }\n const parentLane = resolve(parentId);\n const lane = parentLane ?? parentId;\n cache.set(id, lane);\n return lane;\n }, \"resolve\");\n for (const id of g.nodes) {\n resolve(id);\n }\n return cache;\n}\n__name(buildTopLaneMap, \"buildTopLaneMap\");\nfunction createTopLaneResolver(g) {\n const topLaneMap = buildTopLaneMap(g);\n return (id) => topLaneMap.get(id) ?? null;\n}\n__name(createTopLaneResolver, \"createTopLaneResolver\");\nfunction buildTopLaneOrder(g) {\n const lanes = [];\n for (const node of g.layout.nodes ?? []) {\n if (node.isGroup && !node.parentId) {\n lanes.push(node.id);\n }\n }\n return [...new Set(lanes)].reverse();\n}\n__name(buildTopLaneOrder, \"buildTopLaneOrder\");\nfunction resolveTopLaneOrder(g, preferredOrder) {\n const sourceOrder = buildTopLaneOrder(g);\n if (!preferredOrder || preferredOrder.length === 0) {\n return sourceOrder;\n }\n const sourceLaneIds = new Set(sourceOrder);\n const seen = /* @__PURE__ */ new Set();\n const resolved = [];\n for (const laneId of preferredOrder) {\n if (!sourceLaneIds.has(laneId) || seen.has(laneId)) {\n continue;\n }\n seen.add(laneId);\n resolved.push(laneId);\n }\n for (const laneId of sourceOrder) {\n if (seen.has(laneId)) {\n continue;\n }\n resolved.push(laneId);\n }\n return resolved;\n}\n__name(resolveTopLaneOrder, \"resolveTopLaneOrder\");\n\n// src/rendering-util/layout-algorithms/swimlanes/config.ts\nvar PRECISION = {\n /** Epsilon for floating-point comparisons */\n EPSILON: 1e-6\n};\nvar LAYERING = {\n /** Default number of iterations for gravity-based layering */\n GRAVITY_ITERATIONS: 8,\n /** Maximum number of passes for crossing-based rank optimization */\n MAX_CROSSING_OPTIMIZATION_PASSES: 4,\n /** Whether to compact single-input nodes by default */\n DEFAULT_COMPACT_SINGLE_INPUT: true\n};\nvar COORDINATES = {\n /** Default vertical gap between layers (px) */\n DEFAULT_LAYER_GAP: 100,\n /** Default horizontal gap between nodes (px) */\n DEFAULT_NODE_GAP: 40\n};\n\n// src/rendering-util/layout-algorithms/swimlanes/driving-tree.ts\nfunction buildDrivingTree(graph, opts) {\n const g = normalizeGraph(graph);\n const laneOf = opts?.laneOf ?? (() => null);\n const rankHint = opts?.rankHint;\n const { preds } = buildPredecessorSuccessorMaps(g);\n for (const arr of preds.values()) {\n arr.sort((a, b) => a.localeCompare(b));\n }\n const topoOrder = topoSortIfAcyclic(g) ?? [...g.nodes].sort((a, b) => a.localeCompare(b));\n const topoIndex = /* @__PURE__ */ new Map();\n for (const [idx, id] of topoOrder.entries()) {\n topoIndex.set(id, idx);\n }\n const parent = /* @__PURE__ */ new Map();\n const children = /* @__PURE__ */ new Map();\n for (const node of g.nodes) {\n children.set(node, []);\n }\n for (const node of topoOrder) {\n const candidates = (preds.get(node) ?? []).filter((p) => parent.has(p));\n if (candidates.length > 0) {\n const chosen = chooseParent(node, candidates, {\n laneOf,\n rankHint,\n topoIndex\n });\n parent.set(node, chosen);\n children.get(chosen).push(node);\n } else if (!parent.has(node)) {\n parent.set(node, null);\n }\n }\n for (const node of g.nodes) {\n if (!parent.has(node)) {\n parent.set(node, null);\n }\n }\n const rootSet = /* @__PURE__ */ new Set();\n for (const node of g.nodes) {\n if ((parent.get(node) ?? null) === null) {\n rootSet.add(node);\n }\n }\n const roots = [...rootSet].sort((a, b) => {\n const ta = topoIndex.get(a) ?? 0;\n const tb = topoIndex.get(b) ?? 0;\n if (ta === tb) {\n return a.localeCompare(b);\n }\n return ta - tb;\n });\n const adjacency = buildAdjacency(g);\n const adjacencyList = /* @__PURE__ */ new Map();\n for (const [node, set] of adjacency.entries()) {\n adjacencyList.set(\n node,\n [...set].sort((a, b) => a.localeCompare(b))\n );\n }\n const componentOf = assignComponents(adjacencyList);\n const blocks = computeBlocks(adjacencyList);\n const nodeBlocks = /* @__PURE__ */ new Map();\n for (const node of g.nodes) {\n nodeBlocks.set(node, []);\n }\n for (const block of blocks) {\n for (const node of block.nodes) {\n const list = nodeBlocks.get(node);\n if (list) {\n list.push(block.id);\n } else {\n nodeBlocks.set(node, [block.id]);\n }\n }\n }\n const preorder = [];\n const postorder = [];\n const seen = /* @__PURE__ */ new Set();\n const walk = /* @__PURE__ */ __name((node) => {\n if (seen.has(node)) {\n return;\n }\n seen.add(node);\n preorder.push(node);\n for (const child of children.get(node) ?? []) {\n walk(child);\n }\n postorder.push(node);\n }, \"walk\");\n for (const root of roots) {\n walk(root);\n }\n for (const node of topoOrder) {\n walk(node);\n }\n return {\n parent,\n children,\n roots,\n componentOf,\n blocks,\n nodeBlocks,\n adjacency: adjacencyList,\n preorder,\n postorder,\n topologicalOrder: topoOrder\n };\n}\n__name(buildDrivingTree, \"buildDrivingTree\");\nfunction chooseParent(node, candidates, ctx) {\n const laneNode = ctx.laneOf(node);\n const sorted = [...candidates].sort((a, b) => {\n const laneA = ctx.laneOf(a);\n const laneB = ctx.laneOf(b);\n const sameLaneA = laneA != null && laneA === laneNode;\n const sameLaneB = laneB != null && laneB === laneNode;\n if (sameLaneA !== sameLaneB) {\n return sameLaneA ? -1 : 1;\n }\n const rankA = ctx.rankHint?.[a];\n const rankB = ctx.rankHint?.[b];\n if (rankA != null && rankB != null && rankA !== rankB) {\n return rankB - rankA;\n }\n const idxA = ctx.topoIndex.get(a) ?? 0;\n const idxB = ctx.topoIndex.get(b) ?? 0;\n if (idxA !== idxB) {\n return idxA - idxB;\n }\n return a.localeCompare(b);\n });\n return sorted[0];\n}\n__name(chooseParent, \"chooseParent\");\nfunction buildAdjacency(g) {\n const adjacency = /* @__PURE__ */ new Map();\n for (const node of g.nodes) {\n adjacency.set(node, /* @__PURE__ */ new Set());\n }\n for (const e of g.edges) {\n adjacency.get(e.src).add(e.dst);\n adjacency.get(e.dst).add(e.src);\n }\n return adjacency;\n}\n__name(buildAdjacency, \"buildAdjacency\");\nfunction assignComponents(adjacency) {\n const componentOf = /* @__PURE__ */ new Map();\n let componentId = 0;\n for (const node of adjacency.keys()) {\n if (componentOf.has(node)) {\n continue;\n }\n const stack = [node];\n while (stack.length > 0) {\n const cur = stack.pop();\n if (componentOf.has(cur)) {\n continue;\n }\n componentOf.set(cur, componentId);\n for (const next of adjacency.get(cur) ?? []) {\n if (!componentOf.has(next)) {\n stack.push(next);\n }\n }\n }\n componentId++;\n }\n return componentOf;\n}\n__name(assignComponents, \"assignComponents\");\nfunction computeBlocks(adjacency) {\n const discovery = /* @__PURE__ */ new Map();\n const low = /* @__PURE__ */ new Map();\n const edgeStack = [];\n const blocks = [];\n let time = 0;\n const visit = /* @__PURE__ */ __name((node, parent) => {\n discovery.set(node, ++time);\n low.set(node, time);\n for (const next of adjacency.get(node) ?? []) {\n if (next === parent) {\n continue;\n }\n if (!discovery.has(next)) {\n edgeStack.push([node, next]);\n visit(next, node);\n low.set(node, Math.min(low.get(node) ?? time, low.get(next) ?? time));\n if ((low.get(next) ?? 0) >= (discovery.get(node) ?? 0)) {\n blocks.push(popBlock(node, next, edgeStack, blocks.length));\n }\n } else if ((discovery.get(next) ?? 0) < (discovery.get(node) ?? 0)) {\n edgeStack.push([node, next]);\n low.set(node, Math.min(low.get(node) ?? time, discovery.get(next) ?? time));\n }\n }\n }, \"visit\");\n for (const node of adjacency.keys()) {\n if (!discovery.has(node)) {\n visit(node, null);\n }\n }\n return blocks;\n}\n__name(computeBlocks, \"computeBlocks\");\nfunction popBlock(u, v, stack, id) {\n const edges = [];\n const nodes = /* @__PURE__ */ new Set();\n while (stack.length > 0) {\n const edge = stack.pop();\n edges.push(edge);\n nodes.add(edge[0]);\n nodes.add(edge[1]);\n if (edge[0] === u && edge[1] === v || edge[0] === v && edge[1] === u) {\n break;\n }\n }\n return { id, edges, nodes: [...nodes] };\n}\n__name(popBlock, \"popBlock\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.crossCounts.ts\nfunction computeSubtreeCrossCounts(g, rankOf, tree) {\n const nodes = [...g.nodes];\n const indexOf = /* @__PURE__ */ new Map();\n for (const [i, node] of nodes.entries()) {\n indexOf.set(node, i);\n }\n const n = nodes.length;\n const parentIdx = new Array(n).fill(-1);\n const depth = new Array(n).fill(0);\n const queue = [];\n const seen = /* @__PURE__ */ new Set();\n for (const node of nodes) {\n const parentId = tree.parent.get(node) ?? null;\n const idx = indexOf.get(node);\n if (idx == null) {\n continue;\n }\n if (parentId == null) {\n parentIdx[idx] = -1;\n depth[idx] = 0;\n if (!seen.has(node)) {\n seen.add(node);\n queue.push(node);\n }\n }\n }\n while (queue.length > 0) {\n const current = queue.shift();\n const currentIdx = indexOf.get(current);\n if (currentIdx == null) {\n continue;\n }\n const childList = tree.children.get(current) ?? [];\n for (const child of childList) {\n if (seen.has(child)) {\n continue;\n }\n const childIdx = indexOf.get(child);\n if (childIdx == null) {\n continue;\n }\n parentIdx[childIdx] = currentIdx;\n depth[childIdx] = depth[currentIdx] + 1;\n seen.add(child);\n queue.push(child);\n }\n }\n for (const node of nodes) {\n if (seen.has(node)) {\n continue;\n }\n const idx = indexOf.get(node);\n if (idx == null) {\n continue;\n }\n parentIdx[idx] = -1;\n depth[idx] = 0;\n seen.add(node);\n }\n const maxLog = Math.max(1, Math.ceil(Math.log2(Math.max(1, n))) + 1);\n const up = Array.from({ length: maxLog }, () => new Array(n).fill(-1));\n for (let i = 0; i < n; i++) {\n up[0][i] = parentIdx[i];\n }\n for (let k = 1; k < maxLog; k++) {\n for (let i = 0; i < n; i++) {\n const prev = up[k - 1][i];\n up[k][i] = prev === -1 ? -1 : up[k - 1][prev];\n }\n }\n const lcaIndex = /* @__PURE__ */ __name((aIdx, bIdx) => {\n if (aIdx === -1 || bIdx === -1) {\n return -1;\n }\n if (depth[aIdx] < depth[bIdx]) {\n [aIdx, bIdx] = [bIdx, aIdx];\n }\n const diff = depth[aIdx] - depth[bIdx];\n for (let k = 0; k < maxLog; k++) {\n if (diff >> k & 1) {\n aIdx = up[k][aIdx];\n if (aIdx === -1) {\n return -1;\n }\n }\n }\n if (aIdx === bIdx) {\n return aIdx;\n }\n for (let k = maxLog - 1; k >= 0; k--) {\n const upA = up[k][aIdx];\n const upB = up[k][bIdx];\n if (upA === -1 || upB === -1) {\n continue;\n }\n if (upA !== upB) {\n aIdx = upA;\n bIdx = upB;\n }\n }\n return up[0][aIdx];\n }, \"lcaIndex\");\n const ownCounts = Array.from({ length: n }, () => /* @__PURE__ */ new Map());\n for (const edge of g.edges) {\n let src = edge.src;\n let dst = edge.dst;\n let ru = rankOf[src];\n let rv = rankOf[dst];\n if (ru == null || rv == null) {\n continue;\n }\n if (ru > rv) {\n [src, dst] = [dst, src];\n [ru, rv] = [rv, ru];\n }\n if (ru == null || rv == null || ru === rv) {\n continue;\n }\n const upperIdx = indexOf.get(src);\n const lowerIdx = indexOf.get(dst);\n if (upperIdx == null || lowerIdx == null) {\n continue;\n }\n const lca = lcaIndex(upperIdx, lowerIdx);\n if (lca === -1) {\n continue;\n }\n const bucket = ownCounts[lca];\n for (let layer = ru; layer < rv; layer++) {\n bucket.set(layer, (bucket.get(layer) ?? 0) + 1);\n }\n }\n const crossCounts = /* @__PURE__ */ new Map();\n const mergeInto = /* @__PURE__ */ __name((target, source) => {\n if (source.size === 0) {\n return;\n }\n for (const [layer, value] of source) {\n target.set(layer, (target.get(layer) ?? 0) + value);\n }\n }, \"mergeInto\");\n const visited = /* @__PURE__ */ new Set();\n const dfs = /* @__PURE__ */ __name((node) => {\n const idx = indexOf.get(node);\n visited.add(node);\n const base = idx == null ? void 0 : ownCounts[idx];\n const accumulator = base ? new Map(base) : /* @__PURE__ */ new Map();\n const childList = tree.children.get(node) ?? [];\n for (const child of childList) {\n const childMap = dfs(child);\n const parentLayer = rankOf[node];\n if (parentLayer != null) {\n let map = crossCounts.get(node);\n if (!map) {\n map = /* @__PURE__ */ new Map();\n crossCounts.set(node, map);\n }\n let value = childMap.get(parentLayer) ?? 0;\n const childLayer = rankOf[child];\n if (childLayer != null && childLayer > parentLayer) {\n value += 1;\n }\n map.set(child, value);\n }\n mergeInto(accumulator, childMap);\n }\n return accumulator;\n }, \"dfs\");\n for (const root of tree.roots) {\n if (!visited.has(root)) {\n dfs(root);\n }\n }\n for (const node of nodes) {\n if (!visited.has(node)) {\n dfs(node);\n }\n }\n return crossCounts;\n}\n__name(computeSubtreeCrossCounts, \"computeSubtreeCrossCounts\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.multitree.core.ts\nfunction annotateMinimumLayers(nodes, children, rankOf) {\n const minLayer = /* @__PURE__ */ new Map();\n const annotate = /* @__PURE__ */ __name((node) => {\n let minL = rankOf[node] ?? 0;\n const childList = [...children.get(node) ?? []];\n childList.sort(compareByRankThenId(rankOf));\n for (const child of childList) {\n annotate(child);\n const childMin = minLayer.get(child);\n if (childMin != null) {\n minL = Math.min(minL, childMin);\n }\n }\n minLayer.set(node, minL);\n }, \"annotate\");\n for (const node of nodes) {\n annotate(node);\n }\n return minLayer;\n}\n__name(annotateMinimumLayers, \"annotateMinimumLayers\");\nfunction compareByRankThenId(rankOf) {\n return (a, b) => {\n const ra = rankOf[a] ?? 0;\n const rb = rankOf[b] ?? 0;\n return ra === rb ? a.localeCompare(b) : ra - rb;\n };\n}\n__name(compareByRankThenId, \"compareByRankThenId\");\nfunction emitNodesInTreeOrder(roots, allNodes, rankOf, orderChildren) {\n let maxRank = 0;\n for (const node of allNodes) {\n const r = rankOf[node] ?? 0;\n if (r > maxRank) {\n maxRank = r;\n }\n }\n const layers = Array.from({ length: maxRank + 1 }, () => []);\n const emitted = /* @__PURE__ */ new Set();\n const emit = /* @__PURE__ */ __name((node) => {\n if (emitted.has(node)) {\n return;\n }\n emitted.add(node);\n const layer = rankOf[node] ?? 0;\n if (!layers[layer]) {\n layers[layer] = [];\n }\n layers[layer].push(node);\n for (const child of orderChildren(node)) {\n emit(child);\n }\n }, \"emit\");\n for (const root of roots) {\n emit(root);\n }\n for (const node of allNodes) {\n if (!emitted.has(node)) {\n const layer = rankOf[node] ?? 0;\n if (!layers[layer]) {\n layers[layer] = [];\n }\n layers[layer].push(node);\n emitted.add(node);\n }\n }\n return layers;\n}\n__name(emitNodesInTreeOrder, \"emitNodesInTreeOrder\");\nfunction deduplicateLayers(layers) {\n const result = [];\n for (const layer of layers) {\n const seen = /* @__PURE__ */ new Set();\n const deduped = [];\n for (const id of layer) {\n if (seen.has(id)) {\n continue;\n }\n seen.add(id);\n deduped.push(id);\n }\n result.push(deduped);\n }\n return result;\n}\n__name(deduplicateLayers, \"deduplicateLayers\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.multitree.order.ts\nfunction createChildOrderer(children, rankOf, crossCounts, minLayer) {\n return (node) => {\n const raw = children.get(node) ?? [];\n if (raw.length === 0) {\n return [];\n }\n const layer = rankOf[node] ?? 0;\n const future = [];\n const present = [];\n const crossMap = crossCounts.get(node);\n for (const child of raw) {\n const minL = minLayer.get(child) ?? layer;\n if (minL > layer) {\n future.push({ child, min: minL });\n } else {\n present.push(child);\n }\n }\n future.sort((a, b) => {\n if (a.min === b.min) {\n return a.child.localeCompare(b.child);\n }\n return a.min - b.min;\n });\n present.sort((a, b) => {\n const ca = crossMap?.get(a) ?? 0;\n const cb = crossMap?.get(b) ?? 0;\n if (ca !== cb) {\n return ca - cb;\n }\n const ma = minLayer.get(a) ?? layer;\n const mb = minLayer.get(b) ?? layer;\n if (ma !== mb) {\n return ma - mb;\n }\n return a.localeCompare(b);\n });\n return [...future.map((item) => item.child), ...present];\n };\n}\n__name(createChildOrderer, \"createChildOrderer\");\nfunction buildMultitreeLayerOrder(g, rankOf, laneOf) {\n const tree = buildDrivingTree(g, {\n rankHint: rankOf,\n laneOf\n });\n const { children, roots } = tree;\n for (const node of g.nodes) {\n if (!children.has(node)) {\n children.set(node, []);\n }\n }\n const crossCounts = computeSubtreeCrossCounts(g, rankOf, tree);\n const rootsSorted = [...roots].sort(compareByRankThenId(rankOf));\n const minLayer = annotateMinimumLayers(rootsSorted, children, rankOf);\n const orderChildren = createChildOrderer(children, rankOf, crossCounts, minLayer);\n let layers = emitNodesInTreeOrder(rootsSorted, g.nodes, rankOf, orderChildren);\n layers = deduplicateLayers(layers);\n return layers;\n}\n__name(buildMultitreeLayerOrder, \"buildMultitreeLayerOrder\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.crossOptimization.ts\nfunction countCrossingsBetweenAdjacent(upper, lower, edges) {\n const upperSet = new Set(upper);\n const lowerSet = new Set(lower);\n const li = buildLayerIndex(lower);\n const vs = [];\n for (const e of edges) {\n if (upperSet.has(e.src) && lowerSet.has(e.dst)) {\n vs.push(li.get(e.dst));\n }\n }\n return countInversions(vs);\n}\n__name(countCrossingsBetweenAdjacent, \"countCrossingsBetweenAdjacent\");\nfunction totalCrossings(layers, edges, rankOf) {\n const expanded = [];\n for (const e of edges) {\n const ru = rankOf[e.src];\n const rv = rankOf[e.dst];\n if (ru == null || rv == null || ru === rv) {\n continue;\n }\n let upper = e.src;\n let lower = e.dst;\n let rUpper = ru;\n let rLower = rv;\n if (ru > rv) {\n upper = e.dst;\n lower = e.src;\n rUpper = rv;\n rLower = ru;\n }\n for (let L = rUpper; L < rLower; L++) {\n expanded.push({ id: `${e.id}@${L}`, src: upper, dst: lower, ref: e.ref });\n }\n }\n let sum = 0;\n for (let i = 0; i + 1 < layers.length; i++) {\n sum += countCrossingsBetweenAdjacent(layers[i], layers[i + 1], expanded);\n }\n return sum;\n}\n__name(totalCrossings, \"totalCrossings\");\nfunction optimizeRanksByCrossings(g, initialRank) {\n const rankOf = { ...initialRank };\n const { preds } = buildPredecessorSuccessorMaps(g);\n const laneOf = createTopLaneResolver(g);\n const layers = buildMultitreeLayerOrder(g, rankOf, laneOf);\n let best = totalCrossings(layers, g.edges, rankOf);\n const maxPasses = LAYERING.MAX_CROSSING_OPTIMIZATION_PASSES;\n for (let pass = 0; pass < maxPasses; pass++) {\n let changed = false;\n const nodesByRank = [...g.nodes].sort((a, b) => (rankOf[b] ?? 0) - (rankOf[a] ?? 0));\n for (const v of nodesByRank) {\n const r = rankOf[v] ?? 0;\n if (r === 0) {\n continue;\n }\n let lb = 0;\n for (const u of preds.get(v) ?? []) {\n lb = Math.max(lb, (rankOf[u] ?? 0) + 1);\n }\n if (lb >= r) {\n continue;\n }\n const old = r;\n rankOf[v] = lb;\n const trialLayers = buildMultitreeLayerOrder(g, rankOf, laneOf);\n const score = totalCrossings(trialLayers, g.edges, rankOf);\n if (score < best) {\n best = score;\n changed = true;\n } else {\n rankOf[v] = old;\n }\n }\n if (!changed) {\n break;\n }\n }\n return rankOf;\n}\n__name(optimizeRanksByCrossings, \"optimizeRanksByCrossings\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.crossLaneAdjust.ts\nfunction adjustCrossLaneSources(g, rankOf) {\n const topLaneOf = createTopLaneResolver(g);\n const nodesByRank = [...g.nodes].sort(\n (a, b) => (rankOf[a] ?? 0) - (rankOf[b] ?? 0) || a.localeCompare(b)\n );\n for (const v of nodesByRank) {\n const laneV = topLaneOf(v);\n if (!laneV) {\n continue;\n }\n const outEdges = g.edges.filter((e) => e.src === v);\n if (outEdges.length === 0) {\n continue;\n }\n let hasSameLaneSucc = false;\n let crossLaneCount = 0;\n for (const e of outEdges) {\n const laneDst = topLaneOf(e.dst);\n if (laneDst == null || laneDst === laneV) {\n hasSameLaneSucc = true;\n } else {\n crossLaneCount++;\n }\n }\n if (crossLaneCount === 0 || hasSameLaneSucc) {\n continue;\n }\n let crossLaneIncoming = 0;\n let hasSameLanePred = false;\n for (const e of g.edges) {\n if (e.dst !== v) {\n continue;\n }\n const laneSrc = topLaneOf(e.src);\n if (!laneSrc) {\n continue;\n }\n if (laneSrc === laneV) {\n hasSameLanePred = true;\n } else {\n crossLaneIncoming++;\n }\n }\n if (crossLaneIncoming > 0 || !hasSameLanePred) {\n continue;\n }\n const current = rankOf[v] ?? 0;\n const target = current + crossLaneCount;\n let lb = 0;\n for (const e of g.edges) {\n if (e.dst === v) {\n lb = Math.max(lb, (rankOf[e.src] ?? 0) + 1);\n }\n }\n const newRank = Math.max(current, lb, target);\n if (newRank !== current) {\n rankOf[v] = newRank;\n }\n }\n}\n__name(adjustCrossLaneSources, \"adjustCrossLaneSources\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.longestPath.ts\nfunction assignLayers_LongestPath(gAcyclic, opts) {\n const g = normalizeGraph(gAcyclic);\n const order = topoSortIfAcyclic(g) ?? [...g.nodes].sort();\n const compact = opts?.compactSingleInput ?? false;\n const topLaneOf = createTopLaneResolver(g);\n let rankOf = /* @__PURE__ */ Object.create(null);\n for (const v of order) {\n const incAll = incoming(g, v);\n const inc = opts?.ignoreCrossLaneEdges ? incAll.filter((e) => {\n const laneSrc = topLaneOf(e.src);\n const laneDst = topLaneOf(v);\n if (!laneSrc || !laneDst) {\n return true;\n }\n return laneSrc === laneDst;\n }) : incAll;\n if (inc.length === 0) {\n rankOf[v] = 0;\n } else if (compact && inc.length === 1) {\n const u = inc[0].src;\n const laneU = topLaneOf(u);\n const laneV = topLaneOf(v);\n if (laneU !== laneV) {\n rankOf[v] = rankOf[u] ?? 0;\n } else {\n rankOf[v] = (rankOf[u] ?? 0) + 1;\n }\n } else {\n let mx = -Infinity;\n for (const e of inc) {\n mx = Math.max(mx, (rankOf[e.src] ?? 0) + 1);\n }\n rankOf[v] = mx === -Infinity ? 0 : mx;\n }\n }\n if (opts?.optimizeRanksByCrossings ?? false) {\n rankOf = optimizeRanksByCrossings(g, rankOf);\n }\n if (opts?.ignoreCrossLaneEdges) {\n adjustCrossLaneSources(g, rankOf);\n }\n const layers = buildMultitreeLayerOrder(g, rankOf, topLaneOf);\n return { layers, rankOf, dummy: /* @__PURE__ */ new Set() };\n}\n__name(assignLayers_LongestPath, \"assignLayers_LongestPath\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.gravity.ts\nfunction assignLayers_Gravity(gAcyclic, opts) {\n const g = normalizeGraph(gAcyclic);\n const base = assignLayers_LongestPath(g, {\n compactSingleInput: opts?.compactSingleInput,\n ignoreCrossLaneEdges: opts?.ignoreCrossLaneEdges,\n optimizeRanksByCrossings: opts?.optimizeRanksByCrossings\n });\n const rankOf = { ...base.rankOf };\n const topLaneOf = createTopLaneResolver(g);\n const { preds, succs } = buildPredecessorSuccessorMaps(g, (e) => {\n if (opts?.ignoreCrossLaneEdges) {\n const laneSrc = topLaneOf(e.src);\n const laneDst = topLaneOf(e.dst);\n if (laneSrc && laneDst && laneSrc !== laneDst) {\n return false;\n }\n }\n return true;\n });\n const order = topoSortIfAcyclic(g) ?? [...g.nodes];\n const revOrder = [...order].reverse();\n const clampFeasible = /* @__PURE__ */ __name((v, desired) => {\n let lb = 0;\n for (const u of preds.get(v) ?? []) {\n lb = Math.max(lb, (rankOf[u] ?? 0) + 1);\n }\n let ub = Number.POSITIVE_INFINITY;\n const s = succs.get(v) ?? [];\n if (s.length > 0) {\n ub = Math.min(...s.map((w) => (rankOf[w] ?? 0) - 1));\n }\n if (!Number.isFinite(ub)) {\n ub = Math.max(lb, desired);\n }\n return Math.min(Math.max(desired, lb), ub);\n }, \"clampFeasible\");\n const iters = LAYERING.GRAVITY_ITERATIONS;\n const relaxOrder = /* @__PURE__ */ __name((nodeOrder) => {\n let changed = false;\n for (const v of nodeOrder) {\n const ps = preds.get(v) ?? [];\n const ss = succs.get(v) ?? [];\n if (ps.length === 0 && ss.length === 0) {\n continue;\n }\n const predAvg = ps.length > 0 ? ps.reduce((a, u) => a + (rankOf[u] ?? 0) + 1, 0) / ps.length : rankOf[v] ?? 0;\n const succAvg = ss.length > 0 ? ss.reduce((a, w) => a + (rankOf[w] ?? 0) - 1, 0) / ss.length : rankOf[v] ?? 0;\n const desired = Math.round((predAvg + succAvg) / 2);\n const clamped = clampFeasible(v, desired);\n if (clamped !== rankOf[v]) {\n rankOf[v] = clamped;\n changed = true;\n }\n }\n return changed;\n }, \"relaxOrder\");\n for (let it = 0; it < iters; it++) {\n const forwardChanged = relaxOrder(order);\n const backwardChanged = relaxOrder(revOrder);\n if (!forwardChanged && !backwardChanged) {\n break;\n }\n }\n for (const v of order) {\n let lb = 0;\n for (const u of preds.get(v) ?? []) {\n lb = Math.max(lb, (rankOf[u] ?? 0) + 1);\n }\n if ((rankOf[v] ?? 0) < lb) {\n rankOf[v] = lb;\n }\n }\n for (const v of revOrder) {\n const s = succs.get(v) ?? [];\n if (s.length > 0) {\n const ub = Math.min(...s.map((w) => (rankOf[w] ?? 0) - 1));\n if ((rankOf[v] ?? 0) > ub) {\n rankOf[v] = ub;\n }\n }\n }\n const layers = buildLayersFromRanks(g, order, rankOf);\n return { layers, rankOf, dummy: /* @__PURE__ */ new Set() };\n}\n__name(assignLayers_Gravity, \"assignLayers_Gravity\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.laneAwareCompact.ts\nfunction topoSortByGenerationIfAcyclic(g) {\n const indeg = buildInDegreeMap(g);\n const adj = buildSortedSuccessorMap(g);\n let frontier = sortedZeroInDegreeNodes(indeg);\n const order = [];\n while (frontier.length > 0) {\n const nextFrontier = [];\n for (const u of frontier) {\n order.push(u);\n for (const v of adj.get(u) ?? []) {\n indeg.set(v, (indeg.get(v) ?? 0) - 1);\n if ((indeg.get(v) ?? 0) === 0) {\n nextFrontier.push(v);\n }\n }\n }\n frontier = nextFrontier.sort((a, b) => a.localeCompare(b));\n }\n return order.length === g.nodes.length ? order : null;\n}\n__name(topoSortByGenerationIfAcyclic, \"topoSortByGenerationIfAcyclic\");\nfunction assignLayers_LaneAwareCompact(gAcyclic, opts) {\n const g = normalizeGraph(gAcyclic);\n const order = opts?.direction === \"LR\" ? topoSortByGenerationIfAcyclic(g) ?? [...g.nodes].sort() : topoSortIfAcyclic(g) ?? [...g.nodes].sort();\n const topLaneOf = createTopLaneResolver(g);\n const laneOf = /* @__PURE__ */ __name((id) => topLaneOf(id) ?? id, \"laneOf\");\n const rankOf = /* @__PURE__ */ Object.create(null);\n const nextFree = /* @__PURE__ */ new Map();\n const edgeWeight = /* @__PURE__ */ __name((u, v) => {\n const ignoreCrossLane = opts?.ignoreCrossLaneEdges ?? true;\n if (ignoreCrossLane) {\n return laneOf(u) === laneOf(v) ? 1 : 0;\n }\n return 1;\n }, \"edgeWeight\");\n for (const v of order) {\n const node = g.nodeById.get(v);\n if (node?.isGroup) {\n continue;\n }\n const preds = incoming(g, v);\n let base = 0;\n if (preds.length > 0) {\n for (const e of preds) {\n const u = e.src;\n const ru = rankOf[u] ?? 0;\n base = Math.max(base, ru + edgeWeight(u, v));\n }\n }\n const lane = laneOf(v);\n const nf = nextFree.get(lane) ?? 0;\n const L = Math.max(base, nf);\n rankOf[v] = L;\n nextFree.set(lane, L + 1);\n }\n const layers = buildLayersFromRanks(g, order, rankOf, { skipGroups: true });\n return { layers, rankOf, dummy: /* @__PURE__ */ new Set() };\n}\n__name(assignLayers_LaneAwareCompact, \"assignLayers_LaneAwareCompact\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.dummies.ts\nfunction makeProperLayering(layering, gAcyclic) {\n const g = normalizeGraph(gAcyclic);\n const { rankOf } = layering;\n const layers = layering.layers.map((l) => [...l]);\n const dummy = new Set(layering.dummy ? [...layering.dummy] : []);\n let dummySeq = 0;\n const nodeById = new Map(g.nodeById);\n const addDummyAt = /* @__PURE__ */ __name((L) => {\n const id = `placeholder-${dummySeq++}`;\n const dn = { id, isGroup: false, isDummy: true, width: 0, height: 0 };\n nodeById.set(id, dn);\n dummy.add(id);\n while (layers.length <= L) {\n layers.push([]);\n }\n layers[L].push(id);\n rankOf[id] = L;\n return id;\n }, \"addDummyAt\");\n const edgesSorted = [...g.edges].sort(\n (a, b) => a.id === b.id ? a.src === b.src ? a.dst.localeCompare(b.dst) : a.src.localeCompare(b.src) : a.id.localeCompare(b.id)\n );\n const newEdges = [];\n for (const e of edgesSorted) {\n const rU = rankOf[e.src] ?? 0;\n const rV = rankOf[e.dst] ?? 0;\n if (rV - rU <= 1) {\n newEdges.push(e);\n continue;\n }\n let prev = e.src;\n for (let L = rU + 1, k = 0; L < rV; L++, k++) {\n const d = addDummyAt(L);\n newEdges.push({ id: `${e.id}#${k}`, src: prev, dst: d, weight: e.weight, ref: e.ref });\n prev = d;\n }\n const lastIndex = rV - rU - 2;\n newEdges.push({\n id: `${e.id}#${Math.max(lastIndex + 1, 0)}`,\n src: prev,\n dst: e.dst,\n weight: e.weight,\n ref: e.ref\n });\n }\n const nodes = [...g.nodes, ...[...dummy].filter((id) => !g.nodes.includes(id))];\n const graphWithDummies = { nodes, edges: newEdges, layout: g.layout, nodeById };\n return { layering: { layers, rankOf, dummy }, graphWithDummies };\n}\n__name(makeProperLayering, \"makeProperLayering\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase3.ordering.ts\nfunction median(values) {\n const n = values.length;\n if (n === 0) {\n return Number.POSITIVE_INFINITY;\n }\n const a = [...values].sort((x, y) => x - y);\n if (n % 2 === 1) {\n return a[(n - 1) / 2];\n }\n return 0.5 * (a[n / 2 - 1] + a[n / 2]);\n}\n__name(median, \"median\");\nfunction barycenter(values) {\n if (values.length === 0) {\n return Number.POSITIVE_INFINITY;\n }\n const s = values.reduce((acc, v) => acc + v, 0);\n return s / values.length;\n}\n__name(barycenter, \"barycenter\");\nfunction neighborPositionsFor(targetNodes, fixedIndex, edges, direction) {\n const neighborPositions = /* @__PURE__ */ new Map();\n for (const v of targetNodes) {\n neighborPositions.set(v, []);\n }\n for (const e of edges) {\n if (direction === \"down\") {\n if (fixedIndex.has(e.src) && neighborPositions.has(e.dst)) {\n neighborPositions.get(e.dst).push(fixedIndex.get(e.src));\n }\n } else if (fixedIndex.has(e.dst) && neighborPositions.has(e.src)) {\n neighborPositions.get(e.src).push(fixedIndex.get(e.dst));\n }\n }\n return neighborPositions;\n}\n__name(neighborPositionsFor, \"neighborPositionsFor\");\nfunction currentOrderTieBreak(a, b, currentLayerIndex) {\n const ia = currentLayerIndex.get(a) ?? 0;\n const ib = currentLayerIndex.get(b) ?? 0;\n return ia !== ib ? ia - ib : a.localeCompare(b);\n}\n__name(currentOrderTieBreak, \"currentOrderTieBreak\");\nfunction countCrossingsBetweenAdjacent2(upper, lower, edges) {\n const upperSet = new Set(upper);\n const lowerSet = new Set(lower);\n const upperIndex = buildLayerIndex(upper);\n const lowerIndex = buildLayerIndex(lower);\n const pairs = [];\n for (const e of edges) {\n if (upperSet.has(e.src) && lowerSet.has(e.dst)) {\n pairs.push({ u: upperIndex.get(e.src), v: lowerIndex.get(e.dst) });\n }\n }\n pairs.sort((a, b) => a.u === b.u ? a.v - b.v : a.u - b.u);\n const vs = pairs.map((p) => p.v);\n return countInversions(vs);\n}\n__name(countCrossingsBetweenAdjacent2, \"countCrossingsBetweenAdjacent\");\nfunction sortByHeuristic(nodes, neighborPositions, currentLayerIndex) {\n return [...nodes].sort((a, b) => {\n const sa = median(neighborPositions.get(a) ?? []);\n const sb = median(neighborPositions.get(b) ?? []);\n if (sa === sb) {\n return currentOrderTieBreak(a, b, currentLayerIndex);\n }\n if (!isFinite(sa)) {\n return 1;\n }\n if (!isFinite(sb)) {\n return -1;\n }\n return sa - sb;\n });\n}\n__name(sortByHeuristic, \"sortByHeuristic\");\nfunction reorderLayer(fixedLayer, targetLayer, edges, direction, topLaneOf, laneOrder) {\n const fixedIndex = buildLayerIndex(fixedLayer);\n const currIndex = buildLayerIndex(targetLayer);\n const neighborPositions = neighborPositionsFor(targetLayer, fixedIndex, edges, direction);\n if (!topLaneOf || !laneOrder || laneOrder.length === 0) {\n return sortByHeuristic(targetLayer, neighborPositions, currIndex);\n }\n const byLane = /* @__PURE__ */ new Map();\n for (const id of targetLayer) {\n const lane = topLaneOf(id);\n const arr = byLane.get(lane) ?? [];\n arr.push(id);\n byLane.set(lane, arr);\n }\n const result = [];\n for (const lane of laneOrder) {\n const nodesInLane = byLane.get(lane);\n if (!nodesInLane || nodesInLane.length === 0) {\n continue;\n }\n const sorted = sortByHeuristic(nodesInLane, neighborPositions, currIndex);\n result.push(...sorted);\n }\n const nullNodes = byLane.get(null);\n if (nullNodes && nullNodes.length > 0) {\n const sorted = sortByHeuristic(nullNodes, neighborPositions, currIndex);\n for (const nid of sorted) {\n const bc = barycenter(neighborPositions.get(nid) ?? []);\n let bestIdx = result.length;\n if (isFinite(bc)) {\n for (const [i, rid] of result.entries()) {\n const rBc = barycenter(neighborPositions.get(rid) ?? []);\n if (bc < rBc) {\n bestIdx = i;\n break;\n }\n }\n }\n result.splice(bestIdx, 0, nid);\n }\n }\n return result;\n}\n__name(reorderLayer, \"reorderLayer\");\nfunction transposeImprove(upper, current, edges, next, topLaneOf) {\n const best = [...current];\n const upperSet = new Set(upper);\n const layerSet = new Set(current);\n const nextSet = next ? new Set(next) : null;\n const edgesIn = edges.filter((e) => upperSet.has(e.src) && layerSet.has(e.dst));\n const edgesOut = nextSet ? edges.filter((e) => layerSet.has(e.src) && nextSet.has(e.dst)) : void 0;\n const crossingScore = /* @__PURE__ */ __name((order) => {\n let score = countCrossingsBetweenAdjacent2(upper, order, edgesIn);\n if (edgesOut && next) {\n score += countCrossingsBetweenAdjacent2(order, next, edgesOut);\n }\n return score;\n }, \"crossingScore\");\n const laneOf = topLaneOf ? /* @__PURE__ */ new Map() : null;\n if (topLaneOf && laneOf) {\n for (const id of current) {\n laneOf.set(id, topLaneOf(id));\n }\n }\n let improved = true;\n let bestScore = crossingScore(best);\n while (improved) {\n improved = false;\n for (let i = 0; i + 1 < best.length; i++) {\n if (laneOf) {\n const laneA = laneOf.get(best[i]);\n const laneB = laneOf.get(best[i + 1]);\n if (laneA !== laneB) {\n continue;\n }\n }\n const prev = bestScore;\n [best[i], best[i + 1]] = [best[i + 1], best[i]];\n const nextScore = crossingScore(best);\n if (nextScore < prev) {\n bestScore = nextScore;\n improved = true;\n } else {\n [best[i], best[i + 1]] = [best[i + 1], best[i]];\n }\n }\n }\n return best;\n}\n__name(transposeImprove, \"transposeImprove\");\nfunction orderLayers(layering, gWithDummies, opts) {\n const layers = layering.layers.map((l) => [...l]);\n const edges = gWithDummies.edges;\n const topLaneOf = createTopLaneResolver(gWithDummies);\n const laneOrder = resolveTopLaneOrder(gWithDummies, opts?.laneOrder);\n for (let s = 0; s < 3; s++) {\n for (let i = 1; i < layers.length; i++) {\n layers[i] = reorderLayer(layers[i - 1], layers[i], edges, \"down\", topLaneOf, laneOrder);\n layers[i] = transposeImprove(layers[i - 1], layers[i], edges, layers[i + 1], topLaneOf);\n }\n for (let i = layers.length - 2; i >= 0; i--) {\n layers[i] = reorderLayer(layers[i + 1], layers[i], edges, \"up\", topLaneOf, laneOrder);\n layers[i] = transposeImprove(layers[i + 1], layers[i], edges, layers[i - 1], topLaneOf);\n }\n }\n return { layers };\n}\n__name(orderLayers, \"orderLayers\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase4.coordinates.ts\nfunction assignCoordinates(ordered, gWithDummies, opts) {\n const layerGap = opts?.layerGap ?? COORDINATES.DEFAULT_LAYER_GAP;\n const nodeGap = opts?.nodeGap ?? COORDINATES.DEFAULT_NODE_GAP;\n const laneGap = opts?.laneGap ?? nodeGap * 2;\n const direction = opts?.direction ?? \"TB\";\n const isHorizontal = direction === \"LR\" || direction === \"RL\";\n const layers = ordered.layers;\n const x = /* @__PURE__ */ Object.create(null);\n const y = /* @__PURE__ */ Object.create(null);\n const getNode = /* @__PURE__ */ __name((id) => gWithDummies.nodeById.get(id), \"getNode\");\n const getWidth = /* @__PURE__ */ __name((id) => getNode(id)?.width ?? 0, \"getWidth\");\n const getHeight = /* @__PURE__ */ __name((id) => getNode(id)?.height ?? 0, \"getHeight\");\n const topLaneOf = createTopLaneResolver(gWithDummies);\n const laneOrderGlobal = resolveTopLaneOrder(gWithDummies, opts?.laneOrder);\n const layerHeights = layers.map(\n (layer) => layer.reduce((m, v) => Math.max(m, getHeight(v)), 0)\n );\n const extraLayerGaps = [];\n if (isHorizontal) {\n for (let i = 0; i + 1 < layers.length; i++) {\n const thisLayerMaxWidth = layers[i].reduce((m, v) => Math.max(m, getWidth(v)), 0);\n const nextLayerMaxWidth = layers[i + 1].reduce((m, v) => Math.max(m, getWidth(v)), 0);\n const thisLayerMaxHeight = layerHeights[i];\n const nextLayerMaxHeight = layerHeights[i + 1];\n const normalSpacing = thisLayerMaxHeight / 2 + nextLayerMaxHeight / 2;\n const requiredSpacing = (thisLayerMaxWidth + nextLayerMaxWidth) / 2;\n const extraNeeded = Math.max(0, requiredSpacing - normalSpacing - layerGap);\n extraLayerGaps.push(extraNeeded);\n }\n }\n const lanesUsedSet = /* @__PURE__ */ new Set();\n for (const layer of layers) {\n for (const id of layer) {\n lanesUsedSet.add(topLaneOf(id));\n }\n }\n const hasNullLane = lanesUsedSet.has(null);\n const lanesUsed = laneOrderGlobal.filter((L) => lanesUsedSet.has(L));\n const laneOrderColumns = [...hasNullLane ? [null] : [], ...lanesUsed];\n const laneWidth = /* @__PURE__ */ Object.create(null);\n for (const L of lanesUsed) {\n laneWidth[L] = 0;\n }\n if (hasNullLane) {\n laneWidth.null = 0;\n }\n for (const layer of layers) {\n const perLane = /* @__PURE__ */ Object.create(null);\n const nullIds = [];\n for (const id of layer) {\n const L = topLaneOf(id);\n if (L === null) {\n nullIds.push(id);\n } else {\n (perLane[L] ||= []).push(id);\n }\n }\n for (const [L, ids] of Object.entries(perLane)) {\n const total = ids.reduce((s, id) => s + getWidth(id), 0) + nodeGap * Math.max(0, ids.length - 1);\n laneWidth[L] = Math.max(laneWidth[L] ?? 0, total);\n }\n if (hasNullLane && nullIds.length) {\n const totalNull = nullIds.reduce((s, id) => s + getWidth(id), 0) + nodeGap * Math.max(0, nullIds.length - 1);\n laneWidth.null = Math.max(laneWidth.null ?? 0, totalNull);\n }\n }\n const centerX = /* @__PURE__ */ new Map();\n {\n const widths = laneOrderColumns.map(\n (L) => (L === null ? laneWidth.null : laneWidth[L]) ?? 0\n );\n const totalW = widths.reduce((a, b) => a + b, 0) + laneGap * Math.max(0, laneOrderColumns.length - 1);\n let cursor = -totalW / 2;\n for (let i = 0; i < laneOrderColumns.length; i++) {\n const L = laneOrderColumns[i];\n const w = widths[i] ?? 0;\n const cx = cursor + w / 2;\n centerX.set(L, cx);\n cursor += w;\n if (i < laneOrderColumns.length - 1) {\n cursor += laneGap;\n }\n }\n }\n let yOffset = 0;\n for (const [li, layer] of layers.entries()) {\n const layerH = layerHeights[li] ?? 0;\n const byLane = /* @__PURE__ */ new Map();\n for (const id of layer) {\n const laneId = topLaneOf(id);\n const arr = byLane.get(laneId) ?? [];\n arr.push(id);\n byLane.set(laneId, arr);\n }\n for (const L of laneOrderColumns) {\n const nodesInLane = byLane.get(L) ?? [];\n if (nodesInLane.length === 0) {\n continue;\n }\n const cx = centerX.get(L);\n if (nodesInLane.length === 1) {\n const id = nodesInLane[0];\n x[id] = cx;\n y[id] = yOffset + layerH / 2;\n } else {\n const widths = nodesInLane.map((id) => getWidth(id));\n const total = widths.reduce((a, b) => a + b, 0) + nodeGap * (nodesInLane.length - 1);\n let start = cx - total / 2;\n for (const [i, id] of nodesInLane.entries()) {\n const w = widths[i];\n x[id] = start + w / 2;\n y[id] = yOffset + layerH / 2;\n start += w + nodeGap;\n }\n }\n }\n const extraGap = extraLayerGaps[li] ?? 0;\n yOffset += layerH + layerGap + extraGap;\n }\n const byRef = /* @__PURE__ */ new Map();\n for (const e of gWithDummies.edges) {\n const rid = e.ref.id;\n if (!byRef.has(rid)) {\n byRef.set(rid, []);\n }\n byRef.get(rid).push(e);\n }\n for (const [, chainEdges] of byRef) {\n if (chainEdges.length === 0) {\n continue;\n }\n const ref = chainEdges[0].ref;\n const src = ref.start;\n const dst = ref.end;\n if (src == null || dst == null) {\n continue;\n }\n const midX = Math.round(((x[src] ?? 0) + (x[dst] ?? 0)) / 2);\n const involved = /* @__PURE__ */ new Set();\n for (const e of chainEdges) {\n involved.add(e.src);\n involved.add(e.dst);\n }\n for (const vid of involved) {\n if (vid === src || vid === dst) {\n continue;\n }\n const node = gWithDummies.nodeById.get(vid);\n if (node?.isDummy) {\n x[vid] = midX;\n }\n }\n }\n return { x, y };\n}\n__name(assignCoordinates, \"assignCoordinates\");\n\n// src/rendering-util/layout-algorithms/swimlanes/laneOrdering.ts\nvar AUTOMATIC_LANE_ORDERING_RESTARTS = 8;\nfunction hashString(input) {\n let hash = 2166136261;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n__name(hashString, \"hashString\");\nfunction mulberry32(seed) {\n let state = seed >>> 0;\n return () => {\n state += 1831565813;\n let t = state;\n t = Math.imul(t ^ t >>> 15, t | 1);\n t ^= t + Math.imul(t ^ t >>> 7, t | 61);\n return ((t ^ t >>> 14) >>> 0) / 4294967296;\n };\n}\n__name(mulberry32, \"mulberry32\");\nfunction deterministicShuffle(order, seed) {\n const shuffled = [...order];\n const random = mulberry32(seed);\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(random() * (i + 1));\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\n }\n return shuffled;\n}\n__name(deterministicShuffle, \"deterministicShuffle\");\nfunction sourceDistance(order, sourceIndex) {\n let distance = 0;\n for (const [index, laneId] of order.entries()) {\n distance += Math.abs(index - (sourceIndex.get(laneId) ?? index));\n }\n return distance;\n}\n__name(sourceDistance, \"sourceDistance\");\nfunction laneArrangementCost(order, weights) {\n const position = /* @__PURE__ */ new Map();\n for (const [index, laneId] of order.entries()) {\n position.set(laneId, index);\n }\n let cost = 0;\n for (const { a, b, weight } of weights) {\n const ai = position.get(a);\n const bi = position.get(b);\n if (ai == null || bi == null) {\n continue;\n }\n cost += weight * Math.abs(ai - bi);\n }\n return cost;\n}\n__name(laneArrangementCost, \"laneArrangementCost\");\nfunction buildWeightedLaneEdges(g) {\n const sourceOrder = buildTopLaneOrder(g);\n if (sourceOrder.length < 2) {\n return [];\n }\n const sourceIndex = new Map(sourceOrder.map((laneId, index) => [laneId, index]));\n const topLaneOf = createTopLaneResolver(g);\n const weights = /* @__PURE__ */ new Map();\n for (const edge of g.layout.edges ?? []) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const src = typeof edge.start === \"string\" ? edge.start : void 0;\n const dst = typeof edge.end === \"string\" ? edge.end : void 0;\n if (!src || !dst || !g.nodeById.has(src) || !g.nodeById.has(dst)) {\n continue;\n }\n const laneA = topLaneOf(src);\n const laneB = topLaneOf(dst);\n if (!laneA || !laneB || laneA === laneB) {\n continue;\n }\n const ia = sourceIndex.get(laneA);\n const ib = sourceIndex.get(laneB);\n if (ia == null || ib == null) {\n continue;\n }\n const [a, b] = ia <= ib ? [laneA, laneB] : [laneB, laneA];\n const key = `${a}\\0${b}`;\n const existing = weights.get(key);\n if (existing) {\n existing.weight++;\n } else {\n weights.set(key, { a, b, weight: 1 });\n }\n }\n return [...weights.values()];\n}\n__name(buildWeightedLaneEdges, \"buildWeightedLaneEdges\");\nfunction greedySwitch(startOrder, weights, sourceIndex) {\n const order = [...startOrder];\n let cost = laneArrangementCost(order, weights);\n let changed = true;\n let sweeps = 0;\n const maxSweeps = Math.max(1, order.length);\n while (changed && sweeps < maxSweeps) {\n changed = false;\n sweeps++;\n for (let i = 0; i + 1 < order.length; i++) {\n [order[i], order[i + 1]] = [order[i + 1], order[i]];\n const nextCost = laneArrangementCost(order, weights);\n if (nextCost < cost) {\n cost = nextCost;\n changed = true;\n } else {\n [order[i], order[i + 1]] = [order[i + 1], order[i]];\n }\n }\n }\n return {\n order,\n cost,\n sourceDistance: sourceDistance(order, sourceIndex)\n };\n}\n__name(greedySwitch, \"greedySwitch\");\nfunction isBetterCandidate(candidate, best) {\n if (candidate.cost !== best.cost) {\n return candidate.cost < best.cost;\n }\n return candidate.sourceDistance < best.sourceDistance;\n}\n__name(isBetterCandidate, \"isBetterCandidate\");\nfunction seedForRestart(sourceOrder, weights, restartIndex) {\n const weightSignature = [...weights].sort((a, b) => a.a === b.a ? a.b.localeCompare(b.b) : a.a.localeCompare(b.a)).map(({ a, b, weight }) => `${a}:${b}:${weight}`).join(\"|\");\n return hashString(`${sourceOrder.join(\"|\")}#${weightSignature}#${restartIndex}`);\n}\n__name(seedForRestart, \"seedForRestart\");\nfunction optimizeTopLaneOrder(g, opts = {}) {\n const sourceOrder = buildTopLaneOrder(g);\n if (sourceOrder.length < 2) {\n return sourceOrder;\n }\n const weights = buildWeightedLaneEdges(g);\n if (weights.length === 0) {\n return sourceOrder;\n }\n const sourceIndex = new Map(sourceOrder.map((laneId, index) => [laneId, index]));\n let best = greedySwitch(sourceOrder, weights, sourceIndex);\n const restarts = Math.max(0, opts.restarts ?? AUTOMATIC_LANE_ORDERING_RESTARTS);\n for (let i = 0; i < restarts; i++) {\n const seed = seedForRestart(sourceOrder, weights, i);\n const start = deterministicShuffle(sourceOrder, seed);\n const candidate = greedySwitch(start, weights, sourceIndex);\n if (isBetterCandidate(candidate, best)) {\n best = candidate;\n }\n }\n return best.order;\n}\n__name(optimizeTopLaneOrder, \"optimizeTopLaneOrder\");\n\n// src/rendering-util/layout-algorithms/swimlanes/pipeline.ts\nfunction sugiyamaLayout(g, opts) {\n const ignoreCrossLaneEdges = opts?.ignoreCrossLaneEdges ?? true;\n const optimizeRanksByCrossings2 = opts?.optimizeRanksByCrossings ?? true;\n const g0 = normalizeGraph(g);\n const laneOrder = opts?.automaticLaneOrdering ? optimizeTopLaneOrder(g0, { restarts: AUTOMATIC_LANE_ORDERING_RESTARTS }) : void 0;\n const cycleRes = removeCycles_DFS(g0);\n const gAcyclic = cycleRes.acyclic;\n const layering = ignoreCrossLaneEdges ? assignLayers_LaneAwareCompact(gAcyclic, {\n compactSingleInput: opts?.compactSingleInput ?? LAYERING.DEFAULT_COMPACT_SINGLE_INPUT,\n ignoreCrossLaneEdges: true,\n direction: opts?.direction\n }) : assignLayers_Gravity(gAcyclic, {\n compactSingleInput: opts?.compactSingleInput ?? LAYERING.DEFAULT_COMPACT_SINGLE_INPUT,\n ignoreCrossLaneEdges: false,\n optimizeRanksByCrossings: optimizeRanksByCrossings2\n });\n const { layering: properLayering, graphWithDummies } = makeProperLayering(layering, gAcyclic);\n const ordered = orderLayers(properLayering, graphWithDummies, { laneOrder });\n const coordinates = assignCoordinates(ordered, graphWithDummies, {\n layerGap: opts?.layerGap,\n nodeGap: opts?.nodeGap,\n direction: opts?.direction,\n laneOrder\n });\n return {\n acyclic: gAcyclic,\n reversed: cycleRes.reversed,\n layering: properLayering,\n ordered,\n coordinates\n };\n}\n__name(sugiyamaLayout, \"sugiyamaLayout\");\n\n// src/rendering-util/layout-algorithms/swimlanes/orthogonalRouter/router.ts\nvar EPS7 = PRECISION.EPSILON;\nvar NODE_PADDING = 8;\nvar HORIZONTAL_PIPE_MARGIN = 15;\nvar VERTICAL_PIPE_MARGIN = 15;\nvar ROUTING_MARGIN = 25;\nvar ANCHOR_OFFSET = 20;\nvar TRACK_SPACING = 10;\nfunction chooseOrthogonalSide(node, target, fallback) {\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const dx = target.x - cx;\n const dy = target.y - cy;\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n if (absDx < EPS7 && absDy < EPS7) {\n return fallback;\n }\n const verticalBias = 3;\n if (absDy > EPS7 && absDy * verticalBias >= absDx) {\n return dy > 0 ? \"bottom\" : \"top\";\n }\n if (absDx > EPS7) {\n return dx > 0 ? \"right\" : \"left\";\n }\n return fallback;\n}\n__name(chooseOrthogonalSide, \"chooseOrthogonalSide\");\nfunction sharedLineEndpointCoord(line, nextLine) {\n return Math.abs(line.to - nextLine.from) < EPS7 || Math.abs(line.to - nextLine.to) < EPS7 ? line.to : line.from;\n}\n__name(sharedLineEndpointCoord, \"sharedLineEndpointCoord\");\nfunction pointOnLine(line, along) {\n return line.orient === \"vertical\" ? { x: line.coord, y: along } : { x: along, y: line.coord };\n}\n__name(pointOnLine, \"pointOnLine\");\nfunction routeEdgesOrthogonal(data, direction) {\n const nodes = data.nodes ?? [];\n const originalEdges = data.edges ?? [];\n const edges = [];\n for (const oe of originalEdges) {\n if (oe.isLayoutOnly) {\n continue;\n }\n edges.push({\n ...oe,\n __originalEdge: oe\n });\n }\n const nodeById = /* @__PURE__ */ new Map();\n const laneByNodeId = /* @__PURE__ */ new Map();\n const pipes = [];\n const isLR = direction === \"LR\";\n for (const n of nodes) {\n nodeById.set(n.id, n);\n }\n const topLevelGroups = nodes.filter((n) => n.isGroup && !n.parentId);\n for (const group of topLevelGroups) {\n const lane = { id: group.id };\n const assignLane = /* @__PURE__ */ __name((n) => {\n laneByNodeId.set(n.id, lane);\n nodes.filter((child) => child.parentId === n.id).forEach(assignLane);\n }, \"assignLane\");\n assignLane(group);\n }\n const obstacles = nodes.filter((n) => !n.isGroup && !n.isEdgeLabel).map((n) => {\n const w = n.width ?? 10;\n const h = n.height ?? 10;\n const x = n.x ?? 0;\n const y = n.y ?? 0;\n const padding = NODE_PADDING;\n return {\n nodeId: n.id,\n minX: x - w / 2 - padding,\n maxX: x + w / 2 + padding,\n minY: y - h / 2 - padding,\n maxY: y + h / 2 + padding,\n // For LR: TB x becomes LR y, so visual Y extent should be based on height\n visualXHalfExtent: isLR ? h / 2 + padding : w / 2 + padding\n };\n });\n const getOrAddPipe = /* @__PURE__ */ __name((orientation, coord, spanMin, spanMax) => {\n let pipe = pipes.find((p) => p.orientation === orientation && Math.abs(p.coord - coord) < 1);\n if (!pipe) {\n pipe = {\n id: `pipe-${orientation}-${coord.toFixed(0)}`,\n orientation,\n coord,\n spanMin,\n spanMax,\n tracks: []\n };\n pipes.push(pipe);\n }\n pipe.spanMin = Math.min(pipe.spanMin, spanMin);\n pipe.spanMax = Math.max(pipe.spanMax, spanMax);\n return pipe;\n }, \"getOrAddPipe\");\n const portForSide = /* @__PURE__ */ __name((node, side) => {\n const w = node.width ?? 10;\n const h = node.height ?? 10;\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n switch (side) {\n case \"top\":\n return { x: cx, y: cy - h / 2 };\n case \"bottom\":\n return { x: cx, y: cy + h / 2 };\n case \"left\":\n return { x: cx - w / 2, y: cy };\n case \"right\":\n return { x: cx + w / 2, y: cy };\n }\n }, \"portForSide\");\n const getOrthogonalPort = /* @__PURE__ */ __name((node, target, isSource) => portForSide(node, chooseOrthogonalSide(node, target, isSource ? \"bottom\" : \"top\")), \"getOrthogonalPort\");\n const allRoutedSegments = [];\n const edgeSegmentIndices = [];\n const straightIntraLaneEdges = /* @__PURE__ */ new Set();\n const CROSSING_PENALTY = 1e3;\n const crossingPenalty = /* @__PURE__ */ __name((edgeIdx, from, to) => {\n if (allRoutedSegments.length === 0) {\n return 0;\n }\n const isHorizontal = Math.abs(from.y - to.y) < EPS7;\n const isVertical = Math.abs(from.x - to.x) < EPS7;\n if (!isHorizontal && !isVertical) {\n return 0;\n }\n let penalties = 0;\n if (isHorizontal) {\n const y = from.y;\n const minX = Math.min(from.x, to.x) - EPS7;\n const maxX = Math.max(from.x, to.x) + EPS7;\n if (maxX <= minX) {\n return 0;\n }\n for (const seg of allRoutedSegments) {\n if (seg.edgeIndex === edgeIdx || seg.orientation !== \"vertical\") {\n continue;\n }\n if (seg.pipe.coord < minX || seg.pipe.coord > maxX) {\n continue;\n }\n if (seg.from - EPS7 <= y && seg.to + EPS7 >= y) {\n penalties += CROSSING_PENALTY;\n }\n }\n } else if (isVertical) {\n const x = from.x;\n const minY = Math.min(from.y, to.y) - EPS7;\n const maxY = Math.max(from.y, to.y) + EPS7;\n if (maxY <= minY) {\n return 0;\n }\n for (const seg of allRoutedSegments) {\n if (seg.edgeIndex === edgeIdx || seg.orientation !== \"horizontal\") {\n continue;\n }\n if (seg.pipe.coord < minY || seg.pipe.coord > maxY) {\n continue;\n }\n if (seg.from - EPS7 <= x && seg.to + EPS7 >= x) {\n penalties += CROSSING_PENALTY;\n }\n }\n }\n return penalties;\n }, \"crossingPenalty\");\n const routingOrder = edges.map((edge, idx) => {\n if (!edge.start || !edge.end) {\n return { idx, crossLane: 0, dx: 0, dy: 0 };\n }\n const srcNode = nodeById.get(edge.start);\n const dstNode = nodeById.get(edge.end);\n const srcLane = laneByNodeId.get(edge.start);\n const dstLane = laneByNodeId.get(edge.end);\n const crossLane = srcLane && dstLane && srcLane.id !== dstLane.id ? 1 : 0;\n const dx = srcNode && dstNode ? Math.abs((dstNode.x ?? 0) - (srcNode.x ?? 0)) : 0;\n const dy = srcNode && dstNode ? Math.abs((dstNode.y ?? 0) - (srcNode.y ?? 0)) : 0;\n return { idx, crossLane, dx, dy };\n }).sort((a, b) => {\n if (a.crossLane !== b.crossLane) {\n return b.crossLane - a.crossLane;\n }\n const aDist = a.dx + a.dy;\n const bDist = b.dx + b.dy;\n if (Math.abs(aDist - bDist) > 1) {\n return aDist - bDist;\n }\n return a.idx - b.idx;\n }).map((entry) => entry.idx);\n const isSegmentBlocked = /* @__PURE__ */ __name((p1, p2, excludeStart, excludeEnd) => {\n const segMinX = Math.min(p1.x, p2.x);\n const segMaxX = Math.max(p1.x, p2.x);\n const segMinY = Math.min(p1.y, p2.y);\n const segMaxY = Math.max(p1.y, p2.y);\n const blockingObs = obstacles.find((obs) => {\n if (excludeStart && obs.nodeId === excludeStart) {\n return false;\n }\n if (excludeEnd && obs.nodeId === excludeEnd) {\n return false;\n }\n if (Math.abs(p1.x - p2.x) > EPS7) {\n return obs.minY < p1.y && obs.maxY > p1.y && obs.maxX > segMinX && obs.minX < segMaxX;\n } else {\n return obs.minX < p1.x && obs.maxX > p1.x && obs.maxY > segMinY && obs.minY < segMaxY;\n }\n });\n return !!blockingObs;\n }, \"isSegmentBlocked\");\n const portGroups = /* @__PURE__ */ new Map();\n const incidentEdgeTotals = /* @__PURE__ */ new Map();\n for (const edge of edges) {\n if (!edge.start || !edge.end || edge.start === edge.end) {\n continue;\n }\n incidentEdgeTotals.set(edge.start, (incidentEdgeTotals.get(edge.start) ?? 0) + 1);\n incidentEdgeTotals.set(edge.end, (incidentEdgeTotals.get(edge.end) ?? 0) + 1);\n }\n const determineSide = /* @__PURE__ */ __name((node, target) => chooseOrthogonalSide(node, target, \"bottom\"), \"determineSide\");\n const sideInfoByIdx = /* @__PURE__ */ new Map();\n for (const [i, e] of edges.entries()) {\n if (!e.start || !e.end || e.start === e.end) {\n continue;\n }\n if (e.points && e.points.length > 0) {\n continue;\n }\n const src = nodeById.get(e.start);\n const dst = nodeById.get(e.end);\n if (!src || !dst) {\n continue;\n }\n const dx = (dst.x ?? 0) - (src.x ?? 0);\n const dy = (dst.y ?? 0) - (src.y ?? 0);\n sideInfoByIdx.set(i, {\n edgeIdx: i,\n srcId: e.start,\n dstId: e.end,\n srcSide: determineSide(src, { x: dst.x ?? 0, y: dst.y ?? 0 }),\n dstSide: determineSide(dst, { x: src.x ?? 0, y: src.y ?? 0 }),\n absDx: Math.abs(dx),\n absDy: Math.abs(dy),\n dxSign: Math.sign(dx),\n dySign: Math.sign(dy)\n });\n }\n const preferenceStrength = /* @__PURE__ */ __name((info) => {\n if (info.srcSide === \"top\" || info.srcSide === \"bottom\") {\n return info.absDx === 0 ? Infinity : info.absDy / info.absDx;\n }\n return info.absDy === 0 ? Infinity : info.absDx / info.absDy;\n }, \"preferenceStrength\");\n const secondarySide = /* @__PURE__ */ __name((info) => {\n if (info.srcSide === \"top\" || info.srcSide === \"bottom\") {\n return info.dxSign >= 0 ? \"right\" : \"left\";\n }\n return info.dySign >= 0 ? \"bottom\" : \"top\";\n }, \"secondarySide\");\n const sourceSideGroups = /* @__PURE__ */ new Map();\n for (const info of sideInfoByIdx.values()) {\n const key = `${info.srcId}:${info.srcSide}`;\n if (!sourceSideGroups.has(key)) {\n sourceSideGroups.set(key, []);\n }\n sourceSideGroups.get(key).push(info);\n }\n const sideLoad = /* @__PURE__ */ new Map();\n const loadKey = /* @__PURE__ */ __name((nodeId, side) => `${nodeId}:${side}`, \"loadKey\");\n for (const info of sideInfoByIdx.values()) {\n sideLoad.set(\n loadKey(info.srcId, info.srcSide),\n (sideLoad.get(loadKey(info.srcId, info.srcSide)) ?? 0) + 1\n );\n sideLoad.set(\n loadKey(info.dstId, info.dstSide),\n (sideLoad.get(loadKey(info.dstId, info.dstSide)) ?? 0) + 1\n );\n }\n for (const group of sourceSideGroups.values()) {\n if (group.length < 2) {\n continue;\n }\n group.sort((a, b) => {\n const sa = preferenceStrength(a);\n const sb = preferenceStrength(b);\n if (Math.abs(sa - sb) > 1e-9) {\n return sb - sa;\n }\n return a.edgeIdx - b.edgeIdx;\n });\n for (let g = 1; g < group.length; g++) {\n const info = group[g];\n const secondary = secondarySide(info);\n const primaryLoad = sideLoad.get(loadKey(info.srcId, info.srcSide)) ?? 0;\n const secondaryLoad = sideLoad.get(loadKey(info.srcId, secondary)) ?? 0;\n if (secondaryLoad >= primaryLoad) {\n continue;\n }\n sideLoad.set(loadKey(info.srcId, info.srcSide), primaryLoad - 1);\n sideLoad.set(loadKey(info.srcId, secondary), secondaryLoad + 1);\n info.srcSide = secondary;\n }\n }\n const isDiamondNode = /* @__PURE__ */ __name((node) => {\n const shape = node?.shape;\n return shape === \"question\" || shape === \"diamond\";\n }, \"isDiamondNode\");\n const inSidesByNode = /* @__PURE__ */ new Map();\n for (const info of sideInfoByIdx.values()) {\n if (!inSidesByNode.has(info.dstId)) {\n inSidesByNode.set(info.dstId, /* @__PURE__ */ new Set());\n }\n inSidesByNode.get(info.dstId).add(info.dstSide);\n }\n for (const info of sideInfoByIdx.values()) {\n if (!isDiamondNode(nodeById.get(info.srcId))) {\n continue;\n }\n const inSides = inSidesByNode.get(info.srcId);\n if (!inSides?.has(info.srcSide)) {\n continue;\n }\n const secondary = secondarySide(info);\n if (inSides.has(secondary) || (sideLoad.get(loadKey(info.srcId, secondary)) ?? 0) > 0) {\n continue;\n }\n const primaryLoad = sideLoad.get(loadKey(info.srcId, info.srcSide)) ?? 0;\n sideLoad.set(loadKey(info.srcId, info.srcSide), Math.max(0, primaryLoad - 1));\n sideLoad.set(loadKey(info.srcId, secondary), 1);\n info.srcSide = secondary;\n }\n for (const info of sideInfoByIdx.values()) {\n const { edgeIdx: i, srcId, dstId, srcSide, dstSide } = info;\n const src = nodeById.get(srcId);\n const dst = nodeById.get(dstId);\n const srcKey = `${srcId}:${srcSide}:src`;\n const dstCoord = srcSide === \"top\" || srcSide === \"bottom\" ? dst.x ?? 0 : dst.y ?? 0;\n if (!portGroups.has(srcKey)) {\n portGroups.set(srcKey, []);\n }\n portGroups.get(srcKey).push({ edgeIdx: i, oppositeCoord: dstCoord });\n const dstKey = `${dstId}:${dstSide}:dst`;\n const srcCoord = dstSide === \"top\" || dstSide === \"bottom\" ? src.x ?? 0 : src.y ?? 0;\n if (!portGroups.has(dstKey)) {\n portGroups.set(dstKey, []);\n }\n portGroups.get(dstKey).push({ edgeIdx: i, oppositeCoord: srcCoord });\n }\n const portOffsets = /* @__PURE__ */ new Map();\n const MIN_PORT_SPACING3 = 8;\n for (const [key, group] of portGroups) {\n if (group.length < 2) {\n continue;\n }\n group.sort((a, b) => a.oppositeCoord - b.oppositeCoord);\n const parts = key.split(\":\");\n const nodeId = parts.slice(0, -2).join(\":\");\n const side = parts[parts.length - 2];\n const role = parts[parts.length - 1];\n const node = nodeById.get(nodeId);\n if (!node) {\n continue;\n }\n const isVerticalSide = side === \"left\" || side === \"right\";\n const sideLength = isVerticalSide ? node.height ?? 10 : node.width ?? 10;\n const shape = node.shape;\n const isDiamond = shape === \"question\" || shape === \"diamond\";\n const effectiveLength = isDiamond ? sideLength * 0.3 : sideLength;\n const MAX_PORT_SPACING = 20;\n const spacing = Math.min(\n MAX_PORT_SPACING,\n Math.max(MIN_PORT_SPACING3, effectiveLength / (group.length + 1))\n );\n const totalSpan = spacing * (group.length - 1);\n const startOffset = -totalSpan / 2;\n for (const [j, element] of group.entries()) {\n const offset = startOffset + j * spacing;\n const offsetKey = `${element.edgeIdx}:${role}`;\n portOffsets.set(offsetKey, offset);\n }\n }\n const edgeHasLabelNode = /* @__PURE__ */ __name((edgeIdx) => Boolean(edges[edgeIdx]?.labelNodeId), \"edgeHasLabelNode\");\n const faceHasLabelNode = /* @__PURE__ */ __name((nodeId, side) => {\n if (!nodeId) {\n return false;\n }\n return (portGroups.get(`${nodeId}:${side}:src`) ?? []).some(\n ({ edgeIdx }) => edgeHasLabelNode(edgeIdx)\n ) || (portGroups.get(`${nodeId}:${side}:dst`) ?? []).some(\n ({ edgeIdx }) => edgeHasLabelNode(edgeIdx)\n );\n }, \"faceHasLabelNode\");\n const applyPortOffset = /* @__PURE__ */ __name((basePort, side, offset) => {\n if (side === \"top\" || side === \"bottom\") {\n return { x: basePort.x + offset, y: basePort.y };\n } else {\n return { x: basePort.x, y: basePort.y + offset };\n }\n }, \"applyPortOffset\");\n const portsForEdge = /* @__PURE__ */ __name((edgeIndex, src, dst) => {\n const sideInfo = sideInfoByIdx.get(edgeIndex);\n const srcTarget = { x: dst.x ?? 0, y: dst.y ?? 0 };\n const dstTarget = { x: src.x ?? 0, y: src.y ?? 0 };\n const srcSide = sideInfo?.srcSide ?? determineSide(src, srcTarget);\n const dstSide = sideInfo?.dstSide ?? determineSide(dst, dstTarget);\n let pSrcPort = sideInfo ? portForSide(src, sideInfo.srcSide) : getOrthogonalPort(src, srcTarget, true);\n let pDstPort = sideInfo ? portForSide(dst, sideInfo.dstSide) : getOrthogonalPort(dst, dstTarget, false);\n const srcOffset = portOffsets.get(`${edgeIndex}:src`);\n const dstOffset = portOffsets.get(`${edgeIndex}:dst`);\n if (srcOffset !== void 0) {\n pSrcPort = applyPortOffset(pSrcPort, srcSide, srcOffset);\n }\n if (dstOffset !== void 0) {\n pDstPort = applyPortOffset(pDstPort, dstSide, dstOffset);\n }\n return { pSrcPort, pDstPort, srcSide, dstSide };\n }, \"portsForEdge\");\n for (const i of routingOrder) {\n const e = edges[i];\n edgeSegmentIndices[i] = [];\n if (!e.start || !e.end) {\n continue;\n }\n if (e.points && e.points.length > 0) {\n continue;\n }\n if (e.start === e.end) {\n continue;\n }\n const src = nodeById.get(e.start);\n const dst = nodeById.get(e.end);\n if (!src || !dst) {\n continue;\n }\n const {\n pSrcPort,\n pDstPort,\n srcSide: srcPortSide,\n dstSide: dstPortSide\n } = portsForEdge(i, src, dst);\n const pSrcAnchor = { ...pSrcPort };\n const pDstAnchor = { ...pDstPort };\n const srcPortIsVertical = srcPortSide === \"top\" || srcPortSide === \"bottom\";\n const dstPortIsVertical = dstPortSide === \"top\" || dstPortSide === \"bottom\";\n if (srcPortIsVertical) {\n const isBottom = pSrcPort.y > (src.y ?? 0);\n pSrcAnchor.y = isBottom ? pSrcPort.y + ANCHOR_OFFSET : pSrcPort.y - ANCHOR_OFFSET;\n } else {\n const isRight = pSrcPort.x > (src.x ?? 0);\n pSrcAnchor.x = isRight ? pSrcPort.x + ANCHOR_OFFSET : pSrcPort.x - ANCHOR_OFFSET;\n }\n if (dstPortIsVertical) {\n const isBottom = pDstPort.y > (dst.y ?? 0);\n pDstAnchor.y = isBottom ? pDstPort.y + ANCHOR_OFFSET : pDstPort.y - ANCHOR_OFFSET;\n } else {\n const isRight = pDstPort.x > (dst.x ?? 0);\n pDstAnchor.x = isRight ? pDstPort.x + ANCHOR_OFFSET : pDstPort.x - ANCHOR_OFFSET;\n }\n const isPointInObstacle = /* @__PURE__ */ __name((pt, excludeNodeIds) => {\n for (const obs of obstacles) {\n if (excludeNodeIds.includes(obs.nodeId)) {\n continue;\n }\n if (pt.x > obs.minX && pt.x < obs.maxX && pt.y > obs.minY && pt.y < obs.maxY) {\n return { inside: true, obstacle: obs };\n }\n }\n return { inside: false };\n }, \"isPointInObstacle\");\n const obstacleDetour = /* @__PURE__ */ __name((port, node, opposite, obs, portIsVertical) => {\n if (portIsVertical) {\n const leavesPositiveSide2 = port.y > (node.y ?? 0);\n const goRight = (opposite.x ?? 0) >= port.x;\n return {\n x: goRight ? obs.maxX + HORIZONTAL_PIPE_MARGIN : obs.minX - HORIZONTAL_PIPE_MARGIN,\n y: leavesPositiveSide2 ? obs.maxY + VERTICAL_PIPE_MARGIN : obs.minY - VERTICAL_PIPE_MARGIN,\n leavesPositiveSide: leavesPositiveSide2\n };\n }\n const leavesPositiveSide = port.x > (node.x ?? 0);\n const goDown = (opposite.y ?? 0) >= port.y;\n return {\n x: leavesPositiveSide ? obs.maxX + HORIZONTAL_PIPE_MARGIN : obs.minX - HORIZONTAL_PIPE_MARGIN,\n y: goDown ? obs.maxY + VERTICAL_PIPE_MARGIN : obs.minY - VERTICAL_PIPE_MARGIN,\n leavesPositiveSide\n };\n }, \"obstacleDetour\");\n let srcHandleWaypoints = [];\n const endpointIds = [e.start, e.end];\n const srcCheck = isPointInObstacle(pSrcAnchor, endpointIds);\n if (srcCheck.inside && srcCheck.obstacle) {\n const obs = srcCheck.obstacle;\n if (srcPortIsVertical) {\n const detour = obstacleDetour(pSrcPort, src, dst, obs, true);\n pSrcAnchor.x = detour.x;\n pSrcAnchor.y = detour.y;\n const gapY = detour.leavesPositiveSide ? Math.min(obs.minY - 2, pSrcPort.y + ANCHOR_OFFSET) : Math.max(obs.maxY + 2, pSrcPort.y - ANCHOR_OFFSET);\n srcHandleWaypoints = [\n { x: pSrcPort.x, y: gapY },\n // Orthogonal step in the gap\n { x: detour.x, y: gapY },\n // Horizontal detour\n { x: detour.x, y: detour.y }\n // Down past obstacle\n ];\n } else {\n const detour = obstacleDetour(pSrcPort, src, dst, obs, false);\n const gapX = detour.leavesPositiveSide ? Math.min(obs.minX - 2, pSrcPort.x + ANCHOR_OFFSET) : Math.max(obs.maxX + 2, pSrcPort.x - ANCHOR_OFFSET);\n pSrcAnchor.x = detour.x;\n pSrcAnchor.y = detour.y;\n srcHandleWaypoints = [\n { x: gapX, y: pSrcPort.y },\n // Orthogonal step in the gap\n { x: gapX, y: detour.y },\n // Vertical detour\n { x: detour.x, y: detour.y }\n // Horizontal past obstacle\n ];\n }\n }\n let dstHandleWaypoints = [];\n const dstCheck = isPointInObstacle(pDstAnchor, endpointIds);\n if (dstCheck.inside && dstCheck.obstacle) {\n const obs = dstCheck.obstacle;\n if (dstPortIsVertical) {\n const detour = obstacleDetour(pDstPort, dst, src, obs, true);\n pDstAnchor.x = detour.x;\n pDstAnchor.y = detour.y;\n dstHandleWaypoints = [\n { x: detour.x, y: detour.y },\n // From anchor position\n { x: pDstPort.x, y: detour.y }\n // Go sideways to port's X\n // Then orthogonally to port\n ];\n } else {\n const detour = obstacleDetour(pDstPort, dst, src, obs, false);\n pDstAnchor.x = detour.x;\n pDstAnchor.y = detour.y;\n dstHandleWaypoints = [\n { x: detour.x, y: detour.y },\n // From anchor position\n { x: detour.x, y: pDstPort.y }\n // Go vertically to port's Y\n ];\n }\n }\n if (srcHandleWaypoints.length === 0 && dstHandleWaypoints.length === 0) {\n const hpMargin = HORIZONTAL_PIPE_MARGIN;\n const anchorsSameX = Math.abs(pSrcAnchor.x - pDstAnchor.x) < hpMargin;\n const anchorsSameY = Math.abs(pSrcAnchor.y - pDstAnchor.y) < hpMargin;\n const hasPortOffset = portOffsets.get(`${i}:src`) !== void 0 || portOffsets.get(`${i}:dst`) !== void 0;\n const srcFaceTotal = (portGroups.get(`${e.start ?? \"\"}:${srcPortSide}:src`)?.length ?? 0) + (portGroups.get(`${e.start ?? \"\"}:${srcPortSide}:dst`)?.length ?? 0);\n const dstFaceTotal = (portGroups.get(`${e.end ?? \"\"}:${dstPortSide}:src`)?.length ?? 0) + (portGroups.get(`${e.end ?? \"\"}:${dstPortSide}:dst`)?.length ?? 0);\n const faceContested = srcFaceTotal > 1 || dstFaceTotal > 1;\n const srcIncidentTotal = incidentEdgeTotals.get(e.start ?? \"\") ?? 0;\n const dstIncidentTotal = incidentEdgeTotals.get(e.end ?? \"\") ?? 0;\n const contestedFaceHasLabel = srcFaceTotal > 1 && faceHasLabelNode(e.start, srcPortSide) || dstFaceTotal > 1 && faceHasLabelNode(e.end, dstPortSide);\n const srcContestAllowsCenteredStraight = srcFaceTotal <= 1 || srcIncidentTotal <= 2;\n const dstContestAllowsCenteredStraight = dstFaceTotal <= 1 || dstIncidentTotal <= 2;\n const canPreserveSimpleContestedStraight = faceContested && !contestedFaceHasLabel && srcContestAllowsCenteredStraight && dstContestAllowsCenteredStraight;\n if ((anchorsSameX || anchorsSameY) && !hasPortOffset && (!faceContested || canPreserveSimpleContestedStraight)) {\n const directBlocked = isSegmentBlocked(pSrcPort, pDstPort, e.start, e.end);\n if (!directBlocked) {\n e.points = [{ ...pSrcPort }, { ...pSrcAnchor }, { ...pDstAnchor }, { ...pDstPort }];\n straightIntraLaneEdges.add(i);\n const fastPathOrientation = anchorsSameY ? \"horizontal\" : \"vertical\";\n const fastPathCoord = anchorsSameY ? pSrcPort.y : pSrcPort.x;\n const fastPathFrom = anchorsSameY ? Math.min(pSrcPort.x, pDstPort.x) : Math.min(pSrcPort.y, pDstPort.y);\n const fastPathTo = anchorsSameY ? Math.max(pSrcPort.x, pDstPort.x) : Math.max(pSrcPort.y, pDstPort.y);\n const fastPathPipe = {\n id: `fast-path-${fastPathOrientation}-${fastPathCoord.toFixed(0)}-${i}`,\n orientation: fastPathOrientation,\n coord: fastPathCoord,\n spanMin: fastPathFrom,\n spanMax: fastPathTo,\n tracks: []\n };\n allRoutedSegments.push({\n edgeIndex: i,\n segmentIndex: 0,\n orientation: fastPathOrientation,\n pipe: fastPathPipe,\n trackIndex: 0,\n from: fastPathFrom,\n to: fastPathTo\n });\n continue;\n }\n }\n }\n const srcPipe = getOrAddPipe(\"vertical\", pSrcAnchor.x, pSrcAnchor.y, pSrcAnchor.y);\n pSrcAnchor.x = srcPipe.coord;\n const dstPipe = getOrAddPipe(\"vertical\", pDstAnchor.x, pDstAnchor.y, pDstAnchor.y);\n pDstAnchor.x = dstPipe.coord;\n let bbMinX = Math.min(pSrcAnchor.x, pDstAnchor.x) - 50;\n let bbMaxX = Math.max(pSrcAnchor.x, pDstAnchor.x) + 50;\n let bbMinY = Math.min(pSrcAnchor.y, pDstAnchor.y) - 50;\n let bbMaxY = Math.max(pSrcAnchor.y, pDstAnchor.y) + 50;\n for (const obs of obstacles) {\n const pathMinX = Math.min(pSrcAnchor.x, pDstAnchor.x);\n const pathMaxX = Math.max(pSrcAnchor.x, pDstAnchor.x);\n const pathMinY = Math.min(pSrcAnchor.y, pDstAnchor.y);\n const pathMaxY = Math.max(pSrcAnchor.y, pDstAnchor.y);\n const obsBlocksPath = obs.minX < pathMaxX && obs.maxX > pathMinX && obs.minY < pathMaxY && obs.maxY > pathMinY;\n if (obsBlocksPath) {\n bbMinX = Math.min(bbMinX, obs.minX - ROUTING_MARGIN);\n bbMaxX = Math.max(bbMaxX, obs.maxX + ROUTING_MARGIN);\n bbMinY = Math.min(bbMinY, obs.minY - ROUTING_MARGIN);\n bbMaxY = Math.max(bbMaxY, obs.maxY + ROUTING_MARGIN);\n }\n }\n for (const obs of obstacles) {\n if (obs.maxX < bbMinX || obs.minX > bbMaxX || obs.maxY < bbMinY || obs.minY > bbMaxY) {\n continue;\n }\n const hMargin = HORIZONTAL_PIPE_MARGIN;\n getOrAddPipe(\"horizontal\", obs.minY - hMargin, bbMinX, bbMaxX);\n getOrAddPipe(\"horizontal\", obs.maxY + hMargin, bbMinX, bbMaxX);\n const vMargin = VERTICAL_PIPE_MARGIN;\n getOrAddPipe(\"vertical\", obs.minX - vMargin, bbMinY, bbMaxY);\n getOrAddPipe(\"vertical\", obs.maxX + vMargin, bbMinY, bbMaxY);\n }\n getOrAddPipe(\"horizontal\", pSrcAnchor.y, bbMinX, bbMaxX);\n getOrAddPipe(\"horizontal\", pDstAnchor.y, bbMinX, bbMaxX);\n const hPipes = pipes.filter(\n (p) => p.orientation === \"horizontal\" && p.coord >= bbMinY && p.coord <= bbMaxY\n );\n const vPipes = pipes.filter(\n (p) => p.orientation === \"vertical\" && p.coord >= bbMinX && p.coord <= bbMaxX\n );\n const getKey = /* @__PURE__ */ __name((x, y) => `${x.toFixed(1)},${y.toFixed(1)}`, \"getKey\");\n const startKey = getKey(pSrcAnchor.x, pSrcAnchor.y);\n const endKey = getKey(pDstAnchor.x, pDstAnchor.y);\n const gScore = /* @__PURE__ */ new Map();\n const cameFrom = /* @__PURE__ */ new Map();\n const arrivalDir = /* @__PURE__ */ new Map();\n const openSet = /* @__PURE__ */ new Set();\n const openList = [];\n gScore.set(startKey, 0);\n arrivalDir.set(startKey, \"n\");\n openList.push({\n key: startKey,\n f: Math.hypot(pDstAnchor.x - pSrcAnchor.x, pDstAnchor.y - pSrcAnchor.y),\n pt: pSrcAnchor\n });\n openSet.add(startKey);\n let foundPath = [];\n const checkSegmentBlocked = /* @__PURE__ */ __name((p1, p2) => {\n return isSegmentBlocked(p1, p2, e.start, e.end);\n }, \"checkSegmentBlocked\");\n const cornerHV = { x: pDstAnchor.x, y: pSrcAnchor.y };\n const seg1HV_blocked = checkSegmentBlocked(pSrcAnchor, cornerHV);\n const seg2HV_blocked = checkSegmentBlocked(cornerHV, pDstAnchor);\n const pathHV_blocked = seg1HV_blocked || seg2HV_blocked;\n const cornerVH = { x: pSrcAnchor.x, y: pDstAnchor.y };\n const seg1VH_blocked = checkSegmentBlocked(pSrcAnchor, cornerVH);\n const seg2VH_blocked = checkSegmentBlocked(cornerVH, pDstAnchor);\n const pathVH_blocked = seg1VH_blocked || seg2VH_blocked;\n if (!pathHV_blocked) {\n if (Math.abs(pSrcAnchor.y - pDstAnchor.y) < EPS7 || Math.abs(pSrcAnchor.x - pDstAnchor.x) < EPS7) {\n foundPath = [pSrcAnchor, pDstAnchor];\n } else {\n foundPath = [pSrcAnchor, cornerHV, pDstAnchor];\n }\n } else if (!pathVH_blocked) {\n if (Math.abs(pSrcAnchor.x - pDstAnchor.x) < EPS7) {\n foundPath = [pSrcAnchor, pDstAnchor];\n } else {\n foundPath = [pSrcAnchor, cornerVH, pDstAnchor];\n }\n }\n if (foundPath.length === 0) {\n while (openList.length > 0) {\n openList.sort((a, b) => a.f - b.f);\n const current = openList.shift();\n openSet.delete(current.key);\n if (current.key === endKey) {\n let currKey = endKey;\n let currPt = pDstAnchor;\n foundPath = [currPt];\n while (cameFrom.has(currKey)) {\n const prev = cameFrom.get(currKey);\n foundPath.unshift(prev);\n currPt = prev;\n currKey = getKey(prev.x, prev.y);\n }\n break;\n }\n const cx = current.pt.x;\n const cy = current.pt.y;\n const sortedVPipes = vPipes.sort((a, b) => a.coord - b.coord);\n const vIdx = sortedVPipes.findIndex((p) => Math.abs(p.coord - cx) < 1);\n const hPipesSorted = hPipes.sort((a, b) => a.coord - b.coord);\n const hIdx = hPipesSorted.findIndex((p) => Math.abs(p.coord - cy) < 1);\n const neighbors = [];\n if (vIdx > 0) {\n neighbors.push({ x: sortedVPipes[vIdx - 1].coord, y: cy });\n }\n if (vIdx >= 0 && vIdx < sortedVPipes.length - 1) {\n neighbors.push({ x: sortedVPipes[vIdx + 1].coord, y: cy });\n }\n if (hIdx > 0) {\n neighbors.push({ x: cx, y: hPipesSorted[hIdx - 1].coord });\n }\n if (hIdx >= 0 && hIdx < hPipesSorted.length - 1) {\n neighbors.push({ x: cx, y: hPipesSorted[hIdx + 1].coord });\n }\n for (const neighbor of neighbors) {\n const minX = Math.min(cx, neighbor.x);\n const maxX = Math.max(cx, neighbor.x);\n const minY = Math.min(cy, neighbor.y);\n const maxY = Math.max(cy, neighbor.y);\n const blocked = obstacles.some((obs) => {\n if (obs.nodeId === e.start || obs.nodeId === e.end) {\n return false;\n }\n if (minX !== maxX) {\n return obs.minY < cy && obs.maxY > cy && obs.maxX > minX && obs.minX < maxX;\n } else {\n return obs.minX < cx && obs.maxX > cx && obs.maxY > minY && obs.minY < maxY;\n }\n });\n if (blocked) {\n continue;\n }\n const nKey = getKey(neighbor.x, neighbor.y);\n const dist = Math.abs(neighbor.x - cx) + Math.abs(neighbor.y - cy);\n const penalty = crossingPenalty(i, current.pt, neighbor);\n let dirPenalty = 0;\n const destDx = pDstAnchor.x - pSrcAnchor.x;\n const destDy = pDstAnchor.y - pSrcAnchor.y;\n const moveDx = neighbor.x - cx;\n const moveDy = neighbor.y - cy;\n if (destDy > 10 && moveDy < -5 || destDy < -10 && moveDy > 5) {\n dirPenalty = Math.abs(moveDy) * 100;\n }\n if (destDx > 10 && moveDx < -5 || destDx < -10 && moveDx > 5) {\n dirPenalty += Math.abs(moveDx) * 50;\n }\n let bendPenalty = 0;\n const currentDir = arrivalDir.get(current.key) ?? \"n\";\n const moveDir = Math.abs(moveDx) > EPS7 ? \"h\" : \"v\";\n if (currentDir !== \"n\" && currentDir !== moveDir) {\n bendPenalty = 50;\n }\n const stepCost = dist + penalty + dirPenalty + bendPenalty;\n const tentativeG = (gScore.get(current.key) ?? Infinity) + stepCost;\n const h = Math.abs(pDstAnchor.x - neighbor.x) + Math.abs(pDstAnchor.y - neighbor.y);\n if (tentativeG < (gScore.get(nKey) ?? Infinity)) {\n cameFrom.set(nKey, current.pt);\n gScore.set(nKey, tentativeG);\n arrivalDir.set(nKey, moveDir);\n if (!openSet.has(nKey)) {\n openList.push({ key: nKey, f: tentativeG + h, pt: neighbor });\n openSet.add(nKey);\n } else {\n const idx = openList.findIndex((x) => x.key === nKey);\n if (idx !== -1) {\n openList[idx].f = tentativeG + h;\n }\n }\n }\n }\n }\n }\n if (foundPath.length === 0) {\n foundPath = [pSrcAnchor, { x: pSrcAnchor.x, y: pDstAnchor.y }, pDstAnchor];\n }\n if (foundPath.length > 4) {\n const start = foundPath[0];\n const end = foundPath[foundPath.length - 1];\n let minX = Math.min(start.x, end.x);\n let maxX = Math.max(start.x, end.x);\n let minY = Math.min(start.y, end.y);\n let maxY = Math.max(start.y, end.y);\n for (const pt of foundPath) {\n minX = Math.min(minX, pt.x);\n maxX = Math.max(maxX, pt.x);\n minY = Math.min(minY, pt.y);\n maxY = Math.max(maxY, pt.y);\n }\n const wentRight = maxX > Math.max(start.x, end.x);\n const wentLeft = minX < Math.min(start.x, end.x);\n if (isLR) {\n const margin = VERTICAL_PIPE_MARGIN;\n if (wentRight) {\n const pathX = Math.max(start.x, end.x);\n const pathMinY = Math.min(start.y, end.y);\n const pathMaxY = Math.max(start.y, end.y);\n const detourObstacles = obstacles.filter(\n (obs) => obs.minX < pathX && obs.maxX > pathX && // obstacle's x-range contains the path x\n obs.minY < pathMaxY && obs.maxY > pathMinY\n // obstacle's y-range overlaps with path y-range\n );\n if (detourObstacles.length > 0) {\n let visualMaxX = Math.max(start.x, end.x);\n for (const obs of detourObstacles) {\n const obsCenterX = (obs.minX + obs.maxX) / 2;\n if (obs.visualXHalfExtent === void 0 || isNaN(obs.visualXHalfExtent)) {\n continue;\n }\n const visualRight = obsCenterX + obs.visualXHalfExtent + margin;\n visualMaxX = Math.max(visualMaxX, visualRight);\n }\n if (!isNaN(visualMaxX)) {\n maxX = visualMaxX;\n }\n }\n }\n if (wentLeft) {\n const detourObstacles = obstacles.filter(\n (obs) => obs.minX < Math.min(start.x, end.x) + margin && // obstacle extends past the direct path\n obs.minY < Math.max(start.y, end.y) && obs.maxY > Math.min(start.y, end.y)\n // obstacle is in Y range\n );\n if (detourObstacles.length > 0) {\n let visualMinX = Math.min(start.x, end.x);\n for (const obs of detourObstacles) {\n const obsCenterX = (obs.minX + obs.maxX) / 2;\n const visualLeft = obsCenterX - obs.visualXHalfExtent - margin;\n visualMinX = Math.min(visualMinX, visualLeft);\n }\n minX = visualMinX;\n }\n }\n }\n const findBestReturnY = /* @__PURE__ */ __name((detourX) => {\n const goingDown = end.y > start.y;\n const relevantObs = obstacles.filter((obs) => {\n const obsInXRange = Math.min(start.x, end.x) < obs.maxX && Math.max(start.x, end.x) > obs.minX;\n const obsInYRange = Math.min(start.y, end.y) < obs.maxY && Math.max(start.y, end.y) > obs.minY;\n return obsInXRange && obsInYRange;\n });\n let filteredObs = relevantObs;\n if (isLR && relevantObs.length > 0) {\n const obsAtDetourX = relevantObs.filter(\n (obs) => obs.minX < detourX && obs.maxX > detourX\n );\n if (obsAtDetourX.length > 0) {\n filteredObs = obsAtDetourX;\n }\n }\n if (filteredObs.length === 0) {\n return end.y;\n }\n const margin = HORIZONTAL_PIPE_MARGIN;\n if (goingDown) {\n const lowestObsBottom = Math.max(...filteredObs.map((obs) => obs.maxY));\n const bestY = lowestObsBottom + margin;\n if (bestY < end.y - EPS7) {\n return bestY;\n }\n } else {\n const highestObsTop = Math.min(...filteredObs.map((obs) => obs.minY));\n const bestY = highestObsTop - margin;\n if (bestY > end.y + EPS7) {\n return bestY;\n }\n }\n return end.y;\n }, \"findBestReturnY\");\n const trySimplifyWithDetourX = /* @__PURE__ */ __name((detourX) => {\n const bestY = findBestReturnY(detourX);\n const corner1 = { x: detourX, y: start.y };\n const corner2 = { x: detourX, y: bestY };\n const corner3 = { x: end.x, y: bestY };\n const seg1Blocked = checkSegmentBlocked(start, corner1);\n const seg2Blocked = checkSegmentBlocked(corner1, corner2);\n const seg3Blocked = checkSegmentBlocked(corner2, corner3);\n const seg4Blocked = bestY !== end.y ? checkSegmentBlocked(corner3, end) : false;\n if (!seg1Blocked && !seg2Blocked && !seg3Blocked && !seg4Blocked) {\n if (Math.abs(bestY - end.y) < EPS7) {\n return [start, corner1, corner2, end];\n }\n return [start, corner1, corner2, corner3, end];\n }\n return null;\n }, \"trySimplifyWithDetourX\");\n const simplified2 = wentRight && !wentLeft ? trySimplifyWithDetourX(maxX) : wentLeft && !wentRight ? trySimplifyWithDetourX(minX) : null;\n if (simplified2) {\n foundPath = simplified2;\n }\n }\n const fullPoints = [\n pSrcPort,\n ...srcHandleWaypoints,\n ...foundPath,\n ...dstHandleWaypoints.reverse(),\n // Reverse because they're stored anchor->waypoint->port\n pDstPort\n ];\n if (fullPoints.length >= 3) {\n const C = fullPoints[fullPoints.length - 1];\n const B = fullPoints[fullPoints.length - 2];\n const A = fullPoints[fullPoints.length - 3];\n const isHoriz = Math.abs(A.y - B.y) < EPS7 && Math.abs(B.y - C.y) < EPS7;\n const isVert = Math.abs(A.x - B.x) < EPS7 && Math.abs(B.x - C.x) < EPS7;\n if (isHoriz) {\n const signAB = Math.sign(B.x - A.x);\n const signAC = Math.sign(C.x - A.x);\n if (signAB !== 0 && signAB === signAC && Math.abs(B.x - A.x) > Math.abs(C.x - A.x)) {\n fullPoints.splice(-2, 1);\n }\n } else if (isVert) {\n const signAB = Math.sign(B.y - A.y);\n const signAC = Math.sign(C.y - A.y);\n if (signAB !== 0 && signAB === signAC && Math.abs(B.y - A.y) > Math.abs(C.y - A.y)) {\n fullPoints.splice(-2, 1);\n }\n }\n }\n const simplified = [fullPoints[0]];\n for (let k = 1; k < fullPoints.length - 1; k++) {\n if (k === 1) {\n simplified.push(fullPoints[k]);\n continue;\n }\n const prev = simplified[simplified.length - 1];\n const curr = fullPoints[k];\n const next = fullPoints[k + 1];\n if (Math.abs(prev.y - curr.y) < EPS7 && Math.abs(curr.y - next.y) < EPS7) {\n const dir1 = curr.x > prev.x;\n const dir2 = next.x > curr.x;\n if (dir1 !== dir2) {\n simplified.push(curr);\n continue;\n }\n continue;\n }\n if (Math.abs(prev.x - curr.x) < EPS7 && Math.abs(curr.x - next.x) < EPS7) {\n const dir1 = curr.y > prev.y;\n const dir2 = next.y > curr.y;\n if (dir1 !== dir2) {\n simplified.push(curr);\n continue;\n }\n continue;\n }\n simplified.push(curr);\n }\n simplified.push(fullPoints[fullPoints.length - 1]);\n for (let k = 0; k < simplified.length - 1; k++) {\n const p1 = simplified[k];\n const p2 = simplified[k + 1];\n const orientation = Math.abs(p1.x - p2.x) < EPS7 ? \"vertical\" : \"horizontal\";\n const coord = orientation === \"vertical\" ? p1.x : p1.y;\n const from = orientation === \"vertical\" ? Math.min(p1.y, p2.y) : Math.min(p1.x, p2.x);\n const to = orientation === \"vertical\" ? Math.max(p1.y, p2.y) : Math.max(p1.x, p2.x);\n const pipe = getOrAddPipe(orientation, coord, from, to);\n const rSeg = {\n edgeIndex: i,\n segmentIndex: k,\n orientation,\n pipe,\n trackIndex: 0,\n // Initial track\n from,\n to\n };\n allRoutedSegments.push(rSeg);\n edgeSegmentIndices[i].push(allRoutedSegments.length - 1);\n if (!pipe.tracks[0]) {\n pipe.tracks[0] = { index: 0, coord: pipe.coord, segments: [] };\n }\n pipe.tracks[0].segments.push({\n edgeIndex: i,\n segmentIndex: k,\n from,\n to\n });\n }\n }\n const segmentsOverlap = /* @__PURE__ */ __name((s1, s2) => {\n return s1.from < s2.to && s2.from < s1.to;\n }, \"segmentsOverlap\");\n const trySwapSegmentsAcrossTracks = /* @__PURE__ */ __name((s1, s2, t1, t2) => {\n const canS1GoT2 = !t2.segments.some(\n (r) => (r.edgeIndex !== s2.edgeIndex || r.segmentIndex !== s2.segmentIndex) && segmentsOverlap(r, s1)\n );\n const canS2GoT1 = !t1.segments.some(\n (r) => (r.edgeIndex !== s1.edgeIndex || r.segmentIndex !== s1.segmentIndex) && segmentsOverlap(r, s2)\n );\n if (canS1GoT2 && canS2GoT1) {\n s1.trackIndex = t2.index;\n s2.trackIndex = t1.index;\n t1.segments = [\n ...t1.segments.filter(\n (r) => r.edgeIndex !== s1.edgeIndex || r.segmentIndex !== s1.segmentIndex\n ),\n {\n edgeIndex: s2.edgeIndex,\n segmentIndex: s2.segmentIndex,\n from: s2.from,\n to: s2.to\n }\n ];\n t2.segments = [\n ...t2.segments.filter(\n (r) => r.edgeIndex !== s2.edgeIndex || r.segmentIndex !== s2.segmentIndex\n ),\n {\n edgeIndex: s1.edgeIndex,\n segmentIndex: s1.segmentIndex,\n from: s1.from,\n to: s1.to\n }\n ];\n return true;\n }\n return false;\n }, \"trySwapSegmentsAcrossTracks\");\n const createNewTrack = /* @__PURE__ */ __name((pipe) => {\n const idx = pipe.tracks.length;\n pipe.tracks[idx] = { index: idx, coord: pipe.coord, segments: [] };\n return idx;\n }, \"createNewTrack\");\n const moveSegmentToTrack = /* @__PURE__ */ __name((seg, trackIdx) => {\n const oldTrack = seg.pipe.tracks[seg.trackIndex];\n oldTrack.segments = oldTrack.segments.filter(\n (r) => r.edgeIndex !== seg.edgeIndex || r.segmentIndex !== seg.segmentIndex\n );\n seg.trackIndex = trackIdx;\n const newTrack = seg.pipe.tracks[trackIdx];\n newTrack.segments.push({\n edgeIndex: seg.edgeIndex,\n segmentIndex: seg.segmentIndex,\n from: seg.from,\n to: seg.to\n });\n }, \"moveSegmentToTrack\");\n const moveSegmentChainToTrack = /* @__PURE__ */ __name((seg, trackIdx) => {\n const indices = edgeSegmentIndices[seg.edgeIndex];\n for (const idx of indices) {\n const s = allRoutedSegments[idx];\n if (s.pipe === seg.pipe) {\n moveSegmentToTrack(s, trackIdx);\n }\n }\n }, \"moveSegmentChainToTrack\");\n const getAdjacentSegmentsAlongEdge = /* @__PURE__ */ __name((seg) => {\n const indices = edgeSegmentIndices[seg.edgeIndex];\n const idxInList = indices.indexOf(allRoutedSegments.indexOf(seg));\n const adj = [];\n if (idxInList > 0) {\n adj.push(allRoutedSegments[indices[idxInList - 1]]);\n }\n if (idxInList < indices.length - 1) {\n adj.push(allRoutedSegments[indices[idxInList + 1]]);\n }\n return adj;\n }, \"getAdjacentSegmentsAlongEdge\");\n const haveAnyCrossing = /* @__PURE__ */ __name((segA, segB) => {\n if (segA.orientation === segB.orientation) {\n return false;\n }\n const h = segA.orientation === \"horizontal\" ? segA : segB;\n const v = segA.orientation === \"horizontal\" ? segB : segA;\n return v.pipe.coord > h.from && v.pipe.coord < h.to && h.pipe.coord > v.from && h.pipe.coord < v.to;\n }, \"haveAnyCrossing\");\n const findAvailableTrack = /* @__PURE__ */ __name((pipe, seg) => {\n for (const track of pipe.tracks) {\n const overlap = track.segments.some(\n (r) => (r.edgeIndex !== seg.edgeIndex || r.segmentIndex !== seg.segmentIndex) && segmentsOverlap(r, seg)\n );\n if (!overlap) {\n return track.index;\n }\n }\n return -1;\n }, \"findAvailableTrack\");\n const segmentsConflict = /* @__PURE__ */ __name((s1, s2) => {\n if (s1.trackIndex === s2.trackIndex) {\n return segmentsOverlap(s1, s2);\n }\n const adj1 = getAdjacentSegmentsAlongEdge(s1);\n const adj2 = getAdjacentSegmentsAlongEdge(s2);\n return adj1.some((a1) => adj2.some((a2) => haveAnyCrossing(a1, a2)));\n }, \"segmentsConflict\");\n const resolveTrackConflict = /* @__PURE__ */ __name((s1, s2, move) => {\n if (trySwapSegmentsAcrossTracks(\n s1,\n s2,\n s1.pipe.tracks[s1.trackIndex],\n s2.pipe.tracks[s2.trackIndex]\n )) {\n return;\n }\n const avail = findAvailableTrack(s1.pipe, s2);\n move(s2, avail !== -1 ? avail : createNewTrack(s1.pipe));\n }, \"resolveTrackConflict\");\n const resolveHandleConflicts = /* @__PURE__ */ __name((handles) => {\n let crossings = 0;\n for (let i = 0; i < handles.length; i++) {\n for (let j = i + 1; j < handles.length; j++) {\n const h1 = handles[i];\n const h2 = handles[j];\n if (h1.pipe !== h2.pipe) {\n continue;\n }\n if (segmentsConflict(h1, h2)) {\n crossings++;\n resolveTrackConflict(h1, h2, moveSegmentChainToTrack);\n }\n }\n }\n return crossings;\n }, \"resolveHandleConflicts\");\n const destInfoCache = /* @__PURE__ */ new Map();\n const getDestInfo = /* @__PURE__ */ __name((edgeIdx) => {\n if (destInfoCache.has(edgeIdx)) {\n return destInfoCache.get(edgeIdx);\n }\n const indices = edgeSegmentIndices[edgeIdx];\n if (indices.length === 0) {\n const info2 = { dest: 0, deviation: 0, base: 0, delta: 0 };\n destInfoCache.set(edgeIdx, info2);\n return info2;\n }\n const firstSeg = allRoutedSegments[indices[0]];\n const base = firstSeg.pipe.coord;\n let dest = base;\n for (let idx = 1; idx < indices.length; idx++) {\n const seg = allRoutedSegments[indices[idx]];\n if (seg.orientation === \"horizontal\") {\n const candidateA = seg.from;\n const candidateB = seg.to;\n dest = Math.abs(candidateA - base) > Math.abs(candidateB - base) ? candidateA : candidateB;\n break;\n }\n }\n const deviation = Math.abs(dest - base);\n const info = { dest, deviation, base, delta: dest - base };\n destInfoCache.set(edgeIdx, info);\n return info;\n }, \"getDestInfo\");\n const fixSourceHandleCrossings = /* @__PURE__ */ __name(() => {\n let crossings = 0;\n const edgesBySource = /* @__PURE__ */ new Map();\n for (const [i, e] of edges.entries()) {\n if (edgeSegmentIndices[i].length === 0) {\n continue;\n }\n if (!e.start) {\n continue;\n }\n if (!edgesBySource.has(e.start)) {\n edgesBySource.set(e.start, []);\n }\n edgesBySource.get(e.start).push(i);\n }\n const getEdgeDistance = /* @__PURE__ */ __name((edgeIdx) => {\n const edge = edges[edgeIdx];\n if (!edge.start || !edge.end) {\n return 0;\n }\n const srcNode = nodeById.get(edge.start);\n const dstNode = nodeById.get(edge.end);\n if (!srcNode || !dstNode) {\n return 0;\n }\n const dx = (dstNode.x ?? 0) - (srcNode.x ?? 0);\n const dy = (dstNode.y ?? 0) - (srcNode.y ?? 0);\n return Math.abs(dx) + Math.abs(dy);\n }, \"getEdgeDistance\");\n for (const grp of edgesBySource.values()) {\n grp.sort((a, b) => {\n const infoA = getDestInfo(a);\n const infoB = getDestInfo(b);\n if (Math.abs(infoA.deviation - infoB.deviation) > 1) {\n return infoA.deviation - infoB.deviation;\n }\n if (Math.abs(infoA.dest - infoB.dest) > 1) {\n return infoA.dest - infoB.dest;\n }\n const distA = getEdgeDistance(a);\n const distB = getEdgeDistance(b);\n if (Math.abs(distA - distB) > 1) {\n return distB - distA;\n }\n const lenA = edgeSegmentIndices[a].length;\n const lenB = edgeSegmentIndices[b].length;\n if (lenA !== lenB) {\n return lenA - lenB;\n }\n if (lenA === 1) {\n const idxA = edgeSegmentIndices[a][0];\n const idxB = edgeSegmentIndices[b][0];\n if (allRoutedSegments[idxA] && allRoutedSegments[idxB]) {\n const segA = allRoutedSegments[idxA];\n const segB = allRoutedSegments[idxB];\n const distA2 = Math.abs(segA.to - segA.from);\n const distB2 = Math.abs(segB.to - segB.from);\n if (Math.abs(distA2 - distB2) > 1) {\n return distA2 - distB2;\n }\n }\n }\n return 0;\n });\n const handles = grp.map((ei) => allRoutedSegments[edgeSegmentIndices[ei][0]]);\n crossings += resolveHandleConflicts(handles);\n }\n return crossings;\n }, \"fixSourceHandleCrossings\");\n const fixTargetHandleCrossings = /* @__PURE__ */ __name(() => {\n let crossings = 0;\n const edgesByTarget = /* @__PURE__ */ new Map();\n for (const [i, e] of edges.entries()) {\n const indices = edgeSegmentIndices[i];\n if (indices.length === 0) {\n continue;\n }\n if (!e.end) {\n continue;\n }\n if (!edgesByTarget.has(e.end)) {\n edgesByTarget.set(e.end, []);\n }\n edgesByTarget.get(e.end).push(i);\n }\n for (const grp of edgesByTarget.values()) {\n grp.sort((a, b) => {\n const getDist = /* @__PURE__ */ __name((edgeIdx) => {\n const indices = edgeSegmentIndices[edgeIdx];\n if (indices.length < 2) {\n return 0;\n }\n const prev = allRoutedSegments[indices[indices.length - 2]];\n return Math.abs(prev.to - prev.from);\n }, \"getDist\");\n const scoreA = getDist(a);\n const scoreB = getDist(b);\n if (Math.abs(scoreA - scoreB) > 0.1) {\n return scoreA - scoreB;\n }\n return a - b;\n });\n const handles = grp.map(\n (ei) => allRoutedSegments[edgeSegmentIndices[ei][edgeSegmentIndices[ei].length - 1]]\n );\n crossings += resolveHandleConflicts(handles);\n }\n return crossings;\n }, \"fixTargetHandleCrossings\");\n const fixPipeCrossings = /* @__PURE__ */ __name(() => {\n let crossings = 0;\n for (const pipe of pipes) {\n const pipeSegments = [];\n for (const t of pipe.tracks) {\n for (const ref of t.segments) {\n const idx = edgeSegmentIndices[ref.edgeIndex].find(\n (ix) => allRoutedSegments[ix].segmentIndex === ref.segmentIndex\n );\n if (idx !== void 0) {\n pipeSegments.push(allRoutedSegments[idx]);\n }\n }\n }\n pipeSegments.sort((a, b) => a.edgeIndex - b.edgeIndex || a.segmentIndex - b.segmentIndex);\n for (let i = 0; i < pipeSegments.length; i++) {\n for (let j = i + 1; j < pipeSegments.length; j++) {\n const s1 = pipeSegments[i];\n const s2 = pipeSegments[j];\n if (segmentsConflict(s1, s2)) {\n crossings++;\n resolveTrackConflict(s1, s2, moveSegmentToTrack);\n }\n }\n }\n }\n return crossings;\n }, \"fixPipeCrossings\");\n let iterations = 0;\n const MAX_ITER = 10;\n while (iterations < MAX_ITER) {\n let changed = 0;\n changed += fixSourceHandleCrossings();\n changed += fixTargetHandleCrossings();\n changed += fixPipeCrossings();\n if (changed === 0) {\n break;\n }\n iterations++;\n }\n const segmentCoords = /* @__PURE__ */ new Map();\n for (const pipe of pipes) {\n const segments = [];\n pipe.tracks.forEach((t) => {\n t.segments.forEach((s) => {\n segments.push({\n edgeIndex: s.edgeIndex,\n segmentIndex: s.segmentIndex,\n trackIndex: t.index,\n from: s.from,\n to: s.to\n });\n });\n });\n segments.sort((a, b) => a.from - b.from);\n const clusters = [];\n if (segments.length > 0) {\n let currentCluster = [segments[0]];\n let clusterEnd = segments[0].to;\n for (let k = 1; k < segments.length; k++) {\n const s = segments[k];\n if (s.from < clusterEnd) {\n currentCluster.push(s);\n clusterEnd = Math.max(clusterEnd, s.to);\n } else {\n clusters.push(currentCluster);\n currentCluster = [s];\n clusterEnd = s.to;\n }\n }\n clusters.push(currentCluster);\n }\n for (const cluster of clusters) {\n const usedTracks = /* @__PURE__ */ new Set();\n cluster.forEach((s) => usedTracks.add(s.trackIndex));\n const trackScores = /* @__PURE__ */ new Map();\n cluster.forEach((s) => {\n const info = getDestInfo(s.edgeIndex);\n trackScores.set(s.trackIndex, (trackScores.get(s.trackIndex) ?? 0) + info.delta);\n });\n const leftTracks = [...usedTracks].filter((t) => (trackScores.get(t) ?? 0) < -1);\n const rightTracks = [...usedTracks].filter((t) => (trackScores.get(t) ?? 0) > 1);\n const neutralTracks = [...usedTracks].filter((t) => Math.abs(trackScores.get(t) ?? 0) <= 1);\n leftTracks.sort((a, b) => (trackScores.get(b) ?? 0) - (trackScores.get(a) ?? 0));\n rightTracks.sort((a, b) => (trackScores.get(a) ?? 0) - (trackScores.get(b) ?? 0));\n const assignCoord = /* @__PURE__ */ __name((trackIndex, coord) => {\n cluster.filter((s) => s.trackIndex === trackIndex).forEach((s) => {\n const effectiveCoord = straightIntraLaneEdges.has(s.edgeIndex) ? pipe.coord : coord;\n segmentCoords.set(`${s.edgeIndex}-${s.segmentIndex}`, effectiveCoord);\n });\n }, \"assignCoord\");\n let leftCount = 0;\n for (const trackIndex of leftTracks) {\n leftCount++;\n assignCoord(trackIndex, pipe.coord - leftCount * TRACK_SPACING);\n }\n if (neutralTracks.length === 0 && usedTracks.size > 0) {\n const bestTrack = [...usedTracks].sort(\n (a, b) => Math.abs(trackScores.get(a) ?? 0) - Math.abs(trackScores.get(b) ?? 0)\n )[0];\n const leftIdx = leftTracks.indexOf(bestTrack);\n if (leftIdx !== -1) {\n leftTracks.splice(leftIdx, 1);\n }\n const rightIdx = rightTracks.indexOf(bestTrack);\n if (rightIdx !== -1) {\n rightTracks.splice(rightIdx, 1);\n }\n neutralTracks.push(bestTrack);\n }\n let neutralAssigned = 0;\n for (const trackIndex of neutralTracks) {\n if (neutralAssigned === 0) {\n assignCoord(trackIndex, pipe.coord);\n } else {\n const dir = neutralAssigned % 2 === 1 ? 1 : -1;\n const magnitude = Math.ceil(neutralAssigned / 2);\n assignCoord(trackIndex, pipe.coord + dir * magnitude * TRACK_SPACING * 0.5);\n }\n neutralAssigned++;\n }\n let rightCount = 0;\n for (const trackIndex of rightTracks) {\n rightCount++;\n assignCoord(trackIndex, pipe.coord + rightCount * TRACK_SPACING);\n }\n }\n }\n for (const [i, e] of edges.entries()) {\n const indices = edgeSegmentIndices[i] ?? [];\n if (indices.length === 0) {\n continue;\n }\n const newPoints = [];\n const src = nodeById.get(e.start);\n const dst = nodeById.get(e.end);\n const { pSrcPort, pDstPort } = portsForEdge(i, src, dst);\n const lines = indices.map((idx) => {\n const s = allRoutedSegments[idx];\n const coord = segmentCoords.get(`${s.edgeIndex}-${s.segmentIndex}`) ?? s.pipe.coord;\n return {\n orient: s.orientation,\n coord,\n from: s.from,\n to: s.to\n };\n });\n newPoints.push(pSrcPort);\n for (let k = 0; k < lines.length; k++) {\n const line = lines[k];\n const prevPt = newPoints[newPoints.length - 1];\n const prevAlong = line.orient === \"vertical\" ? prevPt.y : prevPt.x;\n const prevTrackCoord = line.orient === \"vertical\" ? prevPt.x : prevPt.y;\n const nextLine = lines[k + 1];\n const hasNextLine = k < lines.length - 1;\n if (Math.abs(prevTrackCoord - line.coord) > EPS7) {\n newPoints.push(pointOnLine(line, prevAlong));\n }\n if (hasNextLine && nextLine.orient === line.orient) {\n if (Math.abs(line.coord - nextLine.coord) > EPS7) {\n const junction = line.orient === \"vertical\" ? (prevAlong + nextLine.from) / 2 : sharedLineEndpointCoord(line, nextLine);\n newPoints.push(pointOnLine(line, junction), pointOnLine(nextLine, junction));\n } else if (k === 0 || k === lines.length - 2) {\n newPoints.push(pointOnLine(line, sharedLineEndpointCoord(line, nextLine)));\n }\n } else if (hasNextLine) {\n newPoints.push(pointOnLine(line, nextLine.coord));\n } else {\n const endAlong = Math.abs(line.from - prevAlong) < Math.abs(line.to - prevAlong) ? line.to : line.from;\n newPoints.push(pointOnLine(line, endAlong));\n }\n }\n const last = newPoints[newPoints.length - 1];\n if (Math.abs(last.x - pDstPort.x) > EPS7 || Math.abs(last.y - pDstPort.y) > EPS7) {\n newPoints.push(pDstPort);\n }\n const filtered = [];\n if (newPoints.length > 0) {\n filtered.push(newPoints[0]);\n }\n for (let k = 1; k < newPoints.length; k++) {\n const p = newPoints[k];\n const prev = filtered[filtered.length - 1];\n if (Math.abs(p.x - prev.x) > EPS7 || Math.abs(p.y - prev.y) > EPS7) {\n filtered.push(p);\n }\n }\n e.points = filtered;\n }\n for (const re of edges) {\n const orig = re.__originalEdge;\n if (orig && re.points) {\n orig.points = re.points;\n }\n }\n data.edges = (data.edges ?? []).filter((e) => !e.isLayoutOnly);\n const nodeBoundaryClamp = /* @__PURE__ */ __name((p, node) => {\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const w = node.width ?? 0;\n const h = node.height ?? 0;\n if (w <= 0 || h <= 0) {\n return p;\n }\n const left = cx - w / 2;\n const right = cx + w / 2;\n const top = cy - h / 2;\n const bottom = cy + h / 2;\n if (p.x < left || p.x > right || p.y < top || p.y > bottom) {\n return p;\n }\n const dLeft = p.x - left;\n const dRight = right - p.x;\n const dTop = p.y - top;\n const dBottom = bottom - p.y;\n const minD = Math.min(dLeft, dRight, dTop, dBottom);\n if (minD === dLeft) {\n return { x: left, y: p.y };\n }\n if (minD === dRight) {\n return { x: right, y: p.y };\n }\n if (minD === dTop) {\n return { x: p.x, y: top };\n }\n return { x: p.x, y: bottom };\n }, \"nodeBoundaryClamp\");\n for (const edge of data.edges) {\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n const srcId = edge.start;\n const dstId = edge.end;\n const src = srcId ? nodeById.get(srcId) : void 0;\n const dst = dstId ? nodeById.get(dstId) : void 0;\n if (src) {\n pts[0] = nodeBoundaryClamp(pts[0], src);\n }\n if (dst) {\n pts[pts.length - 1] = nodeBoundaryClamp(pts[pts.length - 1], dst);\n }\n }\n return data;\n}\n__name(routeEdgesOrthogonal, \"routeEdgesOrthogonal\");\n\n// src/rendering-util/layout-algorithms/swimlanes/layoutCore.ts\nfunction getSwimlaneDirection(data4Layout) {\n return data4Layout.direction ?? \"TB\";\n}\n__name(getSwimlaneDirection, \"getSwimlaneDirection\");\nfunction runSwimlaneLayoutCore(data4Layout) {\n const g = toGraphView(data4Layout);\n const nodeGap = data4Layout.config.flowchart?.nodeSpacing ?? 40;\n const layerGap = data4Layout.config.flowchart?.rankSpacing ?? 100;\n const ignoreCrossLaneEdges = data4Layout.config.swimlane?.ignoreCrossLaneEdges ?? true;\n const optimizeRanksByCrossings2 = data4Layout.config.swimlane?.optimizeRanksByCrossings ?? true;\n const automaticLaneOrdering = data4Layout.config.swimlane?.automaticLaneOrdering ?? false;\n const direction = getSwimlaneDirection(data4Layout);\n const { ordered, coordinates } = sugiyamaLayout(g, {\n nodeGap,\n layerGap,\n ignoreCrossLaneEdges,\n optimizeRanksByCrossings: optimizeRanksByCrossings2,\n automaticLaneOrdering,\n direction\n });\n writeBackToLayoutData(g, ordered, coordinates, { nodeGap, layerGap });\n for (const edge of data4Layout.edges ?? []) {\n delete edge.points;\n }\n routeEdgesOrthogonal(data4Layout, direction);\n for (const edge of data4Layout.edges ?? []) {\n if (!edge.curve || edge.curve === \"basis\") {\n edge.curve = \"rounded\";\n }\n }\n postProcessSwimlaneLayout(data4Layout, direction);\n validateSwimlanesLayout(data4Layout);\n return direction;\n}\n__name(runSwimlaneLayoutCore, \"runSwimlaneLayoutCore\");\n\n// src/rendering-util/layout-algorithms/swimlanes/index.ts\nasync function render(data4Layout, svg) {\n const element = svg.select(\"g\");\n markers_default(element, data4Layout.markers, data4Layout.type, data4Layout.diagramId);\n clear3();\n clear2();\n clear();\n clear4();\n prepareLayoutForSwimlanes(data4Layout);\n const transformedData = createEdgeLabelNodes(data4Layout);\n data4Layout.nodes = transformedData.nodes;\n data4Layout.edges = transformedData.edges;\n const { groups } = await createGraphWithElements(element, data4Layout);\n runSwimlaneLayoutCore(data4Layout);\n await adjustLayout(data4Layout, groups);\n}\n__name(render, \"render\");\nexport {\n render\n};\n"],"names":["createGraphWithElements","element","data4Layout","graph","graphlib.Graph","edgesToProcess","config","getConfig2","rootGroups","clusters","edgePaths","edgeLabels2","nodesGroup","nodeElements","hasDom","node","childNodeEl","insertNode","boundingBox","edge","existingEdge","captureNodeSizes","__name","ROUNDED_CORNER_RADIUS","CORNER_EPSILON","ENDPOINT_EPSILON","buildSegmentList","points","segments","i","segmentIntersection","a1","a2","b1","b2","dxA","dyA","dxB","dyB","denom","dx","dy","tA","tB","isHorizontalSeg","seg","findEdgeIntersections","edges","crossings","edgeA","segmentsA","j","edgeB","segmentsB","si","segA","sj","segB","hit","aHoriz","bHoriz","fmt","n","rounded","pointToString","p","getArcSweepFlag","MIN_JUMP_RADIUS","applyMarkerOffsets","out","startOff","markerOffsets","a","b","ang","endOff","emitJump","jump","ux","uy","sweep","style","cx","cy","pre","post","computeRoundedCorner","prev","curr","next","radius","dx1","dy1","dx2","dy2","len1","len2","nx1","ny1","nx2","ny2","dot","clamped","angle","cutLen","rewriteEdgePath","jumps","rawPoints","bySeg","segLen","list","parts","segStartConsumed","corner","segEndStop","upcomingCorner","segJumps","k","gap","half","isStraightPath","d","curveSupportsLineHops","curve","decodeDataPoints","raw","json","parsed","pts","applyLineJumpsToSvg","edgePathsGroup","groupNode","edgeMeta","e","renderedEdges","pathById","escapedId","pathEl","jumpsByEdge","c","renderedEdge","curveHint","currentD","originalStyle","dasharrayMatch","preservedOValueS","preservedOValueE","newD","newLen","onLen","newDasharray","cleaned","adjustLayout","groups","insertCluster","positionNode","nodeById","startNode","endNode","paths","insertEdge","insertEdgeLabel","positionEdgeLabel","lineHopsConfig","jumpStyle","edgeGeometries","path","siteConfig","getConfig","subGraphTitleTotalMargin","getSubGraphTitleMargins","el","edgeLabels","x","y","pos","utils_default","log","terminalLabels","DEFAULT_SWIMLANE_ID","TOP_LANE_TITLE_BAND_HEIGHT","MIN_TOP_LANE_HORIZONTAL_PADDING","topLaneHorizontalPadding","lane","assignTopLaneTitleRect","width","height","contentTop","top","headerBottom","titleHeight","bottom","prepareLayoutForSwimlanes","layout","direction","nodes","looseNodes","defaultLane","toGraphView","src","dst","allNodes","groupNodes","nonGroupNodes","writeBackToLayoutData","g","ordered","coords","opts","nodeMap","layerGap","nodeGap","layerIndex","layer","orderIndex","id","groupBounds","topLevelGroups","group","children","minX","maxX","minY","maxY","child","cw","ch","pad","horizontalPad","verticalPad","w","h","globalMinY","globalMaxY","maxPad","contentHeight","verticalMargin","laneHeight","centerY","sortedLanes","ax","bx","laneIds","centers","baseWidths","contentWidth","count","laneWidths","u","lowerBound","upperBound","baseW","finalWidth","EDGE_LABEL_LOG_PREFIX","createEdgeLabelNodes","data","nodesToAdd","layoutOnlyEdges","sourceNode","targetNode","labelNodeId","labelLane","labelNode","toLabelVirtual","fromLabelVirtual","newNodes","newEdges","EPS","measuredNodeRect","rectFromCenterSize","nodeBoundsInfoFor","measured","samePoint","epsilon","sameX","sameY","isHorizontalSegment","isVerticalSegment","overlapLength","sameAxisSegmentOverlapLength","orthogonalSegmentsForPoints","result","horizontal","vertical","countOrthogonalBends","bends","dedupeConsecutivePoints","point","last","classifyThreeSegmentRoute","p0","p1","p2","p3","segmentBoundsOverlapRect","rect","buffer","segMinX","segMaxX","segMinY","segMaxY","pointInsideRect","rectContainsRect","outer","inner","rectsOverlap","inflateRect","margin","rectOfNodeBounds","portForRectSide","side","buildOrthogonalPortPath","srcSide","dstSide","anchor","srcH","dstH","midX","intX","intY","midY","sameDirSrc2","sameDirDst2","sameDirSrc","sameDirDst","buildSameSideTrackPath","track","collectRealNodeBounds","nodeInfoById","realNodeRects","info","collectNodeRectEntries","labelNodeRects","entry","collectLayoutNodeRects","includeEdgeLabels","getNodePairGeometry","srcId","dstId","srcInfo","dstInfo","segmentHitsAnyRect","rects","excludeIds","shrink","orthogonalSegmentsCross","endpointTolerance","s1H","s1V","s2H","s2V","horiz","vert","hY","hX1","hX2","vX","vY1","vY2","matchesHorizEndpoint","matchesVertEndpoint","sameAxisSegmentsOverlap","segmentConflictsWithAnyEdge","excludeEdge","skipDegenerateOther","other","oa","ob","orthogonalSegmentsStrictlyCross","aVert","bVert","hXmin","hXmax","vYmin","vYmax","strictlyBetween","value","lo","hi","isCollinearIntermediate","cur","simplifyPolylineOnce","changed","orthogonalizePolyline","prevPrev","deduped","simplifyPolyline","work","guard","EPS2","INSIDE_EPS","CORNER_CLEARANCE","endpointContextFor","nodeByIdMap","minPoints","candidate","segmentEnterPoint","outside","inside","r","clipEndpoint","atStart","step","outsideIndex","insideIndex","clipEdgeEndpointsToNodeBoundaries","context","clearStraightEndpointCornerConnections","snapEndpointToBoundary","endpoint","useApproachSide","toTop","firstDistinctAdjacent","endpointIndex","index","cornerClearanceRange","min","max","clampToCornerClearance","intersectRanges","ranges","range","clearanceRangeForSide","terminalSideForSegment","adjacent","yWithin","xWithin","isHorizontalSide","straightClearanceRange","start","end","srcRect","dstRect","clearStraightEndpointCornerAxis","current","cornerClearedEndpoint","moveCollinearEndpointRun","adjusted","horizontalTerminal","clearEndpointCornerConnection","borderSideForSegment","leavesOutward","from","to","collapseOwnBorderStub","side2","snapAndCollapseEndpoints","snapped","straightCleared","prepareEdgeEndpointsForRenderer","input","newPts","duplicated","buildNodeMap","resolveTopLevelGroupId","parentId","topLevelGroupId","parent","groupDepth","depth","boundsForChildren","applyGroupBounds","bounds","recomputeNestedGroupBounds","groupsByDepth","mirrorAxis","axis","contentNodes","mirror","titleRect","applyBtDirectionTransform","applyLrDirectionTransform","x0","y0","titleBandSize","totalWidth","totalHeight","avgWidth","avgHeight","horizontalScaleFactor","newX","newY","laneNodes","childrenByLane","laneId","bucket","laneBounds","globalMinXChild","globalMaxXChild","fullContentWidth","horizontalMargin","bodyWidth","laneWidth","laneLeft","centerX","laneTop","laneBottom","EPS3","MIN_PORT_SPACING","PORT_SHIFT","TRY_DELTAS","portSwapToLShape","route","isHVH","nodePair","collinearX","collinearY","delta","np0","np1","np2","newSrcY","newSrcX","firstSegDegenerate","secondSegDegenerate","firstSegConflicts","secondSegConflicts","collapseShortTerminalStub","labelRects","rawPts","nLast","endPt","penultPt","prevPt","lastDx","lastDy","lastLen","penultDx","penultDy","lastIsHoriz","lastIsVert","penultIsHoriz","penultIsVert","dstCx","dstCy","newPrev","newEnd","approachFromBelow","approachFromLeft","ownSegmentKey","selfSegments","segmentCrossesOtherEdge","oPts","beforePrev","endpointIds","labelId","lw","lh","bestMidX","bestMidY","bestLen","isHoriz","isVert","EPS_LOCAL","MIN_SHARED","segmentsFor","orthogonallyAligned","separateSharedRenderedTerminalLanes","rectIntersect","terminalLaneFor","nodeId","boundary","railEnd","projectedOverlapLength","sameTerminalFace","exactTerminalLaneConflict","nearTerminalLaneConflict","shared","faceSpan","shiftedCandidate","shift","shiftedBoundary","shiftedRailEnd","railEndIsAdjacent2","rest","railEndIsAdjacent","before","previous","laneIsStraightCollinearConnector","startId","endId","startX","startY","endX","endY","shifts","iteration","lanes","fixed","first","second","fixingNearConflict","candidates","aPreservesStraight","bPreservesStraight","nextLane","collapseRedundantRectangularDoglegs","candidateIsSafe","sourceId","targetId","candidateSegments","segment","otherPoints","candidateSegment","otherSegment","withoutDogleg","p4","terminalVerticalDogleg","terminalHorizontalDogleg","p5","verticalDogleg","horizontalDogleg","liftObstacleHuggingSameSideRails","visibleEdges","pointsFor","replacementEdge","replacement","strictCrossingCount","firstSegments","secondSegments","firstSegment","secondSegment","middleRail","middle","blockingRectsFor","rail","candidateByMovingRail","coord","simplified","currentCrossings","blockers","liftTopLaneTitleBandsAboveRails","validTitleRect","topLaneTitleFor","rawDirection","titleWidth","horizontalSegmentIntersectsTitle","topDelta","shiftLeftLaneTitleBandsLeftOfRails","leftLaneTitleFor","verticalSegmentIntersectsTitle","leftDelta","segmentLeft","swapDestinationTerminalTailsToReduceCrossings","replacementPointsFor","replacements","crossingCount","totalBends","sum","terminalTailFor","tailStart","terminal","candidateWithDestinationTail","tail","firstTurn","connector","pathHasNodeHit","pathHasSharedTrack","edgesByDestination","currentBends","bestReplacements","bestCrossings","bestBends","destinationEdges","firstTail","secondTail","firstCandidate","secondCandidate","candidateCrossings","candidateBends","reassignCrossingExternalRailChannels","endpointRectsFor","srcNode","dstNode","externalRailForSegment","endpointRects","leftBound","rightBound","topBound","bottomBound","collectExternalRails","rails","railsInteract","connectedComponents","seen","queue","component","uniqueCoordsFor","coordinateAssignmentsFor","assignments","used","visit","assignment","replacementsForAssignment","draftByEdge","firstChanged","bestDisplacement","candidateDisplacement","shortcutRedundantOrthogonalJogs","pathLength","segmentRunsAlongRectBorder","shortcutCandidatesAt","isVHV","corners","rawCandidates","key","bestEdge","bestPath","bestLength","currentPoints","currentLength","candidateLength","resolveRenderedOrthogonalCrossings","realNodes","sides","outsideTracks","edgeIndex","outwardTracksForSide","outward","tracks","channel","crossingCountBetweenSegments","crossingCountBetweenPaths","crossingSnapshot","pairs","edgeSet","edgeOrder","addEdge","firstPoints","pairCount","crossingCountWithReplacements","currentAffected","pair","replacementAffected","crossingComponents","snapshot","neighbors","firstNeighbors","secondNeighbors","components","endpointIdsFor","pairSearchGroups","componentSet","componentEndpointIds","crossingCountWithSingleReplacement","currentCrossingsByEdge","totalLength","pathHasSegmentConflict","pathSegments","pathHitsNode","pushOrthogonalCandidate","sideIsHorizontal","localTrackForSameSide","addSameSideCandidates","trackSeeds","seed","addHorizontalToVerticalCandidates","xTrack","yTrack","addVerticalToHorizontalCandidates","addHorizontalPairCandidates","yTracks","srcTrack","dstTrack","addVerticalPairCandidates","xTracks","dedupeCandidatePaths","buildCandidatesForSides","base","srcHorizontal","dstHorizontal","addVerticalDepartureOuterTrackCandidates","departure","externalXTracks","externalYTracks","targetYTracks","targetTrack","addHorizontalDepartureOuterTrackCandidates","targetXTracks","terminalPreservingOuterTrackCandidates","candidatePathsFor","srcPort","currentSegmentsByEdge","sharedTrackConflictsFor","baseSegments","conflicts","otherSegments","pairCandidatesFor","crossingCountByEdge","pairCrossingCount","firstEdge","secondEdge","conflictsOnlyWith","conflict","candidatesShareTrack","pairCandidatesAreCompatible","scorePairReplacement","pairScoreIsBetter","best","bestScoreForOptionPair","pairBest","score","bestPairedReplacement","baseBendsByEdge","baseLengthByEdge","optionsByEdge","scoringContext","crossingEdgeSet","options","option","currentEdgeBends","candidateHitsNode","candidateHasSegmentConflict","pairedReplacement","EPS4","MIN_SHARED2","simplifyDetouredEdges","ANCHOR","buildOrthogonalPathCandidates","pathConflictCount","currentEdge","includeIncidentEdges","currentStart","currentEnd","otherStart","otherEnd","otherPts","pathSegment","BEND_THRESHOLD","nearestSideOfRect","pt","dTop","dBottom","dLeft","dRight","bestDist","faceClaims","addFaceClaim","edgeId","claims","eId","faceIsClaimed","ignoreEdgeId","currentCrossingConflicts","currentNonIncidentConflicts","bestCrossingConflicts","dstPort","pathBends","pathCrossingConflicts","refreshSrc","refreshDst","EPS5","MARKER_CLEARANCE_LENGTH","MARKER_CLEARANCE_HALF_WIDTH","markerClearanceRectFor","terminalIndex","tip","x2","y2","normalizeRect","labelOverlapsOwnMarker","visiblePts","startMarker","endMarker","marker","anchorLabelsToPolyline","allEdgeSegments","foreignNodeRects","laneGroups","isGroup","rect2","LABEL_PLACEMENT_BUFFER","LABEL_LANE_MARGIN","LABEL_ENDPOINT_CLEARANCE","labelOverlapsForeignNode","buffered","nr","labelOverlapsForeignEdge","s","labelOverlapsAnything","placedLabelRects","findContainingLane","laneRect","overlapsPlacedLabel","placed","middleSegments","poolBase","labelLongAxis","rankSegments","pool","aLongAxis","bLongAxis","aFits","bFits","firstVisibleSegment","lastVisibleSegment","ALONG_SEGMENT_TS","anchorAtT","t","clamp","pointInsideRectInclusive","placementForAnchor","centeredRect","centeredLane","containingLane","clampedAnchor","clampedRect","distanceAlongSegment","labelClearsTerminalEndpoints","requiredDistance","tryPool","rankedPool","placement","findLaneContainingFallback","requireEndpointClearance","allowForeignEdgeOverlap","chosen","chosenRect","priorIdx","EPS6","MIN_PORT_SPACING2","PORT_SHIFT2","LABEL_CLEARANCE_BUFFER","pairKey","straightenCollinearSiblingDetours","labelDimById","labelClearanceFor","thisEdge","thisSrcId","thisDstId","targetPair","maxHalf","consider","dim","oSrc","oDst","targetSrc","targetDst","dstBelow","dstEast","labelShift","effectiveShift","deltas","shiftedSrc","shiftedDst","nudgeSharedInteriorSubpaths","segmentsFor2","allSegments","hasCrowdedParallelTrack","ownLabelIds","nodeCenter","sourceDetourContextFor","sourceRect","targetRect","verticalSourceDetour","sourceCenter","targetCenter","targetBelow","sourcePortY","stubY","railX","horizontalSourceDetour","targetRight","sourcePortX","stubX","railY","sourceDetourCandidate","direct","detoured","segmentsIntersect","d1x","d1y","d2x","d2y","cross","eps","validateSwimlanesLayout","issues","nodeRects","edgeSegments","edgeStart","edgeEnd","ownLabelId","crossingPairs","pairKey2","overlaps","issue","postProcessSwimlaneLayout","finalizeRenderedEdges","normalizeGraph","incoming","v","buildSuccessorMap","succs","buildSortedSuccessorMap","successors","buildInDegreeMap","indeg","sortedZeroInDegreeNodes","degree","buildPredecessorSuccessorMaps","includeEdge","preds","buildLayersFromRanks","order","rankOf","maxRank","layers","topoSortIfAcyclic","adj","buildLayerIndex","m","countInversions","values","tmp","left","right","mid","inversions","removeCycles_DFS","gn","arr","color","reversed","dfs","nodesSorted","toReverse","acycEdges","buildTopLaneMap","cache","resolve","createTopLaneResolver","topLaneMap","buildTopLaneOrder","resolveTopLaneOrder","preferredOrder","sourceOrder","sourceLaneIds","resolved","PRECISION","LAYERING","COORDINATES","buildDrivingTree","laneOf","rankHint","topoOrder","topoIndex","idx","chooseParent","rootSet","roots","ta","tb","adjacency","buildAdjacency","adjacencyList","set","componentOf","assignComponents","blocks","computeBlocks","nodeBlocks","block","preorder","postorder","walk","root","ctx","laneNode","laneA","laneB","sameLaneA","sameLaneB","rankA","rankB","idxA","idxB","componentId","stack","discovery","low","edgeStack","time","popBlock","computeSubtreeCrossCounts","tree","indexOf","parentIdx","currentIdx","childList","childIdx","maxLog","up","lcaIndex","aIdx","bIdx","diff","upA","upB","ownCounts","ru","rv","upperIdx","lowerIdx","lca","crossCounts","mergeInto","target","source","visited","accumulator","childMap","parentLayer","map","childLayer","annotateMinimumLayers","minLayer","annotate","minL","compareByRankThenId","childMin","ra","rb","emitNodesInTreeOrder","orderChildren","emitted","emit","deduplicateLayers","createChildOrderer","future","present","crossMap","ca","cb","ma","mb","item","buildMultitreeLayerOrder","rootsSorted","countCrossingsBetweenAdjacent","upper","lower","upperSet","lowerSet","li","vs","totalCrossings","expanded","rUpper","rLower","L","optimizeRanksByCrossings","initialRank","maxPasses","pass","nodesByRank","lb","old","trialLayers","adjustCrossLaneSources","topLaneOf","laneV","outEdges","hasSameLaneSucc","crossLaneCount","laneDst","crossLaneIncoming","hasSameLanePred","laneSrc","newRank","assignLayers_LongestPath","gAcyclic","compact","incAll","inc","laneU","mx","assignLayers_Gravity","revOrder","clampFeasible","desired","ub","iters","relaxOrder","nodeOrder","ps","ss","predAvg","succAvg","it","forwardChanged","backwardChanged","topoSortByGenerationIfAcyclic","frontier","nextFrontier","assignLayers_LaneAwareCompact","nextFree","edgeWeight","nf","makeProperLayering","layering","l","dummy","dummySeq","addDummyAt","dn","edgesSorted","rU","rV","lastIndex","graphWithDummies","median","barycenter","acc","neighborPositionsFor","targetNodes","fixedIndex","neighborPositions","currentOrderTieBreak","currentLayerIndex","ia","ib","countCrossingsBetweenAdjacent2","upperIndex","lowerIndex","sortByHeuristic","sa","sb","reorderLayer","fixedLayer","targetLayer","laneOrder","currIndex","byLane","nodesInLane","sorted","nullNodes","nid","bc","bestIdx","rid","rBc","transposeImprove","layerSet","nextSet","edgesIn","edgesOut","crossingScore","improved","bestScore","nextScore","orderLayers","gWithDummies","assignCoordinates","laneGap","isHorizontal","getNode","getWidth","getHeight","laneOrderGlobal","layerHeights","extraLayerGaps","thisLayerMaxWidth","nextLayerMaxWidth","thisLayerMaxHeight","nextLayerMaxHeight","normalSpacing","requiredSpacing","extraNeeded","lanesUsedSet","hasNullLane","lanesUsed","laneOrderColumns","perLane","nullIds","ids","total","totalNull","widths","cursor","yOffset","layerH","extraGap","byRef","chainEdges","ref","involved","vid","AUTOMATIC_LANE_ORDERING_RESTARTS","hashString","hash","mulberry32","state","deterministicShuffle","shuffled","random","sourceDistance","sourceIndex","distance","laneArrangementCost","weights","position","cost","weight","ai","bi","buildWeightedLaneEdges","existing","greedySwitch","startOrder","sweeps","maxSweeps","nextCost","isBetterCandidate","seedForRestart","restartIndex","weightSignature","optimizeTopLaneOrder","restarts","sugiyamaLayout","ignoreCrossLaneEdges","optimizeRanksByCrossings2","g0","cycleRes","properLayering","coordinates","EPS7","NODE_PADDING","HORIZONTAL_PIPE_MARGIN","VERTICAL_PIPE_MARGIN","ROUTING_MARGIN","ANCHOR_OFFSET","TRACK_SPACING","chooseOrthogonalSide","fallback","absDx","absDy","sharedLineEndpointCoord","line","nextLine","pointOnLine","along","routeEdgesOrthogonal","originalEdges","oe","laneByNodeId","pipes","isLR","assignLane","obstacles","padding","getOrAddPipe","orientation","spanMin","spanMax","pipe","portForSide","getOrthogonalPort","isSource","allRoutedSegments","edgeSegmentIndices","straightIntraLaneEdges","CROSSING_PENALTY","crossingPenalty","edgeIdx","isVertical","penalties","routingOrder","srcLane","dstLane","crossLane","aDist","bDist","isSegmentBlocked","excludeStart","excludeEnd","obs","portGroups","incidentEdgeTotals","determineSide","sideInfoByIdx","preferenceStrength","secondarySide","sourceSideGroups","sideLoad","loadKey","secondary","primaryLoad","secondaryLoad","isDiamondNode","shape","inSidesByNode","inSides","srcKey","dstCoord","dstKey","srcCoord","portOffsets","MIN_PORT_SPACING3","role","sideLength","effectiveLength","spacing","startOffset","offset","offsetKey","edgeHasLabelNode","faceHasLabelNode","applyPortOffset","basePort","portsForEdge","sideInfo","srcTarget","dstTarget","pSrcPort","pDstPort","srcOffset","dstOffset","srcPortSide","dstPortSide","pSrcAnchor","pDstAnchor","srcPortIsVertical","dstPortIsVertical","isBottom","isRight","isPointInObstacle","excludeNodeIds","obstacleDetour","port","opposite","portIsVertical","leavesPositiveSide2","leavesPositiveSide","goDown","srcHandleWaypoints","srcCheck","detour","gapY","gapX","dstHandleWaypoints","dstCheck","hpMargin","anchorsSameX","anchorsSameY","hasPortOffset","srcFaceTotal","dstFaceTotal","faceContested","srcIncidentTotal","dstIncidentTotal","contestedFaceHasLabel","srcContestAllowsCenteredStraight","dstContestAllowsCenteredStraight","fastPathOrientation","fastPathCoord","fastPathFrom","fastPathTo","fastPathPipe","srcPipe","dstPipe","bbMinX","bbMaxX","bbMinY","bbMaxY","pathMinX","pathMaxX","pathMinY","pathMaxY","hMargin","vMargin","hPipes","vPipes","getKey","startKey","endKey","gScore","cameFrom","arrivalDir","openSet","openList","foundPath","checkSegmentBlocked","cornerHV","seg1HV_blocked","seg2HV_blocked","pathHV_blocked","cornerVH","seg1VH_blocked","seg2VH_blocked","currKey","currPt","sortedVPipes","vIdx","hPipesSorted","hIdx","neighbor","nKey","dist","penalty","dirPenalty","destDx","destDy","moveDx","moveDy","bendPenalty","currentDir","moveDir","stepCost","tentativeG","wentRight","wentLeft","pathX","detourObstacles","visualMaxX","obsCenterX","visualRight","visualMinX","visualLeft","findBestReturnY","detourX","goingDown","relevantObs","obsInXRange","obsInYRange","filteredObs","obsAtDetourX","bestY","trySimplifyWithDetourX","corner1","corner2","corner3","seg1Blocked","seg2Blocked","seg3Blocked","seg4Blocked","simplified2","fullPoints","C","B","A","signAB","signAC","dir1","dir2","rSeg","segmentsOverlap","s1","s2","trySwapSegmentsAcrossTracks","t1","t2","canS1GoT2","canS2GoT1","createNewTrack","moveSegmentToTrack","trackIdx","oldTrack","moveSegmentChainToTrack","indices","getAdjacentSegmentsAlongEdge","idxInList","haveAnyCrossing","findAvailableTrack","segmentsConflict","adj1","adj2","resolveTrackConflict","move","avail","resolveHandleConflicts","handles","h1","h2","destInfoCache","getDestInfo","info2","dest","candidateA","candidateB","deviation","fixSourceHandleCrossings","edgesBySource","getEdgeDistance","grp","infoA","infoB","distA","distB","lenA","lenB","distA2","distB2","ei","fixTargetHandleCrossings","edgesByTarget","getDist","scoreA","scoreB","fixPipeCrossings","pipeSegments","ix","iterations","MAX_ITER","segmentCoords","currentCluster","clusterEnd","cluster","usedTracks","trackScores","leftTracks","rightTracks","neutralTracks","assignCoord","trackIndex","effectiveCoord","leftCount","bestTrack","leftIdx","rightIdx","neutralAssigned","dir","magnitude","rightCount","newPoints","lines","prevAlong","prevTrackCoord","hasNextLine","junction","endAlong","filtered","re","orig","nodeBoundaryClamp","minD","getSwimlaneDirection","runSwimlaneLayoutCore","automaticLaneOrdering","render","svg","markers_default","clear3","clear2","clear","clear4","transformedData"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"swimlanes-5IMT3BWC-ByyaHYdJ.cjs","sources":["../../../node_modules/.pnpm/mermaid@11.16.0/node_modules/mermaid/dist/chunks/mermaid.core/swimlanes-5IMT3BWC.mjs"],"sourcesContent":["import {\n clear as clear4\n} from \"./chunk-RYQCIY6F.mjs\";\nimport {\n clear as clear2,\n edgeLabels,\n insertEdge,\n insertEdgeLabel,\n markers_default,\n terminalLabels\n} from \"./chunk-52WLFC77.mjs\";\nimport {\n clear,\n clear2 as clear3,\n insertCluster,\n insertNode,\n positionNode\n} from \"./chunk-ZGVPDNZ5.mjs\";\nimport \"./chunk-C7G6YPKG.mjs\";\nimport {\n markerOffsets\n} from \"./chunk-7BUUIJ7U.mjs\";\nimport {\n getSubGraphTitleMargins\n} from \"./chunk-OGEWGWER.mjs\";\nimport \"./chunk-Q4XR5HBZ.mjs\";\nimport \"./chunk-HOUHSVGY.mjs\";\nimport {\n utils_default\n} from \"./chunk-ICXQ74PX.mjs\";\nimport {\n getConfig,\n getConfig2\n} from \"./chunk-WYO6CB5R.mjs\";\nimport {\n log\n} from \"./chunk-X3CZISLH.mjs\";\nimport {\n __name\n} from \"./chunk-Y2CYZVJY.mjs\";\n\n// src/rendering-util/createGraph.ts\nimport * as graphlib from \"dagre-d3-es/src/graphlib/index.js\";\nasync function createGraphWithElements(element, data4Layout) {\n const graph = new graphlib.Graph({\n multigraph: true,\n compound: true\n });\n const edgesToProcess = [...data4Layout.edges];\n const config = getConfig2();\n const rootGroups = element.insert(\"g\").attr(\"class\", \"root\");\n const clusters = rootGroups.insert(\"g\").attr(\"class\", \"clusters\");\n const edgePaths = rootGroups.insert(\"g\").attr(\"class\", \"edges edgePath\");\n const edgeLabels2 = rootGroups.insert(\"g\").attr(\"class\", \"edgeLabels\");\n const nodesGroup = rootGroups.insert(\"g\").attr(\"class\", \"nodes\");\n const nodeElements = /* @__PURE__ */ new Map();\n const hasDom = element.node() != null;\n await Promise.all(\n data4Layout.nodes.map(async (node) => {\n if (node.isGroup) {\n graph.setNode(node.id, { ...node });\n } else {\n if (hasDom) {\n const childNodeEl = await insertNode(nodesGroup, node, { config, dir: node.dir });\n const boundingBox = childNodeEl.node()?.getBBox() ?? { width: 0, height: 0 };\n nodeElements.set(node.id, childNodeEl);\n node.width = boundingBox.width;\n node.height = boundingBox.height;\n }\n graph.setNode(node.id, { ...node });\n }\n })\n );\n for (const edge of edgesToProcess) {\n graph.setEdge(edge.start, edge.end, { ...edge }, edge.id);\n const edgeExists = data4Layout.edges.some((existingEdge) => existingEdge.id === edge.id);\n if (!edgeExists) {\n data4Layout.edges.push(edge);\n }\n }\n if (globalThis.mermaidCaptureSizes) {\n const { captureNodeSizes } = await import(\"./sizeCapture-X5ZJPWSS.mjs\");\n captureNodeSizes(element, data4Layout);\n }\n return {\n graph,\n groups: { clusters, edgePaths, edgeLabels: edgeLabels2, nodes: nodesGroup, rootGroups },\n nodeElements\n };\n}\n__name(createGraphWithElements, \"createGraphWithElements\");\n\n// src/rendering-util/rendering-elements/lineJump.ts\nvar ROUNDED_CORNER_RADIUS = 5;\nvar CORNER_EPSILON = 1e-5;\nvar ENDPOINT_EPSILON = 1e-6;\nfunction buildSegmentList(points) {\n const segments = [];\n for (let i = 0; i < points.length - 1; i++) {\n segments.push({ a: points[i], b: points[i + 1] });\n }\n return segments;\n}\n__name(buildSegmentList, \"buildSegmentList\");\nfunction segmentIntersection(a1, a2, b1, b2) {\n const dxA = a2.x - a1.x;\n const dyA = a2.y - a1.y;\n const dxB = b2.x - b1.x;\n const dyB = b2.y - b1.y;\n const denom = dxA * dyB - dyA * dxB;\n if (denom === 0) {\n return null;\n }\n const dx = b1.x - a1.x;\n const dy = b1.y - a1.y;\n const tA = (dx * dyB - dy * dxB) / denom;\n const tB = (dx * dyA - dy * dxA) / denom;\n if (tA <= ENDPOINT_EPSILON || tA >= 1 - ENDPOINT_EPSILON || tB <= ENDPOINT_EPSILON || tB >= 1 - ENDPOINT_EPSILON) {\n return null;\n }\n return {\n point: { x: a1.x + tA * dxA, y: a1.y + tA * dyA },\n tA,\n tB\n };\n}\n__name(segmentIntersection, \"segmentIntersection\");\nfunction isHorizontalSeg(seg) {\n return Math.abs(seg.b.x - seg.a.x) >= Math.abs(seg.b.y - seg.a.y);\n}\n__name(isHorizontalSeg, \"isHorizontalSeg\");\nfunction findEdgeIntersections(edges) {\n const crossings = [];\n for (let i = 0; i < edges.length; i++) {\n const edgeA = edges[i];\n const segmentsA = buildSegmentList(edgeA.points);\n for (let j = i + 1; j < edges.length; j++) {\n const edgeB = edges[j];\n const segmentsB = buildSegmentList(edgeB.points);\n for (const [si, segA] of segmentsA.entries()) {\n for (const [sj, segB] of segmentsB.entries()) {\n const hit = segmentIntersection(segA.a, segA.b, segB.a, segB.b);\n if (!hit) {\n continue;\n }\n const aHoriz = isHorizontalSeg(segA);\n const bHoriz = isHorizontalSeg(segB);\n const orthogonalPair = aHoriz !== bHoriz;\n const jumpOnA = orthogonalPair ? aHoriz : false;\n if (jumpOnA) {\n crossings.push({\n jumpEdgeId: edgeA.id,\n otherEdgeId: edgeB.id,\n segIndex: si,\n t: hit.tA,\n point: hit.point\n });\n } else {\n crossings.push({\n jumpEdgeId: edgeB.id,\n otherEdgeId: edgeA.id,\n segIndex: sj,\n t: hit.tB,\n point: hit.point\n });\n }\n }\n }\n }\n }\n return crossings;\n}\n__name(findEdgeIntersections, \"findEdgeIntersections\");\nfunction fmt(n) {\n const rounded = Math.round(n * 1e3) / 1e3;\n return Number.isInteger(rounded) ? `${rounded}` : `${rounded}`;\n}\n__name(fmt, \"fmt\");\nfunction pointToString(p) {\n return `${fmt(p.x)},${fmt(p.y)}`;\n}\n__name(pointToString, \"pointToString\");\nfunction getArcSweepFlag(seg) {\n const dx = seg.b.x - seg.a.x;\n const dy = seg.b.y - seg.a.y;\n if (Math.abs(dx) >= Math.abs(dy)) {\n return dx >= 0 ? 1 : 0;\n }\n return dy >= 0 ? 1 : 0;\n}\n__name(getArcSweepFlag, \"getArcSweepFlag\");\nvar MIN_JUMP_RADIUS = 1e-3;\nfunction applyMarkerOffsets(points, edge) {\n if (points.length < 2) {\n return points.map((p) => ({ ...p }));\n }\n const out = points.map((p) => ({ ...p }));\n const startOff = edge.arrowTypeStart && markerOffsets[edge.arrowTypeStart];\n if (startOff) {\n const a = points[0];\n const b = points[1];\n const ang = Math.atan2(b.y - a.y, b.x - a.x);\n out[0].x = a.x + startOff * Math.cos(ang);\n out[0].y = a.y + startOff * Math.sin(ang);\n }\n const endOff = edge.arrowTypeEnd && markerOffsets[edge.arrowTypeEnd];\n if (endOff) {\n const n = points.length;\n const a = points[n - 2];\n const b = points[n - 1];\n const ang = Math.atan2(b.y - a.y, b.x - a.x);\n out[n - 1].x = b.x - endOff * Math.cos(ang);\n out[n - 1].y = b.y - endOff * Math.sin(ang);\n }\n return out;\n}\n__name(applyMarkerOffsets, \"applyMarkerOffsets\");\nfunction emitJump(jump, ux, uy, sweep, style) {\n const cx = jump.point.x;\n const cy = jump.point.y;\n const pre = { x: cx - ux * jump.r, y: cy - uy * jump.r };\n const post = { x: cx + ux * jump.r, y: cy + uy * jump.r };\n const out = [`L${pointToString(pre)}`];\n if (style === \"arc\") {\n out.push(`A${fmt(jump.r)},${fmt(jump.r)} 0 0 ${sweep} ${pointToString(post)}`);\n } else {\n out.push(`M${pointToString(post)}`);\n }\n return out;\n}\n__name(emitJump, \"emitJump\");\nfunction computeRoundedCorner(prev, curr, next, radius) {\n const dx1 = curr.x - prev.x;\n const dy1 = curr.y - prev.y;\n const dx2 = next.x - curr.x;\n const dy2 = next.y - curr.y;\n const len1 = Math.hypot(dx1, dy1);\n const len2 = Math.hypot(dx2, dy2);\n if (len1 < CORNER_EPSILON || len2 < CORNER_EPSILON) {\n return null;\n }\n const nx1 = dx1 / len1;\n const ny1 = dy1 / len1;\n const nx2 = dx2 / len2;\n const ny2 = dy2 / len2;\n const dot = nx1 * nx2 + ny1 * ny2;\n const clamped = Math.max(-1, Math.min(1, dot));\n const angle = Math.acos(clamped);\n if (angle < CORNER_EPSILON || Math.abs(Math.PI - angle) < CORNER_EPSILON) {\n return null;\n }\n const cutLen = Math.min(radius / Math.sin(angle / 2), len1 / 2, len2 / 2);\n return {\n startX: curr.x - nx1 * cutLen,\n startY: curr.y - ny1 * cutLen,\n endX: curr.x + nx2 * cutLen,\n endY: curr.y + ny2 * cutLen,\n ctrlX: curr.x,\n ctrlY: curr.y,\n cutLen\n };\n}\n__name(computeRoundedCorner, \"computeRoundedCorner\");\nfunction rewriteEdgePath(edge, jumps, config) {\n const rawPoints = edge.points;\n if (rawPoints.length < 2) {\n return \"\";\n }\n const points = applyMarkerOffsets(rawPoints, edge);\n const rounded = edge.curve === \"rounded\";\n const segments = buildSegmentList(points);\n const bySeg = /* @__PURE__ */ new Map();\n for (const j of jumps) {\n const seg = segments[j.segIndex];\n if (!seg) {\n continue;\n }\n const segLen = Math.hypot(seg.b.x - seg.a.x, seg.b.y - seg.a.y);\n const list = bySeg.get(j.segIndex) ?? [];\n list.push({\n t: j.t,\n point: j.point,\n d: j.t * segLen,\n r: config.jumpRadius\n });\n bySeg.set(j.segIndex, list);\n }\n const parts = [`M${pointToString(points[0])}`];\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n const segLen = Math.hypot(seg.b.x - seg.a.x, seg.b.y - seg.a.y);\n const ux = segLen === 0 ? 0 : (seg.b.x - seg.a.x) / segLen;\n const uy = segLen === 0 ? 0 : (seg.b.y - seg.a.y) / segLen;\n const sweep = getArcSweepFlag(seg);\n let segStartConsumed = 0;\n if (rounded && i > 0) {\n const corner = computeRoundedCorner(\n points[i - 1],\n points[i],\n points[i + 1] ?? points[i],\n ROUNDED_CORNER_RADIUS\n );\n if (corner) {\n segStartConsumed = corner.cutLen;\n }\n }\n let segEndStop = segLen;\n let upcomingCorner = null;\n if (rounded && i < segments.length - 1) {\n upcomingCorner = computeRoundedCorner(\n points[i],\n points[i + 1],\n points[i + 2] ?? points[i + 1],\n ROUNDED_CORNER_RADIUS\n );\n if (upcomingCorner) {\n segEndStop = segLen - upcomingCorner.cutLen;\n }\n }\n const segJumps = [...bySeg.get(i) ?? []].sort((a, b) => a.t - b.t);\n for (const j of segJumps) {\n j.r = Math.min(j.r, j.d - segStartConsumed, segEndStop - j.d);\n }\n for (let k = 0; k < segJumps.length - 1; k++) {\n const gap = segJumps[k + 1].d - segJumps[k].d;\n if (segJumps[k].r + segJumps[k + 1].r > gap) {\n const half = gap / 2;\n segJumps[k].r = Math.min(segJumps[k].r, half);\n segJumps[k + 1].r = Math.min(segJumps[k + 1].r, half);\n }\n }\n for (const j of segJumps) {\n if (j.r < MIN_JUMP_RADIUS) {\n continue;\n }\n parts.push(...emitJump(j, ux, uy, sweep, config.jumpStyle));\n }\n if (rounded && upcomingCorner) {\n parts.push(`L${fmt(upcomingCorner.startX)},${fmt(upcomingCorner.startY)}`);\n parts.push(\n `Q${fmt(upcomingCorner.ctrlX)},${fmt(upcomingCorner.ctrlY)} ${fmt(upcomingCorner.endX)},${fmt(upcomingCorner.endY)}`\n );\n } else {\n parts.push(`L${pointToString(seg.b)}`);\n }\n }\n return parts.join(\" \");\n}\n__name(rewriteEdgePath, \"rewriteEdgePath\");\nfunction isStraightPath(d) {\n return /^[\\d\\s+,.LMelm-]*$/.test(d);\n}\n__name(isStraightPath, \"isStraightPath\");\nfunction curveSupportsLineHops(curve) {\n if (!curve) {\n return true;\n }\n return curve === \"linear\" || curve === \"rounded\" || curve === \"step\" || curve === \"stepBefore\" || curve === \"stepAfter\";\n}\n__name(curveSupportsLineHops, \"curveSupportsLineHops\");\nfunction decodeDataPoints(raw) {\n if (!raw) {\n return null;\n }\n try {\n const json = typeof atob === \"function\" ? atob(raw) : Buffer.from(raw, \"base64\").toString();\n const parsed = JSON.parse(json);\n if (!Array.isArray(parsed)) {\n return null;\n }\n const pts = [];\n for (const p of parsed) {\n if (p && typeof p.x === \"number\" && typeof p.y === \"number\") {\n pts.push({ x: p.x, y: p.y });\n }\n }\n return pts.length >= 2 ? pts : null;\n } catch {\n return null;\n }\n}\n__name(decodeDataPoints, \"decodeDataPoints\");\nfunction applyLineJumpsToSvg(edgePathsGroup, edges, config) {\n if (!config.enabled) {\n return;\n }\n const groupNode = edgePathsGroup.node();\n if (!groupNode) {\n return;\n }\n const edgeMeta = /* @__PURE__ */ new Map();\n for (const e of edges) {\n edgeMeta.set(e.id, e);\n }\n const renderedEdges = [];\n const pathById = /* @__PURE__ */ new Map();\n for (const e of edges) {\n const escapedId = typeof CSS !== \"undefined\" && CSS.escape ? CSS.escape(e.id) : e.id;\n const pathEl = groupNode.querySelector(`path[data-id=\"${escapedId}\"]`);\n if (!pathEl) {\n continue;\n }\n pathById.set(e.id, pathEl);\n const decoded = decodeDataPoints(pathEl.getAttribute(\"data-points\"));\n const points = decoded ?? e.points;\n renderedEdges.push({ ...e, points });\n }\n const crossings = findEdgeIntersections(renderedEdges);\n if (crossings.length === 0) {\n return;\n }\n const jumpsByEdge = /* @__PURE__ */ new Map();\n for (const c of crossings) {\n const list = jumpsByEdge.get(c.jumpEdgeId) ?? [];\n list.push(c);\n jumpsByEdge.set(c.jumpEdgeId, list);\n }\n for (const renderedEdge of renderedEdges) {\n const jumps = jumpsByEdge.get(renderedEdge.id);\n if (!jumps || jumps.length === 0) {\n continue;\n }\n const meta = edgeMeta.get(renderedEdge.id);\n const curveHint = meta?.curve;\n if (curveHint !== void 0 && !curveSupportsLineHops(curveHint)) {\n continue;\n }\n const pathEl = pathById.get(renderedEdge.id);\n if (!pathEl) {\n continue;\n }\n if (curveHint === void 0) {\n const currentD = pathEl.getAttribute(\"d\") ?? \"\";\n if (!isStraightPath(currentD)) {\n continue;\n }\n }\n const originalStyle = pathEl.getAttribute(\"style\") ?? \"\";\n const dasharrayMatch = /stroke-dasharray\\s*:\\s*0\\s+([\\d.]+)\\s+[\\d.]+\\s+([\\d.]+)/.exec(\n originalStyle\n );\n const preservedOValueS = dasharrayMatch ? Number.parseFloat(dasharrayMatch[1]) : null;\n const preservedOValueE = dasharrayMatch ? Number.parseFloat(dasharrayMatch[2]) : null;\n const newD = rewriteEdgePath(renderedEdge, jumps, config);\n pathEl.setAttribute(\"d\", newD);\n if (preservedOValueS !== null && preservedOValueE !== null && typeof pathEl.getTotalLength === \"function\") {\n const newLen = pathEl.getTotalLength();\n const onLen = Math.max(0, newLen - preservedOValueS - preservedOValueE);\n const newDasharray = `0 ${preservedOValueS} ${onLen} ${preservedOValueE}`;\n const cleaned = originalStyle.replace(/stroke-dasharray\\s*:[^;]*;?/g, `stroke-dasharray: ${newDasharray};`).replace(/;\\s*;+/g, \";\");\n pathEl.setAttribute(\"style\", cleaned);\n }\n }\n}\n__name(applyLineJumpsToSvg, \"applyLineJumpsToSvg\");\n\n// src/rendering-util/layout-algorithms/swimlanes/adjustLayout.ts\nasync function adjustLayout(data4Layout, groups) {\n for (const node of data4Layout.nodes) {\n if (node.isGroup) {\n await insertCluster(groups.clusters, node);\n } else {\n positionNode(node);\n }\n }\n const nodeById = /* @__PURE__ */ new Map();\n for (const node of data4Layout.nodes) {\n if (node?.id) {\n nodeById.set(node.id, node);\n }\n }\n for (const edge of data4Layout.edges) {\n const startNode = edge.start ? nodeById.get(edge.start) ?? {} : {};\n const endNode = edge.end ? nodeById.get(edge.end) ?? {} : {};\n const paths = insertEdge(\n groups.edgePaths,\n { ...edge },\n {},\n data4Layout.type,\n startNode,\n endNode,\n data4Layout.diagramId\n );\n if (edge.label) {\n await insertEdgeLabel(groups.rootGroups, edge);\n }\n if (edge.label) {\n positionEdgeLabel(edge, paths);\n }\n }\n const lineHopsConfig = data4Layout.config?.swimlane?.lineHops;\n if (lineHopsConfig !== false) {\n const jumpStyle = lineHopsConfig === \"gap\" ? \"gap\" : \"arc\";\n const edgeGeometries = data4Layout.edges.filter((e) => Array.isArray(e.points) && e.points.length >= 2).map((e) => ({\n id: e.id,\n points: e.points,\n curve: e.curve,\n arrowTypeStart: e.arrowTypeStart,\n arrowTypeEnd: e.arrowTypeEnd\n }));\n applyLineJumpsToSvg(groups.edgePaths, edgeGeometries, {\n enabled: true,\n jumpRadius: 6,\n jumpStyle\n });\n }\n}\n__name(adjustLayout, \"adjustLayout\");\nfunction positionEdgeLabel(edge, paths) {\n const path = paths?.updatedPath ?? paths?.originalPath;\n const siteConfig = getConfig();\n const { subGraphTitleTotalMargin } = getSubGraphTitleMargins({\n flowchart: siteConfig.flowchart ?? {}\n });\n if (edge.label) {\n const el = edgeLabels.get(edge.id);\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcLabelPosition(path);\n log.debug(\n \"Moving label \" + edge.label + \" from (\",\n x,\n \",\",\n y,\n \") to (\",\n pos.x,\n \",\",\n pos.y,\n \") abc88\"\n );\n if (paths) {\n x = pos.x;\n y = pos.y;\n }\n }\n el.attr(\"transform\", `translate(${x}, ${y + subGraphTitleTotalMargin / 2})`);\n }\n if (edge?.startLabelLeft) {\n const el = terminalLabels.get(edge.id).startLeft;\n let x = edge?.x;\n let y = edge?.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeStart ? 10 : 0, \"start_left\", path);\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n if (edge.startLabelRight) {\n const el = terminalLabels.get(edge.id).startRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(\n edge.arrowTypeStart ? 10 : 0,\n \"start_right\",\n path\n );\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n if (edge.endLabelLeft) {\n const el = terminalLabels.get(edge.id).endLeft;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, \"end_left\", path);\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n if (edge.endLabelRight) {\n const el = terminalLabels.get(edge.id).endRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, \"end_right\", path);\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n}\n__name(positionEdgeLabel, \"positionEdgeLabel\");\n\n// src/rendering-util/layout-algorithms/swimlanes/helpers.ts\nvar DEFAULT_SWIMLANE_ID = \"__swimlane_default__\";\nvar TOP_LANE_TITLE_BAND_HEIGHT = 21;\nvar MIN_TOP_LANE_HORIZONTAL_PADDING = 20;\nfunction topLaneHorizontalPadding(lane) {\n return Math.max(lane.padding ?? MIN_TOP_LANE_HORIZONTAL_PADDING, MIN_TOP_LANE_HORIZONTAL_PADDING);\n}\n__name(topLaneHorizontalPadding, \"topLaneHorizontalPadding\");\nfunction assignTopLaneTitleRect(lane) {\n const { x, y, width, height } = lane;\n const contentTop = lane.swimlaneContentTop;\n if (typeof x !== \"number\" || typeof y !== \"number\" || typeof width !== \"number\" || typeof height !== \"number\" || typeof contentTop !== \"number\" || !Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(width) || !Number.isFinite(height) || !Number.isFinite(contentTop) || width <= 0 || height <= 0) {\n delete lane.groupTitleRect;\n return;\n }\n const top = y - height / 2;\n const headerBottom = Math.min(contentTop, y + height / 2);\n const titleHeight = Math.min(TOP_LANE_TITLE_BAND_HEIGHT, Math.max(0, headerBottom - top));\n const bottom = top + titleHeight;\n if (bottom <= top) {\n delete lane.groupTitleRect;\n return;\n }\n lane.groupTitleRect = {\n left: x - width / 2,\n right: x + width / 2,\n top,\n bottom\n };\n}\n__name(assignTopLaneTitleRect, \"assignTopLaneTitleRect\");\nfunction prepareLayoutForSwimlanes(layout) {\n const direction = layout.direction;\n const nodes = layout.nodes ??= [];\n for (const node of layout.nodes ?? []) {\n if (node.isGroup && !node.parentId) {\n node.shape = \"swimlane\";\n if (direction) {\n node.direction = direction;\n }\n }\n }\n const looseNodes = nodes.filter((node) => !node.isGroup && !node.parentId);\n if (looseNodes.length === 0) {\n return;\n }\n let defaultLane = nodes.find((node) => node.id === DEFAULT_SWIMLANE_ID);\n if (!defaultLane) {\n defaultLane = {\n id: DEFAULT_SWIMLANE_ID,\n label: \"\",\n isGroup: true,\n shape: \"swimlane\",\n padding: 20,\n ...direction ? { direction } : {}\n };\n nodes.push(defaultLane);\n } else if (defaultLane.isGroup) {\n defaultLane.shape = \"swimlane\";\n if (direction) {\n defaultLane.direction = direction;\n }\n }\n for (const node of looseNodes) {\n node.parentId = DEFAULT_SWIMLANE_ID;\n }\n}\n__name(prepareLayoutForSwimlanes, \"prepareLayoutForSwimlanes\");\nfunction toGraphView(layout) {\n const nodeById = /* @__PURE__ */ new Map();\n for (const n of layout.nodes ?? []) {\n nodeById.set(n.id, n);\n }\n const edges = [];\n for (const e of layout.edges ?? []) {\n const src = typeof e.start === \"string\" ? e.start : void 0;\n const dst = typeof e.end === \"string\" ? e.end : void 0;\n if (!src || !dst) {\n continue;\n }\n if (e.labelNodeId) {\n continue;\n }\n edges.push({ id: e.id, src, dst, ref: e });\n }\n const allNodes = layout.nodes ?? [];\n const groupNodes = allNodes.filter((n) => n.isGroup);\n const nonGroupNodes = allNodes.filter((n) => !n.isGroup);\n const nodesInGroupOrder = [...groupNodes].reverse();\n const nodes = [...nodesInGroupOrder, ...nonGroupNodes].map((n) => n.id);\n return { nodes, edges, layout, nodeById };\n}\n__name(toGraphView, \"toGraphView\");\nfunction writeBackToLayoutData(g, ordered, coords, opts) {\n const { layout } = g;\n const nodeMap = g.nodeById;\n const layerGap = opts?.layerGap ?? 100;\n const nodeGap = opts?.nodeGap ?? 40;\n let layerIndex = 0;\n for (const layer of ordered.layers) {\n let orderIndex = 0;\n for (const id of layer) {\n const node = nodeMap.get(id);\n if (!node) {\n orderIndex++;\n continue;\n }\n node.layer = layerIndex;\n node.order = orderIndex;\n const x = coords.x[id] ?? orderIndex * nodeGap;\n const y = coords.y[id] ?? layerIndex * layerGap;\n node.x = x;\n node.y = y;\n orderIndex++;\n }\n layerIndex++;\n }\n const allNodes = layout.nodes ?? [];\n const groupBounds = /* @__PURE__ */ new Map();\n const topLevelGroups = [];\n for (const group of allNodes) {\n if (!group?.isGroup) {\n continue;\n }\n if (!group.parentId) {\n topLevelGroups.push(group);\n }\n const children = allNodes.filter((n) => n.parentId === group.id);\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n for (const child of children) {\n const cx = child.x ?? coords.x[child.id];\n const cy = child.y ?? coords.y[child.id];\n const cw = child.width ?? 0;\n const ch = child.height ?? 0;\n if (cx != null && cy != null) {\n minX = Math.min(minX, cx - cw / 2);\n maxX = Math.max(maxX, cx + cw / 2);\n minY = Math.min(minY, cy - ch / 2);\n maxY = Math.max(maxY, cy + ch / 2);\n }\n }\n if (minX === Infinity || minY === Infinity) {\n group.x = group.x ?? 0;\n group.y = group.y ?? 0;\n group.width = group.width ?? 0;\n group.height = group.height ?? 0;\n } else {\n const pad = group.padding ?? 20;\n const horizontalPad = group.parentId ? pad : 2 * topLaneHorizontalPadding(group);\n const verticalPad = pad;\n const w = Math.max(0, maxX - minX) + horizontalPad;\n const h = Math.max(0, maxY - minY) + verticalPad;\n const cx = (minX + maxX) / 2;\n const cy = (minY + maxY) / 2;\n group.x = cx;\n group.y = cy;\n group.width = w;\n group.height = h;\n groupBounds.set(group.id, { minX, maxX, minY, maxY });\n }\n }\n if (topLevelGroups.length > 0 && groupBounds.size > 0) {\n let globalMinY = Infinity;\n let globalMaxY = -Infinity;\n let maxPad = 0;\n for (const lane of topLevelGroups) {\n const pad = lane.padding ?? 20;\n if (pad > maxPad) {\n maxPad = pad;\n }\n const b = groupBounds.get(lane.id);\n if (!b) {\n continue;\n }\n globalMinY = Math.min(globalMinY, b.minY);\n globalMaxY = Math.max(globalMaxY, b.maxY);\n }\n if (globalMinY !== Infinity && globalMaxY !== -Infinity) {\n const contentHeight = Math.max(0, globalMaxY - globalMinY);\n const minHeaderMargin = 36;\n const verticalMargin = Math.max(maxPad, minHeaderMargin);\n const laneHeight = contentHeight + 2 * verticalMargin;\n const centerY = (globalMinY + globalMaxY) / 2;\n for (const lane of topLevelGroups) {\n lane.y = centerY;\n lane.height = laneHeight;\n lane.swimlaneContentTop = globalMinY;\n }\n const sortedLanes = [...topLevelGroups].sort((a, b) => {\n const ax = a.x ?? 0;\n const bx = b.x ?? 0;\n return ax - bx;\n });\n const laneIds = [];\n const centers = [];\n const baseWidths = [];\n for (const lane of sortedLanes) {\n const b = groupBounds.get(lane.id);\n if (!b) {\n continue;\n }\n const contentWidth = Math.max(0, b.maxX - b.minX) + 2 * topLaneHorizontalPadding(lane);\n const cx = (b.minX + b.maxX) / 2;\n laneIds.push(lane.id);\n centers.push(cx);\n baseWidths.push(contentWidth);\n }\n const count = laneIds.length;\n if (count > 0) {\n const laneWidths = /* @__PURE__ */ new Map();\n if (count === 1) {\n laneWidths.set(laneIds[0], baseWidths[0]);\n } else {\n const d = [];\n for (let i = 0; i < count - 1; i++) {\n d.push(centers[i + 1] - centers[i]);\n }\n const u = new Array(count);\n u[0] = 0;\n for (let i = 0; i < count - 1; i++) {\n u[i + 1] = 2 * d[i] - u[i];\n }\n let lowerBound = 0;\n let upperBound = Number.POSITIVE_INFINITY;\n for (let i = 0; i < count; i++) {\n const baseW = baseWidths[i];\n if (i % 2 === 0) {\n lowerBound = Math.max(lowerBound, baseW - u[i]);\n } else {\n upperBound = Math.min(upperBound, u[i] - baseW);\n }\n }\n let x = lowerBound;\n if (lowerBound <= upperBound) {\n x = (lowerBound + upperBound) / 2;\n } else {\n x = lowerBound;\n }\n for (let i = 0; i < count; i++) {\n const w = u[i] + (i % 2 === 0 ? x : -x);\n const finalWidth = Math.max(baseWidths[i], w);\n laneWidths.set(laneIds[i], finalWidth);\n }\n }\n for (const lane of topLevelGroups) {\n const w = laneWidths.get(lane.id);\n if (w != null) {\n lane.width = w;\n }\n assignTopLaneTitleRect(lane);\n }\n }\n }\n }\n}\n__name(writeBackToLayoutData, \"writeBackToLayoutData\");\n\n// src/rendering-util/layout-algorithms/swimlanes/edgeLabelNodes.ts\nvar EDGE_LABEL_LOG_PREFIX = \"[EdgeLabelNodes]\";\nfunction createEdgeLabelNodes(data) {\n const nodesToAdd = [];\n const layoutOnlyEdges = [];\n const nodeById = /* @__PURE__ */ new Map();\n for (const node of data.nodes) {\n nodeById.set(node.id, node);\n }\n for (const edge of data.edges) {\n if (!edge.label || edge.label.length === 0) {\n continue;\n }\n if (edge.isLayoutOnly) {\n continue;\n }\n if (edge.labelNodeId) {\n continue;\n }\n const sourceNode = edge.start ? nodeById.get(edge.start) : void 0;\n const targetNode = edge.end ? nodeById.get(edge.end) : void 0;\n if (!sourceNode || !targetNode) {\n log.warn(EDGE_LABEL_LOG_PREFIX, `Edge ${edge.id} has missing source or target node`);\n continue;\n }\n const labelNodeId = `edge-label-${edge.start}-${edge.end}-${edge.id}`;\n const isCrossLane = sourceNode.parentId !== targetNode.parentId;\n const labelLane = isCrossLane ? targetNode.parentId : sourceNode.parentId;\n const labelNode = {\n id: labelNodeId,\n label: edge.label,\n edgeStart: edge.start ?? \"\",\n edgeEnd: edge.end ?? \"\",\n shape: \"labelRect\",\n width: 0,\n // populated when rendered / applied from fixture\n height: 0,\n isEdgeLabel: true,\n isDummy: true,\n parentId: labelLane,\n isGroup: false,\n labelStyle: Array.isArray(edge.labelStyle) ? edge.labelStyle[0] : edge.labelStyle ?? \"\",\n ...sourceNode.dir ? { dir: sourceNode.dir } : {}\n };\n nodesToAdd.push(labelNode);\n edge.labelNodeId = labelNodeId;\n edge.label = void 0;\n edge.text = void 0;\n const toLabelVirtual = {\n id: `${edge.id}-to-label`,\n start: edge.start,\n end: labelNodeId,\n type: \"normal\",\n isLayoutOnly: true\n };\n const fromLabelVirtual = {\n id: `${edge.id}-from-label`,\n start: labelNodeId,\n end: edge.end,\n type: \"normal\",\n isLayoutOnly: true\n };\n layoutOnlyEdges.push(toLabelVirtual, fromLabelVirtual);\n }\n const newNodes = [...data.nodes, ...nodesToAdd];\n const newEdges = [...data.edges, ...layoutOnlyEdges];\n return {\n ...data,\n nodes: newNodes,\n edges: newEdges\n };\n}\n__name(createEdgeLabelNodes, \"createEdgeLabelNodes\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/geometry.ts\nvar EPS = 1e-3;\nfunction measuredNodeRect(node) {\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const width = node.width ?? 0;\n const height = node.height ?? 0;\n return width > 0 && height > 0 ? { cx, cy, rect: rectFromCenterSize(cx, cy, width, height) } : void 0;\n}\n__name(measuredNodeRect, \"measuredNodeRect\");\nfunction nodeBoundsInfoFor(node) {\n if (node.isGroup) {\n return void 0;\n }\n const measured = measuredNodeRect(node);\n if (!measured) {\n return void 0;\n }\n const id = String(node.id ?? \"\");\n return {\n id,\n cx: measured.cx,\n cy: measured.cy,\n rect: measured.rect\n };\n}\n__name(nodeBoundsInfoFor, \"nodeBoundsInfoFor\");\nfunction samePoint(a, b, epsilon = EPS) {\n return Math.abs(a.x - b.x) < epsilon && Math.abs(a.y - b.y) < epsilon;\n}\n__name(samePoint, \"samePoint\");\nfunction sameX(a, b, epsilon = EPS) {\n return Math.abs(a.x - b.x) < epsilon;\n}\n__name(sameX, \"sameX\");\nfunction sameY(a, b, epsilon = EPS) {\n return Math.abs(a.y - b.y) < epsilon;\n}\n__name(sameY, \"sameY\");\nfunction isHorizontalSegment(a, b, epsilon = EPS) {\n return sameY(a, b, epsilon) && Math.abs(a.x - b.x) > epsilon;\n}\n__name(isHorizontalSegment, \"isHorizontalSegment\");\nfunction isVerticalSegment(a, b, epsilon = EPS) {\n return sameX(a, b, epsilon) && Math.abs(a.y - b.y) > epsilon;\n}\n__name(isVerticalSegment, \"isVerticalSegment\");\nfunction overlapLength(a1, a2, b1, b2) {\n return Math.max(\n 0,\n Math.min(Math.max(a1, a2), Math.max(b1, b2)) - Math.max(Math.min(a1, a2), Math.min(b1, b2))\n );\n}\n__name(overlapLength, \"overlapLength\");\nfunction sameAxisSegmentOverlapLength(a, b, epsilon = EPS) {\n if (a.horizontal && b.horizontal && sameY(a.a, b.a, epsilon)) {\n return overlapLength(a.a.x, a.b.x, b.a.x, b.b.x);\n }\n if (a.vertical && b.vertical && sameX(a.a, b.a, epsilon)) {\n return overlapLength(a.a.y, a.b.y, b.a.y, b.b.y);\n }\n return 0;\n}\n__name(sameAxisSegmentOverlapLength, \"sameAxisSegmentOverlapLength\");\nfunction orthogonalSegmentsForPoints(points, epsilon = EPS) {\n const result = [];\n for (let i = 0; i < points.length - 1; i++) {\n const a = points[i];\n const b = points[i + 1];\n const horizontal = isHorizontalSegment(a, b, epsilon);\n const vertical = isVerticalSegment(a, b, epsilon);\n if (horizontal || vertical) {\n result.push({ index: i, a, b, horizontal, vertical });\n }\n }\n return result;\n}\n__name(orthogonalSegmentsForPoints, \"orthogonalSegmentsForPoints\");\nfunction countOrthogonalBends(points, epsilon = EPS) {\n const segments = orthogonalSegmentsForPoints(points, epsilon);\n let bends = 0;\n for (let i = 1; i < segments.length; i++) {\n if (segments[i - 1].horizontal !== segments[i].horizontal) {\n bends++;\n }\n }\n return bends;\n}\n__name(countOrthogonalBends, \"countOrthogonalBends\");\nfunction dedupeConsecutivePoints(points, epsilon = EPS) {\n const result = [];\n for (const point of points) {\n const last = result.length > 0 ? result[result.length - 1] : void 0;\n if (!last || !samePoint(last, point, epsilon)) {\n result.push({ x: point.x, y: point.y });\n }\n }\n return result;\n}\n__name(dedupeConsecutivePoints, \"dedupeConsecutivePoints\");\nfunction classifyThreeSegmentRoute(points, epsilon = EPS) {\n if (!points || points.length !== 4) {\n return void 0;\n }\n const [p0, p1, p2, p3] = points;\n const isHVH = isHorizontalSegment(p0, p1, epsilon) && isVerticalSegment(p1, p2, epsilon) && isHorizontalSegment(p2, p3, epsilon);\n if (isHVH) {\n return { kind: \"HVH\", p0, p1, p2, p3 };\n }\n const isVHV = isVerticalSegment(p0, p1, epsilon) && isHorizontalSegment(p1, p2, epsilon) && isVerticalSegment(p2, p3, epsilon);\n return isVHV ? { kind: \"VHV\", p0, p1, p2, p3 } : void 0;\n}\n__name(classifyThreeSegmentRoute, \"classifyThreeSegmentRoute\");\nfunction segmentBoundsOverlapRect(a, b, rect, buffer = 0) {\n const segMinX = Math.min(a.x, b.x);\n const segMaxX = Math.max(a.x, b.x);\n const segMinY = Math.min(a.y, b.y);\n const segMaxY = Math.max(a.y, b.y);\n return segMaxX > rect.left - buffer && segMinX < rect.right + buffer && segMaxY > rect.top - buffer && segMinY < rect.bottom + buffer;\n}\n__name(segmentBoundsOverlapRect, \"segmentBoundsOverlapRect\");\nfunction pointInsideRect(point, rect, buffer = 0) {\n return point.x > rect.left + buffer && point.x < rect.right - buffer && point.y > rect.top + buffer && point.y < rect.bottom - buffer;\n}\n__name(pointInsideRect, \"pointInsideRect\");\nfunction rectContainsRect(outer, inner) {\n return outer.left <= inner.left && outer.right >= inner.right && outer.top <= inner.top && outer.bottom >= inner.bottom;\n}\n__name(rectContainsRect, \"rectContainsRect\");\nfunction rectsOverlap(a, b) {\n return a.left < b.right && a.right > b.left && a.top < b.bottom && a.bottom > b.top;\n}\n__name(rectsOverlap, \"rectsOverlap\");\nfunction inflateRect(rect, margin) {\n return {\n left: rect.left - margin,\n right: rect.right + margin,\n top: rect.top - margin,\n bottom: rect.bottom + margin\n };\n}\n__name(inflateRect, \"inflateRect\");\nfunction rectFromCenterSize(cx, cy, width, height) {\n return {\n left: cx - width / 2,\n right: cx + width / 2,\n top: cy - height / 2,\n bottom: cy + height / 2\n };\n}\n__name(rectFromCenterSize, \"rectFromCenterSize\");\nfunction rectOfNodeBounds(node) {\n return measuredNodeRect(node)?.rect;\n}\n__name(rectOfNodeBounds, \"rectOfNodeBounds\");\nfunction portForRectSide(node, side) {\n switch (side) {\n case \"top\":\n return { x: node.cx, y: node.rect.top };\n case \"bottom\":\n return { x: node.cx, y: node.rect.bottom };\n case \"left\":\n return { x: node.rect.left, y: node.cy };\n case \"right\":\n return { x: node.rect.right, y: node.cy };\n }\n}\n__name(portForRectSide, \"portForRectSide\");\nfunction buildOrthogonalPortPath(src, srcSide, dst, dstSide, anchor, epsilon = EPS) {\n const srcH = srcSide === \"left\" || srcSide === \"right\";\n const dstH = dstSide === \"left\" || dstSide === \"right\";\n if (srcH && dstH) {\n const opposingDir = srcSide === \"right\" && dstSide === \"left\" && src.x < dst.x || srcSide === \"left\" && dstSide === \"right\" && src.x > dst.x;\n if (opposingDir) {\n if (sameY(src, dst, epsilon)) {\n return [src, dst];\n }\n const midX = (src.x + dst.x) / 2;\n return [src, { x: midX, y: src.y }, { x: midX, y: dst.y }, dst];\n }\n if (srcSide === dstSide) {\n if (sameY(src, dst, epsilon)) {\n return void 0;\n }\n const intX = srcSide === \"left\" ? Math.min(src.x, dst.x) - anchor : Math.max(src.x, dst.x) + anchor;\n return [src, { x: intX, y: src.y }, { x: intX, y: dst.y }, dst];\n }\n return void 0;\n }\n if (!srcH && !dstH) {\n if (srcSide === dstSide) {\n if (sameX(src, dst, epsilon)) {\n return void 0;\n }\n const intY = srcSide === \"top\" ? Math.min(src.y, dst.y) - anchor : Math.max(src.y, dst.y) + anchor;\n return [src, { x: src.x, y: intY }, { x: dst.x, y: intY }, dst];\n }\n const sameDir = srcSide === \"bottom\" && dstSide === \"top\" && src.y < dst.y || srcSide === \"top\" && dstSide === \"bottom\" && src.y > dst.y;\n if (!sameDir) {\n return void 0;\n }\n if (sameX(src, dst, epsilon)) {\n return [src, dst];\n }\n const midY = (src.y + dst.y) / 2;\n return [src, { x: src.x, y: midY }, { x: dst.x, y: midY }, dst];\n }\n if (srcH && !dstH) {\n const sameDirSrc2 = srcSide === \"right\" && dst.x > src.x || srcSide === \"left\" && dst.x < src.x;\n const sameDirDst2 = dstSide === \"top\" && src.y < dst.y || dstSide === \"bottom\" && src.y > dst.y;\n return sameDirSrc2 && sameDirDst2 ? [src, { x: dst.x, y: src.y }, dst] : void 0;\n }\n const sameDirSrc = srcSide === \"bottom\" && dst.y > src.y || srcSide === \"top\" && dst.y < src.y;\n const sameDirDst = dstSide === \"left\" && src.x < dst.x || dstSide === \"right\" && src.x > dst.x;\n return sameDirSrc && sameDirDst ? [src, { x: src.x, y: dst.y }, dst] : void 0;\n}\n__name(buildOrthogonalPortPath, \"buildOrthogonalPortPath\");\nfunction buildSameSideTrackPath(src, side, dst, track) {\n return side === \"left\" || side === \"right\" ? [src, { x: track, y: src.y }, { x: track, y: dst.y }, dst] : [src, { x: src.x, y: track }, { x: dst.x, y: track }, dst];\n}\n__name(buildSameSideTrackPath, \"buildSameSideTrackPath\");\nfunction collectRealNodeBounds(nodes) {\n const nodeInfoById = /* @__PURE__ */ new Map();\n const realNodeRects = [];\n for (const node of nodes) {\n if (node.isEdgeLabel) {\n continue;\n }\n const info = nodeBoundsInfoFor(node);\n if (!info) {\n continue;\n }\n nodeInfoById.set(info.id, info);\n realNodeRects.push({ id: info.id, rect: info.rect });\n }\n return { nodeInfoById, realNodeRects };\n}\n__name(collectRealNodeBounds, \"collectRealNodeBounds\");\nfunction collectNodeRectEntries(nodes) {\n const realNodeRects = [];\n const labelNodeRects = [];\n for (const node of nodes) {\n const info = nodeBoundsInfoFor(node);\n if (!info) {\n continue;\n }\n const entry = { id: info.id, rect: info.rect };\n if (node.isEdgeLabel) {\n labelNodeRects.push(entry);\n } else {\n realNodeRects.push(entry);\n }\n }\n return { realNodeRects, labelNodeRects };\n}\n__name(collectNodeRectEntries, \"collectNodeRectEntries\");\nfunction collectLayoutNodeRects(nodes, { includeEdgeLabels = true } = {}) {\n const result = [];\n for (const node of nodes) {\n if (node.isGroup || !includeEdgeLabels && node.isEdgeLabel) {\n continue;\n }\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const width = node.width ?? 0;\n const height = node.height ?? 0;\n result.push({\n nodeId: node.id,\n ...rectFromCenterSize(cx, cy, width, height)\n });\n }\n return result;\n}\n__name(collectLayoutNodeRects, \"collectLayoutNodeRects\");\nfunction getNodePairGeometry(edge, nodeInfoById, epsilon = EPS) {\n const srcId = edge.start;\n const dstId = edge.end;\n if (!srcId || !dstId) {\n return void 0;\n }\n const srcInfo = nodeInfoById.get(srcId);\n const dstInfo = nodeInfoById.get(dstId);\n if (!srcInfo || !dstInfo) {\n return void 0;\n }\n return {\n srcId,\n dstId,\n srcInfo,\n dstInfo,\n collinearX: Math.abs(srcInfo.cx - dstInfo.cx) < epsilon,\n collinearY: Math.abs(srcInfo.cy - dstInfo.cy) < epsilon\n };\n}\n__name(getNodePairGeometry, \"getNodePairGeometry\");\nfunction segmentHitsAnyRect(a, b, rects, excludeIds = [], shrink = 0) {\n for (const entry of rects) {\n if (excludeIds.includes(entry.id)) {\n continue;\n }\n if (segmentBoundsOverlapRect(a, b, entry.rect, -shrink)) {\n return true;\n }\n }\n return false;\n}\n__name(segmentHitsAnyRect, \"segmentHitsAnyRect\");\nfunction orthogonalSegmentsCross(a1, b1, a2, b2, epsilon = EPS, endpointTolerance = 1e-6) {\n const s1H = sameY(a1, b1, epsilon);\n const s1V = sameX(a1, b1, epsilon);\n const s2H = sameY(a2, b2, epsilon);\n const s2V = sameX(a2, b2, epsilon);\n if (s1H && s2H || s1V && s2V) {\n return false;\n }\n if (!(s1H || s1V) || !(s2H || s2V)) {\n return false;\n }\n const horiz = s1H ? { a: a1, b: b1 } : { a: a2, b: b2 };\n const vert = s1V ? { a: a1, b: b1 } : { a: a2, b: b2 };\n const hY = horiz.a.y;\n const hX1 = Math.min(horiz.a.x, horiz.b.x);\n const hX2 = Math.max(horiz.a.x, horiz.b.x);\n const vX = vert.a.x;\n const vY1 = Math.min(vert.a.y, vert.b.y);\n const vY2 = Math.max(vert.a.y, vert.b.y);\n if (vX < hX1 || vX > hX2 || hY < vY1 || hY > vY2) {\n return false;\n }\n const matchesHorizEndpoint = Math.abs(vX - horiz.a.x) < endpointTolerance && Math.abs(hY - horiz.a.y) < endpointTolerance || Math.abs(vX - horiz.b.x) < endpointTolerance && Math.abs(hY - horiz.b.y) < endpointTolerance;\n const matchesVertEndpoint = Math.abs(vX - vert.a.x) < endpointTolerance && Math.abs(hY - vert.a.y) < endpointTolerance || Math.abs(vX - vert.b.x) < endpointTolerance && Math.abs(hY - vert.b.y) < endpointTolerance;\n return !(matchesHorizEndpoint && matchesVertEndpoint);\n}\n__name(orthogonalSegmentsCross, \"orthogonalSegmentsCross\");\nfunction sameAxisSegmentsOverlap(a1, b1, a2, b2, epsilon = EPS) {\n const s1H = sameY(a1, b1, epsilon);\n const s1V = sameX(a1, b1, epsilon);\n const s2H = sameY(a2, b2, epsilon);\n const s2V = sameX(a2, b2, epsilon);\n if (s1V && s2V && sameX(a1, a2, epsilon)) {\n return overlapLength(a1.y, b1.y, a2.y, b2.y) > epsilon;\n }\n if (s1H && s2H && sameY(a1, a2, epsilon)) {\n return overlapLength(a1.x, b1.x, a2.x, b2.x) > epsilon;\n }\n return false;\n}\n__name(sameAxisSegmentsOverlap, \"sameAxisSegmentsOverlap\");\nfunction segmentConflictsWithAnyEdge(a, b, edges, excludeEdge, {\n epsilon = EPS,\n skipDegenerateOther = false\n} = {}) {\n for (const other of edges) {\n if (other === excludeEdge || other.isLayoutOnly) {\n continue;\n }\n const points = other.points;\n if (!points || points.length < 2) {\n continue;\n }\n for (let i = 0; i < points.length - 1; i++) {\n const oa = points[i];\n const ob = points[i + 1];\n if (skipDegenerateOther && samePoint(oa, ob, epsilon)) {\n continue;\n }\n if (orthogonalSegmentsCross(a, b, oa, ob, epsilon) || sameAxisSegmentsOverlap(a, b, oa, ob, epsilon)) {\n return true;\n }\n }\n }\n return false;\n}\n__name(segmentConflictsWithAnyEdge, \"segmentConflictsWithAnyEdge\");\nfunction orthogonalSegmentsStrictlyCross(a1, b1, a2, b2, epsilon = EPS) {\n const aHoriz = sameY(a1, b1, epsilon);\n const aVert = sameX(a1, b1, epsilon);\n const bHoriz = sameY(a2, b2, epsilon);\n const bVert = sameX(a2, b2, epsilon);\n if (!(aHoriz && bVert || aVert && bHoriz)) {\n return false;\n }\n const horiz = aHoriz ? { a: a1, b: b1 } : { a: a2, b: b2 };\n const vert = aHoriz ? { a: a2, b: b2 } : { a: a1, b: b1 };\n const hY = horiz.a.y;\n const hXmin = Math.min(horiz.a.x, horiz.b.x);\n const hXmax = Math.max(horiz.a.x, horiz.b.x);\n const vX = vert.a.x;\n const vYmin = Math.min(vert.a.y, vert.b.y);\n const vYmax = Math.max(vert.a.y, vert.b.y);\n return vX > hXmin + epsilon && vX < hXmax - epsilon && hY > vYmin + epsilon && hY < vYmax - epsilon;\n}\n__name(orthogonalSegmentsStrictlyCross, \"orthogonalSegmentsStrictlyCross\");\nfunction strictlyBetween(value, a, b) {\n const lo = Math.min(a, b);\n const hi = Math.max(a, b);\n return value > lo + EPS && value < hi - EPS;\n}\n__name(strictlyBetween, \"strictlyBetween\");\nfunction isCollinearIntermediate(prev, cur, next) {\n if (sameX(prev, cur) && sameX(cur, next)) {\n return strictlyBetween(cur.y, prev.y, next.y);\n }\n if (sameY(prev, cur) && sameY(cur, next)) {\n return strictlyBetween(cur.x, prev.x, next.x);\n }\n return false;\n}\n__name(isCollinearIntermediate, \"isCollinearIntermediate\");\nfunction simplifyPolylineOnce(points) {\n let changed = false;\n const out = [];\n for (let i = 0; i < points.length; i++) {\n const prev = out[out.length - 1];\n const cur = points[i];\n const next = i + 1 < points.length ? points[i + 1] : void 0;\n if (prev && next) {\n if (samePoint(prev, next)) {\n i++;\n changed = true;\n continue;\n }\n if (isCollinearIntermediate(prev, cur, next)) {\n changed = true;\n continue;\n }\n }\n out.push(cur);\n }\n return { points: out, changed };\n}\n__name(simplifyPolylineOnce, \"simplifyPolylineOnce\");\nfunction orthogonalizePolyline(pts) {\n const cleaned = [pts[0]];\n for (let i = 1; i < pts.length; i++) {\n const prev = cleaned[cleaned.length - 1];\n const curr = pts[i];\n if (!sameX(prev, curr) && !sameY(prev, curr)) {\n const prevPrev = cleaned.length >= 2 ? cleaned[cleaned.length - 2] : void 0;\n const incomingVertical = prevPrev ? sameX(prevPrev, prev) : false;\n const corner = incomingVertical ? { x: prev.x, y: curr.y } : { x: curr.x, y: prev.y };\n cleaned.push(corner);\n }\n cleaned.push(curr);\n }\n const deduped = [];\n for (const p of cleaned) {\n const last = deduped[deduped.length - 1];\n if (!last || !samePoint(last, p)) {\n deduped.push(p);\n }\n }\n return deduped;\n}\n__name(orthogonalizePolyline, \"orthogonalizePolyline\");\nfunction simplifyPolyline(pts) {\n if (pts.length < 3) {\n return pts;\n }\n let work = [...pts];\n for (let guard = 0; guard < 32; guard++) {\n const result = simplifyPolylineOnce(work);\n work = result.points;\n if (!result.changed) {\n break;\n }\n }\n return work;\n}\n__name(simplifyPolyline, \"simplifyPolyline\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/endpointClip.ts\nvar EPS2 = 1e-3;\nvar INSIDE_EPS = 0.5;\nvar CORNER_CLEARANCE = 4;\nfunction endpointContextFor(edge, nodeByIdMap, minPoints) {\n const candidate = edge;\n if (candidate.isLayoutOnly || !candidate.points || candidate.points.length < minPoints) {\n return void 0;\n }\n const src = candidate.start ? nodeByIdMap.get(candidate.start) : void 0;\n const dst = candidate.end ? nodeByIdMap.get(candidate.end) : void 0;\n return {\n edge: candidate,\n points: candidate.points,\n srcRect: src ? rectOfNodeBounds(src) : void 0,\n dstRect: dst ? rectOfNodeBounds(dst) : void 0\n };\n}\n__name(endpointContextFor, \"endpointContextFor\");\nfunction segmentEnterPoint(outside, inside, r) {\n if (sameY(outside, inside, EPS2)) {\n const x = outside.x < r.left ? r.left : r.right;\n return { x, y: outside.y };\n }\n if (sameX(outside, inside, EPS2)) {\n const y = outside.y < r.top ? r.top : r.bottom;\n return { x: outside.x, y };\n }\n return {\n x: Math.min(r.right, Math.max(r.left, outside.x)),\n y: Math.min(r.bottom, Math.max(r.top, outside.y))\n };\n}\n__name(segmentEnterPoint, \"segmentEnterPoint\");\nfunction clipEndpoint(points, rect, atStart) {\n const step = atStart ? 1 : -1;\n let outsideIndex = atStart ? 0 : points.length - 1;\n while (outsideIndex >= 0 && outsideIndex < points.length && pointInsideRect(points[outsideIndex], rect, INSIDE_EPS)) {\n outsideIndex += step;\n }\n if (outsideIndex < 0 || outsideIndex >= points.length) {\n return points;\n }\n const insideIndex = outsideIndex - step;\n if (insideIndex < 0 || insideIndex >= points.length) {\n return points;\n }\n const entry = segmentEnterPoint(points[outsideIndex], points[insideIndex], rect);\n return atStart ? [entry, ...points.slice(outsideIndex)] : [...points.slice(0, outsideIndex + 1), entry];\n}\n__name(clipEndpoint, \"clipEndpoint\");\nfunction clipEdgeEndpointsToNodeBoundaries(edges, nodeByIdMap) {\n for (const edge of edges) {\n const context = endpointContextFor(edge, nodeByIdMap, 2);\n if (!context) {\n continue;\n }\n let next = [...context.points];\n if (context.srcRect) {\n next = clipEndpoint(next, context.srcRect, true);\n }\n if (context.dstRect) {\n next = clipEndpoint(next, context.dstRect, false);\n }\n next = simplifyPolyline(orthogonalizePolyline(next));\n next = clearStraightEndpointCornerConnections(next, context.srcRect, context.dstRect);\n context.edge.points = simplifyPolyline(orthogonalizePolyline(next));\n }\n}\n__name(clipEdgeEndpointsToNodeBoundaries, \"clipEdgeEndpointsToNodeBoundaries\");\nfunction snapEndpointToBoundary(inner, endpoint, r, useApproachSide = false) {\n if (sameY(inner, endpoint, EPS2)) {\n if (endpoint.y < r.top - EPS2 || endpoint.y > r.bottom + EPS2) {\n return endpoint;\n }\n if (useApproachSide) {\n if (inner.x < r.left - EPS2) {\n return { x: r.left, y: inner.y };\n }\n if (inner.x > r.right + EPS2) {\n return { x: r.right, y: inner.y };\n }\n }\n const toLeft = Math.abs(endpoint.x - r.left) <= Math.abs(endpoint.x - r.right);\n return { x: toLeft ? r.left : r.right, y: inner.y };\n }\n if (sameX(inner, endpoint, EPS2)) {\n if (endpoint.x < r.left - EPS2 || endpoint.x > r.right + EPS2) {\n return endpoint;\n }\n if (useApproachSide) {\n if (inner.y < r.top - EPS2) {\n return { x: inner.x, y: r.top };\n }\n if (inner.y > r.bottom + EPS2) {\n return { x: inner.x, y: r.bottom };\n }\n }\n const toTop = Math.abs(endpoint.y - r.top) <= Math.abs(endpoint.y - r.bottom);\n return { x: inner.x, y: toTop ? r.top : r.bottom };\n }\n return endpoint;\n}\n__name(snapEndpointToBoundary, \"snapEndpointToBoundary\");\nfunction firstDistinctAdjacent(points, endpointIndex, step) {\n const endpoint = points[endpointIndex];\n for (let index = endpointIndex + step; index >= 0 && index < points.length; index += step) {\n const candidate = points[index];\n if (!samePoint(candidate, endpoint, EPS2)) {\n return candidate;\n }\n }\n return points[endpointIndex + step];\n}\n__name(firstDistinctAdjacent, \"firstDistinctAdjacent\");\nfunction cornerClearanceRange(min, max) {\n const lo = min + CORNER_CLEARANCE;\n const hi = max - CORNER_CLEARANCE;\n return lo <= hi ? { lo, hi } : { lo: (min + max) / 2, hi: (min + max) / 2 };\n}\n__name(cornerClearanceRange, \"cornerClearanceRange\");\nfunction clampToCornerClearance(value, min, max) {\n const { lo, hi } = cornerClearanceRange(min, max);\n return Math.min(hi, Math.max(lo, value));\n}\n__name(clampToCornerClearance, \"clampToCornerClearance\");\nfunction intersectRanges(ranges) {\n const lo = Math.max(...ranges.map((range) => range.lo));\n const hi = Math.min(...ranges.map((range) => range.hi));\n if (lo > hi) {\n return void 0;\n }\n return { lo, hi };\n}\n__name(intersectRanges, \"intersectRanges\");\nfunction clearanceRangeForSide(r, side) {\n return side === \"left\" || side === \"right\" ? cornerClearanceRange(r.top, r.bottom) : cornerClearanceRange(r.left, r.right);\n}\n__name(clearanceRangeForSide, \"clearanceRangeForSide\");\nfunction terminalSideForSegment(endpoint, adjacent, r) {\n const yWithin = endpoint.y >= r.top - EPS2 && endpoint.y <= r.bottom + EPS2;\n const xWithin = endpoint.x >= r.left - EPS2 && endpoint.x <= r.right + EPS2;\n if (sameY(endpoint, adjacent, EPS2) && yWithin) {\n if (Math.abs(endpoint.x - r.left) < EPS2) {\n return \"left\";\n }\n if (Math.abs(endpoint.x - r.right) < EPS2) {\n return \"right\";\n }\n }\n if (sameX(endpoint, adjacent, EPS2) && xWithin) {\n if (Math.abs(endpoint.y - r.top) < EPS2) {\n return \"top\";\n }\n if (Math.abs(endpoint.y - r.bottom) < EPS2) {\n return \"bottom\";\n }\n }\n return void 0;\n}\n__name(terminalSideForSegment, \"terminalSideForSegment\");\nfunction isHorizontalSide(side) {\n return side === \"left\" || side === \"right\";\n}\n__name(isHorizontalSide, \"isHorizontalSide\");\nfunction straightClearanceRange(start, end, srcRect, dstRect, horizontal) {\n const ranges = [];\n const srcSide = srcRect ? terminalSideForSegment(start, end, srcRect) : void 0;\n const dstSide = dstRect ? terminalSideForSegment(end, start, dstRect) : void 0;\n if (srcRect && srcSide && isHorizontalSide(srcSide) === horizontal) {\n ranges.push(clearanceRangeForSide(srcRect, srcSide));\n }\n if (dstRect && dstSide && isHorizontalSide(dstSide) === horizontal) {\n ranges.push(clearanceRangeForSide(dstRect, dstSide));\n }\n return ranges.length > 0 ? intersectRanges(ranges) : void 0;\n}\n__name(straightClearanceRange, \"straightClearanceRange\");\nfunction clearStraightEndpointCornerAxis(start, end, srcRect, dstRect, horizontal) {\n const range = straightClearanceRange(start, end, srcRect, dstRect, horizontal);\n if (!range) {\n return void 0;\n }\n const current = horizontal ? start.y : start.x;\n const next = Math.min(range.hi, Math.max(range.lo, current));\n if (Math.abs(next - current) < EPS2) {\n return void 0;\n }\n return horizontal ? [\n { x: start.x, y: next },\n { x: end.x, y: next }\n ] : [\n { x: next, y: start.y },\n { x: next, y: end.y }\n ];\n}\n__name(clearStraightEndpointCornerAxis, \"clearStraightEndpointCornerAxis\");\nfunction clearStraightEndpointCornerConnections(points, srcRect, dstRect) {\n if (points.length !== 2) {\n return points;\n }\n const [start, end] = points;\n if (sameY(start, end, EPS2)) {\n return clearStraightEndpointCornerAxis(start, end, srcRect, dstRect, true) ?? points;\n }\n if (sameX(start, end, EPS2)) {\n return clearStraightEndpointCornerAxis(start, end, srcRect, dstRect, false) ?? points;\n }\n return points;\n}\n__name(clearStraightEndpointCornerConnections, \"clearStraightEndpointCornerConnections\");\nfunction cornerClearedEndpoint(endpoint, r, side) {\n return isHorizontalSide(side) ? { x: endpoint.x, y: clampToCornerClearance(endpoint.y, r.top, r.bottom) } : { x: clampToCornerClearance(endpoint.x, r.left, r.right), y: endpoint.y };\n}\n__name(cornerClearedEndpoint, \"cornerClearedEndpoint\");\nfunction moveCollinearEndpointRun(points, endpointIndex, step, endpoint, adjusted, horizontalTerminal) {\n const next = points.map((point) => ({ ...point }));\n for (let index = endpointIndex; index >= 0 && index < points.length; index += step) {\n const point = points[index];\n if (horizontalTerminal && !sameY(point, endpoint, EPS2)) {\n break;\n }\n if (!horizontalTerminal && !sameX(point, endpoint, EPS2)) {\n break;\n }\n if (horizontalTerminal) {\n next[index].y = adjusted.y;\n } else {\n next[index].x = adjusted.x;\n }\n }\n return next;\n}\n__name(moveCollinearEndpointRun, \"moveCollinearEndpointRun\");\nfunction clearEndpointCornerConnection(points, r, atStart) {\n if (points.length < 2) {\n return points;\n }\n const endpointIndex = atStart ? 0 : points.length - 1;\n const step = atStart ? 1 : -1;\n const endpoint = points[endpointIndex];\n const adjacent = firstDistinctAdjacent(points, endpointIndex, step);\n if (!adjacent) {\n return points;\n }\n const side = terminalSideForSegment(endpoint, adjacent, r);\n if (!side) {\n return points;\n }\n const horizontalTerminal = isHorizontalSide(side);\n const adjusted = cornerClearedEndpoint(endpoint, r, side);\n if (samePoint(endpoint, adjusted, EPS2)) {\n return points;\n }\n return moveCollinearEndpointRun(\n points,\n endpointIndex,\n step,\n endpoint,\n adjusted,\n horizontalTerminal\n );\n}\n__name(clearEndpointCornerConnection, \"clearEndpointCornerConnection\");\nfunction borderSideForSegment(a, b, r) {\n const xWithin = Math.min(a.x, b.x) >= r.left - EPS2 && Math.max(a.x, b.x) <= r.right + EPS2;\n const yWithin = Math.min(a.y, b.y) >= r.top - EPS2 && Math.max(a.y, b.y) <= r.bottom + EPS2;\n if (Math.abs(a.y - r.top) < EPS2 && Math.abs(b.y - r.top) < EPS2 && xWithin) {\n return \"top\";\n }\n if (Math.abs(a.y - r.bottom) < EPS2 && Math.abs(b.y - r.bottom) < EPS2 && xWithin) {\n return \"bottom\";\n }\n if (Math.abs(a.x - r.left) < EPS2 && Math.abs(b.x - r.left) < EPS2 && yWithin) {\n return \"left\";\n }\n if (Math.abs(a.x - r.right) < EPS2 && Math.abs(b.x - r.right) < EPS2 && yWithin) {\n return \"right\";\n }\n return void 0;\n}\n__name(borderSideForSegment, \"borderSideForSegment\");\nfunction leavesOutward(side, from, to, r) {\n switch (side) {\n case \"top\":\n return sameX(from, to, EPS2) && to.y < r.top - EPS2;\n case \"bottom\":\n return sameX(from, to, EPS2) && to.y > r.bottom + EPS2;\n case \"left\":\n return sameY(from, to, EPS2) && to.x < r.left - EPS2;\n case \"right\":\n return sameY(from, to, EPS2) && to.x > r.right + EPS2;\n }\n}\n__name(leavesOutward, \"leavesOutward\");\nfunction collapseOwnBorderStub(points, r, atStart) {\n if (points.length < 3) {\n return points;\n }\n if (atStart) {\n const side2 = borderSideForSegment(points[0], points[1], r);\n if (side2 && leavesOutward(side2, points[1], points[2], r)) {\n return points.slice(1);\n }\n return points;\n }\n const last = points.length - 1;\n const side = borderSideForSegment(points[last - 1], points[last], r);\n if (side && leavesOutward(side, points[last - 1], points[last - 2], r)) {\n return points.slice(0, last);\n }\n return points;\n}\n__name(collapseOwnBorderStub, \"collapseOwnBorderStub\");\nfunction snapAndCollapseEndpoints(points, srcRect, dstRect) {\n let next = points;\n if (srcRect) {\n const adjacent = firstDistinctAdjacent(next, 0, 1);\n if (adjacent) {\n const snapped = snapEndpointToBoundary(adjacent, next[0], srcRect);\n if (snapped !== next[0]) {\n next = [snapped, ...next.slice(1)];\n }\n }\n next = collapseOwnBorderStub(next, srcRect, true);\n }\n if (dstRect) {\n const last = next.length - 1;\n const adjacent = firstDistinctAdjacent(next, last, -1);\n if (adjacent) {\n const snapped = snapEndpointToBoundary(adjacent, next[last], dstRect, true);\n if (snapped !== next[last]) {\n next = [...next.slice(0, last), snapped];\n }\n }\n next = collapseOwnBorderStub(next, dstRect, false);\n }\n const straightCleared = clearStraightEndpointCornerConnections(next, srcRect, dstRect);\n if (straightCleared !== next || next.length === 2) {\n return straightCleared;\n }\n if (srcRect) {\n next = clearEndpointCornerConnection(next, srcRect, true);\n }\n if (dstRect) {\n next = clearEndpointCornerConnection(next, dstRect, false);\n }\n return next;\n}\n__name(snapAndCollapseEndpoints, \"snapAndCollapseEndpoints\");\nfunction prepareEdgeEndpointsForRenderer(edges, nodeByIdMap) {\n for (const edge of edges) {\n const context = endpointContextFor(edge, nodeByIdMap, 2);\n if (!context) {\n continue;\n }\n const input = dedupeConsecutivePoints(context.points, EPS2);\n const newPts = snapAndCollapseEndpoints(input, context.srcRect, context.dstRect);\n if (newPts.length < 3) {\n context.edge.points = newPts;\n continue;\n }\n const duplicated = [\n newPts[0],\n { ...newPts[0] },\n ...newPts.slice(1, -1),\n newPts[newPts.length - 1],\n { ...newPts[newPts.length - 1] }\n ];\n context.edge.points = duplicated;\n }\n}\n__name(prepareEdgeEndpointsForRenderer, \"prepareEdgeEndpointsForRenderer\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/lrTransform.ts\nfunction buildNodeMap(nodes) {\n return new Map(nodes.map((node) => [node.id, node]));\n}\n__name(buildNodeMap, \"buildNodeMap\");\nfunction resolveTopLevelGroupId(node, nodeById) {\n let parentId = node.parentId;\n let topLevelGroupId = null;\n while (parentId) {\n const parent = nodeById.get(parentId);\n if (!parent?.isGroup) {\n break;\n }\n topLevelGroupId = parent.id;\n parentId = parent.parentId;\n }\n return topLevelGroupId;\n}\n__name(resolveTopLevelGroupId, \"resolveTopLevelGroupId\");\nfunction groupDepth(group, nodeById) {\n let depth = 0;\n let parentId = group.parentId;\n while (parentId) {\n const parent = nodeById.get(parentId);\n if (!parent?.isGroup) {\n break;\n }\n depth++;\n parentId = parent.parentId;\n }\n return depth;\n}\n__name(groupDepth, \"groupDepth\");\nfunction boundsForChildren(children) {\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n for (const child of children) {\n const cx = child.x;\n const cy = child.y;\n if (typeof cx !== \"number\" || typeof cy !== \"number\") {\n continue;\n }\n const w = child.width ?? 0;\n const h = child.height ?? 0;\n minX = Math.min(minX, cx - w / 2);\n maxX = Math.max(maxX, cx + w / 2);\n minY = Math.min(minY, cy - h / 2);\n maxY = Math.max(maxY, cy + h / 2);\n }\n if (minX === Infinity || minY === Infinity) {\n return null;\n }\n return { minX, maxX, minY, maxY };\n}\n__name(boundsForChildren, \"boundsForChildren\");\nfunction applyGroupBounds(group, bounds) {\n const pad = group.padding ?? 20;\n group.x = (bounds.minX + bounds.maxX) / 2;\n group.y = (bounds.minY + bounds.maxY) / 2;\n group.width = Math.max(0, bounds.maxX - bounds.minX) + pad;\n group.height = Math.max(0, bounds.maxY - bounds.minY) + pad;\n}\n__name(applyGroupBounds, \"applyGroupBounds\");\nfunction recomputeNestedGroupBounds(nodes) {\n const nodeById = buildNodeMap(nodes);\n const groupsByDepth = nodes.filter((node) => node.isGroup && node.parentId).sort((a, b) => groupDepth(b, nodeById) - groupDepth(a, nodeById));\n for (const group of groupsByDepth) {\n const children = nodes.filter((node) => node.parentId === group.id);\n const bounds = boundsForChildren(children);\n if (bounds) {\n applyGroupBounds(group, bounds);\n }\n }\n}\n__name(recomputeNestedGroupBounds, \"recomputeNestedGroupBounds\");\nfunction mirrorAxis(layout, axis) {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const contentNodes = nodes.filter((node) => !node.isGroup);\n let min = Infinity;\n let max = -Infinity;\n for (const node of contentNodes) {\n const value = node[axis];\n if (typeof value !== \"number\") {\n continue;\n }\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\n return false;\n }\n const mirror = /* @__PURE__ */ __name((value) => min + max - value, \"mirror\");\n for (const node of nodes) {\n const value = node[axis];\n if (typeof value === \"number\") {\n node[axis] = mirror(value);\n }\n const titleRect = node.groupTitleRect;\n if (titleRect) {\n node.groupTitleRect = axis === \"x\" ? {\n ...titleRect,\n left: mirror(titleRect.right),\n right: mirror(titleRect.left)\n } : {\n ...titleRect,\n top: mirror(titleRect.bottom),\n bottom: mirror(titleRect.top)\n };\n }\n }\n for (const edge of edges) {\n for (const point of edge.points ?? []) {\n point[axis] = mirror(point[axis]);\n }\n }\n return true;\n}\n__name(mirrorAxis, \"mirrorAxis\");\nfunction applyBtDirectionTransform(layout) {\n const nodes = layout.nodes ?? [];\n if (!nodes.some((node) => !node.isGroup)) {\n return true;\n }\n return mirrorAxis(layout, \"y\");\n}\n__name(applyBtDirectionTransform, \"applyBtDirectionTransform\");\nfunction applyLrDirectionTransform(layout, direction = \"LR\") {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const contentNodes = nodes.filter((n) => !n.isGroup);\n let minX = Infinity;\n let minY = Infinity;\n for (const n of contentNodes) {\n const x0 = n.x ?? 0;\n const y0 = n.y ?? 0;\n if (x0 < minX) {\n minX = x0;\n }\n if (y0 < minY) {\n minY = y0;\n }\n }\n if (!Number.isFinite(minX) || !Number.isFinite(minY)) {\n return false;\n }\n const titleBandSize = 36;\n let totalWidth = 0;\n let totalHeight = 0;\n for (const n of contentNodes) {\n totalWidth += n.width ?? 0;\n totalHeight += n.height ?? 0;\n }\n const avgWidth = totalWidth / contentNodes.length;\n const avgHeight = totalHeight / contentNodes.length;\n const horizontalScaleFactor = avgHeight > 0 ? Math.max(1, avgWidth / avgHeight) : 1;\n for (const n of contentNodes) {\n const x0 = n.x ?? 0;\n const y0 = n.y ?? 0;\n const newX = (y0 - minY) * horizontalScaleFactor + titleBandSize;\n const newY = x0 - minX;\n n.x = newX;\n n.y = newY;\n }\n for (const e of edges) {\n if (!e.points) {\n continue;\n }\n for (const p of e.points) {\n const x0 = p.x;\n const y0 = p.y;\n const newX = (y0 - minY) * horizontalScaleFactor + titleBandSize;\n const newY = x0 - minX;\n p.x = newX;\n p.y = newY;\n }\n }\n recomputeNestedGroupBounds(nodes);\n const laneNodes = nodes.filter((n) => n.isGroup && !n.parentId);\n if (laneNodes.length === 0) {\n if (direction === \"RL\") {\n mirrorAxis(layout, \"x\");\n }\n return true;\n }\n const nodeById = buildNodeMap(nodes);\n const childrenByLane = /* @__PURE__ */ new Map();\n for (const n of nodes) {\n if (n.isGroup) {\n continue;\n }\n const laneId = resolveTopLevelGroupId(n, nodeById);\n if (!laneId) {\n continue;\n }\n const bucket = childrenByLane.get(laneId) ?? [];\n bucket.push(n);\n childrenByLane.set(laneId, bucket);\n }\n let maxPad = 0;\n for (const lane of laneNodes) {\n const pad = lane.padding ?? 0;\n if (pad > maxPad) {\n maxPad = pad;\n }\n }\n const laneBounds = [];\n let globalMinXChild = Infinity;\n let globalMaxXChild = -Infinity;\n for (const lane of laneNodes) {\n const children = childrenByLane.get(lane.id) ?? [];\n const bounds = boundsForChildren(children);\n if (!bounds) {\n continue;\n }\n globalMinXChild = Math.min(globalMinXChild, bounds.minX);\n globalMaxXChild = Math.max(globalMaxXChild, bounds.maxX);\n laneBounds.push({\n lane,\n contentTop: bounds.minY,\n contentBottom: bounds.maxY,\n centerY: (bounds.minY + bounds.maxY) / 2\n });\n }\n if (globalMinXChild === Infinity || globalMaxXChild === -Infinity) {\n return true;\n }\n const fullContentWidth = Math.max(0, globalMaxXChild - globalMinXChild);\n const horizontalMargin = Math.max(maxPad, 10);\n const bodyWidth = fullContentWidth + 2 * horizontalMargin;\n const laneWidth = titleBandSize + bodyWidth;\n const bodyCenter = (globalMinXChild + globalMaxXChild) / 2;\n const bodyLeft = bodyCenter - bodyWidth / 2;\n const laneLeft = bodyLeft - titleBandSize;\n const centerX = laneLeft + laneWidth / 2;\n const verticalMargin = Math.max(maxPad, titleBandSize);\n laneBounds.sort((a, b) => a.centerY - b.centerY);\n for (let i = 0; i < laneBounds.length; i++) {\n const curr = laneBounds[i];\n let laneTop;\n let laneBottom;\n if (i === 0) {\n laneTop = curr.contentTop - verticalMargin;\n } else {\n const prev = laneBounds[i - 1];\n laneTop = (prev.contentBottom + curr.contentTop) / 2;\n }\n if (i === laneBounds.length - 1) {\n laneBottom = curr.contentBottom + verticalMargin;\n } else {\n const next = laneBounds[i + 1];\n laneBottom = (curr.contentBottom + next.contentTop) / 2;\n }\n const laneHeight = Math.max(0, laneBottom - laneTop);\n const centerY = (laneTop + laneBottom) / 2;\n curr.lane.x = centerX;\n curr.lane.y = centerY;\n curr.lane.width = laneWidth;\n curr.lane.height = laneHeight;\n curr.lane.swimlaneContentTop = curr.contentTop;\n curr.lane.groupTitleRect = {\n left: laneLeft,\n right: laneLeft + titleBandSize,\n top: laneTop,\n bottom: laneBottom\n };\n }\n if (direction === \"RL\") {\n mirrorAxis(layout, \"x\");\n }\n return true;\n}\n__name(applyLrDirectionTransform, \"applyLrDirectionTransform\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/portSwap.ts\nvar EPS3 = 1e-6;\nvar MIN_PORT_SPACING = 8;\nvar PORT_SHIFT = MIN_PORT_SPACING;\nvar TRY_DELTAS = [0, PORT_SHIFT, -PORT_SHIFT, 2 * PORT_SHIFT, -2 * PORT_SHIFT];\nfunction portSwapToLShape(edges, nodes) {\n const { nodeInfoById, realNodeRects } = collectRealNodeBounds(nodes);\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 4) {\n continue;\n }\n const route = classifyThreeSegmentRoute(dedupeConsecutivePoints(pts, EPS3), EPS3);\n if (!route) {\n continue;\n }\n const { p3 } = route;\n const isHVH = route.kind === \"HVH\";\n const nodePair = getNodePairGeometry(edge, nodeInfoById, EPS3);\n if (!nodePair) {\n continue;\n }\n const { srcId, dstId, srcInfo, dstInfo, collinearX, collinearY } = nodePair;\n if (collinearX || collinearY) {\n continue;\n }\n let newPts;\n const srcRect = srcInfo.rect;\n for (const delta of TRY_DELTAS) {\n let np0;\n let np1;\n let np2;\n if (isHVH) {\n const dstBelow = dstInfo.cy > srcInfo.cy;\n const newSrcY = dstBelow ? srcRect.bottom : srcRect.top;\n const newSrcX = srcInfo.cx + delta;\n if (newSrcX <= srcRect.left + EPS3 || newSrcX >= srcRect.right - EPS3) {\n continue;\n }\n np0 = { x: newSrcX, y: newSrcY };\n np1 = { x: newSrcX, y: p3.y };\n np2 = { x: p3.x, y: p3.y };\n } else {\n const dstEast = dstInfo.cx > srcInfo.cx;\n const newSrcX = dstEast ? srcRect.right : srcRect.left;\n const newSrcY = srcInfo.cy + delta;\n if (newSrcY <= srcRect.top + EPS3 || newSrcY >= srcRect.bottom - EPS3) {\n continue;\n }\n np0 = { x: newSrcX, y: newSrcY };\n np1 = { x: p3.x, y: newSrcY };\n np2 = { x: p3.x, y: p3.y };\n }\n const firstSegDegenerate = samePoint(np0, np1, EPS3);\n const secondSegDegenerate = samePoint(np1, np2, EPS3);\n if (firstSegDegenerate && secondSegDegenerate) {\n continue;\n }\n if (!firstSegDegenerate && segmentHitsAnyRect(np0, np1, realNodeRects, [srcId], 1)) {\n continue;\n }\n if (!secondSegDegenerate && segmentHitsAnyRect(np1, np2, realNodeRects, [dstId], 1)) {\n continue;\n }\n const firstSegConflicts = !firstSegDegenerate && segmentConflictsWithAnyEdge(np0, np1, edges, edge, {\n epsilon: EPS3,\n skipDegenerateOther: true\n });\n const secondSegConflicts = !secondSegDegenerate && segmentConflictsWithAnyEdge(np1, np2, edges, edge, {\n epsilon: EPS3,\n skipDegenerateOther: true\n });\n if (firstSegConflicts || secondSegConflicts) {\n continue;\n }\n if (firstSegDegenerate) {\n newPts = [np1, np2];\n } else if (secondSegDegenerate) {\n newPts = [np0, np1];\n } else {\n newPts = [np0, np1, np2];\n }\n break;\n }\n if (newPts) {\n edge.points = newPts;\n }\n }\n}\n__name(portSwapToLShape, \"portSwapToLShape\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/terminalStub.ts\nfunction collapseShortTerminalStub(edges, nodeByIdMap) {\n const MIN_STUB = 10;\n const EPS_LOCAL2 = 1e-3;\n const BUFFER = 2;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const rawPts = edge.points;\n if (!rawPts || rawPts.length < 4) {\n continue;\n }\n const pts = dedupeConsecutivePoints(rawPts, EPS_LOCAL2);\n if (pts.length < 4) {\n continue;\n }\n const nLast = pts.length - 1;\n const endPt = pts[nLast];\n const penultPt = pts[nLast - 1];\n const prevPt = pts[nLast - 2];\n const lastDx = endPt.x - penultPt.x;\n const lastDy = endPt.y - penultPt.y;\n const lastLen = Math.hypot(lastDx, lastDy);\n if (lastLen >= MIN_STUB || lastLen < EPS_LOCAL2) {\n continue;\n }\n const penultDx = penultPt.x - prevPt.x;\n const penultDy = penultPt.y - prevPt.y;\n const penultLen = Math.hypot(penultDx, penultDy);\n if (penultLen < EPS_LOCAL2) {\n continue;\n }\n const lastIsHoriz = isHorizontalSegment(penultPt, endPt, EPS_LOCAL2);\n const lastIsVert = isVerticalSegment(penultPt, endPt, EPS_LOCAL2);\n const penultIsHoriz = isHorizontalSegment(prevPt, penultPt, EPS_LOCAL2);\n const penultIsVert = isVerticalSegment(prevPt, penultPt, EPS_LOCAL2);\n if (!(lastIsHoriz && penultIsVert || lastIsVert && penultIsHoriz)) {\n continue;\n }\n const dstId = edge.end;\n const srcId = edge.start;\n const dst = dstId ? nodeByIdMap.get(dstId) : void 0;\n if (!dst) {\n continue;\n }\n const dstCx = dst.x ?? 0;\n const dstCy = dst.y ?? 0;\n const dstRect = rectOfNodeBounds(dst);\n if (!dstRect) {\n continue;\n }\n let newPrev;\n let newEnd;\n if (penultIsVert) {\n const approachFromBelow = penultDy < 0;\n newPrev = { x: dstCx, y: prevPt.y };\n newEnd = { x: dstCx, y: approachFromBelow ? dstRect.bottom : dstRect.top };\n } else {\n const approachFromLeft = penultDx > 0;\n newPrev = { x: prevPt.x, y: dstCy };\n newEnd = { x: approachFromLeft ? dstRect.right : dstRect.left, y: dstCy };\n }\n if (segmentHitsAnyRect(newPrev, newEnd, realNodeRects, dstId ? [dstId] : [], -BUFFER)) {\n continue;\n }\n if (segmentHitsAnyRect(newPrev, newEnd, labelRects, [], -BUFFER)) {\n continue;\n }\n if (srcId) {\n const src = nodeByIdMap.get(srcId);\n const srcRect = src ? rectOfNodeBounds(src) : void 0;\n if (srcRect && pointInsideRect(newPrev, srcRect, BUFFER)) {\n continue;\n }\n }\n const ownSegmentKey = /* @__PURE__ */ __name((a, b) => `${a.x.toFixed(3)},${a.y.toFixed(3)}|${b.x.toFixed(3)},${b.y.toFixed(3)}`, \"ownSegmentKey\");\n const selfSegments = /* @__PURE__ */ new Set();\n for (let i = 0; i < pts.length - 1; i++) {\n selfSegments.add(ownSegmentKey(pts[i], pts[i + 1]));\n }\n const segmentCrossesOtherEdge = /* @__PURE__ */ __name((from, to) => {\n for (const other of edges) {\n if (other === edge) {\n continue;\n }\n if (other.isLayoutOnly) {\n continue;\n }\n const oPts = other.points;\n if (!oPts || oPts.length < 2) {\n continue;\n }\n for (let i = 0; i < oPts.length - 1; i++) {\n const a = oPts[i];\n const b = oPts[i + 1];\n if (selfSegments.has(ownSegmentKey(a, b))) {\n continue;\n }\n if (orthogonalSegmentsStrictlyCross(from, to, a, b, EPS_LOCAL2)) {\n return true;\n }\n }\n }\n return false;\n }, \"segmentCrossesOtherEdge\");\n if (segmentCrossesOtherEdge(newPrev, newEnd)) {\n continue;\n }\n if (nLast - 3 >= 0) {\n const beforePrev = pts[nLast - 3];\n const endpointIds = [srcId, dstId].filter((id) => Boolean(id));\n if (segmentHitsAnyRect(beforePrev, newPrev, realNodeRects, endpointIds, -BUFFER)) {\n continue;\n }\n if (segmentCrossesOtherEdge(beforePrev, newPrev)) {\n continue;\n }\n }\n const head = pts.slice(0, nLast - 2);\n const newPts = [...head, newPrev, newEnd];\n edge.points = newPts;\n const labelId = edge.labelNodeId;\n if (labelId) {\n const labelNode = nodeByIdMap.get(labelId);\n if (labelNode) {\n const lw = labelNode.width ?? 0;\n const lh = labelNode.height ?? 0;\n if (lw > 0 && lh > 0) {\n let bestMidX;\n let bestMidY;\n let bestLen = -1;\n for (let i = 0; i < newPts.length - 1; i++) {\n const a = newPts[i];\n const b = newPts[i + 1];\n const segLen = Math.hypot(b.x - a.x, b.y - a.y);\n const isHoriz = sameY(a, b, EPS_LOCAL2);\n const isVert = sameX(a, b, EPS_LOCAL2);\n const fits = isHoriz && segLen >= lw + 2 || isVert && segLen >= lh + 2;\n if (!fits) {\n continue;\n }\n if (segLen > bestLen) {\n bestLen = segLen;\n bestMidX = (a.x + b.x) / 2;\n bestMidY = (a.y + b.y) / 2;\n }\n }\n if (bestMidX !== void 0 && bestMidY !== void 0) {\n labelNode.x = bestMidX;\n labelNode.y = bestMidY;\n }\n }\n }\n }\n }\n}\n__name(collapseShortTerminalStub, \"collapseShortTerminalStub\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/materializedGeometry.ts\nvar EPS_LOCAL = 1e-3;\nvar MIN_SHARED = 8;\nvar segmentsFor = orthogonalSegmentsForPoints;\nvar orthogonallyAligned = /* @__PURE__ */ __name((a, b) => sameX(a, b, EPS_LOCAL) || sameY(a, b, EPS_LOCAL), \"orthogonallyAligned\");\nfunction separateSharedRenderedTerminalLanes(edges, nodeByIdMap) {\n const MIN_FACE_CLEARANCE = 16;\n const TRACK_SHIFT = 7;\n const rectIntersect = /* @__PURE__ */ __name((node, point) => {\n const x = node.x ?? 0;\n const y = node.y ?? 0;\n const dx = point.x - x;\n const dy = point.y - y;\n let w = (node.width ?? 0) / 2;\n let h = (node.height ?? 0) / 2;\n if (Math.abs(dy) * w > Math.abs(dx) * h) {\n if (dy < 0) {\n h = -h;\n }\n return { x: x + (dy === 0 ? 0 : h * dx / dy), y: y + h };\n }\n if (dx < 0) {\n w = -w;\n }\n return { x: x + w, y: y + (dx === 0 ? 0 : w * dy / dx) };\n }, \"rectIntersect\");\n const terminalLaneFor = /* @__PURE__ */ __name((edge, atStart) => {\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length < 2) {\n return void 0;\n }\n const nodeId = atStart ? edge.start : edge.end;\n const node = nodeId ? nodeByIdMap.get(nodeId) : void 0;\n const rect = node ? rectOfNodeBounds(node) : void 0;\n if (!node || !nodeId || !rect) {\n return void 0;\n }\n const endpoint = atStart ? points[0] : points[points.length - 1];\n const adjacent = atStart ? points[1] : points[points.length - 2];\n const boundary = rectIntersect(node, endpoint);\n let railEnd = endpoint;\n if (orthogonallyAligned(adjacent, boundary)) {\n railEnd = adjacent;\n }\n if (sameX(boundary, railEnd, EPS_LOCAL)) {\n return {\n edge,\n edgeId: String(edge.id ?? \"\"),\n nodeId,\n atStart,\n orientation: \"V\",\n coord: boundary.x,\n min: Math.min(boundary.y, railEnd.y),\n max: Math.max(boundary.y, railEnd.y),\n boundary,\n railEnd,\n rect\n };\n }\n if (sameY(boundary, railEnd, EPS_LOCAL)) {\n return {\n edge,\n edgeId: String(edge.id ?? \"\"),\n nodeId,\n atStart,\n orientation: \"H\",\n coord: boundary.y,\n min: Math.min(boundary.x, railEnd.x),\n max: Math.max(boundary.x, railEnd.x),\n boundary,\n railEnd,\n rect\n };\n }\n return void 0;\n }, \"terminalLaneFor\");\n const projectedOverlapLength = /* @__PURE__ */ __name((a, b) => Math.max(0, Math.min(a.max, b.max) - Math.max(a.min, b.min)), \"projectedOverlapLength\");\n const sameTerminalFace = /* @__PURE__ */ __name((a, b) => {\n if (a.nodeId !== b.nodeId || a.orientation !== b.orientation) {\n return false;\n }\n if (a.orientation === \"H\") {\n const aOnHorizontalFace = Math.abs(a.boundary.x - a.rect.left) < 1 || Math.abs(a.boundary.x - a.rect.right) < 1;\n return aOnHorizontalFace && sameX(a.boundary, b.boundary, 1);\n }\n const aOnVerticalFace = Math.abs(a.boundary.y - a.rect.top) < 1 || Math.abs(a.boundary.y - a.rect.bottom) < 1;\n return aOnVerticalFace && sameY(a.boundary, b.boundary, 1);\n }, \"sameTerminalFace\");\n const exactTerminalLaneConflict = /* @__PURE__ */ __name((a, b) => {\n if (a.nodeId !== b.nodeId || a.orientation !== b.orientation) {\n return false;\n }\n const shared = projectedOverlapLength(a, b);\n return shared >= MIN_SHARED && Math.abs(a.coord - b.coord) < 0.5;\n }, \"exactTerminalLaneConflict\");\n const nearTerminalLaneConflict = /* @__PURE__ */ __name((a, b) => {\n if (a.nodeId !== b.nodeId || a.orientation !== b.orientation || a.orientation !== \"H\" || a.atStart === b.atStart) {\n return false;\n }\n const shared = projectedOverlapLength(a, b);\n if (shared < MIN_SHARED) {\n return false;\n }\n const faceSpan = a.rect.bottom - a.rect.top;\n if (shared < faceSpan || shared > 2 * faceSpan) {\n return false;\n }\n return sameTerminalFace(a, b) && Math.abs(a.coord - b.coord) < MIN_FACE_CLEARANCE;\n }, \"nearTerminalLaneConflict\");\n const shiftedCandidate = /* @__PURE__ */ __name((lane, shift) => {\n const points = dedupeConsecutivePoints(lane.edge.points ?? []);\n if (points.length < 2) {\n return void 0;\n }\n const shiftedBoundary = lane.orientation === \"V\" ? { x: lane.boundary.x + shift, y: lane.boundary.y } : { x: lane.boundary.x, y: lane.boundary.y + shift };\n const shiftedRailEnd = lane.orientation === \"V\" ? { x: lane.railEnd.x + shift, y: lane.railEnd.y } : { x: lane.railEnd.x, y: lane.railEnd.y + shift };\n const boundaryStaysOnSameFace = /* @__PURE__ */ __name(() => {\n if (Math.abs(lane.boundary.y - lane.rect.top) < 1 || Math.abs(lane.boundary.y - lane.rect.bottom) < 1) {\n return sameY(shiftedBoundary, lane.boundary, EPS_LOCAL) && shiftedBoundary.x >= lane.rect.left + 1 && shiftedBoundary.x <= lane.rect.right - 1;\n }\n if (Math.abs(lane.boundary.x - lane.rect.left) < 1 || Math.abs(lane.boundary.x - lane.rect.right) < 1) {\n return sameX(shiftedBoundary, lane.boundary, EPS_LOCAL) && shiftedBoundary.y >= lane.rect.top + 1 && shiftedBoundary.y <= lane.rect.bottom - 1;\n }\n return false;\n }, \"boundaryStaysOnSameFace\");\n if (!boundaryStaysOnSameFace()) {\n return void 0;\n }\n if (lane.atStart) {\n const railEndIsAdjacent2 = points.length > 1 && samePoint(points[1], lane.railEnd, EPS_LOCAL);\n const rest = points.slice(railEndIsAdjacent2 ? 2 : 1);\n const next = rest[0];\n if (next && !orthogonallyAligned(next, shiftedRailEnd)) {\n return void 0;\n }\n return [shiftedBoundary, shiftedRailEnd, ...rest];\n }\n const railEndIsAdjacent = points.length > 1 && samePoint(points[points.length - 2], lane.railEnd, EPS_LOCAL);\n const before = points.slice(0, railEndIsAdjacent ? -2 : -1);\n const previous = before[before.length - 1];\n if (previous && !orthogonallyAligned(previous, shiftedRailEnd)) {\n return void 0;\n }\n return [...before, shiftedRailEnd, shiftedBoundary];\n }, \"shiftedCandidate\");\n const laneIsStraightCollinearConnector = /* @__PURE__ */ __name((lane) => {\n const edge = lane.edge;\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length !== 2) {\n return false;\n }\n const startId = edge.start;\n const endId = edge.end;\n const start = startId ? nodeByIdMap.get(startId) : void 0;\n const end = endId ? nodeByIdMap.get(endId) : void 0;\n if (!start || !end) {\n return false;\n }\n const startX = start.x ?? 0;\n const startY = start.y ?? 0;\n const endX = end.x ?? 0;\n const endY = end.y ?? 0;\n const [a, b] = points;\n return sameY(a, b, EPS_LOCAL) && Math.abs(startY - endY) < 1 && Math.abs(startX - endX) > 1 || sameX(a, b, EPS_LOCAL) && Math.abs(startX - endX) < 1 && Math.abs(startY - endY) > 1;\n }, \"laneIsStraightCollinearConnector\");\n const shifts = [\n -TRACK_SHIFT,\n TRACK_SHIFT,\n -2 * TRACK_SHIFT,\n 2 * TRACK_SHIFT,\n -3 * TRACK_SHIFT,\n 3 * TRACK_SHIFT\n ];\n for (let iteration = 0; iteration < 8; iteration++) {\n const lanes = edges.filter((edge) => !edge.isLayoutOnly).flatMap((edge) => [terminalLaneFor(edge, true), terminalLaneFor(edge, false)]).filter((lane) => Boolean(lane));\n let fixed = false;\n for (let i = 0; i < lanes.length && !fixed; i++) {\n for (let j = i + 1; j < lanes.length && !fixed; j++) {\n const first = lanes[i];\n const second = lanes[j];\n if (first.edge === second.edge || !(exactTerminalLaneConflict(first, second) || nearTerminalLaneConflict(first, second))) {\n continue;\n }\n const fixingNearConflict = !exactTerminalLaneConflict(first, second);\n const candidates = [first, second].sort((a, b) => {\n const aPreservesStraight = laneIsStraightCollinearConnector(a);\n const bPreservesStraight = laneIsStraightCollinearConnector(b);\n if (aPreservesStraight !== bPreservesStraight) {\n return Number(aPreservesStraight) - Number(bPreservesStraight);\n }\n return Number(!b.atStart) - Number(!a.atStart);\n });\n for (const lane of candidates) {\n for (const shift of shifts) {\n const candidate = shiftedCandidate(lane, shift);\n if (!candidate) {\n continue;\n }\n const nextLane = terminalLaneFor({ ...lane.edge, points: candidate }, lane.atStart);\n if (!nextLane || lanes.some(\n (other) => other.edge !== lane.edge && (exactTerminalLaneConflict(nextLane, other) || fixingNearConflict && nearTerminalLaneConflict(nextLane, other))\n )) {\n continue;\n }\n lane.edge.points = candidate;\n fixed = true;\n break;\n }\n if (fixed) {\n break;\n }\n }\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(separateSharedRenderedTerminalLanes, \"separateSharedRenderedTerminalLanes\");\nfunction collapseRedundantRectangularDoglegs(edges, nodeByIdMap) {\n const BUFFER = 2;\n const MAX_ITERATIONS = 8;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate) => {\n const sourceId = edge.start;\n const targetId = edge.end;\n const candidateSegments = segmentsFor(candidate);\n if (candidateSegments.length !== candidate.length - 1) {\n return false;\n }\n const endpointIds = [sourceId, targetId].filter((id) => Boolean(id));\n for (const segment of candidateSegments) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n }\n for (const other of edges) {\n if (other === edge || other.isLayoutOnly) {\n continue;\n }\n const otherPoints = other.points;\n if (!otherPoints || otherPoints.length < 2) {\n continue;\n }\n for (const candidateSegment of candidateSegments) {\n for (const otherSegment of segmentsFor(dedupeConsecutivePoints(otherPoints))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n if (orthogonalSegmentsStrictlyCross(\n candidateSegment.a,\n candidateSegment.b,\n otherSegment.a,\n otherSegment.b,\n EPS_LOCAL\n )) {\n return false;\n }\n }\n }\n }\n return true;\n }, \"candidateIsSafe\");\n const withoutDogleg = /* @__PURE__ */ __name((points, i) => {\n if (i + 4 >= points.length) {\n return void 0;\n }\n const p0 = points[i];\n const p1 = points[i + 1];\n const p2 = points[i + 2];\n const p3 = points[i + 3];\n const p4 = points[i + 4];\n const terminalVerticalDogleg = isHorizontalSegment(p0, p1) && isVerticalSegment(p1, p2) && isHorizontalSegment(p2, p3) && isVerticalSegment(p3, p4) && sameX(p0, p3, EPS_LOCAL) && sameX(p0, p4, EPS_LOCAL) && sameX(p1, p2, EPS_LOCAL) && (p1.x - p0.x) * (p3.x - p2.x) < 0;\n const terminalHorizontalDogleg = isVerticalSegment(p0, p1) && isHorizontalSegment(p1, p2) && isVerticalSegment(p2, p3) && isHorizontalSegment(p3, p4) && sameY(p0, p3, EPS_LOCAL) && sameY(p0, p4, EPS_LOCAL) && sameY(p1, p2, EPS_LOCAL) && (p1.y - p0.y) * (p3.y - p2.y) < 0;\n if (terminalVerticalDogleg || terminalHorizontalDogleg) {\n return dedupeConsecutivePoints([...points.slice(0, i + 1), p4, ...points.slice(i + 5)]);\n }\n if (i + 5 >= points.length) {\n return void 0;\n }\n const p5 = points[i + 5];\n const verticalDogleg = isVerticalSegment(p0, p1) && isHorizontalSegment(p1, p2) && isVerticalSegment(p2, p3) && isHorizontalSegment(p3, p4) && isVerticalSegment(p4, p5) && sameX(p0, p4, EPS_LOCAL) && sameX(p0, p5, EPS_LOCAL) && sameX(p2, p3, EPS_LOCAL) && (p2.x - p1.x) * (p4.x - p3.x) < 0;\n const horizontalDogleg = isHorizontalSegment(p0, p1) && isVerticalSegment(p1, p2) && isHorizontalSegment(p2, p3) && isVerticalSegment(p3, p4) && isHorizontalSegment(p4, p5) && sameY(p0, p4, EPS_LOCAL) && sameY(p0, p5, EPS_LOCAL) && sameY(p2, p3, EPS_LOCAL) && (p2.y - p1.y) * (p4.y - p3.y) < 0;\n if (!verticalDogleg && !horizontalDogleg) {\n return void 0;\n }\n return dedupeConsecutivePoints([...points.slice(0, i + 1), p5, ...points.slice(i + 6)]);\n }, \"withoutDogleg\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n let fixed = false;\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n for (let i = 0; i <= points.length - 5; i++) {\n const candidate = withoutDogleg(points, i);\n if (!candidate || !candidateIsSafe(edge, candidate)) {\n continue;\n }\n edge.points = candidate;\n fixed = true;\n break;\n }\n if (fixed) {\n break;\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(collapseRedundantRectangularDoglegs, \"collapseRedundantRectangularDoglegs\");\nfunction liftObstacleHuggingSameSideRails(edges, nodeByIdMap) {\n const BUFFER = 2;\n const CLEARANCE = 20;\n const MAX_ITERATIONS = 8;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const pointsFor = /* @__PURE__ */ __name((edge, replacementEdge, replacement) => dedupeConsecutivePoints(\n edge === replacementEdge ? replacement ?? [] : edge.points ?? []\n ), \"pointsFor\");\n const strictCrossingCount = /* @__PURE__ */ __name((replacementEdge, replacement) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(pointsFor(visibleEdges[i], replacementEdge, replacement));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(\n pointsFor(visibleEdges[j], replacementEdge, replacement)\n );\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"strictCrossingCount\");\n const middleRail = /* @__PURE__ */ __name((points) => {\n const segments = segmentsFor(points);\n if (segments.length !== 3) {\n return void 0;\n }\n const middle = segments[1];\n if (segments[0].horizontal === middle.horizontal || segments[2].horizontal === middle.horizontal) {\n return void 0;\n }\n return {\n index: middle.index,\n horizontal: middle.horizontal,\n vertical: middle.vertical,\n segment: middle\n };\n }, \"middleRail\");\n const blockingRectsFor = /* @__PURE__ */ __name((edge, rail) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n return realNodeRects.filter((entry) => {\n if (endpointIds.includes(entry.id)) {\n return false;\n }\n const rect = entry.rect;\n if (rail.horizontal) {\n const xOverlap = overlapLength(rail.a.x, rail.b.x, rect.left, rect.right);\n return xOverlap >= MIN_SHARED && rail.a.y >= rect.top - BUFFER && rail.a.y <= rect.bottom + BUFFER;\n }\n const yOverlap = overlapLength(rail.a.y, rail.b.y, rect.top, rect.bottom);\n return yOverlap >= MIN_SHARED && rail.a.x >= rect.left - BUFFER && rail.a.x <= rect.right + BUFFER;\n });\n }, \"blockingRectsFor\");\n const candidateByMovingRail = /* @__PURE__ */ __name((points, rail, coord) => {\n const candidate = points.map((point) => ({ ...point }));\n if (rail.horizontal) {\n candidate[rail.index].y = coord;\n candidate[rail.index + 1].y = coord;\n } else if (rail.vertical) {\n candidate[rail.index].x = coord;\n candidate[rail.index + 1].x = coord;\n } else {\n return void 0;\n }\n const simplified = simplifyPolyline(dedupeConsecutivePoints(candidate));\n return segmentsFor(simplified).length === simplified.length - 1 ? simplified : void 0;\n }, \"candidateByMovingRail\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate, currentCrossings) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n const candidateSegments = segmentsFor(candidate);\n if (candidateSegments.length !== candidate.length - 1) {\n return false;\n }\n for (const segment of candidateSegments) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n }\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of candidateSegments) {\n for (const otherSegment of segmentsFor(pointsFor(other))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n }\n }\n }\n return strictCrossingCount(edge, candidate) <= currentCrossings;\n }, \"candidateIsSafe\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = strictCrossingCount();\n let fixed = false;\n for (const edge of visibleEdges) {\n const points = pointsFor(edge);\n const rail = middleRail(points);\n if (!rail) {\n continue;\n }\n const blockers = blockingRectsFor(edge, rail.segment);\n if (blockers.length === 0) {\n continue;\n }\n const coords = rail.horizontal ? [\n Math.min(...blockers.map((entry) => entry.rect.top)) - CLEARANCE,\n Math.max(...blockers.map((entry) => entry.rect.bottom)) + CLEARANCE\n ] : [\n Math.min(...blockers.map((entry) => entry.rect.left)) - CLEARANCE,\n Math.max(...blockers.map((entry) => entry.rect.right)) + CLEARANCE\n ];\n for (const coord of coords) {\n const candidate = candidateByMovingRail(points, rail.segment, coord);\n if (!candidate || !candidateIsSafe(edge, candidate, currentCrossings)) {\n continue;\n }\n edge.points = candidate;\n fixed = true;\n break;\n }\n if (fixed) {\n break;\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(liftObstacleHuggingSameSideRails, \"liftObstacleHuggingSameSideRails\");\nfunction liftTopLaneTitleBandsAboveRails(edges, nodeByIdMap) {\n const CLEARANCE = 4;\n const validTitleRect = /* @__PURE__ */ __name((node) => {\n const rect = node.groupTitleRect;\n if (!rect || typeof rect.left !== \"number\" || typeof rect.right !== \"number\" || typeof rect.top !== \"number\" || typeof rect.bottom !== \"number\" || !Number.isFinite(rect.left) || !Number.isFinite(rect.right) || !Number.isFinite(rect.top) || !Number.isFinite(rect.bottom) || rect.right <= rect.left || rect.bottom <= rect.top) {\n return void 0;\n }\n return { left: rect.left, right: rect.right, top: rect.top, bottom: rect.bottom };\n }, \"validTitleRect\");\n const topLaneTitleFor = /* @__PURE__ */ __name((node) => {\n if (!node.isGroup || node.parentId) {\n return void 0;\n }\n const rawDirection = node.direction;\n const direction = typeof rawDirection === \"string\" ? rawDirection.toUpperCase() : \"\";\n if (direction === \"LR\" || direction === \"RL\" || direction === \"BT\") {\n return void 0;\n }\n const rect = validTitleRect(node);\n const y = node.y;\n const height = node.height;\n if (!rect || typeof y !== \"number\" || typeof height !== \"number\" || !Number.isFinite(y) || !Number.isFinite(height) || height <= 0) {\n return void 0;\n }\n const titleWidth = rect.right - rect.left;\n const titleHeight = rect.bottom - rect.top;\n if (titleHeight <= 0 || titleWidth < titleHeight) {\n return void 0;\n }\n return { node, rect };\n }, \"topLaneTitleFor\");\n const horizontalSegmentIntersectsTitle = /* @__PURE__ */ __name((segment, rect) => {\n if (!segment.horizontal) {\n return false;\n }\n const y = segment.a.y;\n if (y <= rect.top + EPS_LOCAL || y >= rect.bottom - EPS_LOCAL) {\n return false;\n }\n return overlapLength(segment.a.x, segment.b.x, rect.left, rect.right) >= MIN_SHARED;\n }, \"horizontalSegmentIntersectsTitle\");\n const lanes = [...nodeByIdMap.values()].map(topLaneTitleFor).filter((lane) => Boolean(lane));\n if (lanes.length === 0) {\n return;\n }\n let topDelta = 0;\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n for (const segment of segmentsFor(points)) {\n for (const lane of lanes) {\n if (!horizontalSegmentIntersectsTitle(segment, lane.rect)) {\n continue;\n }\n topDelta = Math.max(topDelta, lane.rect.bottom - segment.a.y + CLEARANCE);\n }\n }\n }\n if (topDelta <= EPS_LOCAL) {\n return;\n }\n for (const lane of lanes) {\n const y = lane.node.y;\n const height = lane.node.height;\n if (typeof y !== \"number\" || typeof height !== \"number\" || !Number.isFinite(y) || !Number.isFinite(height) || height <= 0) {\n continue;\n }\n lane.node.y = y - topDelta / 2;\n lane.node.height = height + topDelta;\n lane.node.groupTitleRect = {\n ...lane.rect,\n top: lane.rect.top - topDelta,\n bottom: lane.rect.bottom - topDelta\n };\n }\n}\n__name(liftTopLaneTitleBandsAboveRails, \"liftTopLaneTitleBandsAboveRails\");\nfunction shiftLeftLaneTitleBandsLeftOfRails(edges, nodeByIdMap) {\n const CLEARANCE = 4;\n const validTitleRect = /* @__PURE__ */ __name((node) => {\n const rect = node.groupTitleRect;\n if (!rect || typeof rect.left !== \"number\" || typeof rect.right !== \"number\" || typeof rect.top !== \"number\" || typeof rect.bottom !== \"number\" || !Number.isFinite(rect.left) || !Number.isFinite(rect.right) || !Number.isFinite(rect.top) || !Number.isFinite(rect.bottom) || rect.right <= rect.left || rect.bottom <= rect.top) {\n return void 0;\n }\n return { left: rect.left, right: rect.right, top: rect.top, bottom: rect.bottom };\n }, \"validTitleRect\");\n const leftLaneTitleFor = /* @__PURE__ */ __name((node) => {\n if (!node.isGroup || node.parentId) {\n return void 0;\n }\n const rawDirection = node.direction;\n if (rawDirection !== \"LR\") {\n return void 0;\n }\n const rect = validTitleRect(node);\n const x = node.x;\n const width = node.width;\n if (!rect || typeof x !== \"number\" || typeof width !== \"number\" || !Number.isFinite(x) || !Number.isFinite(width) || width <= 0) {\n return void 0;\n }\n const titleWidth = rect.right - rect.left;\n const titleHeight = rect.bottom - rect.top;\n if (titleWidth <= 0 || titleHeight < titleWidth) {\n return void 0;\n }\n return { node, rect };\n }, \"leftLaneTitleFor\");\n const verticalSegmentIntersectsTitle = /* @__PURE__ */ __name((segment, rect) => {\n if (!segment.vertical) {\n return false;\n }\n const x = segment.a.x;\n if (x <= rect.left + EPS_LOCAL || x >= rect.right - EPS_LOCAL) {\n return false;\n }\n return overlapLength(segment.a.y, segment.b.y, rect.top, rect.bottom) >= MIN_SHARED;\n }, \"verticalSegmentIntersectsTitle\");\n const horizontalSegmentIntersectsTitle = /* @__PURE__ */ __name((segment, rect) => {\n if (!segment.horizontal) {\n return false;\n }\n const y = segment.a.y;\n if (y <= rect.top + EPS_LOCAL || y >= rect.bottom - EPS_LOCAL) {\n return false;\n }\n return overlapLength(segment.a.x, segment.b.x, rect.left, rect.right) >= MIN_SHARED;\n }, \"horizontalSegmentIntersectsTitle\");\n const lanes = [...nodeByIdMap.values()].map(leftLaneTitleFor).filter((lane) => Boolean(lane));\n if (lanes.length === 0) {\n return;\n }\n let leftDelta = 0;\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n for (const segment of segmentsFor(points)) {\n for (const lane of lanes) {\n if (verticalSegmentIntersectsTitle(segment, lane.rect)) {\n leftDelta = Math.max(leftDelta, lane.rect.right - segment.a.x + CLEARANCE);\n } else if (horizontalSegmentIntersectsTitle(segment, lane.rect)) {\n const segmentLeft = Math.min(segment.a.x, segment.b.x);\n leftDelta = Math.max(leftDelta, lane.rect.right - segmentLeft + CLEARANCE);\n }\n }\n }\n }\n if (leftDelta <= EPS_LOCAL) {\n return;\n }\n for (const lane of lanes) {\n const x = lane.node.x;\n const width = lane.node.width;\n if (typeof x !== \"number\" || typeof width !== \"number\" || !Number.isFinite(x) || !Number.isFinite(width) || width <= 0) {\n continue;\n }\n lane.node.x = x - leftDelta / 2;\n lane.node.width = width + leftDelta;\n lane.node.groupTitleRect = {\n ...lane.rect,\n left: lane.rect.left - leftDelta,\n right: lane.rect.right - leftDelta\n };\n }\n}\n__name(shiftLeftLaneTitleBandsLeftOfRails, \"shiftLeftLaneTitleBandsLeftOfRails\");\nfunction swapDestinationTerminalTailsToReduceCrossings(edges, nodeByIdMap) {\n const BUFFER = 2;\n const MAX_ITERATIONS = 4;\n const { realNodeRects } = collectNodeRectEntries(nodeByIdMap.values());\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const replacementPointsFor = /* @__PURE__ */ __name((edge, replacements = /* @__PURE__ */ new Map()) => dedupeConsecutivePoints(\n replacements.get(edge) ?? edge.points ?? []\n ), \"replacementPointsFor\");\n const crossingCount = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(replacementPointsFor(visibleEdges[i], replacements));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(replacementPointsFor(visibleEdges[j], replacements));\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"crossingCount\");\n const totalBends = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + countOrthogonalBends(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalBends\");\n const terminalTailFor = /* @__PURE__ */ __name((edge) => {\n const points = replacementPointsFor(edge);\n if (points.length < 4) {\n return void 0;\n }\n const tailStart = points[points.length - 2];\n const terminal = points[points.length - 1];\n if (!isHorizontalSegment(tailStart, terminal, EPS_LOCAL) && !isVerticalSegment(tailStart, terminal, EPS_LOCAL)) {\n return void 0;\n }\n return { tailStart, terminal };\n }, \"terminalTailFor\");\n const candidateWithDestinationTail = /* @__PURE__ */ __name((edge, tail) => {\n const points = replacementPointsFor(edge);\n if (points.length < 3) {\n return void 0;\n }\n const start = points[0];\n const firstTurn = points[1];\n let connector;\n if (isHorizontalSegment(start, firstTurn, EPS_LOCAL)) {\n connector = { x: firstTurn.x, y: tail.tailStart.y };\n } else if (isVerticalSegment(start, firstTurn, EPS_LOCAL)) {\n connector = { x: tail.tailStart.x, y: firstTurn.y };\n } else {\n return void 0;\n }\n const candidate = simplifyPolyline(\n dedupeConsecutivePoints([start, firstTurn, connector, tail.tailStart, tail.terminal])\n );\n return segmentsFor(candidate).length === candidate.length - 1 ? candidate : void 0;\n }, \"candidateWithDestinationTail\");\n const pathHasNodeHit = /* @__PURE__ */ __name((edge, path) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n for (const segment of segmentsFor(path)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return true;\n }\n }\n return false;\n }, \"pathHasNodeHit\");\n const pathHasSharedTrack = /* @__PURE__ */ __name((edge, path, replacements) => {\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of segmentsFor(path)) {\n for (const otherSegment of segmentsFor(replacementPointsFor(other, replacements))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return true;\n }\n }\n }\n }\n return false;\n }, \"pathHasSharedTrack\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, path, replacements) => !pathHasNodeHit(edge, path) && !pathHasSharedTrack(edge, path, replacements), \"candidateIsSafe\");\n const edgesByDestination = /* @__PURE__ */ __name(() => {\n const result = /* @__PURE__ */ new Map();\n for (const edge of visibleEdges) {\n const dstId = edge.end;\n if (!dstId || !nodeByIdMap.has(dstId)) {\n continue;\n }\n const points = replacementPointsFor(edge);\n if (points.length < 4) {\n continue;\n }\n const bucket = result.get(dstId) ?? [];\n bucket.push(edge);\n result.set(dstId, bucket);\n }\n return result;\n }, \"edgesByDestination\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = crossingCount();\n if (currentCrossings === 0) {\n return;\n }\n const currentBends = totalBends();\n let bestReplacements;\n let bestCrossings = currentCrossings;\n let bestBends = currentBends;\n for (const destinationEdges of edgesByDestination().values()) {\n for (let i = 0; i < destinationEdges.length; i++) {\n for (let j = i + 1; j < destinationEdges.length; j++) {\n const first = destinationEdges[i];\n const second = destinationEdges[j];\n const firstTail = terminalTailFor(first);\n const secondTail = terminalTailFor(second);\n if (!firstTail || !secondTail) {\n continue;\n }\n const firstCandidate = candidateWithDestinationTail(first, secondTail);\n const secondCandidate = candidateWithDestinationTail(second, firstTail);\n if (!firstCandidate || !secondCandidate) {\n continue;\n }\n const replacements = /* @__PURE__ */ new Map([\n [first, firstCandidate],\n [second, secondCandidate]\n ]);\n if (!candidateIsSafe(first, firstCandidate, replacements) || !candidateIsSafe(second, secondCandidate, replacements)) {\n continue;\n }\n const candidateCrossings = crossingCount(replacements);\n const candidateBends = totalBends(replacements);\n if (candidateCrossings >= currentCrossings) {\n continue;\n }\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && candidateBends >= bestBends) {\n continue;\n }\n bestReplacements = replacements;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n }\n }\n }\n if (!bestReplacements) {\n return;\n }\n for (const [edge, points] of bestReplacements) {\n edge.points = points;\n }\n }\n}\n__name(swapDestinationTerminalTailsToReduceCrossings, \"swapDestinationTerminalTailsToReduceCrossings\");\nfunction reassignCrossingExternalRailChannels(edges, nodeByIdMap) {\n const BUFFER = 2;\n const RAIL_CHANNEL_GAP = 12;\n const MAX_ITERATIONS = 4;\n const MAX_EXHAUSTIVE_COMPONENT = 6;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const replacementPointsFor = /* @__PURE__ */ __name((edge, replacements = /* @__PURE__ */ new Map()) => dedupeConsecutivePoints(\n replacements.get(edge) ?? edge.points ?? []\n ), \"replacementPointsFor\");\n const strictCrossingCount = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(replacementPointsFor(visibleEdges[i], replacements));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(replacementPointsFor(visibleEdges[j], replacements));\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"strictCrossingCount\");\n const totalBends = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + countOrthogonalBends(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalBends\");\n const endpointRectsFor = /* @__PURE__ */ __name((edge) => {\n const srcId = edge.start;\n const dstId = edge.end;\n const srcNode = srcId ? nodeByIdMap.get(srcId) : void 0;\n const dstNode = dstId ? nodeByIdMap.get(dstId) : void 0;\n const src = srcNode ? rectOfNodeBounds(srcNode) : void 0;\n const dst = dstNode ? rectOfNodeBounds(dstNode) : void 0;\n return src && dst ? { src, dst } : void 0;\n }, \"endpointRectsFor\");\n const externalRailForSegment = /* @__PURE__ */ __name((edge, points, segment) => {\n if (segment.index <= 0 || segment.index + 1 >= points.length - 1) {\n return void 0;\n }\n const endpointRects = endpointRectsFor(edge);\n if (!endpointRects) {\n return void 0;\n }\n if (segment.vertical) {\n const coord = segment.a.x;\n const leftBound = Math.min(endpointRects.src.left, endpointRects.dst.left);\n const rightBound = Math.max(endpointRects.src.right, endpointRects.dst.right);\n const side = coord < leftBound - EPS_LOCAL ? \"left\" : coord > rightBound + EPS_LOCAL ? \"right\" : void 0;\n if (!side) {\n return void 0;\n }\n return {\n edge,\n points,\n segmentIndex: segment.index,\n axis: \"vertical\",\n side,\n coord,\n min: Math.min(segment.a.y, segment.b.y),\n max: Math.max(segment.a.y, segment.b.y)\n };\n }\n if (segment.horizontal) {\n const coord = segment.a.y;\n const topBound = Math.min(endpointRects.src.top, endpointRects.dst.top);\n const bottomBound = Math.max(endpointRects.src.bottom, endpointRects.dst.bottom);\n const side = coord < topBound - EPS_LOCAL ? \"top\" : coord > bottomBound + EPS_LOCAL ? \"bottom\" : void 0;\n if (!side) {\n return void 0;\n }\n return {\n edge,\n points,\n segmentIndex: segment.index,\n axis: \"horizontal\",\n side,\n coord,\n min: Math.min(segment.a.x, segment.b.x),\n max: Math.max(segment.a.x, segment.b.x)\n };\n }\n return void 0;\n }, \"externalRailForSegment\");\n const collectExternalRails = /* @__PURE__ */ __name(() => {\n const rails = [];\n for (const edge of visibleEdges) {\n const points = replacementPointsFor(edge);\n for (const segment of segmentsFor(points)) {\n const rail = externalRailForSegment(edge, points, segment);\n if (rail) {\n rails.push(rail);\n }\n }\n }\n return rails;\n }, \"collectExternalRails\");\n const railsInteract = /* @__PURE__ */ __name((a, b) => a.edge !== b.edge && a.axis === b.axis && a.side === b.side && overlapLength(a.min, a.max, b.min, b.max) >= MIN_SHARED, \"railsInteract\");\n const connectedComponents = /* @__PURE__ */ __name((rails) => {\n const result = [];\n const seen = /* @__PURE__ */ new Set();\n for (const rail of rails) {\n if (seen.has(rail)) {\n continue;\n }\n const queue = [rail];\n const component = [];\n seen.add(rail);\n while (queue.length > 0) {\n const current = queue.pop();\n component.push(current);\n for (const next of rails) {\n if (!seen.has(next) && railsInteract(current, next)) {\n seen.add(next);\n queue.push(next);\n }\n }\n }\n if (component.length > 1) {\n result.push(component);\n }\n }\n return result;\n }, \"connectedComponents\");\n const uniqueCoordsFor = /* @__PURE__ */ __name((component) => {\n const coords = [];\n for (const rail of component) {\n if (!coords.some((coord) => Math.abs(coord - rail.coord) < EPS_LOCAL)) {\n coords.push(rail.coord);\n }\n }\n while (coords.length < component.length) {\n const min = Math.min(...coords);\n const max = Math.max(...coords);\n const side = component[0].side;\n coords.push(\n side === \"left\" || side === \"top\" ? min - RAIL_CHANNEL_GAP * (component.length - coords.length) : max + RAIL_CHANNEL_GAP * (component.length - coords.length)\n );\n }\n return coords;\n }, \"uniqueCoordsFor\");\n const coordinateAssignmentsFor = /* @__PURE__ */ __name((component) => {\n const current = component.map((rail) => rail.coord);\n const coords = uniqueCoordsFor(component);\n const assignments = [];\n if (component.length <= MAX_EXHAUSTIVE_COMPONENT) {\n const used = new Array(coords.length).fill(false);\n const next = [];\n const visit = /* @__PURE__ */ __name(() => {\n if (next.length === component.length) {\n if (next.some((coord, index) => Math.abs(coord - current[index]) >= EPS_LOCAL)) {\n assignments.push([...next]);\n }\n return;\n }\n for (const [i, coord] of coords.entries()) {\n if (used[i]) {\n continue;\n }\n used[i] = true;\n next.push(coord);\n visit();\n next.pop();\n used[i] = false;\n }\n }, \"visit\");\n visit();\n return assignments;\n }\n for (let i = 0; i < current.length; i++) {\n for (let j = i + 1; j < current.length; j++) {\n const assignment = [...current];\n [assignment[i], assignment[j]] = [assignment[j], assignment[i]];\n assignments.push(assignment);\n }\n }\n return assignments;\n }, \"coordinateAssignmentsFor\");\n const replacementsForAssignment = /* @__PURE__ */ __name((component, assignment) => {\n const draftByEdge = /* @__PURE__ */ new Map();\n for (const [i, rail] of component.entries()) {\n const coord = assignment[i];\n const points = draftByEdge.get(rail.edge) ?? rail.points.map((point) => ({ x: point.x, y: point.y }));\n if (rail.axis === \"vertical\") {\n points[rail.segmentIndex].x = coord;\n points[rail.segmentIndex + 1].x = coord;\n } else {\n points[rail.segmentIndex].y = coord;\n points[rail.segmentIndex + 1].y = coord;\n }\n draftByEdge.set(rail.edge, points);\n }\n const replacements = /* @__PURE__ */ new Map();\n for (const [edge, points] of draftByEdge) {\n const simplified = simplifyPolyline(dedupeConsecutivePoints(points));\n if (segmentsFor(simplified).length !== simplified.length - 1) {\n return void 0;\n }\n replacements.set(edge, simplified);\n }\n return replacements;\n }, \"replacementsForAssignment\");\n const candidateIsSafe = /* @__PURE__ */ __name((replacements) => {\n for (const [edge, points] of replacements) {\n const endpointIds = [\n edge.start,\n edge.end\n ].filter((id) => Boolean(id));\n for (const segment of segmentsFor(points)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n }\n }\n for (let i = 0; i < visibleEdges.length; i++) {\n const first = visibleEdges[i];\n const firstChanged = replacements.has(first);\n const firstSegments = segmentsFor(replacementPointsFor(first, replacements));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const second = visibleEdges[j];\n if (!firstChanged && !replacements.has(second)) {\n continue;\n }\n const secondSegments = segmentsFor(replacementPointsFor(second, replacements));\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (sameAxisSegmentOverlapLength(firstSegment, secondSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n }\n }\n }\n }\n return true;\n }, \"candidateIsSafe\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = strictCrossingCount();\n if (currentCrossings === 0) {\n return;\n }\n let bestReplacements;\n let bestCrossings = currentCrossings;\n let bestBends = totalBends();\n let bestDisplacement = Number.POSITIVE_INFINITY;\n for (const component of connectedComponents(collectExternalRails())) {\n for (const assignment of coordinateAssignmentsFor(component)) {\n const replacements = replacementsForAssignment(component, assignment);\n if (!replacements || !candidateIsSafe(replacements)) {\n continue;\n }\n const candidateCrossings = strictCrossingCount(replacements);\n if (candidateCrossings >= currentCrossings) {\n continue;\n }\n const candidateBends = totalBends(replacements);\n const candidateDisplacement = component.reduce(\n (sum, rail, index) => sum + Math.abs(assignment[index] - rail.coord),\n 0\n );\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && (candidateBends > bestBends || candidateBends === bestBends && candidateDisplacement >= bestDisplacement)) {\n continue;\n }\n bestReplacements = replacements;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n bestDisplacement = candidateDisplacement;\n }\n }\n if (!bestReplacements) {\n return;\n }\n for (const [edge, points] of bestReplacements) {\n edge.points = points;\n }\n }\n}\n__name(reassignCrossingExternalRailChannels, \"reassignCrossingExternalRailChannels\");\nfunction shortcutRedundantOrthogonalJogs(edges, nodeByIdMap) {\n const BUFFER = 2;\n const MAX_ITERATIONS = 8;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const pointsFor = /* @__PURE__ */ __name((edge, replacementEdge, replacement) => dedupeConsecutivePoints(\n edge === replacementEdge ? replacement ?? [] : edge.points ?? []\n ), \"pointsFor\");\n const pathLength = /* @__PURE__ */ __name((points) => segmentsFor(points).reduce((sum, segment) => {\n const dx = segment.a.x - segment.b.x;\n const dy = segment.a.y - segment.b.y;\n return sum + Math.hypot(dx, dy);\n }, 0), \"pathLength\");\n const strictCrossingCount = /* @__PURE__ */ __name((replacementEdge, replacement) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(pointsFor(visibleEdges[i], replacementEdge, replacement));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(\n pointsFor(visibleEdges[j], replacementEdge, replacement)\n );\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"strictCrossingCount\");\n const segmentRunsAlongRectBorder = /* @__PURE__ */ __name((segment, rect) => {\n if (segment.horizontal) {\n const y = segment.a.y;\n const onBorder = Math.abs(y - rect.top) < 1 || Math.abs(y - rect.bottom) < 1;\n return onBorder && overlapLength(segment.a.x, segment.b.x, rect.left, rect.right) >= MIN_SHARED;\n }\n if (segment.vertical) {\n const x = segment.a.x;\n const onBorder = Math.abs(x - rect.left) < 1 || Math.abs(x - rect.right) < 1;\n return onBorder && overlapLength(segment.a.y, segment.b.y, rect.top, rect.bottom) >= MIN_SHARED;\n }\n return false;\n }, \"segmentRunsAlongRectBorder\");\n const endpointRectsFor = /* @__PURE__ */ __name((edge) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n const rects = [];\n for (const id of endpointIds) {\n const node = nodeByIdMap.get(id);\n const rect = node ? rectOfNodeBounds(node) : void 0;\n if (rect) {\n rects.push(rect);\n }\n }\n return rects;\n }, \"endpointRectsFor\");\n const shortcutCandidatesAt = /* @__PURE__ */ __name((points, index) => {\n if (index + 3 >= points.length) {\n return [];\n }\n const p0 = points[index];\n const p1 = points[index + 1];\n const p2 = points[index + 2];\n const p3 = points[index + 3];\n const isHVH = isHorizontalSegment(p0, p1, EPS_LOCAL) && isVerticalSegment(p1, p2, EPS_LOCAL) && isHorizontalSegment(p2, p3, EPS_LOCAL);\n const isVHV = isVerticalSegment(p0, p1, EPS_LOCAL) && isHorizontalSegment(p1, p2, EPS_LOCAL) && isVerticalSegment(p2, p3, EPS_LOCAL);\n if (!isHVH && !isVHV) {\n return [];\n }\n const outerSegmentsOppose = isHVH ? Math.sign(p1.x - p0.x) !== Math.sign(p3.x - p2.x) : Math.sign(p1.y - p0.y) !== Math.sign(p3.y - p2.y);\n if (!outerSegmentsOppose) {\n return [];\n }\n const corners = sameX(p0, p3, EPS_LOCAL) || sameY(p0, p3, EPS_LOCAL) ? [] : [\n { x: p0.x, y: p3.y },\n { x: p3.x, y: p0.y }\n ];\n const rawCandidates = corners.length === 0 ? [[...points.slice(0, index + 1), ...points.slice(index + 3)]] : corners.map((corner) => [\n ...points.slice(0, index + 1),\n corner,\n ...points.slice(index + 3)\n ]);\n const seen = /* @__PURE__ */ new Set();\n return rawCandidates.map((candidate) => simplifyPolyline(dedupeConsecutivePoints(candidate))).filter((candidate) => {\n if (segmentsFor(candidate).length !== candidate.length - 1) {\n return false;\n }\n if (!candidate.some((point) => samePoint(point, p3, EPS_LOCAL))) {\n return false;\n }\n const key = candidate.map((point) => `${point.x.toFixed(3)},${point.y.toFixed(3)}`).join(\"|\");\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n }, \"shortcutCandidatesAt\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate, currentCrossings) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n const endpointRects = endpointRectsFor(edge);\n for (const segment of segmentsFor(candidate)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n if (endpointRects.some((rect) => segmentRunsAlongRectBorder(segment, rect))) {\n return false;\n }\n }\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of segmentsFor(candidate)) {\n for (const otherSegment of segmentsFor(pointsFor(other))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n }\n }\n }\n return strictCrossingCount(edge, candidate) <= currentCrossings;\n }, \"candidateIsSafe\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = strictCrossingCount();\n let bestEdge;\n let bestPath;\n let bestCrossings = currentCrossings;\n let bestBends = Number.POSITIVE_INFINITY;\n let bestLength = Number.POSITIVE_INFINITY;\n for (const edge of visibleEdges) {\n const currentPoints = pointsFor(edge);\n const currentBends = countOrthogonalBends(currentPoints, EPS_LOCAL);\n const currentLength = pathLength(currentPoints);\n for (let index = 0; index <= currentPoints.length - 4; index++) {\n for (const candidate of shortcutCandidatesAt(currentPoints, index)) {\n const candidateBends = countOrthogonalBends(candidate, EPS_LOCAL);\n const candidateLength = pathLength(candidate);\n const improvesShape = candidateBends < currentBends || candidateBends === currentBends && candidateLength < currentLength - EPS_LOCAL;\n if (!improvesShape || !candidateIsSafe(edge, candidate, currentCrossings)) {\n continue;\n }\n const candidateCrossings = strictCrossingCount(edge, candidate);\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && (candidateBends > bestBends || candidateBends === bestBends && candidateLength >= bestLength)) {\n continue;\n }\n bestEdge = edge;\n bestPath = candidate;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n bestLength = candidateLength;\n }\n }\n }\n if (!bestEdge || !bestPath) {\n return;\n }\n bestEdge.points = bestPath;\n }\n}\n__name(shortcutRedundantOrthogonalJogs, \"shortcutRedundantOrthogonalJogs\");\nfunction resolveRenderedOrthogonalCrossings(edges, nodeByIdMap) {\n const ANCHOR = 20;\n const EXTRA_CHANNEL_COUNT = 2;\n const MAX_ITERATIONS = 4;\n const MAX_PAIR_CANDIDATES_PER_EDGE = 48;\n const realNodes = [];\n for (const node of nodeByIdMap.values()) {\n if (node.isGroup || node.isEdgeLabel) {\n continue;\n }\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const rect = rectOfNodeBounds(node);\n if (!rect) {\n continue;\n }\n realNodes.push({\n id: String(node.id ?? \"\"),\n cx,\n cy,\n rect\n });\n }\n if (realNodes.length === 0) {\n return;\n }\n const nodeInfoById = new Map(realNodes.map((node) => [node.id, node]));\n const realNodeRects = realNodes.map((node) => ({ id: node.id, rect: node.rect }));\n const sides = [\"top\", \"bottom\", \"left\", \"right\"];\n const outsideTracks = {\n top: Math.min(...realNodes.map((node) => node.rect.top)) - ANCHOR,\n bottom: Math.max(...realNodes.map((node) => node.rect.bottom)) + ANCHOR,\n left: Math.min(...realNodes.map((node) => node.rect.left)) - ANCHOR,\n right: Math.max(...realNodes.map((node) => node.rect.right)) + ANCHOR\n };\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const edgeIndex = new Map(visibleEdges.map((edge, index) => [edge, index]));\n const outwardTracksForSide = /* @__PURE__ */ __name((side) => {\n const outward = side === \"left\" || side === \"top\" ? -1 : 1;\n const tracks = [];\n for (let channel = 0; channel <= EXTRA_CHANNEL_COUNT; channel++) {\n tracks.push(outsideTracks[side] + outward * ANCHOR * channel);\n }\n return tracks;\n }, \"outwardTracksForSide\");\n const replacementPointsFor = /* @__PURE__ */ __name((edge, replacements = /* @__PURE__ */ new Map()) => dedupeConsecutivePoints(\n replacements.get(edge) ?? edge.points ?? []\n ), \"replacementPointsFor\");\n const crossingCountBetweenSegments = /* @__PURE__ */ __name((firstSegments, secondSegments) => {\n let count = 0;\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n return count;\n }, \"crossingCountBetweenSegments\");\n const crossingCountBetweenPaths = /* @__PURE__ */ __name((first, second) => crossingCountBetweenSegments(segmentsFor(first), segmentsFor(second)), \"crossingCountBetweenPaths\");\n const crossingSnapshot = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => {\n let count = 0;\n const pairs = [];\n const edgeSet = /* @__PURE__ */ new Set();\n const edgeOrder = [];\n const addEdge = /* @__PURE__ */ __name((edge) => {\n if (!edgeSet.has(edge)) {\n edgeSet.add(edge);\n edgeOrder.push(edge);\n }\n }, \"addEdge\");\n for (let i = 0; i < visibleEdges.length; i++) {\n const first = visibleEdges[i];\n const firstPoints = replacementPointsFor(first, replacements);\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const second = visibleEdges[j];\n const pairCount = crossingCountBetweenPaths(\n firstPoints,\n replacementPointsFor(second, replacements)\n );\n if (pairCount > 0) {\n count += pairCount;\n pairs.push({ first, second, count: pairCount });\n addEdge(first);\n addEdge(second);\n }\n }\n }\n edgeOrder.sort((a, b) => (edgeIndex.get(a) ?? 0) - (edgeIndex.get(b) ?? 0));\n return {\n count,\n pairs,\n edgeSet,\n edges: edgeOrder\n };\n }, \"crossingSnapshot\");\n const crossingCountWithReplacements = /* @__PURE__ */ __name((current, replacements) => {\n const changed = new Set(replacements.keys());\n if (changed.size === 0) {\n return current.count;\n }\n let currentAffected = 0;\n for (const pair of current.pairs) {\n if (changed.has(pair.first) || changed.has(pair.second)) {\n currentAffected += pair.count;\n }\n }\n let replacementAffected = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const first = visibleEdges[i];\n const firstChanged = changed.has(first);\n const firstPoints = replacementPointsFor(first, replacements);\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const second = visibleEdges[j];\n if (!firstChanged && !changed.has(second)) {\n continue;\n }\n replacementAffected += crossingCountBetweenPaths(\n firstPoints,\n replacementPointsFor(second, replacements)\n );\n }\n }\n return current.count - currentAffected + replacementAffected;\n }, \"crossingCountWithReplacements\");\n const crossingComponents = /* @__PURE__ */ __name((snapshot) => {\n const neighbors = /* @__PURE__ */ new Map();\n for (const pair of snapshot.pairs) {\n const firstNeighbors = neighbors.get(pair.first) ?? /* @__PURE__ */ new Set();\n firstNeighbors.add(pair.second);\n neighbors.set(pair.first, firstNeighbors);\n const secondNeighbors = neighbors.get(pair.second) ?? /* @__PURE__ */ new Set();\n secondNeighbors.add(pair.first);\n neighbors.set(pair.second, secondNeighbors);\n }\n const components = [];\n const seen = /* @__PURE__ */ new Set();\n for (const edge of snapshot.edges) {\n if (seen.has(edge)) {\n continue;\n }\n const queue = [edge];\n const component = [];\n seen.add(edge);\n while (queue.length > 0) {\n const current = queue.pop();\n component.push(current);\n for (const next of neighbors.get(current) ?? []) {\n if (!seen.has(next)) {\n seen.add(next);\n queue.push(next);\n }\n }\n }\n component.sort((a, b) => (edgeIndex.get(a) ?? 0) - (edgeIndex.get(b) ?? 0));\n if (component.length > 1) {\n components.push(component);\n }\n }\n return components;\n }, \"crossingComponents\");\n const endpointIdsFor = /* @__PURE__ */ __name((edge) => [edge.start, edge.end].filter(\n (id) => Boolean(id)\n ), \"endpointIdsFor\");\n const pairSearchGroups = /* @__PURE__ */ __name((snapshot) => {\n const groups = [];\n for (const component of crossingComponents(snapshot)) {\n const componentSet = new Set(component);\n const componentEndpointIds = new Set(component.flatMap((edge) => endpointIdsFor(edge)));\n const group = [...component];\n for (const edge of visibleEdges) {\n if (componentSet.has(edge)) {\n continue;\n }\n if (endpointIdsFor(edge).some((id) => componentEndpointIds.has(id))) {\n group.push(edge);\n }\n }\n group.sort((a, b) => (edgeIndex.get(a) ?? 0) - (edgeIndex.get(b) ?? 0));\n groups.push(group);\n }\n return groups;\n }, \"pairSearchGroups\");\n const crossingCountWithSingleReplacement = /* @__PURE__ */ __name((current, edge, replacement) => crossingCountWithReplacements(\n current,\n /* @__PURE__ */ new Map([[edge, replacement]])\n ), \"crossingCountWithSingleReplacement\");\n const currentCrossingsByEdge = /* @__PURE__ */ __name((current) => {\n const result = /* @__PURE__ */ new Map();\n for (const pair of current.pairs) {\n result.set(pair.first, (result.get(pair.first) ?? 0) + pair.count);\n result.set(pair.second, (result.get(pair.second) ?? 0) + pair.count);\n }\n return result;\n }, \"currentCrossingsByEdge\");\n const pathLength = /* @__PURE__ */ __name((points) => points.slice(1).reduce((sum, point, index) => {\n const previous = points[index];\n return sum + Math.abs(point.x - previous.x) + Math.abs(point.y - previous.y);\n }, 0), \"pathLength\");\n const totalBends = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + countOrthogonalBends(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalBends\");\n const totalLength = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + pathLength(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalLength\");\n const pathHasSegmentConflict = /* @__PURE__ */ __name((edge, path, replacements = /* @__PURE__ */ new Map()) => {\n const pathSegments = segmentsFor(path);\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of pathSegments) {\n for (const otherSegment of segmentsFor(replacementPointsFor(other, replacements))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return true;\n }\n }\n }\n }\n return false;\n }, \"pathHasSegmentConflict\");\n const pathHitsNode = /* @__PURE__ */ __name((edge, path) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n for (const segment of segmentsFor(path)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -2)) {\n return true;\n }\n }\n return false;\n }, \"pathHitsNode\");\n const pushOrthogonalCandidate = /* @__PURE__ */ __name((candidates, points) => {\n const candidate = simplifyPolyline(dedupeConsecutivePoints(points));\n if (segmentsFor(candidate).length === candidate.length - 1) {\n candidates.push(candidate);\n }\n }, \"pushOrthogonalCandidate\");\n const sideIsHorizontal = /* @__PURE__ */ __name((side) => side === \"left\" || side === \"right\", \"sideIsHorizontal\");\n const localTrackForSameSide = /* @__PURE__ */ __name((src, side, dst) => {\n switch (side) {\n case \"left\":\n return Math.min(src.x, dst.x) - ANCHOR;\n case \"right\":\n return Math.max(src.x, dst.x) + ANCHOR;\n case \"top\":\n return Math.min(src.y, dst.y) - ANCHOR;\n case \"bottom\":\n return Math.max(src.y, dst.y) + ANCHOR;\n }\n }, \"localTrackForSameSide\");\n const addSameSideCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst) => {\n const outward = srcSide === \"left\" || srcSide === \"top\" ? -1 : 1;\n const trackSeeds = [localTrackForSameSide(src, srcSide, dst), outsideTracks[srcSide]];\n for (const seed of trackSeeds) {\n for (let channel = 0; channel <= EXTRA_CHANNEL_COUNT; channel++) {\n pushOrthogonalCandidate(\n candidates,\n buildSameSideTrackPath(src, srcSide, dst, seed + outward * ANCHOR * channel)\n );\n }\n }\n }, \"addSameSideCandidates\");\n const addHorizontalToVerticalCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n for (const xTrack of outwardTracksForSide(srcSide)) {\n for (const yTrack of outwardTracksForSide(dstSide)) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: xTrack, y: src.y },\n { x: xTrack, y: yTrack },\n { x: dst.x, y: yTrack },\n dst\n ]);\n }\n }\n }, \"addHorizontalToVerticalCandidates\");\n const addVerticalToHorizontalCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n for (const yTrack of outwardTracksForSide(srcSide)) {\n for (const xTrack of outwardTracksForSide(dstSide)) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: src.x, y: yTrack },\n { x: xTrack, y: yTrack },\n { x: xTrack, y: dst.y },\n dst\n ]);\n }\n }\n }, \"addVerticalToHorizontalCandidates\");\n const addHorizontalPairCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n const yTracks = [...outwardTracksForSide(\"top\"), ...outwardTracksForSide(\"bottom\")];\n for (const srcTrack of outwardTracksForSide(srcSide)) {\n for (const dstTrack of outwardTracksForSide(dstSide)) {\n for (const yTrack of yTracks) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: srcTrack, y: src.y },\n { x: srcTrack, y: yTrack },\n { x: dstTrack, y: yTrack },\n { x: dstTrack, y: dst.y },\n dst\n ]);\n }\n }\n }\n }, \"addHorizontalPairCandidates\");\n const addVerticalPairCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n const xTracks = [...outwardTracksForSide(\"left\"), ...outwardTracksForSide(\"right\")];\n for (const srcTrack of outwardTracksForSide(srcSide)) {\n for (const dstTrack of outwardTracksForSide(dstSide)) {\n for (const xTrack of xTracks) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: src.x, y: srcTrack },\n { x: xTrack, y: srcTrack },\n { x: xTrack, y: dstTrack },\n { x: dst.x, y: dstTrack },\n dst\n ]);\n }\n }\n }\n }, \"addVerticalPairCandidates\");\n const dedupeCandidatePaths = /* @__PURE__ */ __name((candidates) => {\n const seen = /* @__PURE__ */ new Set();\n return candidates.map((candidate) => dedupeConsecutivePoints(candidate)).filter((candidate) => {\n const key = candidate.map((point) => `${point.x.toFixed(3)},${point.y.toFixed(3)}`).join(\"|\");\n if (seen.has(key) || candidate.length < 2) {\n return false;\n }\n seen.add(key);\n return true;\n });\n }, \"dedupeCandidatePaths\");\n const buildCandidatesForSides = /* @__PURE__ */ __name((src, srcSide, dst, dstSide) => {\n const candidates = [];\n const base = buildOrthogonalPortPath(src, srcSide, dst, dstSide, ANCHOR, EPS_LOCAL);\n if (base) {\n pushOrthogonalCandidate(candidates, base);\n }\n if (srcSide === dstSide) {\n addSameSideCandidates(candidates, src, srcSide, dst);\n }\n const srcHorizontal = sideIsHorizontal(srcSide);\n const dstHorizontal = sideIsHorizontal(dstSide);\n if (srcHorizontal && !dstHorizontal) {\n addHorizontalToVerticalCandidates(candidates, src, srcSide, dst, dstSide);\n } else if (!srcHorizontal && dstHorizontal) {\n addVerticalToHorizontalCandidates(candidates, src, srcSide, dst, dstSide);\n } else if (srcHorizontal) {\n addHorizontalPairCandidates(candidates, src, srcSide, dst, dstSide);\n } else {\n addVerticalPairCandidates(candidates, src, srcSide, dst, dstSide);\n }\n return dedupeCandidatePaths(candidates);\n }, \"buildCandidatesForSides\");\n const addVerticalDepartureOuterTrackCandidates = /* @__PURE__ */ __name((candidates, first, departure, dstNode) => {\n const externalXTracks = [...outwardTracksForSide(\"left\"), ...outwardTracksForSide(\"right\")];\n const externalYTracks = [...outwardTracksForSide(\"top\"), ...outwardTracksForSide(\"bottom\")];\n for (const side of sides) {\n const dst = portForRectSide(dstNode, side);\n const targetYTracks = side === \"top\" || side === \"bottom\" ? outwardTracksForSide(side) : externalYTracks;\n for (const track of externalXTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: track, y: departure.y },\n { x: track, y: dst.y },\n dst\n ]);\n for (const targetTrack of targetYTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: track, y: departure.y },\n { x: track, y: targetTrack },\n { x: dst.x, y: targetTrack },\n dst\n ]);\n }\n }\n }\n }, \"addVerticalDepartureOuterTrackCandidates\");\n const addHorizontalDepartureOuterTrackCandidates = /* @__PURE__ */ __name((candidates, first, departure, dstNode) => {\n const externalXTracks = [...outwardTracksForSide(\"left\"), ...outwardTracksForSide(\"right\")];\n const externalYTracks = [...outwardTracksForSide(\"top\"), ...outwardTracksForSide(\"bottom\")];\n for (const side of sides) {\n const dst = portForRectSide(dstNode, side);\n const targetXTracks = side === \"left\" || side === \"right\" ? outwardTracksForSide(side) : externalXTracks;\n for (const track of externalYTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: departure.x, y: track },\n { x: dst.x, y: track },\n dst\n ]);\n for (const targetTrack of targetXTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: departure.x, y: track },\n { x: targetTrack, y: track },\n { x: targetTrack, y: dst.y },\n dst\n ]);\n }\n }\n }\n }, \"addHorizontalDepartureOuterTrackCandidates\");\n const terminalPreservingOuterTrackCandidates = /* @__PURE__ */ __name((edge) => {\n const srcId = edge.start;\n const dstId = edge.end;\n const dstNode = dstId ? nodeInfoById.get(dstId) : void 0;\n if (!srcId || !dstNode) {\n return [];\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length < 4) {\n return [];\n }\n const first = points[0];\n const departure = points[1];\n const candidates = [];\n if (isVerticalSegment(first, departure, EPS_LOCAL)) {\n addVerticalDepartureOuterTrackCandidates(candidates, first, departure, dstNode);\n } else if (isHorizontalSegment(first, departure, EPS_LOCAL)) {\n addHorizontalDepartureOuterTrackCandidates(candidates, first, departure, dstNode);\n }\n return candidates;\n }, \"terminalPreservingOuterTrackCandidates\");\n const candidatePathsFor = /* @__PURE__ */ __name((edge) => {\n const srcId = edge.start;\n const dstId = edge.end;\n const srcNode = srcId ? nodeInfoById.get(srcId) : void 0;\n const dstNode = dstId ? nodeInfoById.get(dstId) : void 0;\n if (!srcNode || !dstNode) {\n return [];\n }\n const candidates = [];\n for (const srcSide of sides) {\n const srcPort = portForRectSide(srcNode, srcSide);\n for (const dstSide of sides) {\n candidates.push(\n ...buildCandidatesForSides(srcPort, srcSide, portForRectSide(dstNode, dstSide), dstSide)\n );\n }\n }\n candidates.push(...terminalPreservingOuterTrackCandidates(edge));\n return candidates;\n }, \"candidatePathsFor\");\n const currentSegmentsByEdge = /* @__PURE__ */ __name(() => new Map(visibleEdges.map((edge) => [edge, segmentsFor(replacementPointsFor(edge))])), \"currentSegmentsByEdge\");\n const sharedTrackConflictsFor = /* @__PURE__ */ __name((edge, candidateSegments, baseSegments) => {\n const conflicts = /* @__PURE__ */ new Set();\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n const otherSegments = baseSegments.get(other) ?? segmentsFor(replacementPointsFor(other));\n if (candidateSegments.some(\n (candidateSegment) => otherSegments.some(\n (otherSegment) => sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED\n )\n )) {\n conflicts.add(other);\n }\n }\n return conflicts;\n }, \"sharedTrackConflictsFor\");\n const pairCandidatesFor = /* @__PURE__ */ __name((edge, current, baseSegments, crossingCountByEdge) => {\n const seen = /* @__PURE__ */ new Set();\n const candidates = candidatePathsFor(edge).map((candidate) => simplifyPolyline(dedupeConsecutivePoints(candidate))).filter((candidate) => {\n if (pathHitsNode(edge, candidate)) {\n return false;\n }\n const key = candidate.map((point) => `${point.x.toFixed(3)},${point.y.toFixed(3)}`).join(\"|\");\n if (seen.has(key) || candidate.length < 2) {\n return false;\n }\n seen.add(key);\n return true;\n }).map((candidate) => {\n const candidateSegments = segmentsFor(candidate);\n let replacementAffected = 0;\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n replacementAffected += crossingCountBetweenSegments(\n candidateSegments,\n baseSegments.get(other) ?? segmentsFor(replacementPointsFor(other))\n );\n }\n return {\n candidate,\n candidateSegments,\n crossings: current.count - (crossingCountByEdge.get(edge) ?? 0) + replacementAffected,\n bends: countOrthogonalBends(candidate, EPS_LOCAL),\n totalBends: countOrthogonalBends(candidate),\n length: pathLength(candidate)\n };\n }).filter(({ crossings }) => crossings <= current.count).sort((a, b) => a.crossings - b.crossings || a.bends - b.bends || a.length - b.length);\n return candidates.slice(0, MAX_PAIR_CANDIDATES_PER_EDGE).map((candidate) => {\n return {\n path: candidate.candidate,\n segments: candidate.candidateSegments,\n sharedTrackConflicts: sharedTrackConflictsFor(\n edge,\n candidate.candidateSegments,\n baseSegments\n ),\n totalBends: candidate.totalBends,\n length: candidate.length\n };\n });\n }, \"pairCandidatesFor\");\n const pairCrossingCount = /* @__PURE__ */ __name((current, firstEdge, firstCandidate, secondEdge, secondCandidate, baseSegments) => {\n let currentAffected = 0;\n for (const pair of current.pairs) {\n if (pair.first === firstEdge || pair.second === firstEdge || pair.first === secondEdge || pair.second === secondEdge) {\n currentAffected += pair.count;\n }\n }\n let replacementAffected = crossingCountBetweenSegments(\n firstCandidate.segments,\n secondCandidate.segments\n );\n for (const other of visibleEdges) {\n if (other === firstEdge || other === secondEdge) {\n continue;\n }\n const otherSegments = baseSegments.get(other) ?? segmentsFor(replacementPointsFor(other));\n replacementAffected += crossingCountBetweenSegments(firstCandidate.segments, otherSegments) + crossingCountBetweenSegments(secondCandidate.segments, otherSegments);\n }\n return current.count - currentAffected + replacementAffected;\n }, \"pairCrossingCount\");\n const conflictsOnlyWith = /* @__PURE__ */ __name((candidate, edge) => {\n for (const conflict of candidate.sharedTrackConflicts) {\n if (conflict !== edge) {\n return false;\n }\n }\n return true;\n }, \"conflictsOnlyWith\");\n const candidatesShareTrack = /* @__PURE__ */ __name((firstCandidate, secondCandidate) => firstCandidate.segments.some(\n (firstSegment) => secondCandidate.segments.some(\n (secondSegment) => sameAxisSegmentOverlapLength(firstSegment, secondSegment, 0.5) >= MIN_SHARED\n )\n ), \"candidatesShareTrack\");\n const pairCandidatesAreCompatible = /* @__PURE__ */ __name((first, firstCandidate, second, secondCandidate) => conflictsOnlyWith(firstCandidate, second.edge) && conflictsOnlyWith(secondCandidate, first.edge) && !candidatesShareTrack(firstCandidate, secondCandidate), \"pairCandidatesAreCompatible\");\n const scorePairReplacement = /* @__PURE__ */ __name((context, first, firstCandidate, second, secondCandidate) => {\n const crossings = pairCrossingCount(\n context.current,\n first.edge,\n firstCandidate,\n second.edge,\n secondCandidate,\n context.baseSegments\n );\n if (crossings >= context.current.count) {\n return void 0;\n }\n return {\n replacements: /* @__PURE__ */ new Map([\n [first.edge, firstCandidate.path],\n [second.edge, secondCandidate.path]\n ]),\n crossings,\n bends: context.currentBends - (context.baseBendsByEdge.get(first.edge) ?? 0) - (context.baseBendsByEdge.get(second.edge) ?? 0) + firstCandidate.totalBends + secondCandidate.totalBends,\n length: context.currentLength - (context.baseLengthByEdge.get(first.edge) ?? 0) - (context.baseLengthByEdge.get(second.edge) ?? 0) + firstCandidate.length + secondCandidate.length\n };\n }, \"scorePairReplacement\");\n const pairScoreIsBetter = /* @__PURE__ */ __name((candidate, best) => candidate.crossings < best.crossings || candidate.crossings === best.crossings && (candidate.bends < best.bends || candidate.bends === best.bends && candidate.length < best.length), \"pairScoreIsBetter\");\n const bestScoreForOptionPair = /* @__PURE__ */ __name((context, first, second, best) => {\n let pairBest = best;\n for (const firstCandidate of first.candidates) {\n for (const secondCandidate of second.candidates) {\n if (!pairCandidatesAreCompatible(first, firstCandidate, second, secondCandidate)) {\n continue;\n }\n const score = scorePairReplacement(context, first, firstCandidate, second, secondCandidate);\n if (score && pairScoreIsBetter(score, pairBest)) {\n pairBest = score;\n }\n }\n }\n return pairBest;\n }, \"bestScoreForOptionPair\");\n const bestPairedReplacement = /* @__PURE__ */ __name((current) => {\n const currentBends = totalBends();\n const currentLength = totalLength();\n const baseSegments = currentSegmentsByEdge();\n const crossingCountByEdge = currentCrossingsByEdge(current);\n const baseBendsByEdge = new Map(\n visibleEdges.map((edge) => [edge, countOrthogonalBends(replacementPointsFor(edge))])\n );\n const baseLengthByEdge = new Map(\n visibleEdges.map((edge) => [edge, pathLength(replacementPointsFor(edge))])\n );\n const optionsByEdge = /* @__PURE__ */ new Map();\n const groups = pairSearchGroups(current);\n for (const group of groups) {\n for (const edge of group) {\n if (optionsByEdge.has(edge)) {\n continue;\n }\n const candidates = pairCandidatesFor(edge, current, baseSegments, crossingCountByEdge);\n if (candidates.length > 0) {\n optionsByEdge.set(edge, { edge, candidates });\n }\n }\n }\n let best = {\n replacements: /* @__PURE__ */ new Map(),\n crossings: current.count,\n bends: currentBends,\n length: currentLength\n };\n const scoringContext = {\n current,\n currentBends,\n currentLength,\n baseBendsByEdge,\n baseLengthByEdge,\n baseSegments\n };\n for (const group of groups) {\n const crossingEdgeSet = new Set(group.filter((edge) => current.edgeSet.has(edge)));\n const options = group.map((edge) => optionsByEdge.get(edge)).filter((option) => Boolean(option));\n for (let i = 0; i < options.length; i++) {\n const first = options[i];\n for (let j = i + 1; j < options.length; j++) {\n const second = options[j];\n if (!crossingEdgeSet.has(first.edge) && !crossingEdgeSet.has(second.edge)) {\n continue;\n }\n best = bestScoreForOptionPair(scoringContext, first, second, best);\n }\n }\n }\n return best.replacements.size > 0 ? best.replacements : void 0;\n }, \"bestPairedReplacement\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const current = crossingSnapshot();\n const currentCrossings = current.count;\n if (currentCrossings === 0) {\n return;\n }\n let bestEdge;\n let bestPath;\n let bestCrossings = currentCrossings;\n let bestBends = Number.POSITIVE_INFINITY;\n for (const edge of current.edges) {\n const currentEdgeBends = countOrthogonalBends(replacementPointsFor(edge), EPS_LOCAL);\n for (const candidate of candidatePathsFor(edge)) {\n const candidateHitsNode = pathHitsNode(edge, candidate);\n const candidateHasSegmentConflict = !candidateHitsNode && pathHasSegmentConflict(edge, candidate);\n const candidateCrossings = crossingCountWithSingleReplacement(current, edge, candidate);\n const candidateBends = countOrthogonalBends(candidate, EPS_LOCAL);\n if (candidateHitsNode || candidateHasSegmentConflict) {\n continue;\n }\n const improvesCurrentEdge = candidateCrossings < currentCrossings || candidateCrossings === currentCrossings && candidateBends < currentEdgeBends;\n if (!improvesCurrentEdge) {\n continue;\n }\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && candidateBends >= bestBends) {\n continue;\n }\n bestEdge = edge;\n bestPath = candidate;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n }\n }\n if (bestEdge && bestPath) {\n bestEdge.points = bestPath;\n continue;\n }\n const pairedReplacement = bestPairedReplacement(current);\n if (!pairedReplacement) {\n return;\n }\n for (const [edge, points] of pairedReplacement) {\n edge.points = points;\n }\n }\n}\n__name(resolveRenderedOrthogonalCrossings, \"resolveRenderedOrthogonalCrossings\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/detourSimplification.ts\nvar EPS4 = 1e-3;\nvar MIN_SHARED2 = 8;\nfunction simplifyDetouredEdges(edges, nodes) {\n const { nodeInfoById, realNodeRects } = collectRealNodeBounds(nodes);\n const sides = [\"top\", \"bottom\", \"left\", \"right\"];\n const ANCHOR = 20;\n const outsideTracks = {\n top: Math.min(...realNodeRects.map((node) => node.rect.top)) - ANCHOR,\n bottom: Math.max(...realNodeRects.map((node) => node.rect.bottom)) + ANCHOR,\n left: Math.min(...realNodeRects.map((node) => node.rect.left)) - ANCHOR,\n right: Math.max(...realNodeRects.map((node) => node.rect.right)) + ANCHOR\n };\n const buildOrthogonalPathCandidates = /* @__PURE__ */ __name((src, srcSide, dst, dstSide) => {\n const paths = [];\n const base = buildOrthogonalPortPath(src, srcSide, dst, dstSide, ANCHOR, EPS4);\n if (base) {\n paths.push(base);\n }\n if (srcSide === dstSide) {\n paths.push(buildSameSideTrackPath(src, srcSide, dst, outsideTracks[srcSide]));\n }\n return paths;\n }, \"buildOrthogonalPathCandidates\");\n const pathHitsNode = /* @__PURE__ */ __name((pts, excludeIds) => {\n for (let i = 0; i < pts.length - 1; i++) {\n const a = pts[i];\n const b = pts[i + 1];\n if (segmentHitsAnyRect(a, b, realNodeRects, excludeIds, 1)) {\n return true;\n }\n }\n return false;\n }, \"pathHitsNode\");\n const pathConflictCount = /* @__PURE__ */ __name((path, currentEdge, includeIncidentEdges = false) => {\n let conflicts = 0;\n const pathSegments = orthogonalSegmentsForPoints(path, EPS4);\n const currentStart = currentEdge.start;\n const currentEnd = currentEdge.end;\n for (const other of edges) {\n if (other === currentEdge || other.isLayoutOnly) {\n continue;\n }\n const otherStart = other.start;\n const otherEnd = other.end;\n if (!includeIncidentEdges && currentStart && currentEnd && (otherStart === currentStart || otherStart === currentEnd || otherEnd === currentStart || otherEnd === currentEnd)) {\n continue;\n }\n const otherPts = other.points;\n if (!otherPts || otherPts.length < 2) {\n continue;\n }\n for (const pathSegment of pathSegments) {\n for (const otherSegment of orthogonalSegmentsForPoints(otherPts, EPS4)) {\n if (orthogonalSegmentsCross(\n pathSegment.a,\n pathSegment.b,\n otherSegment.a,\n otherSegment.b,\n EPS4,\n EPS4\n )) {\n conflicts++;\n continue;\n }\n if (sameAxisSegmentOverlapLength(pathSegment, otherSegment, EPS4) >= MIN_SHARED2) {\n conflicts++;\n }\n }\n }\n }\n return conflicts;\n }, \"pathConflictCount\");\n const BEND_THRESHOLD = 4;\n const nearestSideOfRect = /* @__PURE__ */ __name((pt, info) => {\n const dTop = Math.abs(pt.y - info.rect.top);\n const dBottom = Math.abs(pt.y - info.rect.bottom);\n const dLeft = Math.abs(pt.x - info.rect.left);\n const dRight = Math.abs(pt.x - info.rect.right);\n let best = \"top\";\n let bestDist = dTop;\n if (dBottom < bestDist) {\n best = \"bottom\";\n bestDist = dBottom;\n }\n if (dLeft < bestDist) {\n best = \"left\";\n bestDist = dLeft;\n }\n if (dRight < bestDist) {\n best = \"right\";\n bestDist = dRight;\n }\n return best;\n }, \"nearestSideOfRect\");\n const faceClaims = /* @__PURE__ */ new Map();\n const addFaceClaim = /* @__PURE__ */ __name((nodeId, side, edgeId) => {\n const claims = faceClaims.get(nodeId) ?? [];\n claims.push({ side, edgeId });\n faceClaims.set(nodeId, claims);\n }, \"addFaceClaim\");\n for (const e of edges) {\n if (e.isLayoutOnly) {\n continue;\n }\n const pts = e.points ?? [];\n if (pts.length < 1) {\n continue;\n }\n const eId = e.id ?? \"\";\n const startId = e.start;\n const endId = e.end;\n if (startId) {\n const info = nodeInfoById.get(startId);\n if (info) {\n addFaceClaim(startId, nearestSideOfRect(pts[0], info), eId);\n }\n }\n if (endId) {\n const info = nodeInfoById.get(endId);\n if (info) {\n addFaceClaim(endId, nearestSideOfRect(pts[pts.length - 1], info), eId);\n }\n }\n }\n const faceIsClaimed = /* @__PURE__ */ __name((nodeId, side, ignoreEdgeId) => {\n return faceClaims.get(nodeId)?.some((c) => c.edgeId !== ignoreEdgeId && c.side === side) ?? false;\n }, \"faceIsClaimed\");\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n const currentBends = countOrthogonalBends(pts, EPS4);\n if (currentBends < BEND_THRESHOLD) {\n continue;\n }\n const srcId = edge.start;\n const dstId = edge.end;\n if (!srcId || !dstId) {\n continue;\n }\n const srcInfo = nodeInfoById.get(srcId);\n const dstInfo = nodeInfoById.get(dstId);\n if (!srcInfo || !dstInfo) {\n continue;\n }\n const edgeId = edge.id ?? \"\";\n const currentCrossingConflicts = pathConflictCount(pts, edge, true);\n const currentNonIncidentConflicts = pathConflictCount(pts, edge);\n let bestPath;\n let bestCrossingConflicts = currentCrossingConflicts;\n let bestBends = currentBends;\n for (const srcSide of sides) {\n if (faceIsClaimed(srcId, srcSide, edgeId)) {\n continue;\n }\n const srcPort = portForRectSide(srcInfo, srcSide);\n for (const dstSide of sides) {\n if (faceIsClaimed(dstId, dstSide, edgeId)) {\n continue;\n }\n const dstPort = portForRectSide(dstInfo, dstSide);\n for (const path of buildOrthogonalPathCandidates(srcPort, srcSide, dstPort, dstSide)) {\n if (pathHitsNode(path, [srcId, dstId])) {\n continue;\n }\n const pathBends = countOrthogonalBends(path, EPS4);\n if (currentCrossingConflicts > 0) {\n const pathCrossingConflicts = pathConflictCount(path, edge, true);\n if (pathCrossingConflicts > bestCrossingConflicts || pathCrossingConflicts === bestCrossingConflicts && pathBends >= bestBends) {\n continue;\n }\n bestCrossingConflicts = pathCrossingConflicts;\n bestBends = pathBends;\n bestPath = path;\n continue;\n }\n if (pathConflictCount(path, edge) > currentNonIncidentConflicts) {\n continue;\n }\n if (pathBends < bestBends) {\n bestBends = pathBends;\n bestPath = path;\n }\n }\n }\n }\n if (bestPath) {\n edge.points = bestPath;\n const refreshSrc = faceClaims.get(srcId);\n if (refreshSrc) {\n faceClaims.set(\n srcId,\n refreshSrc.filter((c) => c.edgeId !== edgeId)\n );\n }\n const refreshDst = faceClaims.get(dstId);\n if (refreshDst) {\n faceClaims.set(\n dstId,\n refreshDst.filter((c) => c.edgeId !== edgeId)\n );\n }\n addFaceClaim(srcId, nearestSideOfRect(bestPath[0], srcInfo), edgeId);\n addFaceClaim(dstId, nearestSideOfRect(bestPath[bestPath.length - 1], dstInfo), edgeId);\n }\n }\n}\n__name(simplifyDetouredEdges, \"simplifyDetouredEdges\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/labelAnchoring.ts\nvar EPS5 = 1e-3;\nvar MARKER_CLEARANCE_LENGTH = 10;\nvar MARKER_CLEARANCE_HALF_WIDTH = 7;\nfunction markerClearanceRectFor(pts, atStart) {\n const terminalIndex = atStart ? 0 : pts.length - 1;\n const step = atStart ? 1 : -1;\n const tip = pts[terminalIndex];\n const inner = pts[terminalIndex + step];\n if (!tip || !inner) {\n return void 0;\n }\n const dx = inner.x - tip.x;\n const dy = inner.y - tip.y;\n const len = Math.abs(dx) + Math.abs(dy);\n if (len < EPS5) {\n return void 0;\n }\n if (Math.abs(dy) <= EPS5) {\n const x2 = tip.x + Math.sign(dx) * MARKER_CLEARANCE_LENGTH;\n return {\n left: Math.min(tip.x, x2),\n right: Math.max(tip.x, x2),\n top: tip.y - MARKER_CLEARANCE_HALF_WIDTH,\n bottom: tip.y + MARKER_CLEARANCE_HALF_WIDTH\n };\n }\n if (Math.abs(dx) <= EPS5) {\n const y2 = tip.y + Math.sign(dy) * MARKER_CLEARANCE_LENGTH;\n return {\n left: tip.x - MARKER_CLEARANCE_HALF_WIDTH,\n right: tip.x + MARKER_CLEARANCE_HALF_WIDTH,\n top: Math.min(tip.y, y2),\n bottom: Math.max(tip.y, y2)\n };\n }\n return {\n left: Math.min(tip.x, inner.x),\n right: Math.max(tip.x, inner.x),\n top: Math.min(tip.y, inner.y),\n bottom: Math.max(tip.y, inner.y)\n };\n}\n__name(markerClearanceRectFor, \"markerClearanceRectFor\");\nfunction normalizeRect(rect) {\n return {\n left: Math.min(rect.left, rect.right),\n right: Math.max(rect.left, rect.right),\n top: Math.min(rect.top, rect.bottom),\n bottom: Math.max(rect.top, rect.bottom)\n };\n}\n__name(normalizeRect, \"normalizeRect\");\nfunction labelOverlapsOwnMarker(rect, pts) {\n const visiblePts = dedupeConsecutivePoints(pts);\n const startMarker = markerClearanceRectFor(visiblePts, true);\n const endMarker = markerClearanceRectFor(visiblePts, false);\n return [startMarker, endMarker].some(\n (marker) => marker && rectsOverlap(rect, normalizeRect(marker))\n );\n}\n__name(labelOverlapsOwnMarker, \"labelOverlapsOwnMarker\");\nfunction anchorLabelsToPolyline(edges, nodeByIdMap) {\n const allEdgeSegments = [];\n for (const other of edges) {\n if (other.isLayoutOnly) {\n continue;\n }\n const pts = other.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n for (let i = 0; i < pts.length - 1; i++) {\n allEdgeSegments.push({ edgeId: other.id, p1: pts[i], p2: pts[i + 1] });\n }\n }\n const foreignNodeRects = [];\n const laneGroups = [];\n for (const n of nodeByIdMap.values()) {\n const isGroup = n.isGroup;\n const parentId = n.parentId;\n if (isGroup && !parentId) {\n const rect2 = rectOfNodeBounds(n);\n if (rect2) {\n laneGroups.push({\n id: n.id,\n rect: rect2\n });\n }\n continue;\n }\n if (isGroup) {\n continue;\n }\n if (n.isEdgeLabel) {\n continue;\n }\n const rect = rectOfNodeBounds(n);\n if (!rect) {\n continue;\n }\n foreignNodeRects.push({\n nodeId: n.id,\n rect\n });\n }\n const LABEL_PLACEMENT_BUFFER = 3;\n const LABEL_LANE_MARGIN = 1;\n const LABEL_ENDPOINT_CLEARANCE = 12;\n const labelOverlapsForeignNode = /* @__PURE__ */ __name((labelId, rect) => {\n const buffered = inflateRect(rect, LABEL_PLACEMENT_BUFFER);\n for (const { nodeId, rect: nr } of foreignNodeRects) {\n if (nodeId === labelId) {\n continue;\n }\n if (rectsOverlap(buffered, nr)) {\n return true;\n }\n }\n return false;\n }, \"labelOverlapsForeignNode\");\n const labelOverlapsForeignEdge = /* @__PURE__ */ __name((edgeId, rect) => {\n const buffered = inflateRect(rect, LABEL_PLACEMENT_BUFFER);\n for (const s of allEdgeSegments) {\n if (s.edgeId === edgeId) {\n continue;\n }\n if (segmentBoundsOverlapRect(s.p1, s.p2, buffered)) {\n return true;\n }\n }\n return false;\n }, \"labelOverlapsForeignEdge\");\n const labelOverlapsAnything = /* @__PURE__ */ __name((labelId, edgeId, rect) => labelOverlapsForeignNode(labelId, rect) || labelOverlapsForeignEdge(edgeId, rect), \"labelOverlapsAnything\");\n const placedLabelRects = [];\n const findContainingLane = /* @__PURE__ */ __name((rect) => {\n for (const { id, rect: laneRect } of laneGroups) {\n if (rectContainsRect(laneRect, rect)) {\n return id;\n }\n }\n return void 0;\n }, \"findContainingLane\");\n const overlapsPlacedLabel = /* @__PURE__ */ __name((labelId, rect) => placedLabelRects.some(\n (placed) => placed.labelId !== labelId && rectsOverlap(rect, placed.rect)\n ), \"overlapsPlacedLabel\");\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const labelId = edge.labelNodeId;\n if (!labelId) {\n continue;\n }\n const labelNode = nodeByIdMap.get(labelId);\n if (!labelNode) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n const lw = labelNode.width ?? 0;\n const lh = labelNode.height ?? 0;\n if (lw <= 0 || lh <= 0) {\n continue;\n }\n const segments = [];\n for (let i = 0; i < pts.length - 1; i++) {\n const a = pts[i];\n const b = pts[i + 1];\n const dx = Math.abs(a.x - b.x);\n const dy = Math.abs(a.y - b.y);\n if (dx < EPS5 && dy < EPS5) {\n continue;\n }\n if (dx >= EPS5 && dy >= EPS5) {\n continue;\n }\n segments.push({\n idx: i,\n length: dx + dy,\n orientation: dx >= EPS5 ? \"horizontal\" : \"vertical\",\n midX: (a.x + b.x) / 2,\n midY: (a.y + b.y) / 2\n });\n }\n if (segments.length === 0) {\n continue;\n }\n const middleSegments = segments.length >= 3 ? segments.filter((s) => s.idx > 0 && s.idx < segments.length - 1) : segments;\n const poolBase = middleSegments.length > 0 ? middleSegments : segments;\n const labelLongAxis = lw >= lh ? \"horizontal\" : \"vertical\";\n const rankSegments = /* @__PURE__ */ __name((pool) => {\n return [...pool].sort((a, b) => {\n const aLongAxis = a.orientation === labelLongAxis;\n const bLongAxis = b.orientation === labelLongAxis;\n if (aLongAxis !== bLongAxis) {\n return aLongAxis ? -1 : 1;\n }\n const aFits = a.length >= (a.orientation === \"horizontal\" ? lw : lh) + 2;\n const bFits = b.length >= (b.orientation === \"horizontal\" ? lw : lh) + 2;\n if (aFits !== bFits) {\n return aFits ? -1 : 1;\n }\n return b.length - a.length;\n });\n }, \"rankSegments\");\n const firstVisibleSegment = segments[0];\n const lastVisibleSegment = segments[segments.length - 1];\n const ALONG_SEGMENT_TS = [0.5, 0.25, 0.75, 0.05, 0.95, 0.15, 0.85, 0.1, 0.9];\n const anchorAtT = /* @__PURE__ */ __name((seg, t) => {\n const a = pts[seg.idx];\n const b = pts[seg.idx + 1];\n return {\n midX: a.x + (b.x - a.x) * t,\n midY: a.y + (b.y - a.y) * t\n };\n }, \"anchorAtT\");\n const clamp = /* @__PURE__ */ __name((value, min, max) => Math.min(max, Math.max(min, value)), \"clamp\");\n const pointInsideRectInclusive = /* @__PURE__ */ __name((point, rect) => point.midX >= rect.left - EPS5 && point.midX <= rect.right + EPS5 && point.midY >= rect.top - EPS5 && point.midY <= rect.bottom + EPS5, \"pointInsideRectInclusive\");\n const placementForAnchor = /* @__PURE__ */ __name((anchor) => {\n const centeredRect = rectFromCenterSize(anchor.midX, anchor.midY, lw, lh);\n const centeredLane = findContainingLane(centeredRect);\n if (centeredLane) {\n return { laneId: centeredLane, anchor, rect: centeredRect };\n }\n const containingLane = laneGroups.find(({ rect }) => pointInsideRectInclusive(anchor, rect));\n if (!containingLane) {\n return void 0;\n }\n const minX = containingLane.rect.left + lw / 2 + LABEL_LANE_MARGIN;\n const maxX = containingLane.rect.right - lw / 2 - LABEL_LANE_MARGIN;\n const minY = containingLane.rect.top + lh / 2 + LABEL_LANE_MARGIN;\n const maxY = containingLane.rect.bottom - lh / 2 - LABEL_LANE_MARGIN;\n if (minX > maxX || minY > maxY) {\n return void 0;\n }\n const clampedAnchor = {\n midX: clamp(anchor.midX, minX, maxX),\n midY: clamp(anchor.midY, minY, maxY)\n };\n const clampedRect = rectFromCenterSize(clampedAnchor.midX, clampedAnchor.midY, lw, lh);\n return pointInsideRectInclusive(anchor, clampedRect) ? { laneId: containingLane.id, anchor: clampedAnchor, rect: clampedRect } : void 0;\n }, \"placementForAnchor\");\n const distanceAlongSegment = /* @__PURE__ */ __name((seg, anchor, endpoint) => seg.orientation === \"horizontal\" ? Math.abs(anchor.midX - endpoint.x) : Math.abs(anchor.midY - endpoint.y), \"distanceAlongSegment\");\n const labelClearsTerminalEndpoints = /* @__PURE__ */ __name((seg, anchor) => {\n const labelHalfExtent = seg.orientation === \"horizontal\" ? lw / 2 : lh / 2;\n const requiredDistance = labelHalfExtent + LABEL_ENDPOINT_CLEARANCE;\n if (seg === firstVisibleSegment) {\n const start = pts[seg.idx];\n if (distanceAlongSegment(seg, anchor, start) + EPS5 < requiredDistance) {\n return false;\n }\n }\n if (seg === lastVisibleSegment) {\n const end = pts[seg.idx + 1];\n if (distanceAlongSegment(seg, anchor, end) + EPS5 < requiredDistance) {\n return false;\n }\n }\n return true;\n }, \"labelClearsTerminalEndpoints\");\n const tryPool = /* @__PURE__ */ __name((pool) => {\n const rankedPool = rankSegments(pool);\n for (const seg of rankedPool) {\n for (const t of ALONG_SEGMENT_TS) {\n const anchor = anchorAtT(seg, t);\n if (!labelClearsTerminalEndpoints(seg, anchor)) {\n continue;\n }\n const placement = placementForAnchor(anchor);\n if (!placement) {\n continue;\n }\n if (labelOverlapsOwnMarker(placement.rect, pts)) {\n continue;\n }\n if (overlapsPlacedLabel(labelId, placement.rect)) {\n continue;\n }\n if (!labelOverlapsAnything(labelId, edge.id, placement.rect)) {\n return { laneId: placement.laneId, anchor: placement.anchor };\n }\n }\n }\n return void 0;\n }, \"tryPool\");\n const findLaneContainingFallback = /* @__PURE__ */ __name((pool, requireEndpointClearance, allowForeignEdgeOverlap = false) => {\n const rankedPool = rankSegments(pool);\n for (const seg of rankedPool) {\n const anchor = { midX: seg.midX, midY: seg.midY };\n if (requireEndpointClearance && !labelClearsTerminalEndpoints(seg, anchor)) {\n continue;\n }\n const placement = placementForAnchor(anchor);\n if (placement && !labelOverlapsOwnMarker(placement.rect, pts) && !overlapsPlacedLabel(labelId, placement.rect) && !labelOverlapsForeignNode(labelId, placement.rect) && (allowForeignEdgeOverlap || !labelOverlapsForeignEdge(edge.id, placement.rect))) {\n return { laneId: placement.laneId, anchor: placement.anchor };\n }\n }\n return void 0;\n }, \"findLaneContainingFallback\");\n const chosen = tryPool(poolBase) ?? (poolBase.length < segments.length ? tryPool(segments) : void 0) ?? findLaneContainingFallback(segments, true) ?? findLaneContainingFallback(segments, false) ?? findLaneContainingFallback(segments, false, true);\n if (chosen) {\n labelNode.x = chosen.anchor.midX;\n labelNode.y = chosen.anchor.midY;\n labelNode.parentId = chosen.laneId;\n const chosenRect = rectFromCenterSize(chosen.anchor.midX, chosen.anchor.midY, lw, lh);\n const priorIdx = placedLabelRects.findIndex((placed) => placed.labelId === labelId);\n if (priorIdx >= 0) {\n placedLabelRects[priorIdx] = { labelId, rect: chosenRect };\n } else {\n placedLabelRects.push({ labelId, rect: chosenRect });\n }\n }\n }\n}\n__name(anchorLabelsToPolyline, \"anchorLabelsToPolyline\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/siblingSharedFaceRouting.ts\nvar EPS6 = 1e-6;\nvar MIN_PORT_SPACING2 = 8;\nvar PORT_SHIFT2 = MIN_PORT_SPACING2 / 2;\nvar LABEL_CLEARANCE_BUFFER = 3;\nfunction pairKey(a, b) {\n return a < b ? `${a}::${b}` : `${b}::${a}`;\n}\n__name(pairKey, \"pairKey\");\nfunction straightenCollinearSiblingDetours(edges, nodes) {\n const { nodeInfoById, realNodeRects } = collectRealNodeBounds(nodes);\n const labelDimById = /* @__PURE__ */ new Map();\n for (const n of nodes) {\n const id = n.id;\n if (n.isGroup) {\n continue;\n }\n if (n.isEdgeLabel) {\n labelDimById.set(id, {\n w: n.width ?? 0,\n h: n.height ?? 0\n });\n continue;\n }\n }\n const labelClearanceFor = /* @__PURE__ */ __name((thisEdge, thisSrcId, thisDstId, axis) => {\n const targetPair = pairKey(thisSrcId, thisDstId);\n let maxHalf = 0;\n const consider = /* @__PURE__ */ __name((labelId) => {\n if (!labelId) {\n return;\n }\n const dim = labelDimById.get(labelId);\n if (!dim) {\n return;\n }\n const half = axis === \"x\" ? dim.w / 2 : dim.h / 2;\n if (half > maxHalf) {\n maxHalf = half;\n }\n }, \"consider\");\n consider(thisEdge.labelNodeId);\n for (const other of edges) {\n if (other === thisEdge) {\n continue;\n }\n if (other.isLayoutOnly) {\n continue;\n }\n const oSrc = other.start;\n const oDst = other.end;\n if (!oSrc || !oDst) {\n continue;\n }\n if (pairKey(oSrc, oDst) !== targetPair) {\n continue;\n }\n consider(other.labelNodeId);\n }\n return maxHalf > 0 ? maxHalf + LABEL_CLEARANCE_BUFFER : 0;\n }, \"labelClearanceFor\");\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!classifyThreeSegmentRoute(pts, EPS6)) {\n continue;\n }\n const nodePair = getNodePairGeometry(edge, nodeInfoById, EPS6);\n if (!nodePair) {\n continue;\n }\n const { srcId, dstId, srcInfo, dstInfo, collinearX, collinearY } = nodePair;\n if (collinearX === collinearY) {\n continue;\n }\n let targetSrc;\n let targetDst;\n if (collinearX) {\n const dstBelow = dstInfo.cy > srcInfo.cy;\n targetSrc = { x: srcInfo.cx, y: dstBelow ? srcInfo.rect.bottom : srcInfo.rect.top };\n targetDst = { x: dstInfo.cx, y: dstBelow ? dstInfo.rect.top : dstInfo.rect.bottom };\n } else {\n const dstEast = dstInfo.cx > srcInfo.cx;\n targetSrc = { x: dstEast ? srcInfo.rect.right : srcInfo.rect.left, y: srcInfo.cy };\n targetDst = { x: dstEast ? dstInfo.rect.left : dstInfo.rect.right, y: dstInfo.cy };\n }\n if (segmentHitsAnyRect(targetSrc, targetDst, realNodeRects, [srcId, dstId], 1)) {\n continue;\n }\n const shiftAxis = collinearX ? \"x\" : \"y\";\n const labelShift = labelClearanceFor(edge, srcId, dstId, shiftAxis);\n const effectiveShift = labelShift > PORT_SHIFT2 ? labelShift : PORT_SHIFT2;\n const deltas = [0, effectiveShift, -effectiveShift];\n for (const delta of deltas) {\n const shiftedSrc = { ...targetSrc };\n const shiftedDst = { ...targetDst };\n if (collinearX) {\n shiftedSrc.x += delta;\n shiftedDst.x += delta;\n if (shiftedSrc.x <= srcInfo.rect.left || shiftedSrc.x >= srcInfo.rect.right) {\n continue;\n }\n if (shiftedDst.x <= dstInfo.rect.left || shiftedDst.x >= dstInfo.rect.right) {\n continue;\n }\n } else {\n shiftedSrc.y += delta;\n shiftedDst.y += delta;\n if (shiftedSrc.y <= srcInfo.rect.top || shiftedSrc.y >= srcInfo.rect.bottom) {\n continue;\n }\n if (shiftedDst.y <= dstInfo.rect.top || shiftedDst.y >= dstInfo.rect.bottom) {\n continue;\n }\n }\n if (segmentHitsAnyRect(shiftedSrc, shiftedDst, realNodeRects, [srcId, dstId], 1)) {\n continue;\n }\n if (segmentConflictsWithAnyEdge(shiftedSrc, shiftedDst, edges, edge, { epsilon: EPS6 })) {\n continue;\n }\n edge.points = [shiftedSrc, shiftedDst];\n break;\n }\n }\n}\n__name(straightenCollinearSiblingDetours, \"straightenCollinearSiblingDetours\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/sharedTrackNudging.ts\nfunction nudgeSharedInteriorSubpaths(edges, nodeByIdMap) {\n const EPS_LOCAL2 = 1e-3;\n const MIN_SHARED3 = 8;\n const TRACK_SHIFT = 7;\n const MIN_TRACK_GAP = TRACK_SHIFT;\n const SOURCE_DETOUR_STUB = 20;\n const BUFFER = 2;\n const MAX_ITERATIONS = 12;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const segmentsFor2 = /* @__PURE__ */ __name((edge, points) => {\n return orthogonalSegmentsForPoints(points, EPS_LOCAL2).map((segment) => ({\n ...segment,\n edge,\n interior: segment.index >= 1 && segment.index <= points.length - 3\n }));\n }, \"segmentsFor\");\n const allSegments = /* @__PURE__ */ __name(() => {\n const result = [];\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = edge.points;\n if (!points || points.length < 2) {\n continue;\n }\n result.push(...segmentsFor2(edge, dedupeConsecutivePoints(points)));\n }\n return result;\n }, \"allSegments\");\n const hasCrowdedParallelTrack = /* @__PURE__ */ __name((a, b) => {\n if (a.horizontal && b.horizontal) {\n return overlapLength(a.a.x, a.b.x, b.a.x, b.b.x) >= MIN_SHARED3 && Math.abs(a.a.y - b.a.y) < MIN_TRACK_GAP;\n }\n if (a.vertical && b.vertical) {\n return overlapLength(a.a.y, a.b.y, b.a.y, b.b.y) >= MIN_SHARED3 && Math.abs(a.a.x - b.a.x) < MIN_TRACK_GAP;\n }\n return false;\n }, \"hasCrowdedParallelTrack\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate) => {\n const sourceId = edge.start;\n const targetId = edge.end;\n const candidateSegments = segmentsFor2(edge, candidate);\n if (candidateSegments.length !== candidate.length - 1) {\n return false;\n }\n const endpointIds = [sourceId, targetId].filter((id) => Boolean(id));\n const ownLabelIds = edge.labelNodeId ? [edge.labelNodeId] : [];\n for (const segment of candidateSegments) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, ownLabelIds, -BUFFER)) {\n return false;\n }\n }\n for (const other of edges) {\n if (other === edge || other.isLayoutOnly) {\n continue;\n }\n const otherPoints = other.points;\n if (!otherPoints || otherPoints.length < 2) {\n continue;\n }\n for (const candidateSegment of candidateSegments) {\n for (const otherSegment of segmentsFor2(other, dedupeConsecutivePoints(otherPoints))) {\n if (hasCrowdedParallelTrack(candidateSegment, otherSegment)) {\n return false;\n }\n if (orthogonalSegmentsStrictlyCross(\n candidateSegment.a,\n candidateSegment.b,\n otherSegment.a,\n otherSegment.b,\n EPS_LOCAL2\n )) {\n return false;\n }\n }\n }\n }\n return true;\n }, \"candidateIsSafe\");\n const shiftedCandidate = /* @__PURE__ */ __name((segment, shift) => {\n const points = dedupeConsecutivePoints(segment.edge.points ?? []);\n if (points.length < 4 || segment.index >= points.length - 1) {\n return void 0;\n }\n const candidate = points.map((p) => ({ ...p }));\n if (segment.horizontal) {\n candidate[segment.index].y += shift;\n candidate[segment.index + 1].y += shift;\n } else if (segment.vertical) {\n candidate[segment.index].x += shift;\n candidate[segment.index + 1].x += shift;\n } else {\n return void 0;\n }\n return segmentsFor2(segment.edge, candidate).length === candidate.length - 1 ? candidate : void 0;\n }, \"shiftedCandidate\");\n const nodeCenter = /* @__PURE__ */ __name((node, rect) => ({\n x: node.x ?? (rect.left + rect.right) / 2,\n y: node.y ?? (rect.top + rect.bottom) / 2\n }), \"nodeCenter\");\n const sourceDetourContextFor = /* @__PURE__ */ __name((segment) => {\n const edge = segment.edge;\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length !== 4 || segment.index !== 1) {\n return void 0;\n }\n const sourceNode = edge.start ? nodeByIdMap.get(edge.start) : void 0;\n const targetNode = edge.end ? nodeByIdMap.get(edge.end) : void 0;\n const sourceRect = sourceNode ? rectOfNodeBounds(sourceNode) : void 0;\n const targetRect = targetNode ? rectOfNodeBounds(targetNode) : void 0;\n const tail = points.slice(segment.index + 2);\n if (!sourceNode || !targetNode || !sourceRect || !targetRect || tail.length === 0) {\n return void 0;\n }\n return {\n sourceCenter: nodeCenter(sourceNode, sourceRect),\n targetCenter: nodeCenter(targetNode, targetRect),\n sourceRect,\n tail\n };\n }, \"sourceDetourContextFor\");\n const verticalSourceDetour = /* @__PURE__ */ __name((segment, shift, sourceCenter, targetCenter, sourceRect, tail) => {\n const targetBelow = targetCenter.y >= sourceCenter.y;\n const sourcePortY = targetBelow ? sourceRect.bottom : sourceRect.top;\n const stubY = sourcePortY + (targetBelow ? SOURCE_DETOUR_STUB : -SOURCE_DETOUR_STUB);\n if (targetBelow && segment.b.y <= stubY + EPS_LOCAL2 || !targetBelow && segment.b.y >= stubY - EPS_LOCAL2) {\n return void 0;\n }\n const railX = segment.a.x + shift;\n return dedupeConsecutivePoints(\n [\n { x: sourceCenter.x, y: sourcePortY },\n { x: sourceCenter.x, y: stubY },\n { x: railX, y: stubY },\n { x: railX, y: segment.b.y },\n ...tail\n ],\n EPS_LOCAL2\n );\n }, \"verticalSourceDetour\");\n const horizontalSourceDetour = /* @__PURE__ */ __name((segment, shift, sourceCenter, targetCenter, sourceRect, tail) => {\n const targetRight = targetCenter.x >= sourceCenter.x;\n const sourcePortX = targetRight ? sourceRect.right : sourceRect.left;\n const stubX = sourcePortX + (targetRight ? SOURCE_DETOUR_STUB : -SOURCE_DETOUR_STUB);\n if (targetRight && segment.b.x <= stubX + EPS_LOCAL2 || !targetRight && segment.b.x >= stubX - EPS_LOCAL2) {\n return void 0;\n }\n const railY = segment.a.y + shift;\n return dedupeConsecutivePoints(\n [\n { x: sourcePortX, y: sourceCenter.y },\n { x: stubX, y: sourceCenter.y },\n { x: stubX, y: railY },\n { x: segment.b.x, y: railY },\n ...tail\n ],\n EPS_LOCAL2\n );\n }, \"horizontalSourceDetour\");\n const sourceDetourCandidate = /* @__PURE__ */ __name((segment, shift) => {\n const context = sourceDetourContextFor(segment);\n if (!context) {\n return void 0;\n }\n if (segment.vertical) {\n return verticalSourceDetour(\n segment,\n shift,\n context.sourceCenter,\n context.targetCenter,\n context.sourceRect,\n context.tail\n );\n }\n if (segment.horizontal) {\n return horizontalSourceDetour(\n segment,\n shift,\n context.sourceCenter,\n context.targetCenter,\n context.sourceRect,\n context.tail\n );\n }\n return void 0;\n }, \"sourceDetourCandidate\");\n const shifts = [\n -TRACK_SHIFT,\n TRACK_SHIFT,\n -2 * TRACK_SHIFT,\n 2 * TRACK_SHIFT,\n -3 * TRACK_SHIFT,\n 3 * TRACK_SHIFT\n ];\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const segments = allSegments();\n let fixed = false;\n for (let i = 0; i < segments.length && !fixed; i++) {\n for (let j = i + 1; j < segments.length && !fixed; j++) {\n const first = segments[i];\n const second = segments[j];\n if (first.edge === second.edge || !hasCrowdedParallelTrack(first, second)) {\n continue;\n }\n const candidates = [first, second].filter((segment) => segment.interior);\n for (const segment of candidates) {\n for (const shift of shifts) {\n const direct = shiftedCandidate(segment, shift);\n if (direct && candidateIsSafe(segment.edge, direct)) {\n segment.edge.points = direct;\n fixed = true;\n break;\n }\n const detoured = sourceDetourCandidate(segment, shift);\n if (detoured && candidateIsSafe(segment.edge, detoured)) {\n segment.edge.points = detoured;\n fixed = true;\n break;\n }\n }\n if (fixed) {\n break;\n }\n }\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(nudgeSharedInteriorSubpaths, \"nudgeSharedInteriorSubpaths\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/validation.ts\nfunction segmentsIntersect(p1, p2, p3, p4) {\n const d1x = p2.x - p1.x;\n const d1y = p2.y - p1.y;\n const d2x = p4.x - p3.x;\n const d2y = p4.y - p3.y;\n const cross = d1x * d2y - d1y * d2x;\n if (Math.abs(cross) < 1e-10) {\n return false;\n }\n const dx = p3.x - p1.x;\n const dy = p3.y - p1.y;\n const t = (dx * d2y - dy * d2x) / cross;\n const u = (dx * d1y - dy * d1x) / cross;\n const eps = 0.01;\n return t > eps && t < 1 - eps && u > eps && u < 1 - eps;\n}\n__name(segmentsIntersect, \"segmentsIntersect\");\nfunction validateSwimlanesLayout(layout) {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const issues = [];\n if (!edges.length || !nodes.length) {\n return issues;\n }\n const nodeRects = collectLayoutNodeRects(nodes);\n const epsilon = 1;\n const edgeSegments = [];\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = edge.points;\n if (!points || points.length < 2) {\n continue;\n }\n const edgeStart = edge.start;\n const edgeEnd = edge.end;\n const ownLabelId = edge.labelNodeId;\n const edgeId = edge.id ?? `${edgeStart}->${edgeEnd}`;\n for (const rect of nodeRects) {\n if (rect.nodeId === edgeStart || rect.nodeId === edgeEnd) {\n continue;\n }\n if (ownLabelId && rect.nodeId === ownLabelId) {\n continue;\n }\n for (let i = 0; i < points.length - 1; i++) {\n if (segmentBoundsOverlapRect(points[i], points[i + 1], rect, -epsilon)) {\n issues.push({\n type: \"edge-node-overlap\",\n edgeId,\n targetId: rect.nodeId,\n detail: `segment ${i} passes through node \"${rect.nodeId}\"`\n });\n break;\n }\n }\n }\n for (let i = 0; i < points.length - 1; i++) {\n edgeSegments.push({\n edgeId,\n start: edgeStart,\n end: edgeEnd,\n p1: points[i],\n p2: points[i + 1]\n });\n }\n }\n const crossingPairs = /* @__PURE__ */ new Set();\n for (let i = 0; i < edgeSegments.length; i++) {\n for (let j = i + 1; j < edgeSegments.length; j++) {\n const a = edgeSegments[i];\n const b = edgeSegments[j];\n if (a.edgeId === b.edgeId) {\n continue;\n }\n if (a.start === b.start || a.start === b.end || a.end === b.start || a.end === b.end) {\n continue;\n }\n if (segmentsIntersect(a.p1, a.p2, b.p1, b.p2)) {\n const pairKey2 = a.edgeId < b.edgeId ? `${a.edgeId}|${b.edgeId}` : `${b.edgeId}|${a.edgeId}`;\n if (!crossingPairs.has(pairKey2)) {\n crossingPairs.add(pairKey2);\n issues.push({\n type: \"edge-edge-crossing\",\n edgeId: a.edgeId,\n targetId: b.edgeId,\n detail: `edges \"${a.edgeId}\" and \"${b.edgeId}\" cross`\n });\n }\n }\n }\n }\n if (issues.length > 0) {\n const overlaps = issues.filter((i) => i.type === \"edge-node-overlap\").length;\n const crossings = issues.filter((i) => i.type === \"edge-edge-crossing\").length;\n log.warn(\n `[SWIMLANE_VALIDATE] ${issues.length} issue(s) detected: ${overlaps} edge-node overlap(s), ${crossings} edge crossing(s)`\n );\n for (const issue of issues) {\n log.warn(`[SWIMLANE_VALIDATE] ${issue.type}: ${issue.detail}`);\n }\n }\n return issues;\n}\n__name(validateSwimlanesLayout, \"validateSwimlanesLayout\");\n\n// src/rendering-util/layout-algorithms/swimlanes/postProcessing.ts\nfunction postProcessSwimlaneLayout(layout, direction) {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const contentNodes = nodes.filter((n) => !n.isGroup);\n if ((direction === \"LR\" || direction === \"RL\") && contentNodes.length > 0 && !applyLrDirectionTransform(layout, direction)) {\n return;\n }\n if (direction === \"BT\" && contentNodes.length > 0 && !applyBtDirectionTransform(layout)) {\n return;\n }\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n edge.points = simplifyPolyline(\n orthogonalizePolyline(pts)\n );\n }\n simplifyDetouredEdges(edges, nodes);\n straightenCollinearSiblingDetours(edges, nodes);\n portSwapToLShape(edges, nodes);\n const nodeByIdMap = /* @__PURE__ */ new Map();\n for (const n of nodes) {\n nodeByIdMap.set(String(n.id), n);\n }\n anchorLabelsToPolyline(edges, nodeByIdMap);\n clipEdgeEndpointsToNodeBoundaries(edges, nodeByIdMap);\n collapseShortTerminalStub(edges, nodeByIdMap);\n nudgeSharedInteriorSubpaths(edges, nodeByIdMap);\n separateSharedRenderedTerminalLanes(edges, nodeByIdMap);\n collapseRedundantRectangularDoglegs(edges, nodeByIdMap);\n liftObstacleHuggingSameSideRails(edges, nodeByIdMap);\n swapDestinationTerminalTailsToReduceCrossings(edges, nodeByIdMap);\n const finalizeRenderedEdges = /* @__PURE__ */ __name(() => {\n resolveRenderedOrthogonalCrossings(edges, nodeByIdMap);\n reassignCrossingExternalRailChannels(edges, nodeByIdMap);\n shortcutRedundantOrthogonalJogs(edges, nodeByIdMap);\n anchorLabelsToPolyline(edges, nodeByIdMap);\n prepareEdgeEndpointsForRenderer(edges, nodeByIdMap);\n liftObstacleHuggingSameSideRails(edges, nodeByIdMap);\n anchorLabelsToPolyline(edges, nodeByIdMap);\n prepareEdgeEndpointsForRenderer(edges, nodeByIdMap);\n }, \"finalizeRenderedEdges\");\n finalizeRenderedEdges();\n nudgeSharedInteriorSubpaths(edges, nodeByIdMap);\n finalizeRenderedEdges();\n liftTopLaneTitleBandsAboveRails(edges, nodeByIdMap);\n shiftLeftLaneTitleBandsLeftOfRails(edges, nodeByIdMap);\n liftTopLaneTitleBandsAboveRails(edges, nodeByIdMap);\n shiftLeftLaneTitleBandsLeftOfRails(edges, nodeByIdMap);\n}\n__name(postProcessSwimlaneLayout, \"postProcessSwimlaneLayout\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase0.helpers.ts\nfunction normalizeGraph(g) {\n const nodeById = new Map(g.nodeById);\n const seen = /* @__PURE__ */ new Set();\n const edges = [];\n for (const e of g.edges) {\n if (!nodeById.has(e.src) || !nodeById.has(e.dst)) {\n continue;\n }\n const key = `${e.id}:${e.src}->${e.dst}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n edges.push(e);\n }\n const nodes = [...nodeById.keys()];\n return { nodes, edges, layout: g.layout, nodeById };\n}\n__name(normalizeGraph, \"normalizeGraph\");\nfunction incoming(g, v) {\n return g.edges.filter((e) => e.dst === v);\n}\n__name(incoming, \"incoming\");\nfunction buildSuccessorMap(g) {\n const succs = /* @__PURE__ */ new Map();\n for (const v of g.nodes) {\n succs.set(v, []);\n }\n for (const e of g.edges) {\n succs.get(e.src).push(e.dst);\n }\n return succs;\n}\n__name(buildSuccessorMap, \"buildSuccessorMap\");\nfunction buildSortedSuccessorMap(g) {\n const succs = buildSuccessorMap(g);\n for (const successors of succs.values()) {\n successors.sort((a, b) => a.localeCompare(b));\n }\n return succs;\n}\n__name(buildSortedSuccessorMap, \"buildSortedSuccessorMap\");\nfunction buildInDegreeMap(g) {\n const indeg = /* @__PURE__ */ new Map();\n for (const v of g.nodes) {\n indeg.set(v, 0);\n }\n for (const e of g.edges) {\n indeg.set(e.dst, (indeg.get(e.dst) ?? 0) + 1);\n }\n return indeg;\n}\n__name(buildInDegreeMap, \"buildInDegreeMap\");\nfunction sortedZeroInDegreeNodes(indeg) {\n return [...indeg.entries()].filter(([, degree]) => degree === 0).map(([id]) => id).sort((a, b) => a.localeCompare(b));\n}\n__name(sortedZeroInDegreeNodes, \"sortedZeroInDegreeNodes\");\nfunction buildPredecessorSuccessorMaps(g, includeEdge = () => true) {\n const preds = /* @__PURE__ */ new Map();\n const succs = /* @__PURE__ */ new Map();\n for (const v of g.nodes) {\n preds.set(v, []);\n succs.set(v, []);\n }\n for (const e of g.edges) {\n if (!includeEdge(e)) {\n continue;\n }\n succs.get(e.src).push(e.dst);\n preds.get(e.dst).push(e.src);\n }\n return { preds, succs };\n}\n__name(buildPredecessorSuccessorMaps, \"buildPredecessorSuccessorMaps\");\nfunction buildLayersFromRanks(g, order, rankOf, opts) {\n let maxRank = 0;\n for (const v of g.nodes) {\n if (opts?.skipGroups && g.nodeById.get(v)?.isGroup) {\n continue;\n }\n maxRank = Math.max(maxRank, rankOf[v] ?? 0);\n }\n const layers = Array.from({ length: maxRank + 1 }, () => []);\n for (const v of order) {\n if (opts?.skipGroups && g.nodeById.get(v)?.isGroup) {\n continue;\n }\n layers[Math.max(0, rankOf[v] ?? 0)].push(v);\n }\n return layers;\n}\n__name(buildLayersFromRanks, \"buildLayersFromRanks\");\nfunction topoSortIfAcyclic(g) {\n const indeg = buildInDegreeMap(g);\n const queue = sortedZeroInDegreeNodes(indeg);\n const order = [];\n const adj = buildSortedSuccessorMap(g);\n while (queue.length) {\n const u = queue.shift();\n order.push(u);\n for (const v of adj.get(u) ?? []) {\n indeg.set(v, (indeg.get(v) ?? 0) - 1);\n if ((indeg.get(v) ?? 0) === 0) {\n let i = 0;\n while (i < queue.length && queue[i] < v) {\n i++;\n }\n queue.splice(i, 0, v);\n }\n }\n }\n return order.length === g.nodes.length ? order : null;\n}\n__name(topoSortIfAcyclic, \"topoSortIfAcyclic\");\nfunction buildLayerIndex(layer) {\n const m = /* @__PURE__ */ new Map();\n let index = 0;\n for (const id of layer) {\n m.set(id, index);\n index++;\n }\n return m;\n}\n__name(buildLayerIndex, \"buildLayerIndex\");\nfunction countInversions(values) {\n const tmp = new Array(values.length);\n const count = /* @__PURE__ */ __name((left, right) => {\n if (right - left <= 1) {\n return 0;\n }\n const mid = left + right >> 1;\n let inversions = count(left, mid) + count(mid, right);\n let i = left;\n let j = mid;\n let k = left;\n while (i < mid || j < right) {\n if (j >= right || i < mid && values[i] <= values[j]) {\n tmp[k++] = values[i++];\n } else {\n tmp[k++] = values[j++];\n inversions += mid - i;\n }\n }\n for (let t = left; t < right; t++) {\n values[t] = tmp[t];\n }\n return inversions;\n }, \"count\");\n return count(0, values.length);\n}\n__name(countInversions, \"countInversions\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase1.cycles.ts\nfunction removeCycles_DFS(g) {\n const gn = normalizeGraph(g);\n const adj = /* @__PURE__ */ new Map();\n for (const v of gn.nodes) {\n adj.set(v, []);\n }\n for (const e of gn.edges) {\n adj.get(e.src).push(e);\n }\n for (const arr of adj.values()) {\n arr.sort((a, b) => a.dst === b.dst ? a.id.localeCompare(b.id) : a.dst.localeCompare(b.dst));\n }\n const color = /* @__PURE__ */ Object.create(null);\n for (const v of gn.nodes) {\n color[v] = 0;\n }\n const reversed = [];\n const dfs = /* @__PURE__ */ __name((u) => {\n color[u] = 1;\n for (const e of adj.get(u) ?? []) {\n const v = e.dst;\n if (color[v] === 0) {\n dfs(v);\n } else if (color[v] === 1) {\n reversed.push(e);\n }\n }\n color[u] = 2;\n }, \"dfs\");\n const nodesSorted = [...gn.nodes].sort((a, b) => a.localeCompare(b));\n for (const v of nodesSorted) {\n if (color[v] === 0) {\n dfs(v);\n }\n }\n const toReverse = new Set(reversed.map((e) => `${e.id}:${e.src}->${e.dst}`));\n const acycEdges = gn.edges.map(\n (e) => toReverse.has(`${e.id}:${e.src}->${e.dst}`) ? { id: e.id, src: e.dst, dst: e.src, weight: e.weight, ref: e.ref } : e\n );\n const acyclic = {\n nodes: [...gn.nodes],\n edges: acycEdges,\n layout: gn.layout,\n nodeById: new Map(gn.nodeById)\n };\n return { acyclic, reversed };\n}\n__name(removeCycles_DFS, \"removeCycles_DFS\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.options.ts\nfunction buildTopLaneMap(g) {\n const cache = /* @__PURE__ */ new Map();\n const resolve = /* @__PURE__ */ __name((id) => {\n if (cache.has(id)) {\n return cache.get(id);\n }\n const node = g.nodeById.get(id);\n if (!node) {\n cache.set(id, null);\n return null;\n }\n const parentId = node.parentId;\n if (!parentId) {\n cache.set(id, null);\n return null;\n }\n const parentLane = resolve(parentId);\n const lane = parentLane ?? parentId;\n cache.set(id, lane);\n return lane;\n }, \"resolve\");\n for (const id of g.nodes) {\n resolve(id);\n }\n return cache;\n}\n__name(buildTopLaneMap, \"buildTopLaneMap\");\nfunction createTopLaneResolver(g) {\n const topLaneMap = buildTopLaneMap(g);\n return (id) => topLaneMap.get(id) ?? null;\n}\n__name(createTopLaneResolver, \"createTopLaneResolver\");\nfunction buildTopLaneOrder(g) {\n const lanes = [];\n for (const node of g.layout.nodes ?? []) {\n if (node.isGroup && !node.parentId) {\n lanes.push(node.id);\n }\n }\n return [...new Set(lanes)].reverse();\n}\n__name(buildTopLaneOrder, \"buildTopLaneOrder\");\nfunction resolveTopLaneOrder(g, preferredOrder) {\n const sourceOrder = buildTopLaneOrder(g);\n if (!preferredOrder || preferredOrder.length === 0) {\n return sourceOrder;\n }\n const sourceLaneIds = new Set(sourceOrder);\n const seen = /* @__PURE__ */ new Set();\n const resolved = [];\n for (const laneId of preferredOrder) {\n if (!sourceLaneIds.has(laneId) || seen.has(laneId)) {\n continue;\n }\n seen.add(laneId);\n resolved.push(laneId);\n }\n for (const laneId of sourceOrder) {\n if (seen.has(laneId)) {\n continue;\n }\n resolved.push(laneId);\n }\n return resolved;\n}\n__name(resolveTopLaneOrder, \"resolveTopLaneOrder\");\n\n// src/rendering-util/layout-algorithms/swimlanes/config.ts\nvar PRECISION = {\n /** Epsilon for floating-point comparisons */\n EPSILON: 1e-6\n};\nvar LAYERING = {\n /** Default number of iterations for gravity-based layering */\n GRAVITY_ITERATIONS: 8,\n /** Maximum number of passes for crossing-based rank optimization */\n MAX_CROSSING_OPTIMIZATION_PASSES: 4,\n /** Whether to compact single-input nodes by default */\n DEFAULT_COMPACT_SINGLE_INPUT: true\n};\nvar COORDINATES = {\n /** Default vertical gap between layers (px) */\n DEFAULT_LAYER_GAP: 100,\n /** Default horizontal gap between nodes (px) */\n DEFAULT_NODE_GAP: 40\n};\n\n// src/rendering-util/layout-algorithms/swimlanes/driving-tree.ts\nfunction buildDrivingTree(graph, opts) {\n const g = normalizeGraph(graph);\n const laneOf = opts?.laneOf ?? (() => null);\n const rankHint = opts?.rankHint;\n const { preds } = buildPredecessorSuccessorMaps(g);\n for (const arr of preds.values()) {\n arr.sort((a, b) => a.localeCompare(b));\n }\n const topoOrder = topoSortIfAcyclic(g) ?? [...g.nodes].sort((a, b) => a.localeCompare(b));\n const topoIndex = /* @__PURE__ */ new Map();\n for (const [idx, id] of topoOrder.entries()) {\n topoIndex.set(id, idx);\n }\n const parent = /* @__PURE__ */ new Map();\n const children = /* @__PURE__ */ new Map();\n for (const node of g.nodes) {\n children.set(node, []);\n }\n for (const node of topoOrder) {\n const candidates = (preds.get(node) ?? []).filter((p) => parent.has(p));\n if (candidates.length > 0) {\n const chosen = chooseParent(node, candidates, {\n laneOf,\n rankHint,\n topoIndex\n });\n parent.set(node, chosen);\n children.get(chosen).push(node);\n } else if (!parent.has(node)) {\n parent.set(node, null);\n }\n }\n for (const node of g.nodes) {\n if (!parent.has(node)) {\n parent.set(node, null);\n }\n }\n const rootSet = /* @__PURE__ */ new Set();\n for (const node of g.nodes) {\n if ((parent.get(node) ?? null) === null) {\n rootSet.add(node);\n }\n }\n const roots = [...rootSet].sort((a, b) => {\n const ta = topoIndex.get(a) ?? 0;\n const tb = topoIndex.get(b) ?? 0;\n if (ta === tb) {\n return a.localeCompare(b);\n }\n return ta - tb;\n });\n const adjacency = buildAdjacency(g);\n const adjacencyList = /* @__PURE__ */ new Map();\n for (const [node, set] of adjacency.entries()) {\n adjacencyList.set(\n node,\n [...set].sort((a, b) => a.localeCompare(b))\n );\n }\n const componentOf = assignComponents(adjacencyList);\n const blocks = computeBlocks(adjacencyList);\n const nodeBlocks = /* @__PURE__ */ new Map();\n for (const node of g.nodes) {\n nodeBlocks.set(node, []);\n }\n for (const block of blocks) {\n for (const node of block.nodes) {\n const list = nodeBlocks.get(node);\n if (list) {\n list.push(block.id);\n } else {\n nodeBlocks.set(node, [block.id]);\n }\n }\n }\n const preorder = [];\n const postorder = [];\n const seen = /* @__PURE__ */ new Set();\n const walk = /* @__PURE__ */ __name((node) => {\n if (seen.has(node)) {\n return;\n }\n seen.add(node);\n preorder.push(node);\n for (const child of children.get(node) ?? []) {\n walk(child);\n }\n postorder.push(node);\n }, \"walk\");\n for (const root of roots) {\n walk(root);\n }\n for (const node of topoOrder) {\n walk(node);\n }\n return {\n parent,\n children,\n roots,\n componentOf,\n blocks,\n nodeBlocks,\n adjacency: adjacencyList,\n preorder,\n postorder,\n topologicalOrder: topoOrder\n };\n}\n__name(buildDrivingTree, \"buildDrivingTree\");\nfunction chooseParent(node, candidates, ctx) {\n const laneNode = ctx.laneOf(node);\n const sorted = [...candidates].sort((a, b) => {\n const laneA = ctx.laneOf(a);\n const laneB = ctx.laneOf(b);\n const sameLaneA = laneA != null && laneA === laneNode;\n const sameLaneB = laneB != null && laneB === laneNode;\n if (sameLaneA !== sameLaneB) {\n return sameLaneA ? -1 : 1;\n }\n const rankA = ctx.rankHint?.[a];\n const rankB = ctx.rankHint?.[b];\n if (rankA != null && rankB != null && rankA !== rankB) {\n return rankB - rankA;\n }\n const idxA = ctx.topoIndex.get(a) ?? 0;\n const idxB = ctx.topoIndex.get(b) ?? 0;\n if (idxA !== idxB) {\n return idxA - idxB;\n }\n return a.localeCompare(b);\n });\n return sorted[0];\n}\n__name(chooseParent, \"chooseParent\");\nfunction buildAdjacency(g) {\n const adjacency = /* @__PURE__ */ new Map();\n for (const node of g.nodes) {\n adjacency.set(node, /* @__PURE__ */ new Set());\n }\n for (const e of g.edges) {\n adjacency.get(e.src).add(e.dst);\n adjacency.get(e.dst).add(e.src);\n }\n return adjacency;\n}\n__name(buildAdjacency, \"buildAdjacency\");\nfunction assignComponents(adjacency) {\n const componentOf = /* @__PURE__ */ new Map();\n let componentId = 0;\n for (const node of adjacency.keys()) {\n if (componentOf.has(node)) {\n continue;\n }\n const stack = [node];\n while (stack.length > 0) {\n const cur = stack.pop();\n if (componentOf.has(cur)) {\n continue;\n }\n componentOf.set(cur, componentId);\n for (const next of adjacency.get(cur) ?? []) {\n if (!componentOf.has(next)) {\n stack.push(next);\n }\n }\n }\n componentId++;\n }\n return componentOf;\n}\n__name(assignComponents, \"assignComponents\");\nfunction computeBlocks(adjacency) {\n const discovery = /* @__PURE__ */ new Map();\n const low = /* @__PURE__ */ new Map();\n const edgeStack = [];\n const blocks = [];\n let time = 0;\n const visit = /* @__PURE__ */ __name((node, parent) => {\n discovery.set(node, ++time);\n low.set(node, time);\n for (const next of adjacency.get(node) ?? []) {\n if (next === parent) {\n continue;\n }\n if (!discovery.has(next)) {\n edgeStack.push([node, next]);\n visit(next, node);\n low.set(node, Math.min(low.get(node) ?? time, low.get(next) ?? time));\n if ((low.get(next) ?? 0) >= (discovery.get(node) ?? 0)) {\n blocks.push(popBlock(node, next, edgeStack, blocks.length));\n }\n } else if ((discovery.get(next) ?? 0) < (discovery.get(node) ?? 0)) {\n edgeStack.push([node, next]);\n low.set(node, Math.min(low.get(node) ?? time, discovery.get(next) ?? time));\n }\n }\n }, \"visit\");\n for (const node of adjacency.keys()) {\n if (!discovery.has(node)) {\n visit(node, null);\n }\n }\n return blocks;\n}\n__name(computeBlocks, \"computeBlocks\");\nfunction popBlock(u, v, stack, id) {\n const edges = [];\n const nodes = /* @__PURE__ */ new Set();\n while (stack.length > 0) {\n const edge = stack.pop();\n edges.push(edge);\n nodes.add(edge[0]);\n nodes.add(edge[1]);\n if (edge[0] === u && edge[1] === v || edge[0] === v && edge[1] === u) {\n break;\n }\n }\n return { id, edges, nodes: [...nodes] };\n}\n__name(popBlock, \"popBlock\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.crossCounts.ts\nfunction computeSubtreeCrossCounts(g, rankOf, tree) {\n const nodes = [...g.nodes];\n const indexOf = /* @__PURE__ */ new Map();\n for (const [i, node] of nodes.entries()) {\n indexOf.set(node, i);\n }\n const n = nodes.length;\n const parentIdx = new Array(n).fill(-1);\n const depth = new Array(n).fill(0);\n const queue = [];\n const seen = /* @__PURE__ */ new Set();\n for (const node of nodes) {\n const parentId = tree.parent.get(node) ?? null;\n const idx = indexOf.get(node);\n if (idx == null) {\n continue;\n }\n if (parentId == null) {\n parentIdx[idx] = -1;\n depth[idx] = 0;\n if (!seen.has(node)) {\n seen.add(node);\n queue.push(node);\n }\n }\n }\n while (queue.length > 0) {\n const current = queue.shift();\n const currentIdx = indexOf.get(current);\n if (currentIdx == null) {\n continue;\n }\n const childList = tree.children.get(current) ?? [];\n for (const child of childList) {\n if (seen.has(child)) {\n continue;\n }\n const childIdx = indexOf.get(child);\n if (childIdx == null) {\n continue;\n }\n parentIdx[childIdx] = currentIdx;\n depth[childIdx] = depth[currentIdx] + 1;\n seen.add(child);\n queue.push(child);\n }\n }\n for (const node of nodes) {\n if (seen.has(node)) {\n continue;\n }\n const idx = indexOf.get(node);\n if (idx == null) {\n continue;\n }\n parentIdx[idx] = -1;\n depth[idx] = 0;\n seen.add(node);\n }\n const maxLog = Math.max(1, Math.ceil(Math.log2(Math.max(1, n))) + 1);\n const up = Array.from({ length: maxLog }, () => new Array(n).fill(-1));\n for (let i = 0; i < n; i++) {\n up[0][i] = parentIdx[i];\n }\n for (let k = 1; k < maxLog; k++) {\n for (let i = 0; i < n; i++) {\n const prev = up[k - 1][i];\n up[k][i] = prev === -1 ? -1 : up[k - 1][prev];\n }\n }\n const lcaIndex = /* @__PURE__ */ __name((aIdx, bIdx) => {\n if (aIdx === -1 || bIdx === -1) {\n return -1;\n }\n if (depth[aIdx] < depth[bIdx]) {\n [aIdx, bIdx] = [bIdx, aIdx];\n }\n const diff = depth[aIdx] - depth[bIdx];\n for (let k = 0; k < maxLog; k++) {\n if (diff >> k & 1) {\n aIdx = up[k][aIdx];\n if (aIdx === -1) {\n return -1;\n }\n }\n }\n if (aIdx === bIdx) {\n return aIdx;\n }\n for (let k = maxLog - 1; k >= 0; k--) {\n const upA = up[k][aIdx];\n const upB = up[k][bIdx];\n if (upA === -1 || upB === -1) {\n continue;\n }\n if (upA !== upB) {\n aIdx = upA;\n bIdx = upB;\n }\n }\n return up[0][aIdx];\n }, \"lcaIndex\");\n const ownCounts = Array.from({ length: n }, () => /* @__PURE__ */ new Map());\n for (const edge of g.edges) {\n let src = edge.src;\n let dst = edge.dst;\n let ru = rankOf[src];\n let rv = rankOf[dst];\n if (ru == null || rv == null) {\n continue;\n }\n if (ru > rv) {\n [src, dst] = [dst, src];\n [ru, rv] = [rv, ru];\n }\n if (ru == null || rv == null || ru === rv) {\n continue;\n }\n const upperIdx = indexOf.get(src);\n const lowerIdx = indexOf.get(dst);\n if (upperIdx == null || lowerIdx == null) {\n continue;\n }\n const lca = lcaIndex(upperIdx, lowerIdx);\n if (lca === -1) {\n continue;\n }\n const bucket = ownCounts[lca];\n for (let layer = ru; layer < rv; layer++) {\n bucket.set(layer, (bucket.get(layer) ?? 0) + 1);\n }\n }\n const crossCounts = /* @__PURE__ */ new Map();\n const mergeInto = /* @__PURE__ */ __name((target, source) => {\n if (source.size === 0) {\n return;\n }\n for (const [layer, value] of source) {\n target.set(layer, (target.get(layer) ?? 0) + value);\n }\n }, \"mergeInto\");\n const visited = /* @__PURE__ */ new Set();\n const dfs = /* @__PURE__ */ __name((node) => {\n const idx = indexOf.get(node);\n visited.add(node);\n const base = idx == null ? void 0 : ownCounts[idx];\n const accumulator = base ? new Map(base) : /* @__PURE__ */ new Map();\n const childList = tree.children.get(node) ?? [];\n for (const child of childList) {\n const childMap = dfs(child);\n const parentLayer = rankOf[node];\n if (parentLayer != null) {\n let map = crossCounts.get(node);\n if (!map) {\n map = /* @__PURE__ */ new Map();\n crossCounts.set(node, map);\n }\n let value = childMap.get(parentLayer) ?? 0;\n const childLayer = rankOf[child];\n if (childLayer != null && childLayer > parentLayer) {\n value += 1;\n }\n map.set(child, value);\n }\n mergeInto(accumulator, childMap);\n }\n return accumulator;\n }, \"dfs\");\n for (const root of tree.roots) {\n if (!visited.has(root)) {\n dfs(root);\n }\n }\n for (const node of nodes) {\n if (!visited.has(node)) {\n dfs(node);\n }\n }\n return crossCounts;\n}\n__name(computeSubtreeCrossCounts, \"computeSubtreeCrossCounts\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.multitree.core.ts\nfunction annotateMinimumLayers(nodes, children, rankOf) {\n const minLayer = /* @__PURE__ */ new Map();\n const annotate = /* @__PURE__ */ __name((node) => {\n let minL = rankOf[node] ?? 0;\n const childList = [...children.get(node) ?? []];\n childList.sort(compareByRankThenId(rankOf));\n for (const child of childList) {\n annotate(child);\n const childMin = minLayer.get(child);\n if (childMin != null) {\n minL = Math.min(minL, childMin);\n }\n }\n minLayer.set(node, minL);\n }, \"annotate\");\n for (const node of nodes) {\n annotate(node);\n }\n return minLayer;\n}\n__name(annotateMinimumLayers, \"annotateMinimumLayers\");\nfunction compareByRankThenId(rankOf) {\n return (a, b) => {\n const ra = rankOf[a] ?? 0;\n const rb = rankOf[b] ?? 0;\n return ra === rb ? a.localeCompare(b) : ra - rb;\n };\n}\n__name(compareByRankThenId, \"compareByRankThenId\");\nfunction emitNodesInTreeOrder(roots, allNodes, rankOf, orderChildren) {\n let maxRank = 0;\n for (const node of allNodes) {\n const r = rankOf[node] ?? 0;\n if (r > maxRank) {\n maxRank = r;\n }\n }\n const layers = Array.from({ length: maxRank + 1 }, () => []);\n const emitted = /* @__PURE__ */ new Set();\n const emit = /* @__PURE__ */ __name((node) => {\n if (emitted.has(node)) {\n return;\n }\n emitted.add(node);\n const layer = rankOf[node] ?? 0;\n if (!layers[layer]) {\n layers[layer] = [];\n }\n layers[layer].push(node);\n for (const child of orderChildren(node)) {\n emit(child);\n }\n }, \"emit\");\n for (const root of roots) {\n emit(root);\n }\n for (const node of allNodes) {\n if (!emitted.has(node)) {\n const layer = rankOf[node] ?? 0;\n if (!layers[layer]) {\n layers[layer] = [];\n }\n layers[layer].push(node);\n emitted.add(node);\n }\n }\n return layers;\n}\n__name(emitNodesInTreeOrder, \"emitNodesInTreeOrder\");\nfunction deduplicateLayers(layers) {\n const result = [];\n for (const layer of layers) {\n const seen = /* @__PURE__ */ new Set();\n const deduped = [];\n for (const id of layer) {\n if (seen.has(id)) {\n continue;\n }\n seen.add(id);\n deduped.push(id);\n }\n result.push(deduped);\n }\n return result;\n}\n__name(deduplicateLayers, \"deduplicateLayers\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.multitree.order.ts\nfunction createChildOrderer(children, rankOf, crossCounts, minLayer) {\n return (node) => {\n const raw = children.get(node) ?? [];\n if (raw.length === 0) {\n return [];\n }\n const layer = rankOf[node] ?? 0;\n const future = [];\n const present = [];\n const crossMap = crossCounts.get(node);\n for (const child of raw) {\n const minL = minLayer.get(child) ?? layer;\n if (minL > layer) {\n future.push({ child, min: minL });\n } else {\n present.push(child);\n }\n }\n future.sort((a, b) => {\n if (a.min === b.min) {\n return a.child.localeCompare(b.child);\n }\n return a.min - b.min;\n });\n present.sort((a, b) => {\n const ca = crossMap?.get(a) ?? 0;\n const cb = crossMap?.get(b) ?? 0;\n if (ca !== cb) {\n return ca - cb;\n }\n const ma = minLayer.get(a) ?? layer;\n const mb = minLayer.get(b) ?? layer;\n if (ma !== mb) {\n return ma - mb;\n }\n return a.localeCompare(b);\n });\n return [...future.map((item) => item.child), ...present];\n };\n}\n__name(createChildOrderer, \"createChildOrderer\");\nfunction buildMultitreeLayerOrder(g, rankOf, laneOf) {\n const tree = buildDrivingTree(g, {\n rankHint: rankOf,\n laneOf\n });\n const { children, roots } = tree;\n for (const node of g.nodes) {\n if (!children.has(node)) {\n children.set(node, []);\n }\n }\n const crossCounts = computeSubtreeCrossCounts(g, rankOf, tree);\n const rootsSorted = [...roots].sort(compareByRankThenId(rankOf));\n const minLayer = annotateMinimumLayers(rootsSorted, children, rankOf);\n const orderChildren = createChildOrderer(children, rankOf, crossCounts, minLayer);\n let layers = emitNodesInTreeOrder(rootsSorted, g.nodes, rankOf, orderChildren);\n layers = deduplicateLayers(layers);\n return layers;\n}\n__name(buildMultitreeLayerOrder, \"buildMultitreeLayerOrder\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.crossOptimization.ts\nfunction countCrossingsBetweenAdjacent(upper, lower, edges) {\n const upperSet = new Set(upper);\n const lowerSet = new Set(lower);\n const li = buildLayerIndex(lower);\n const vs = [];\n for (const e of edges) {\n if (upperSet.has(e.src) && lowerSet.has(e.dst)) {\n vs.push(li.get(e.dst));\n }\n }\n return countInversions(vs);\n}\n__name(countCrossingsBetweenAdjacent, \"countCrossingsBetweenAdjacent\");\nfunction totalCrossings(layers, edges, rankOf) {\n const expanded = [];\n for (const e of edges) {\n const ru = rankOf[e.src];\n const rv = rankOf[e.dst];\n if (ru == null || rv == null || ru === rv) {\n continue;\n }\n let upper = e.src;\n let lower = e.dst;\n let rUpper = ru;\n let rLower = rv;\n if (ru > rv) {\n upper = e.dst;\n lower = e.src;\n rUpper = rv;\n rLower = ru;\n }\n for (let L = rUpper; L < rLower; L++) {\n expanded.push({ id: `${e.id}@${L}`, src: upper, dst: lower, ref: e.ref });\n }\n }\n let sum = 0;\n for (let i = 0; i + 1 < layers.length; i++) {\n sum += countCrossingsBetweenAdjacent(layers[i], layers[i + 1], expanded);\n }\n return sum;\n}\n__name(totalCrossings, \"totalCrossings\");\nfunction optimizeRanksByCrossings(g, initialRank) {\n const rankOf = { ...initialRank };\n const { preds } = buildPredecessorSuccessorMaps(g);\n const laneOf = createTopLaneResolver(g);\n const layers = buildMultitreeLayerOrder(g, rankOf, laneOf);\n let best = totalCrossings(layers, g.edges, rankOf);\n const maxPasses = LAYERING.MAX_CROSSING_OPTIMIZATION_PASSES;\n for (let pass = 0; pass < maxPasses; pass++) {\n let changed = false;\n const nodesByRank = [...g.nodes].sort((a, b) => (rankOf[b] ?? 0) - (rankOf[a] ?? 0));\n for (const v of nodesByRank) {\n const r = rankOf[v] ?? 0;\n if (r === 0) {\n continue;\n }\n let lb = 0;\n for (const u of preds.get(v) ?? []) {\n lb = Math.max(lb, (rankOf[u] ?? 0) + 1);\n }\n if (lb >= r) {\n continue;\n }\n const old = r;\n rankOf[v] = lb;\n const trialLayers = buildMultitreeLayerOrder(g, rankOf, laneOf);\n const score = totalCrossings(trialLayers, g.edges, rankOf);\n if (score < best) {\n best = score;\n changed = true;\n } else {\n rankOf[v] = old;\n }\n }\n if (!changed) {\n break;\n }\n }\n return rankOf;\n}\n__name(optimizeRanksByCrossings, \"optimizeRanksByCrossings\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.crossLaneAdjust.ts\nfunction adjustCrossLaneSources(g, rankOf) {\n const topLaneOf = createTopLaneResolver(g);\n const nodesByRank = [...g.nodes].sort(\n (a, b) => (rankOf[a] ?? 0) - (rankOf[b] ?? 0) || a.localeCompare(b)\n );\n for (const v of nodesByRank) {\n const laneV = topLaneOf(v);\n if (!laneV) {\n continue;\n }\n const outEdges = g.edges.filter((e) => e.src === v);\n if (outEdges.length === 0) {\n continue;\n }\n let hasSameLaneSucc = false;\n let crossLaneCount = 0;\n for (const e of outEdges) {\n const laneDst = topLaneOf(e.dst);\n if (laneDst == null || laneDst === laneV) {\n hasSameLaneSucc = true;\n } else {\n crossLaneCount++;\n }\n }\n if (crossLaneCount === 0 || hasSameLaneSucc) {\n continue;\n }\n let crossLaneIncoming = 0;\n let hasSameLanePred = false;\n for (const e of g.edges) {\n if (e.dst !== v) {\n continue;\n }\n const laneSrc = topLaneOf(e.src);\n if (!laneSrc) {\n continue;\n }\n if (laneSrc === laneV) {\n hasSameLanePred = true;\n } else {\n crossLaneIncoming++;\n }\n }\n if (crossLaneIncoming > 0 || !hasSameLanePred) {\n continue;\n }\n const current = rankOf[v] ?? 0;\n const target = current + crossLaneCount;\n let lb = 0;\n for (const e of g.edges) {\n if (e.dst === v) {\n lb = Math.max(lb, (rankOf[e.src] ?? 0) + 1);\n }\n }\n const newRank = Math.max(current, lb, target);\n if (newRank !== current) {\n rankOf[v] = newRank;\n }\n }\n}\n__name(adjustCrossLaneSources, \"adjustCrossLaneSources\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.longestPath.ts\nfunction assignLayers_LongestPath(gAcyclic, opts) {\n const g = normalizeGraph(gAcyclic);\n const order = topoSortIfAcyclic(g) ?? [...g.nodes].sort();\n const compact = opts?.compactSingleInput ?? false;\n const topLaneOf = createTopLaneResolver(g);\n let rankOf = /* @__PURE__ */ Object.create(null);\n for (const v of order) {\n const incAll = incoming(g, v);\n const inc = opts?.ignoreCrossLaneEdges ? incAll.filter((e) => {\n const laneSrc = topLaneOf(e.src);\n const laneDst = topLaneOf(v);\n if (!laneSrc || !laneDst) {\n return true;\n }\n return laneSrc === laneDst;\n }) : incAll;\n if (inc.length === 0) {\n rankOf[v] = 0;\n } else if (compact && inc.length === 1) {\n const u = inc[0].src;\n const laneU = topLaneOf(u);\n const laneV = topLaneOf(v);\n if (laneU !== laneV) {\n rankOf[v] = rankOf[u] ?? 0;\n } else {\n rankOf[v] = (rankOf[u] ?? 0) + 1;\n }\n } else {\n let mx = -Infinity;\n for (const e of inc) {\n mx = Math.max(mx, (rankOf[e.src] ?? 0) + 1);\n }\n rankOf[v] = mx === -Infinity ? 0 : mx;\n }\n }\n if (opts?.optimizeRanksByCrossings ?? false) {\n rankOf = optimizeRanksByCrossings(g, rankOf);\n }\n if (opts?.ignoreCrossLaneEdges) {\n adjustCrossLaneSources(g, rankOf);\n }\n const layers = buildMultitreeLayerOrder(g, rankOf, topLaneOf);\n return { layers, rankOf, dummy: /* @__PURE__ */ new Set() };\n}\n__name(assignLayers_LongestPath, \"assignLayers_LongestPath\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.gravity.ts\nfunction assignLayers_Gravity(gAcyclic, opts) {\n const g = normalizeGraph(gAcyclic);\n const base = assignLayers_LongestPath(g, {\n compactSingleInput: opts?.compactSingleInput,\n ignoreCrossLaneEdges: opts?.ignoreCrossLaneEdges,\n optimizeRanksByCrossings: opts?.optimizeRanksByCrossings\n });\n const rankOf = { ...base.rankOf };\n const topLaneOf = createTopLaneResolver(g);\n const { preds, succs } = buildPredecessorSuccessorMaps(g, (e) => {\n if (opts?.ignoreCrossLaneEdges) {\n const laneSrc = topLaneOf(e.src);\n const laneDst = topLaneOf(e.dst);\n if (laneSrc && laneDst && laneSrc !== laneDst) {\n return false;\n }\n }\n return true;\n });\n const order = topoSortIfAcyclic(g) ?? [...g.nodes];\n const revOrder = [...order].reverse();\n const clampFeasible = /* @__PURE__ */ __name((v, desired) => {\n let lb = 0;\n for (const u of preds.get(v) ?? []) {\n lb = Math.max(lb, (rankOf[u] ?? 0) + 1);\n }\n let ub = Number.POSITIVE_INFINITY;\n const s = succs.get(v) ?? [];\n if (s.length > 0) {\n ub = Math.min(...s.map((w) => (rankOf[w] ?? 0) - 1));\n }\n if (!Number.isFinite(ub)) {\n ub = Math.max(lb, desired);\n }\n return Math.min(Math.max(desired, lb), ub);\n }, \"clampFeasible\");\n const iters = LAYERING.GRAVITY_ITERATIONS;\n const relaxOrder = /* @__PURE__ */ __name((nodeOrder) => {\n let changed = false;\n for (const v of nodeOrder) {\n const ps = preds.get(v) ?? [];\n const ss = succs.get(v) ?? [];\n if (ps.length === 0 && ss.length === 0) {\n continue;\n }\n const predAvg = ps.length > 0 ? ps.reduce((a, u) => a + (rankOf[u] ?? 0) + 1, 0) / ps.length : rankOf[v] ?? 0;\n const succAvg = ss.length > 0 ? ss.reduce((a, w) => a + (rankOf[w] ?? 0) - 1, 0) / ss.length : rankOf[v] ?? 0;\n const desired = Math.round((predAvg + succAvg) / 2);\n const clamped = clampFeasible(v, desired);\n if (clamped !== rankOf[v]) {\n rankOf[v] = clamped;\n changed = true;\n }\n }\n return changed;\n }, \"relaxOrder\");\n for (let it = 0; it < iters; it++) {\n const forwardChanged = relaxOrder(order);\n const backwardChanged = relaxOrder(revOrder);\n if (!forwardChanged && !backwardChanged) {\n break;\n }\n }\n for (const v of order) {\n let lb = 0;\n for (const u of preds.get(v) ?? []) {\n lb = Math.max(lb, (rankOf[u] ?? 0) + 1);\n }\n if ((rankOf[v] ?? 0) < lb) {\n rankOf[v] = lb;\n }\n }\n for (const v of revOrder) {\n const s = succs.get(v) ?? [];\n if (s.length > 0) {\n const ub = Math.min(...s.map((w) => (rankOf[w] ?? 0) - 1));\n if ((rankOf[v] ?? 0) > ub) {\n rankOf[v] = ub;\n }\n }\n }\n const layers = buildLayersFromRanks(g, order, rankOf);\n return { layers, rankOf, dummy: /* @__PURE__ */ new Set() };\n}\n__name(assignLayers_Gravity, \"assignLayers_Gravity\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.laneAwareCompact.ts\nfunction topoSortByGenerationIfAcyclic(g) {\n const indeg = buildInDegreeMap(g);\n const adj = buildSortedSuccessorMap(g);\n let frontier = sortedZeroInDegreeNodes(indeg);\n const order = [];\n while (frontier.length > 0) {\n const nextFrontier = [];\n for (const u of frontier) {\n order.push(u);\n for (const v of adj.get(u) ?? []) {\n indeg.set(v, (indeg.get(v) ?? 0) - 1);\n if ((indeg.get(v) ?? 0) === 0) {\n nextFrontier.push(v);\n }\n }\n }\n frontier = nextFrontier.sort((a, b) => a.localeCompare(b));\n }\n return order.length === g.nodes.length ? order : null;\n}\n__name(topoSortByGenerationIfAcyclic, \"topoSortByGenerationIfAcyclic\");\nfunction assignLayers_LaneAwareCompact(gAcyclic, opts) {\n const g = normalizeGraph(gAcyclic);\n const order = opts?.direction === \"LR\" ? topoSortByGenerationIfAcyclic(g) ?? [...g.nodes].sort() : topoSortIfAcyclic(g) ?? [...g.nodes].sort();\n const topLaneOf = createTopLaneResolver(g);\n const laneOf = /* @__PURE__ */ __name((id) => topLaneOf(id) ?? id, \"laneOf\");\n const rankOf = /* @__PURE__ */ Object.create(null);\n const nextFree = /* @__PURE__ */ new Map();\n const edgeWeight = /* @__PURE__ */ __name((u, v) => {\n const ignoreCrossLane = opts?.ignoreCrossLaneEdges ?? true;\n if (ignoreCrossLane) {\n return laneOf(u) === laneOf(v) ? 1 : 0;\n }\n return 1;\n }, \"edgeWeight\");\n for (const v of order) {\n const node = g.nodeById.get(v);\n if (node?.isGroup) {\n continue;\n }\n const preds = incoming(g, v);\n let base = 0;\n if (preds.length > 0) {\n for (const e of preds) {\n const u = e.src;\n const ru = rankOf[u] ?? 0;\n base = Math.max(base, ru + edgeWeight(u, v));\n }\n }\n const lane = laneOf(v);\n const nf = nextFree.get(lane) ?? 0;\n const L = Math.max(base, nf);\n rankOf[v] = L;\n nextFree.set(lane, L + 1);\n }\n const layers = buildLayersFromRanks(g, order, rankOf, { skipGroups: true });\n return { layers, rankOf, dummy: /* @__PURE__ */ new Set() };\n}\n__name(assignLayers_LaneAwareCompact, \"assignLayers_LaneAwareCompact\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.dummies.ts\nfunction makeProperLayering(layering, gAcyclic) {\n const g = normalizeGraph(gAcyclic);\n const { rankOf } = layering;\n const layers = layering.layers.map((l) => [...l]);\n const dummy = new Set(layering.dummy ? [...layering.dummy] : []);\n let dummySeq = 0;\n const nodeById = new Map(g.nodeById);\n const addDummyAt = /* @__PURE__ */ __name((L) => {\n const id = `placeholder-${dummySeq++}`;\n const dn = { id, isGroup: false, isDummy: true, width: 0, height: 0 };\n nodeById.set(id, dn);\n dummy.add(id);\n while (layers.length <= L) {\n layers.push([]);\n }\n layers[L].push(id);\n rankOf[id] = L;\n return id;\n }, \"addDummyAt\");\n const edgesSorted = [...g.edges].sort(\n (a, b) => a.id === b.id ? a.src === b.src ? a.dst.localeCompare(b.dst) : a.src.localeCompare(b.src) : a.id.localeCompare(b.id)\n );\n const newEdges = [];\n for (const e of edgesSorted) {\n const rU = rankOf[e.src] ?? 0;\n const rV = rankOf[e.dst] ?? 0;\n if (rV - rU <= 1) {\n newEdges.push(e);\n continue;\n }\n let prev = e.src;\n for (let L = rU + 1, k = 0; L < rV; L++, k++) {\n const d = addDummyAt(L);\n newEdges.push({ id: `${e.id}#${k}`, src: prev, dst: d, weight: e.weight, ref: e.ref });\n prev = d;\n }\n const lastIndex = rV - rU - 2;\n newEdges.push({\n id: `${e.id}#${Math.max(lastIndex + 1, 0)}`,\n src: prev,\n dst: e.dst,\n weight: e.weight,\n ref: e.ref\n });\n }\n const nodes = [...g.nodes, ...[...dummy].filter((id) => !g.nodes.includes(id))];\n const graphWithDummies = { nodes, edges: newEdges, layout: g.layout, nodeById };\n return { layering: { layers, rankOf, dummy }, graphWithDummies };\n}\n__name(makeProperLayering, \"makeProperLayering\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase3.ordering.ts\nfunction median(values) {\n const n = values.length;\n if (n === 0) {\n return Number.POSITIVE_INFINITY;\n }\n const a = [...values].sort((x, y) => x - y);\n if (n % 2 === 1) {\n return a[(n - 1) / 2];\n }\n return 0.5 * (a[n / 2 - 1] + a[n / 2]);\n}\n__name(median, \"median\");\nfunction barycenter(values) {\n if (values.length === 0) {\n return Number.POSITIVE_INFINITY;\n }\n const s = values.reduce((acc, v) => acc + v, 0);\n return s / values.length;\n}\n__name(barycenter, \"barycenter\");\nfunction neighborPositionsFor(targetNodes, fixedIndex, edges, direction) {\n const neighborPositions = /* @__PURE__ */ new Map();\n for (const v of targetNodes) {\n neighborPositions.set(v, []);\n }\n for (const e of edges) {\n if (direction === \"down\") {\n if (fixedIndex.has(e.src) && neighborPositions.has(e.dst)) {\n neighborPositions.get(e.dst).push(fixedIndex.get(e.src));\n }\n } else if (fixedIndex.has(e.dst) && neighborPositions.has(e.src)) {\n neighborPositions.get(e.src).push(fixedIndex.get(e.dst));\n }\n }\n return neighborPositions;\n}\n__name(neighborPositionsFor, \"neighborPositionsFor\");\nfunction currentOrderTieBreak(a, b, currentLayerIndex) {\n const ia = currentLayerIndex.get(a) ?? 0;\n const ib = currentLayerIndex.get(b) ?? 0;\n return ia !== ib ? ia - ib : a.localeCompare(b);\n}\n__name(currentOrderTieBreak, \"currentOrderTieBreak\");\nfunction countCrossingsBetweenAdjacent2(upper, lower, edges) {\n const upperSet = new Set(upper);\n const lowerSet = new Set(lower);\n const upperIndex = buildLayerIndex(upper);\n const lowerIndex = buildLayerIndex(lower);\n const pairs = [];\n for (const e of edges) {\n if (upperSet.has(e.src) && lowerSet.has(e.dst)) {\n pairs.push({ u: upperIndex.get(e.src), v: lowerIndex.get(e.dst) });\n }\n }\n pairs.sort((a, b) => a.u === b.u ? a.v - b.v : a.u - b.u);\n const vs = pairs.map((p) => p.v);\n return countInversions(vs);\n}\n__name(countCrossingsBetweenAdjacent2, \"countCrossingsBetweenAdjacent\");\nfunction sortByHeuristic(nodes, neighborPositions, currentLayerIndex) {\n return [...nodes].sort((a, b) => {\n const sa = median(neighborPositions.get(a) ?? []);\n const sb = median(neighborPositions.get(b) ?? []);\n if (sa === sb) {\n return currentOrderTieBreak(a, b, currentLayerIndex);\n }\n if (!isFinite(sa)) {\n return 1;\n }\n if (!isFinite(sb)) {\n return -1;\n }\n return sa - sb;\n });\n}\n__name(sortByHeuristic, \"sortByHeuristic\");\nfunction reorderLayer(fixedLayer, targetLayer, edges, direction, topLaneOf, laneOrder) {\n const fixedIndex = buildLayerIndex(fixedLayer);\n const currIndex = buildLayerIndex(targetLayer);\n const neighborPositions = neighborPositionsFor(targetLayer, fixedIndex, edges, direction);\n if (!topLaneOf || !laneOrder || laneOrder.length === 0) {\n return sortByHeuristic(targetLayer, neighborPositions, currIndex);\n }\n const byLane = /* @__PURE__ */ new Map();\n for (const id of targetLayer) {\n const lane = topLaneOf(id);\n const arr = byLane.get(lane) ?? [];\n arr.push(id);\n byLane.set(lane, arr);\n }\n const result = [];\n for (const lane of laneOrder) {\n const nodesInLane = byLane.get(lane);\n if (!nodesInLane || nodesInLane.length === 0) {\n continue;\n }\n const sorted = sortByHeuristic(nodesInLane, neighborPositions, currIndex);\n result.push(...sorted);\n }\n const nullNodes = byLane.get(null);\n if (nullNodes && nullNodes.length > 0) {\n const sorted = sortByHeuristic(nullNodes, neighborPositions, currIndex);\n for (const nid of sorted) {\n const bc = barycenter(neighborPositions.get(nid) ?? []);\n let bestIdx = result.length;\n if (isFinite(bc)) {\n for (const [i, rid] of result.entries()) {\n const rBc = barycenter(neighborPositions.get(rid) ?? []);\n if (bc < rBc) {\n bestIdx = i;\n break;\n }\n }\n }\n result.splice(bestIdx, 0, nid);\n }\n }\n return result;\n}\n__name(reorderLayer, \"reorderLayer\");\nfunction transposeImprove(upper, current, edges, next, topLaneOf) {\n const best = [...current];\n const upperSet = new Set(upper);\n const layerSet = new Set(current);\n const nextSet = next ? new Set(next) : null;\n const edgesIn = edges.filter((e) => upperSet.has(e.src) && layerSet.has(e.dst));\n const edgesOut = nextSet ? edges.filter((e) => layerSet.has(e.src) && nextSet.has(e.dst)) : void 0;\n const crossingScore = /* @__PURE__ */ __name((order) => {\n let score = countCrossingsBetweenAdjacent2(upper, order, edgesIn);\n if (edgesOut && next) {\n score += countCrossingsBetweenAdjacent2(order, next, edgesOut);\n }\n return score;\n }, \"crossingScore\");\n const laneOf = topLaneOf ? /* @__PURE__ */ new Map() : null;\n if (topLaneOf && laneOf) {\n for (const id of current) {\n laneOf.set(id, topLaneOf(id));\n }\n }\n let improved = true;\n let bestScore = crossingScore(best);\n while (improved) {\n improved = false;\n for (let i = 0; i + 1 < best.length; i++) {\n if (laneOf) {\n const laneA = laneOf.get(best[i]);\n const laneB = laneOf.get(best[i + 1]);\n if (laneA !== laneB) {\n continue;\n }\n }\n const prev = bestScore;\n [best[i], best[i + 1]] = [best[i + 1], best[i]];\n const nextScore = crossingScore(best);\n if (nextScore < prev) {\n bestScore = nextScore;\n improved = true;\n } else {\n [best[i], best[i + 1]] = [best[i + 1], best[i]];\n }\n }\n }\n return best;\n}\n__name(transposeImprove, \"transposeImprove\");\nfunction orderLayers(layering, gWithDummies, opts) {\n const layers = layering.layers.map((l) => [...l]);\n const edges = gWithDummies.edges;\n const topLaneOf = createTopLaneResolver(gWithDummies);\n const laneOrder = resolveTopLaneOrder(gWithDummies, opts?.laneOrder);\n for (let s = 0; s < 3; s++) {\n for (let i = 1; i < layers.length; i++) {\n layers[i] = reorderLayer(layers[i - 1], layers[i], edges, \"down\", topLaneOf, laneOrder);\n layers[i] = transposeImprove(layers[i - 1], layers[i], edges, layers[i + 1], topLaneOf);\n }\n for (let i = layers.length - 2; i >= 0; i--) {\n layers[i] = reorderLayer(layers[i + 1], layers[i], edges, \"up\", topLaneOf, laneOrder);\n layers[i] = transposeImprove(layers[i + 1], layers[i], edges, layers[i - 1], topLaneOf);\n }\n }\n return { layers };\n}\n__name(orderLayers, \"orderLayers\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase4.coordinates.ts\nfunction assignCoordinates(ordered, gWithDummies, opts) {\n const layerGap = opts?.layerGap ?? COORDINATES.DEFAULT_LAYER_GAP;\n const nodeGap = opts?.nodeGap ?? COORDINATES.DEFAULT_NODE_GAP;\n const laneGap = opts?.laneGap ?? nodeGap * 2;\n const direction = opts?.direction ?? \"TB\";\n const isHorizontal = direction === \"LR\" || direction === \"RL\";\n const layers = ordered.layers;\n const x = /* @__PURE__ */ Object.create(null);\n const y = /* @__PURE__ */ Object.create(null);\n const getNode = /* @__PURE__ */ __name((id) => gWithDummies.nodeById.get(id), \"getNode\");\n const getWidth = /* @__PURE__ */ __name((id) => getNode(id)?.width ?? 0, \"getWidth\");\n const getHeight = /* @__PURE__ */ __name((id) => getNode(id)?.height ?? 0, \"getHeight\");\n const topLaneOf = createTopLaneResolver(gWithDummies);\n const laneOrderGlobal = resolveTopLaneOrder(gWithDummies, opts?.laneOrder);\n const layerHeights = layers.map(\n (layer) => layer.reduce((m, v) => Math.max(m, getHeight(v)), 0)\n );\n const extraLayerGaps = [];\n if (isHorizontal) {\n for (let i = 0; i + 1 < layers.length; i++) {\n const thisLayerMaxWidth = layers[i].reduce((m, v) => Math.max(m, getWidth(v)), 0);\n const nextLayerMaxWidth = layers[i + 1].reduce((m, v) => Math.max(m, getWidth(v)), 0);\n const thisLayerMaxHeight = layerHeights[i];\n const nextLayerMaxHeight = layerHeights[i + 1];\n const normalSpacing = thisLayerMaxHeight / 2 + nextLayerMaxHeight / 2;\n const requiredSpacing = (thisLayerMaxWidth + nextLayerMaxWidth) / 2;\n const extraNeeded = Math.max(0, requiredSpacing - normalSpacing - layerGap);\n extraLayerGaps.push(extraNeeded);\n }\n }\n const lanesUsedSet = /* @__PURE__ */ new Set();\n for (const layer of layers) {\n for (const id of layer) {\n lanesUsedSet.add(topLaneOf(id));\n }\n }\n const hasNullLane = lanesUsedSet.has(null);\n const lanesUsed = laneOrderGlobal.filter((L) => lanesUsedSet.has(L));\n const laneOrderColumns = [...hasNullLane ? [null] : [], ...lanesUsed];\n const laneWidth = /* @__PURE__ */ Object.create(null);\n for (const L of lanesUsed) {\n laneWidth[L] = 0;\n }\n if (hasNullLane) {\n laneWidth.null = 0;\n }\n for (const layer of layers) {\n const perLane = /* @__PURE__ */ Object.create(null);\n const nullIds = [];\n for (const id of layer) {\n const L = topLaneOf(id);\n if (L === null) {\n nullIds.push(id);\n } else {\n (perLane[L] ||= []).push(id);\n }\n }\n for (const [L, ids] of Object.entries(perLane)) {\n const total = ids.reduce((s, id) => s + getWidth(id), 0) + nodeGap * Math.max(0, ids.length - 1);\n laneWidth[L] = Math.max(laneWidth[L] ?? 0, total);\n }\n if (hasNullLane && nullIds.length) {\n const totalNull = nullIds.reduce((s, id) => s + getWidth(id), 0) + nodeGap * Math.max(0, nullIds.length - 1);\n laneWidth.null = Math.max(laneWidth.null ?? 0, totalNull);\n }\n }\n const centerX = /* @__PURE__ */ new Map();\n {\n const widths = laneOrderColumns.map(\n (L) => (L === null ? laneWidth.null : laneWidth[L]) ?? 0\n );\n const totalW = widths.reduce((a, b) => a + b, 0) + laneGap * Math.max(0, laneOrderColumns.length - 1);\n let cursor = -totalW / 2;\n for (let i = 0; i < laneOrderColumns.length; i++) {\n const L = laneOrderColumns[i];\n const w = widths[i] ?? 0;\n const cx = cursor + w / 2;\n centerX.set(L, cx);\n cursor += w;\n if (i < laneOrderColumns.length - 1) {\n cursor += laneGap;\n }\n }\n }\n let yOffset = 0;\n for (const [li, layer] of layers.entries()) {\n const layerH = layerHeights[li] ?? 0;\n const byLane = /* @__PURE__ */ new Map();\n for (const id of layer) {\n const laneId = topLaneOf(id);\n const arr = byLane.get(laneId) ?? [];\n arr.push(id);\n byLane.set(laneId, arr);\n }\n for (const L of laneOrderColumns) {\n const nodesInLane = byLane.get(L) ?? [];\n if (nodesInLane.length === 0) {\n continue;\n }\n const cx = centerX.get(L);\n if (nodesInLane.length === 1) {\n const id = nodesInLane[0];\n x[id] = cx;\n y[id] = yOffset + layerH / 2;\n } else {\n const widths = nodesInLane.map((id) => getWidth(id));\n const total = widths.reduce((a, b) => a + b, 0) + nodeGap * (nodesInLane.length - 1);\n let start = cx - total / 2;\n for (const [i, id] of nodesInLane.entries()) {\n const w = widths[i];\n x[id] = start + w / 2;\n y[id] = yOffset + layerH / 2;\n start += w + nodeGap;\n }\n }\n }\n const extraGap = extraLayerGaps[li] ?? 0;\n yOffset += layerH + layerGap + extraGap;\n }\n const byRef = /* @__PURE__ */ new Map();\n for (const e of gWithDummies.edges) {\n const rid = e.ref.id;\n if (!byRef.has(rid)) {\n byRef.set(rid, []);\n }\n byRef.get(rid).push(e);\n }\n for (const [, chainEdges] of byRef) {\n if (chainEdges.length === 0) {\n continue;\n }\n const ref = chainEdges[0].ref;\n const src = ref.start;\n const dst = ref.end;\n if (src == null || dst == null) {\n continue;\n }\n const midX = Math.round(((x[src] ?? 0) + (x[dst] ?? 0)) / 2);\n const involved = /* @__PURE__ */ new Set();\n for (const e of chainEdges) {\n involved.add(e.src);\n involved.add(e.dst);\n }\n for (const vid of involved) {\n if (vid === src || vid === dst) {\n continue;\n }\n const node = gWithDummies.nodeById.get(vid);\n if (node?.isDummy) {\n x[vid] = midX;\n }\n }\n }\n return { x, y };\n}\n__name(assignCoordinates, \"assignCoordinates\");\n\n// src/rendering-util/layout-algorithms/swimlanes/laneOrdering.ts\nvar AUTOMATIC_LANE_ORDERING_RESTARTS = 8;\nfunction hashString(input) {\n let hash = 2166136261;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n__name(hashString, \"hashString\");\nfunction mulberry32(seed) {\n let state = seed >>> 0;\n return () => {\n state += 1831565813;\n let t = state;\n t = Math.imul(t ^ t >>> 15, t | 1);\n t ^= t + Math.imul(t ^ t >>> 7, t | 61);\n return ((t ^ t >>> 14) >>> 0) / 4294967296;\n };\n}\n__name(mulberry32, \"mulberry32\");\nfunction deterministicShuffle(order, seed) {\n const shuffled = [...order];\n const random = mulberry32(seed);\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(random() * (i + 1));\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\n }\n return shuffled;\n}\n__name(deterministicShuffle, \"deterministicShuffle\");\nfunction sourceDistance(order, sourceIndex) {\n let distance = 0;\n for (const [index, laneId] of order.entries()) {\n distance += Math.abs(index - (sourceIndex.get(laneId) ?? index));\n }\n return distance;\n}\n__name(sourceDistance, \"sourceDistance\");\nfunction laneArrangementCost(order, weights) {\n const position = /* @__PURE__ */ new Map();\n for (const [index, laneId] of order.entries()) {\n position.set(laneId, index);\n }\n let cost = 0;\n for (const { a, b, weight } of weights) {\n const ai = position.get(a);\n const bi = position.get(b);\n if (ai == null || bi == null) {\n continue;\n }\n cost += weight * Math.abs(ai - bi);\n }\n return cost;\n}\n__name(laneArrangementCost, \"laneArrangementCost\");\nfunction buildWeightedLaneEdges(g) {\n const sourceOrder = buildTopLaneOrder(g);\n if (sourceOrder.length < 2) {\n return [];\n }\n const sourceIndex = new Map(sourceOrder.map((laneId, index) => [laneId, index]));\n const topLaneOf = createTopLaneResolver(g);\n const weights = /* @__PURE__ */ new Map();\n for (const edge of g.layout.edges ?? []) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const src = typeof edge.start === \"string\" ? edge.start : void 0;\n const dst = typeof edge.end === \"string\" ? edge.end : void 0;\n if (!src || !dst || !g.nodeById.has(src) || !g.nodeById.has(dst)) {\n continue;\n }\n const laneA = topLaneOf(src);\n const laneB = topLaneOf(dst);\n if (!laneA || !laneB || laneA === laneB) {\n continue;\n }\n const ia = sourceIndex.get(laneA);\n const ib = sourceIndex.get(laneB);\n if (ia == null || ib == null) {\n continue;\n }\n const [a, b] = ia <= ib ? [laneA, laneB] : [laneB, laneA];\n const key = `${a}\\0${b}`;\n const existing = weights.get(key);\n if (existing) {\n existing.weight++;\n } else {\n weights.set(key, { a, b, weight: 1 });\n }\n }\n return [...weights.values()];\n}\n__name(buildWeightedLaneEdges, \"buildWeightedLaneEdges\");\nfunction greedySwitch(startOrder, weights, sourceIndex) {\n const order = [...startOrder];\n let cost = laneArrangementCost(order, weights);\n let changed = true;\n let sweeps = 0;\n const maxSweeps = Math.max(1, order.length);\n while (changed && sweeps < maxSweeps) {\n changed = false;\n sweeps++;\n for (let i = 0; i + 1 < order.length; i++) {\n [order[i], order[i + 1]] = [order[i + 1], order[i]];\n const nextCost = laneArrangementCost(order, weights);\n if (nextCost < cost) {\n cost = nextCost;\n changed = true;\n } else {\n [order[i], order[i + 1]] = [order[i + 1], order[i]];\n }\n }\n }\n return {\n order,\n cost,\n sourceDistance: sourceDistance(order, sourceIndex)\n };\n}\n__name(greedySwitch, \"greedySwitch\");\nfunction isBetterCandidate(candidate, best) {\n if (candidate.cost !== best.cost) {\n return candidate.cost < best.cost;\n }\n return candidate.sourceDistance < best.sourceDistance;\n}\n__name(isBetterCandidate, \"isBetterCandidate\");\nfunction seedForRestart(sourceOrder, weights, restartIndex) {\n const weightSignature = [...weights].sort((a, b) => a.a === b.a ? a.b.localeCompare(b.b) : a.a.localeCompare(b.a)).map(({ a, b, weight }) => `${a}:${b}:${weight}`).join(\"|\");\n return hashString(`${sourceOrder.join(\"|\")}#${weightSignature}#${restartIndex}`);\n}\n__name(seedForRestart, \"seedForRestart\");\nfunction optimizeTopLaneOrder(g, opts = {}) {\n const sourceOrder = buildTopLaneOrder(g);\n if (sourceOrder.length < 2) {\n return sourceOrder;\n }\n const weights = buildWeightedLaneEdges(g);\n if (weights.length === 0) {\n return sourceOrder;\n }\n const sourceIndex = new Map(sourceOrder.map((laneId, index) => [laneId, index]));\n let best = greedySwitch(sourceOrder, weights, sourceIndex);\n const restarts = Math.max(0, opts.restarts ?? AUTOMATIC_LANE_ORDERING_RESTARTS);\n for (let i = 0; i < restarts; i++) {\n const seed = seedForRestart(sourceOrder, weights, i);\n const start = deterministicShuffle(sourceOrder, seed);\n const candidate = greedySwitch(start, weights, sourceIndex);\n if (isBetterCandidate(candidate, best)) {\n best = candidate;\n }\n }\n return best.order;\n}\n__name(optimizeTopLaneOrder, \"optimizeTopLaneOrder\");\n\n// src/rendering-util/layout-algorithms/swimlanes/pipeline.ts\nfunction sugiyamaLayout(g, opts) {\n const ignoreCrossLaneEdges = opts?.ignoreCrossLaneEdges ?? true;\n const optimizeRanksByCrossings2 = opts?.optimizeRanksByCrossings ?? true;\n const g0 = normalizeGraph(g);\n const laneOrder = opts?.automaticLaneOrdering ? optimizeTopLaneOrder(g0, { restarts: AUTOMATIC_LANE_ORDERING_RESTARTS }) : void 0;\n const cycleRes = removeCycles_DFS(g0);\n const gAcyclic = cycleRes.acyclic;\n const layering = ignoreCrossLaneEdges ? assignLayers_LaneAwareCompact(gAcyclic, {\n compactSingleInput: opts?.compactSingleInput ?? LAYERING.DEFAULT_COMPACT_SINGLE_INPUT,\n ignoreCrossLaneEdges: true,\n direction: opts?.direction\n }) : assignLayers_Gravity(gAcyclic, {\n compactSingleInput: opts?.compactSingleInput ?? LAYERING.DEFAULT_COMPACT_SINGLE_INPUT,\n ignoreCrossLaneEdges: false,\n optimizeRanksByCrossings: optimizeRanksByCrossings2\n });\n const { layering: properLayering, graphWithDummies } = makeProperLayering(layering, gAcyclic);\n const ordered = orderLayers(properLayering, graphWithDummies, { laneOrder });\n const coordinates = assignCoordinates(ordered, graphWithDummies, {\n layerGap: opts?.layerGap,\n nodeGap: opts?.nodeGap,\n direction: opts?.direction,\n laneOrder\n });\n return {\n acyclic: gAcyclic,\n reversed: cycleRes.reversed,\n layering: properLayering,\n ordered,\n coordinates\n };\n}\n__name(sugiyamaLayout, \"sugiyamaLayout\");\n\n// src/rendering-util/layout-algorithms/swimlanes/orthogonalRouter/router.ts\nvar EPS7 = PRECISION.EPSILON;\nvar NODE_PADDING = 8;\nvar HORIZONTAL_PIPE_MARGIN = 15;\nvar VERTICAL_PIPE_MARGIN = 15;\nvar ROUTING_MARGIN = 25;\nvar ANCHOR_OFFSET = 20;\nvar TRACK_SPACING = 10;\nfunction chooseOrthogonalSide(node, target, fallback) {\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const dx = target.x - cx;\n const dy = target.y - cy;\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n if (absDx < EPS7 && absDy < EPS7) {\n return fallback;\n }\n const verticalBias = 3;\n if (absDy > EPS7 && absDy * verticalBias >= absDx) {\n return dy > 0 ? \"bottom\" : \"top\";\n }\n if (absDx > EPS7) {\n return dx > 0 ? \"right\" : \"left\";\n }\n return fallback;\n}\n__name(chooseOrthogonalSide, \"chooseOrthogonalSide\");\nfunction sharedLineEndpointCoord(line, nextLine) {\n return Math.abs(line.to - nextLine.from) < EPS7 || Math.abs(line.to - nextLine.to) < EPS7 ? line.to : line.from;\n}\n__name(sharedLineEndpointCoord, \"sharedLineEndpointCoord\");\nfunction pointOnLine(line, along) {\n return line.orient === \"vertical\" ? { x: line.coord, y: along } : { x: along, y: line.coord };\n}\n__name(pointOnLine, \"pointOnLine\");\nfunction routeEdgesOrthogonal(data, direction) {\n const nodes = data.nodes ?? [];\n const originalEdges = data.edges ?? [];\n const edges = [];\n for (const oe of originalEdges) {\n if (oe.isLayoutOnly) {\n continue;\n }\n edges.push({\n ...oe,\n __originalEdge: oe\n });\n }\n const nodeById = /* @__PURE__ */ new Map();\n const laneByNodeId = /* @__PURE__ */ new Map();\n const pipes = [];\n const isLR = direction === \"LR\";\n for (const n of nodes) {\n nodeById.set(n.id, n);\n }\n const topLevelGroups = nodes.filter((n) => n.isGroup && !n.parentId);\n for (const group of topLevelGroups) {\n const lane = { id: group.id };\n const assignLane = /* @__PURE__ */ __name((n) => {\n laneByNodeId.set(n.id, lane);\n nodes.filter((child) => child.parentId === n.id).forEach(assignLane);\n }, \"assignLane\");\n assignLane(group);\n }\n const obstacles = nodes.filter((n) => !n.isGroup && !n.isEdgeLabel).map((n) => {\n const w = n.width ?? 10;\n const h = n.height ?? 10;\n const x = n.x ?? 0;\n const y = n.y ?? 0;\n const padding = NODE_PADDING;\n return {\n nodeId: n.id,\n minX: x - w / 2 - padding,\n maxX: x + w / 2 + padding,\n minY: y - h / 2 - padding,\n maxY: y + h / 2 + padding,\n // For LR: TB x becomes LR y, so visual Y extent should be based on height\n visualXHalfExtent: isLR ? h / 2 + padding : w / 2 + padding\n };\n });\n const getOrAddPipe = /* @__PURE__ */ __name((orientation, coord, spanMin, spanMax) => {\n let pipe = pipes.find((p) => p.orientation === orientation && Math.abs(p.coord - coord) < 1);\n if (!pipe) {\n pipe = {\n id: `pipe-${orientation}-${coord.toFixed(0)}`,\n orientation,\n coord,\n spanMin,\n spanMax,\n tracks: []\n };\n pipes.push(pipe);\n }\n pipe.spanMin = Math.min(pipe.spanMin, spanMin);\n pipe.spanMax = Math.max(pipe.spanMax, spanMax);\n return pipe;\n }, \"getOrAddPipe\");\n const portForSide = /* @__PURE__ */ __name((node, side) => {\n const w = node.width ?? 10;\n const h = node.height ?? 10;\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n switch (side) {\n case \"top\":\n return { x: cx, y: cy - h / 2 };\n case \"bottom\":\n return { x: cx, y: cy + h / 2 };\n case \"left\":\n return { x: cx - w / 2, y: cy };\n case \"right\":\n return { x: cx + w / 2, y: cy };\n }\n }, \"portForSide\");\n const getOrthogonalPort = /* @__PURE__ */ __name((node, target, isSource) => portForSide(node, chooseOrthogonalSide(node, target, isSource ? \"bottom\" : \"top\")), \"getOrthogonalPort\");\n const allRoutedSegments = [];\n const edgeSegmentIndices = [];\n const straightIntraLaneEdges = /* @__PURE__ */ new Set();\n const CROSSING_PENALTY = 1e3;\n const crossingPenalty = /* @__PURE__ */ __name((edgeIdx, from, to) => {\n if (allRoutedSegments.length === 0) {\n return 0;\n }\n const isHorizontal = Math.abs(from.y - to.y) < EPS7;\n const isVertical = Math.abs(from.x - to.x) < EPS7;\n if (!isHorizontal && !isVertical) {\n return 0;\n }\n let penalties = 0;\n if (isHorizontal) {\n const y = from.y;\n const minX = Math.min(from.x, to.x) - EPS7;\n const maxX = Math.max(from.x, to.x) + EPS7;\n if (maxX <= minX) {\n return 0;\n }\n for (const seg of allRoutedSegments) {\n if (seg.edgeIndex === edgeIdx || seg.orientation !== \"vertical\") {\n continue;\n }\n if (seg.pipe.coord < minX || seg.pipe.coord > maxX) {\n continue;\n }\n if (seg.from - EPS7 <= y && seg.to + EPS7 >= y) {\n penalties += CROSSING_PENALTY;\n }\n }\n } else if (isVertical) {\n const x = from.x;\n const minY = Math.min(from.y, to.y) - EPS7;\n const maxY = Math.max(from.y, to.y) + EPS7;\n if (maxY <= minY) {\n return 0;\n }\n for (const seg of allRoutedSegments) {\n if (seg.edgeIndex === edgeIdx || seg.orientation !== \"horizontal\") {\n continue;\n }\n if (seg.pipe.coord < minY || seg.pipe.coord > maxY) {\n continue;\n }\n if (seg.from - EPS7 <= x && seg.to + EPS7 >= x) {\n penalties += CROSSING_PENALTY;\n }\n }\n }\n return penalties;\n }, \"crossingPenalty\");\n const routingOrder = edges.map((edge, idx) => {\n if (!edge.start || !edge.end) {\n return { idx, crossLane: 0, dx: 0, dy: 0 };\n }\n const srcNode = nodeById.get(edge.start);\n const dstNode = nodeById.get(edge.end);\n const srcLane = laneByNodeId.get(edge.start);\n const dstLane = laneByNodeId.get(edge.end);\n const crossLane = srcLane && dstLane && srcLane.id !== dstLane.id ? 1 : 0;\n const dx = srcNode && dstNode ? Math.abs((dstNode.x ?? 0) - (srcNode.x ?? 0)) : 0;\n const dy = srcNode && dstNode ? Math.abs((dstNode.y ?? 0) - (srcNode.y ?? 0)) : 0;\n return { idx, crossLane, dx, dy };\n }).sort((a, b) => {\n if (a.crossLane !== b.crossLane) {\n return b.crossLane - a.crossLane;\n }\n const aDist = a.dx + a.dy;\n const bDist = b.dx + b.dy;\n if (Math.abs(aDist - bDist) > 1) {\n return aDist - bDist;\n }\n return a.idx - b.idx;\n }).map((entry) => entry.idx);\n const isSegmentBlocked = /* @__PURE__ */ __name((p1, p2, excludeStart, excludeEnd) => {\n const segMinX = Math.min(p1.x, p2.x);\n const segMaxX = Math.max(p1.x, p2.x);\n const segMinY = Math.min(p1.y, p2.y);\n const segMaxY = Math.max(p1.y, p2.y);\n const blockingObs = obstacles.find((obs) => {\n if (excludeStart && obs.nodeId === excludeStart) {\n return false;\n }\n if (excludeEnd && obs.nodeId === excludeEnd) {\n return false;\n }\n if (Math.abs(p1.x - p2.x) > EPS7) {\n return obs.minY < p1.y && obs.maxY > p1.y && obs.maxX > segMinX && obs.minX < segMaxX;\n } else {\n return obs.minX < p1.x && obs.maxX > p1.x && obs.maxY > segMinY && obs.minY < segMaxY;\n }\n });\n return !!blockingObs;\n }, \"isSegmentBlocked\");\n const portGroups = /* @__PURE__ */ new Map();\n const incidentEdgeTotals = /* @__PURE__ */ new Map();\n for (const edge of edges) {\n if (!edge.start || !edge.end || edge.start === edge.end) {\n continue;\n }\n incidentEdgeTotals.set(edge.start, (incidentEdgeTotals.get(edge.start) ?? 0) + 1);\n incidentEdgeTotals.set(edge.end, (incidentEdgeTotals.get(edge.end) ?? 0) + 1);\n }\n const determineSide = /* @__PURE__ */ __name((node, target) => chooseOrthogonalSide(node, target, \"bottom\"), \"determineSide\");\n const sideInfoByIdx = /* @__PURE__ */ new Map();\n for (const [i, e] of edges.entries()) {\n if (!e.start || !e.end || e.start === e.end) {\n continue;\n }\n if (e.points && e.points.length > 0) {\n continue;\n }\n const src = nodeById.get(e.start);\n const dst = nodeById.get(e.end);\n if (!src || !dst) {\n continue;\n }\n const dx = (dst.x ?? 0) - (src.x ?? 0);\n const dy = (dst.y ?? 0) - (src.y ?? 0);\n sideInfoByIdx.set(i, {\n edgeIdx: i,\n srcId: e.start,\n dstId: e.end,\n srcSide: determineSide(src, { x: dst.x ?? 0, y: dst.y ?? 0 }),\n dstSide: determineSide(dst, { x: src.x ?? 0, y: src.y ?? 0 }),\n absDx: Math.abs(dx),\n absDy: Math.abs(dy),\n dxSign: Math.sign(dx),\n dySign: Math.sign(dy)\n });\n }\n const preferenceStrength = /* @__PURE__ */ __name((info) => {\n if (info.srcSide === \"top\" || info.srcSide === \"bottom\") {\n return info.absDx === 0 ? Infinity : info.absDy / info.absDx;\n }\n return info.absDy === 0 ? Infinity : info.absDx / info.absDy;\n }, \"preferenceStrength\");\n const secondarySide = /* @__PURE__ */ __name((info) => {\n if (info.srcSide === \"top\" || info.srcSide === \"bottom\") {\n return info.dxSign >= 0 ? \"right\" : \"left\";\n }\n return info.dySign >= 0 ? \"bottom\" : \"top\";\n }, \"secondarySide\");\n const sourceSideGroups = /* @__PURE__ */ new Map();\n for (const info of sideInfoByIdx.values()) {\n const key = `${info.srcId}:${info.srcSide}`;\n if (!sourceSideGroups.has(key)) {\n sourceSideGroups.set(key, []);\n }\n sourceSideGroups.get(key).push(info);\n }\n const sideLoad = /* @__PURE__ */ new Map();\n const loadKey = /* @__PURE__ */ __name((nodeId, side) => `${nodeId}:${side}`, \"loadKey\");\n for (const info of sideInfoByIdx.values()) {\n sideLoad.set(\n loadKey(info.srcId, info.srcSide),\n (sideLoad.get(loadKey(info.srcId, info.srcSide)) ?? 0) + 1\n );\n sideLoad.set(\n loadKey(info.dstId, info.dstSide),\n (sideLoad.get(loadKey(info.dstId, info.dstSide)) ?? 0) + 1\n );\n }\n for (const group of sourceSideGroups.values()) {\n if (group.length < 2) {\n continue;\n }\n group.sort((a, b) => {\n const sa = preferenceStrength(a);\n const sb = preferenceStrength(b);\n if (Math.abs(sa - sb) > 1e-9) {\n return sb - sa;\n }\n return a.edgeIdx - b.edgeIdx;\n });\n for (let g = 1; g < group.length; g++) {\n const info = group[g];\n const secondary = secondarySide(info);\n const primaryLoad = sideLoad.get(loadKey(info.srcId, info.srcSide)) ?? 0;\n const secondaryLoad = sideLoad.get(loadKey(info.srcId, secondary)) ?? 0;\n if (secondaryLoad >= primaryLoad) {\n continue;\n }\n sideLoad.set(loadKey(info.srcId, info.srcSide), primaryLoad - 1);\n sideLoad.set(loadKey(info.srcId, secondary), secondaryLoad + 1);\n info.srcSide = secondary;\n }\n }\n const isDiamondNode = /* @__PURE__ */ __name((node) => {\n const shape = node?.shape;\n return shape === \"question\" || shape === \"diamond\";\n }, \"isDiamondNode\");\n const inSidesByNode = /* @__PURE__ */ new Map();\n for (const info of sideInfoByIdx.values()) {\n if (!inSidesByNode.has(info.dstId)) {\n inSidesByNode.set(info.dstId, /* @__PURE__ */ new Set());\n }\n inSidesByNode.get(info.dstId).add(info.dstSide);\n }\n for (const info of sideInfoByIdx.values()) {\n if (!isDiamondNode(nodeById.get(info.srcId))) {\n continue;\n }\n const inSides = inSidesByNode.get(info.srcId);\n if (!inSides?.has(info.srcSide)) {\n continue;\n }\n const secondary = secondarySide(info);\n if (inSides.has(secondary) || (sideLoad.get(loadKey(info.srcId, secondary)) ?? 0) > 0) {\n continue;\n }\n const primaryLoad = sideLoad.get(loadKey(info.srcId, info.srcSide)) ?? 0;\n sideLoad.set(loadKey(info.srcId, info.srcSide), Math.max(0, primaryLoad - 1));\n sideLoad.set(loadKey(info.srcId, secondary), 1);\n info.srcSide = secondary;\n }\n for (const info of sideInfoByIdx.values()) {\n const { edgeIdx: i, srcId, dstId, srcSide, dstSide } = info;\n const src = nodeById.get(srcId);\n const dst = nodeById.get(dstId);\n const srcKey = `${srcId}:${srcSide}:src`;\n const dstCoord = srcSide === \"top\" || srcSide === \"bottom\" ? dst.x ?? 0 : dst.y ?? 0;\n if (!portGroups.has(srcKey)) {\n portGroups.set(srcKey, []);\n }\n portGroups.get(srcKey).push({ edgeIdx: i, oppositeCoord: dstCoord });\n const dstKey = `${dstId}:${dstSide}:dst`;\n const srcCoord = dstSide === \"top\" || dstSide === \"bottom\" ? src.x ?? 0 : src.y ?? 0;\n if (!portGroups.has(dstKey)) {\n portGroups.set(dstKey, []);\n }\n portGroups.get(dstKey).push({ edgeIdx: i, oppositeCoord: srcCoord });\n }\n const portOffsets = /* @__PURE__ */ new Map();\n const MIN_PORT_SPACING3 = 8;\n for (const [key, group] of portGroups) {\n if (group.length < 2) {\n continue;\n }\n group.sort((a, b) => a.oppositeCoord - b.oppositeCoord);\n const parts = key.split(\":\");\n const nodeId = parts.slice(0, -2).join(\":\");\n const side = parts[parts.length - 2];\n const role = parts[parts.length - 1];\n const node = nodeById.get(nodeId);\n if (!node) {\n continue;\n }\n const isVerticalSide = side === \"left\" || side === \"right\";\n const sideLength = isVerticalSide ? node.height ?? 10 : node.width ?? 10;\n const shape = node.shape;\n const isDiamond = shape === \"question\" || shape === \"diamond\";\n const effectiveLength = isDiamond ? sideLength * 0.3 : sideLength;\n const MAX_PORT_SPACING = 20;\n const spacing = Math.min(\n MAX_PORT_SPACING,\n Math.max(MIN_PORT_SPACING3, effectiveLength / (group.length + 1))\n );\n const totalSpan = spacing * (group.length - 1);\n const startOffset = -totalSpan / 2;\n for (const [j, element] of group.entries()) {\n const offset = startOffset + j * spacing;\n const offsetKey = `${element.edgeIdx}:${role}`;\n portOffsets.set(offsetKey, offset);\n }\n }\n const edgeHasLabelNode = /* @__PURE__ */ __name((edgeIdx) => Boolean(edges[edgeIdx]?.labelNodeId), \"edgeHasLabelNode\");\n const faceHasLabelNode = /* @__PURE__ */ __name((nodeId, side) => {\n if (!nodeId) {\n return false;\n }\n return (portGroups.get(`${nodeId}:${side}:src`) ?? []).some(\n ({ edgeIdx }) => edgeHasLabelNode(edgeIdx)\n ) || (portGroups.get(`${nodeId}:${side}:dst`) ?? []).some(\n ({ edgeIdx }) => edgeHasLabelNode(edgeIdx)\n );\n }, \"faceHasLabelNode\");\n const applyPortOffset = /* @__PURE__ */ __name((basePort, side, offset) => {\n if (side === \"top\" || side === \"bottom\") {\n return { x: basePort.x + offset, y: basePort.y };\n } else {\n return { x: basePort.x, y: basePort.y + offset };\n }\n }, \"applyPortOffset\");\n const portsForEdge = /* @__PURE__ */ __name((edgeIndex, src, dst) => {\n const sideInfo = sideInfoByIdx.get(edgeIndex);\n const srcTarget = { x: dst.x ?? 0, y: dst.y ?? 0 };\n const dstTarget = { x: src.x ?? 0, y: src.y ?? 0 };\n const srcSide = sideInfo?.srcSide ?? determineSide(src, srcTarget);\n const dstSide = sideInfo?.dstSide ?? determineSide(dst, dstTarget);\n let pSrcPort = sideInfo ? portForSide(src, sideInfo.srcSide) : getOrthogonalPort(src, srcTarget, true);\n let pDstPort = sideInfo ? portForSide(dst, sideInfo.dstSide) : getOrthogonalPort(dst, dstTarget, false);\n const srcOffset = portOffsets.get(`${edgeIndex}:src`);\n const dstOffset = portOffsets.get(`${edgeIndex}:dst`);\n if (srcOffset !== void 0) {\n pSrcPort = applyPortOffset(pSrcPort, srcSide, srcOffset);\n }\n if (dstOffset !== void 0) {\n pDstPort = applyPortOffset(pDstPort, dstSide, dstOffset);\n }\n return { pSrcPort, pDstPort, srcSide, dstSide };\n }, \"portsForEdge\");\n for (const i of routingOrder) {\n const e = edges[i];\n edgeSegmentIndices[i] = [];\n if (!e.start || !e.end) {\n continue;\n }\n if (e.points && e.points.length > 0) {\n continue;\n }\n if (e.start === e.end) {\n continue;\n }\n const src = nodeById.get(e.start);\n const dst = nodeById.get(e.end);\n if (!src || !dst) {\n continue;\n }\n const {\n pSrcPort,\n pDstPort,\n srcSide: srcPortSide,\n dstSide: dstPortSide\n } = portsForEdge(i, src, dst);\n const pSrcAnchor = { ...pSrcPort };\n const pDstAnchor = { ...pDstPort };\n const srcPortIsVertical = srcPortSide === \"top\" || srcPortSide === \"bottom\";\n const dstPortIsVertical = dstPortSide === \"top\" || dstPortSide === \"bottom\";\n if (srcPortIsVertical) {\n const isBottom = pSrcPort.y > (src.y ?? 0);\n pSrcAnchor.y = isBottom ? pSrcPort.y + ANCHOR_OFFSET : pSrcPort.y - ANCHOR_OFFSET;\n } else {\n const isRight = pSrcPort.x > (src.x ?? 0);\n pSrcAnchor.x = isRight ? pSrcPort.x + ANCHOR_OFFSET : pSrcPort.x - ANCHOR_OFFSET;\n }\n if (dstPortIsVertical) {\n const isBottom = pDstPort.y > (dst.y ?? 0);\n pDstAnchor.y = isBottom ? pDstPort.y + ANCHOR_OFFSET : pDstPort.y - ANCHOR_OFFSET;\n } else {\n const isRight = pDstPort.x > (dst.x ?? 0);\n pDstAnchor.x = isRight ? pDstPort.x + ANCHOR_OFFSET : pDstPort.x - ANCHOR_OFFSET;\n }\n const isPointInObstacle = /* @__PURE__ */ __name((pt, excludeNodeIds) => {\n for (const obs of obstacles) {\n if (excludeNodeIds.includes(obs.nodeId)) {\n continue;\n }\n if (pt.x > obs.minX && pt.x < obs.maxX && pt.y > obs.minY && pt.y < obs.maxY) {\n return { inside: true, obstacle: obs };\n }\n }\n return { inside: false };\n }, \"isPointInObstacle\");\n const obstacleDetour = /* @__PURE__ */ __name((port, node, opposite, obs, portIsVertical) => {\n if (portIsVertical) {\n const leavesPositiveSide2 = port.y > (node.y ?? 0);\n const goRight = (opposite.x ?? 0) >= port.x;\n return {\n x: goRight ? obs.maxX + HORIZONTAL_PIPE_MARGIN : obs.minX - HORIZONTAL_PIPE_MARGIN,\n y: leavesPositiveSide2 ? obs.maxY + VERTICAL_PIPE_MARGIN : obs.minY - VERTICAL_PIPE_MARGIN,\n leavesPositiveSide: leavesPositiveSide2\n };\n }\n const leavesPositiveSide = port.x > (node.x ?? 0);\n const goDown = (opposite.y ?? 0) >= port.y;\n return {\n x: leavesPositiveSide ? obs.maxX + HORIZONTAL_PIPE_MARGIN : obs.minX - HORIZONTAL_PIPE_MARGIN,\n y: goDown ? obs.maxY + VERTICAL_PIPE_MARGIN : obs.minY - VERTICAL_PIPE_MARGIN,\n leavesPositiveSide\n };\n }, \"obstacleDetour\");\n let srcHandleWaypoints = [];\n const endpointIds = [e.start, e.end];\n const srcCheck = isPointInObstacle(pSrcAnchor, endpointIds);\n if (srcCheck.inside && srcCheck.obstacle) {\n const obs = srcCheck.obstacle;\n if (srcPortIsVertical) {\n const detour = obstacleDetour(pSrcPort, src, dst, obs, true);\n pSrcAnchor.x = detour.x;\n pSrcAnchor.y = detour.y;\n const gapY = detour.leavesPositiveSide ? Math.min(obs.minY - 2, pSrcPort.y + ANCHOR_OFFSET) : Math.max(obs.maxY + 2, pSrcPort.y - ANCHOR_OFFSET);\n srcHandleWaypoints = [\n { x: pSrcPort.x, y: gapY },\n // Orthogonal step in the gap\n { x: detour.x, y: gapY },\n // Horizontal detour\n { x: detour.x, y: detour.y }\n // Down past obstacle\n ];\n } else {\n const detour = obstacleDetour(pSrcPort, src, dst, obs, false);\n const gapX = detour.leavesPositiveSide ? Math.min(obs.minX - 2, pSrcPort.x + ANCHOR_OFFSET) : Math.max(obs.maxX + 2, pSrcPort.x - ANCHOR_OFFSET);\n pSrcAnchor.x = detour.x;\n pSrcAnchor.y = detour.y;\n srcHandleWaypoints = [\n { x: gapX, y: pSrcPort.y },\n // Orthogonal step in the gap\n { x: gapX, y: detour.y },\n // Vertical detour\n { x: detour.x, y: detour.y }\n // Horizontal past obstacle\n ];\n }\n }\n let dstHandleWaypoints = [];\n const dstCheck = isPointInObstacle(pDstAnchor, endpointIds);\n if (dstCheck.inside && dstCheck.obstacle) {\n const obs = dstCheck.obstacle;\n if (dstPortIsVertical) {\n const detour = obstacleDetour(pDstPort, dst, src, obs, true);\n pDstAnchor.x = detour.x;\n pDstAnchor.y = detour.y;\n dstHandleWaypoints = [\n { x: detour.x, y: detour.y },\n // From anchor position\n { x: pDstPort.x, y: detour.y }\n // Go sideways to port's X\n // Then orthogonally to port\n ];\n } else {\n const detour = obstacleDetour(pDstPort, dst, src, obs, false);\n pDstAnchor.x = detour.x;\n pDstAnchor.y = detour.y;\n dstHandleWaypoints = [\n { x: detour.x, y: detour.y },\n // From anchor position\n { x: detour.x, y: pDstPort.y }\n // Go vertically to port's Y\n ];\n }\n }\n if (srcHandleWaypoints.length === 0 && dstHandleWaypoints.length === 0) {\n const hpMargin = HORIZONTAL_PIPE_MARGIN;\n const anchorsSameX = Math.abs(pSrcAnchor.x - pDstAnchor.x) < hpMargin;\n const anchorsSameY = Math.abs(pSrcAnchor.y - pDstAnchor.y) < hpMargin;\n const hasPortOffset = portOffsets.get(`${i}:src`) !== void 0 || portOffsets.get(`${i}:dst`) !== void 0;\n const srcFaceTotal = (portGroups.get(`${e.start ?? \"\"}:${srcPortSide}:src`)?.length ?? 0) + (portGroups.get(`${e.start ?? \"\"}:${srcPortSide}:dst`)?.length ?? 0);\n const dstFaceTotal = (portGroups.get(`${e.end ?? \"\"}:${dstPortSide}:src`)?.length ?? 0) + (portGroups.get(`${e.end ?? \"\"}:${dstPortSide}:dst`)?.length ?? 0);\n const faceContested = srcFaceTotal > 1 || dstFaceTotal > 1;\n const srcIncidentTotal = incidentEdgeTotals.get(e.start ?? \"\") ?? 0;\n const dstIncidentTotal = incidentEdgeTotals.get(e.end ?? \"\") ?? 0;\n const contestedFaceHasLabel = srcFaceTotal > 1 && faceHasLabelNode(e.start, srcPortSide) || dstFaceTotal > 1 && faceHasLabelNode(e.end, dstPortSide);\n const srcContestAllowsCenteredStraight = srcFaceTotal <= 1 || srcIncidentTotal <= 2;\n const dstContestAllowsCenteredStraight = dstFaceTotal <= 1 || dstIncidentTotal <= 2;\n const canPreserveSimpleContestedStraight = faceContested && !contestedFaceHasLabel && srcContestAllowsCenteredStraight && dstContestAllowsCenteredStraight;\n if ((anchorsSameX || anchorsSameY) && !hasPortOffset && (!faceContested || canPreserveSimpleContestedStraight)) {\n const directBlocked = isSegmentBlocked(pSrcPort, pDstPort, e.start, e.end);\n if (!directBlocked) {\n e.points = [{ ...pSrcPort }, { ...pSrcAnchor }, { ...pDstAnchor }, { ...pDstPort }];\n straightIntraLaneEdges.add(i);\n const fastPathOrientation = anchorsSameY ? \"horizontal\" : \"vertical\";\n const fastPathCoord = anchorsSameY ? pSrcPort.y : pSrcPort.x;\n const fastPathFrom = anchorsSameY ? Math.min(pSrcPort.x, pDstPort.x) : Math.min(pSrcPort.y, pDstPort.y);\n const fastPathTo = anchorsSameY ? Math.max(pSrcPort.x, pDstPort.x) : Math.max(pSrcPort.y, pDstPort.y);\n const fastPathPipe = {\n id: `fast-path-${fastPathOrientation}-${fastPathCoord.toFixed(0)}-${i}`,\n orientation: fastPathOrientation,\n coord: fastPathCoord,\n spanMin: fastPathFrom,\n spanMax: fastPathTo,\n tracks: []\n };\n allRoutedSegments.push({\n edgeIndex: i,\n segmentIndex: 0,\n orientation: fastPathOrientation,\n pipe: fastPathPipe,\n trackIndex: 0,\n from: fastPathFrom,\n to: fastPathTo\n });\n continue;\n }\n }\n }\n const srcPipe = getOrAddPipe(\"vertical\", pSrcAnchor.x, pSrcAnchor.y, pSrcAnchor.y);\n pSrcAnchor.x = srcPipe.coord;\n const dstPipe = getOrAddPipe(\"vertical\", pDstAnchor.x, pDstAnchor.y, pDstAnchor.y);\n pDstAnchor.x = dstPipe.coord;\n let bbMinX = Math.min(pSrcAnchor.x, pDstAnchor.x) - 50;\n let bbMaxX = Math.max(pSrcAnchor.x, pDstAnchor.x) + 50;\n let bbMinY = Math.min(pSrcAnchor.y, pDstAnchor.y) - 50;\n let bbMaxY = Math.max(pSrcAnchor.y, pDstAnchor.y) + 50;\n for (const obs of obstacles) {\n const pathMinX = Math.min(pSrcAnchor.x, pDstAnchor.x);\n const pathMaxX = Math.max(pSrcAnchor.x, pDstAnchor.x);\n const pathMinY = Math.min(pSrcAnchor.y, pDstAnchor.y);\n const pathMaxY = Math.max(pSrcAnchor.y, pDstAnchor.y);\n const obsBlocksPath = obs.minX < pathMaxX && obs.maxX > pathMinX && obs.minY < pathMaxY && obs.maxY > pathMinY;\n if (obsBlocksPath) {\n bbMinX = Math.min(bbMinX, obs.minX - ROUTING_MARGIN);\n bbMaxX = Math.max(bbMaxX, obs.maxX + ROUTING_MARGIN);\n bbMinY = Math.min(bbMinY, obs.minY - ROUTING_MARGIN);\n bbMaxY = Math.max(bbMaxY, obs.maxY + ROUTING_MARGIN);\n }\n }\n for (const obs of obstacles) {\n if (obs.maxX < bbMinX || obs.minX > bbMaxX || obs.maxY < bbMinY || obs.minY > bbMaxY) {\n continue;\n }\n const hMargin = HORIZONTAL_PIPE_MARGIN;\n getOrAddPipe(\"horizontal\", obs.minY - hMargin, bbMinX, bbMaxX);\n getOrAddPipe(\"horizontal\", obs.maxY + hMargin, bbMinX, bbMaxX);\n const vMargin = VERTICAL_PIPE_MARGIN;\n getOrAddPipe(\"vertical\", obs.minX - vMargin, bbMinY, bbMaxY);\n getOrAddPipe(\"vertical\", obs.maxX + vMargin, bbMinY, bbMaxY);\n }\n getOrAddPipe(\"horizontal\", pSrcAnchor.y, bbMinX, bbMaxX);\n getOrAddPipe(\"horizontal\", pDstAnchor.y, bbMinX, bbMaxX);\n const hPipes = pipes.filter(\n (p) => p.orientation === \"horizontal\" && p.coord >= bbMinY && p.coord <= bbMaxY\n );\n const vPipes = pipes.filter(\n (p) => p.orientation === \"vertical\" && p.coord >= bbMinX && p.coord <= bbMaxX\n );\n const getKey = /* @__PURE__ */ __name((x, y) => `${x.toFixed(1)},${y.toFixed(1)}`, \"getKey\");\n const startKey = getKey(pSrcAnchor.x, pSrcAnchor.y);\n const endKey = getKey(pDstAnchor.x, pDstAnchor.y);\n const gScore = /* @__PURE__ */ new Map();\n const cameFrom = /* @__PURE__ */ new Map();\n const arrivalDir = /* @__PURE__ */ new Map();\n const openSet = /* @__PURE__ */ new Set();\n const openList = [];\n gScore.set(startKey, 0);\n arrivalDir.set(startKey, \"n\");\n openList.push({\n key: startKey,\n f: Math.hypot(pDstAnchor.x - pSrcAnchor.x, pDstAnchor.y - pSrcAnchor.y),\n pt: pSrcAnchor\n });\n openSet.add(startKey);\n let foundPath = [];\n const checkSegmentBlocked = /* @__PURE__ */ __name((p1, p2) => {\n return isSegmentBlocked(p1, p2, e.start, e.end);\n }, \"checkSegmentBlocked\");\n const cornerHV = { x: pDstAnchor.x, y: pSrcAnchor.y };\n const seg1HV_blocked = checkSegmentBlocked(pSrcAnchor, cornerHV);\n const seg2HV_blocked = checkSegmentBlocked(cornerHV, pDstAnchor);\n const pathHV_blocked = seg1HV_blocked || seg2HV_blocked;\n const cornerVH = { x: pSrcAnchor.x, y: pDstAnchor.y };\n const seg1VH_blocked = checkSegmentBlocked(pSrcAnchor, cornerVH);\n const seg2VH_blocked = checkSegmentBlocked(cornerVH, pDstAnchor);\n const pathVH_blocked = seg1VH_blocked || seg2VH_blocked;\n if (!pathHV_blocked) {\n if (Math.abs(pSrcAnchor.y - pDstAnchor.y) < EPS7 || Math.abs(pSrcAnchor.x - pDstAnchor.x) < EPS7) {\n foundPath = [pSrcAnchor, pDstAnchor];\n } else {\n foundPath = [pSrcAnchor, cornerHV, pDstAnchor];\n }\n } else if (!pathVH_blocked) {\n if (Math.abs(pSrcAnchor.x - pDstAnchor.x) < EPS7) {\n foundPath = [pSrcAnchor, pDstAnchor];\n } else {\n foundPath = [pSrcAnchor, cornerVH, pDstAnchor];\n }\n }\n if (foundPath.length === 0) {\n while (openList.length > 0) {\n openList.sort((a, b) => a.f - b.f);\n const current = openList.shift();\n openSet.delete(current.key);\n if (current.key === endKey) {\n let currKey = endKey;\n let currPt = pDstAnchor;\n foundPath = [currPt];\n while (cameFrom.has(currKey)) {\n const prev = cameFrom.get(currKey);\n foundPath.unshift(prev);\n currPt = prev;\n currKey = getKey(prev.x, prev.y);\n }\n break;\n }\n const cx = current.pt.x;\n const cy = current.pt.y;\n const sortedVPipes = vPipes.sort((a, b) => a.coord - b.coord);\n const vIdx = sortedVPipes.findIndex((p) => Math.abs(p.coord - cx) < 1);\n const hPipesSorted = hPipes.sort((a, b) => a.coord - b.coord);\n const hIdx = hPipesSorted.findIndex((p) => Math.abs(p.coord - cy) < 1);\n const neighbors = [];\n if (vIdx > 0) {\n neighbors.push({ x: sortedVPipes[vIdx - 1].coord, y: cy });\n }\n if (vIdx >= 0 && vIdx < sortedVPipes.length - 1) {\n neighbors.push({ x: sortedVPipes[vIdx + 1].coord, y: cy });\n }\n if (hIdx > 0) {\n neighbors.push({ x: cx, y: hPipesSorted[hIdx - 1].coord });\n }\n if (hIdx >= 0 && hIdx < hPipesSorted.length - 1) {\n neighbors.push({ x: cx, y: hPipesSorted[hIdx + 1].coord });\n }\n for (const neighbor of neighbors) {\n const minX = Math.min(cx, neighbor.x);\n const maxX = Math.max(cx, neighbor.x);\n const minY = Math.min(cy, neighbor.y);\n const maxY = Math.max(cy, neighbor.y);\n const blocked = obstacles.some((obs) => {\n if (obs.nodeId === e.start || obs.nodeId === e.end) {\n return false;\n }\n if (minX !== maxX) {\n return obs.minY < cy && obs.maxY > cy && obs.maxX > minX && obs.minX < maxX;\n } else {\n return obs.minX < cx && obs.maxX > cx && obs.maxY > minY && obs.minY < maxY;\n }\n });\n if (blocked) {\n continue;\n }\n const nKey = getKey(neighbor.x, neighbor.y);\n const dist = Math.abs(neighbor.x - cx) + Math.abs(neighbor.y - cy);\n const penalty = crossingPenalty(i, current.pt, neighbor);\n let dirPenalty = 0;\n const destDx = pDstAnchor.x - pSrcAnchor.x;\n const destDy = pDstAnchor.y - pSrcAnchor.y;\n const moveDx = neighbor.x - cx;\n const moveDy = neighbor.y - cy;\n if (destDy > 10 && moveDy < -5 || destDy < -10 && moveDy > 5) {\n dirPenalty = Math.abs(moveDy) * 100;\n }\n if (destDx > 10 && moveDx < -5 || destDx < -10 && moveDx > 5) {\n dirPenalty += Math.abs(moveDx) * 50;\n }\n let bendPenalty = 0;\n const currentDir = arrivalDir.get(current.key) ?? \"n\";\n const moveDir = Math.abs(moveDx) > EPS7 ? \"h\" : \"v\";\n if (currentDir !== \"n\" && currentDir !== moveDir) {\n bendPenalty = 50;\n }\n const stepCost = dist + penalty + dirPenalty + bendPenalty;\n const tentativeG = (gScore.get(current.key) ?? Infinity) + stepCost;\n const h = Math.abs(pDstAnchor.x - neighbor.x) + Math.abs(pDstAnchor.y - neighbor.y);\n if (tentativeG < (gScore.get(nKey) ?? Infinity)) {\n cameFrom.set(nKey, current.pt);\n gScore.set(nKey, tentativeG);\n arrivalDir.set(nKey, moveDir);\n if (!openSet.has(nKey)) {\n openList.push({ key: nKey, f: tentativeG + h, pt: neighbor });\n openSet.add(nKey);\n } else {\n const idx = openList.findIndex((x) => x.key === nKey);\n if (idx !== -1) {\n openList[idx].f = tentativeG + h;\n }\n }\n }\n }\n }\n }\n if (foundPath.length === 0) {\n foundPath = [pSrcAnchor, { x: pSrcAnchor.x, y: pDstAnchor.y }, pDstAnchor];\n }\n if (foundPath.length > 4) {\n const start = foundPath[0];\n const end = foundPath[foundPath.length - 1];\n let minX = Math.min(start.x, end.x);\n let maxX = Math.max(start.x, end.x);\n let minY = Math.min(start.y, end.y);\n let maxY = Math.max(start.y, end.y);\n for (const pt of foundPath) {\n minX = Math.min(minX, pt.x);\n maxX = Math.max(maxX, pt.x);\n minY = Math.min(minY, pt.y);\n maxY = Math.max(maxY, pt.y);\n }\n const wentRight = maxX > Math.max(start.x, end.x);\n const wentLeft = minX < Math.min(start.x, end.x);\n if (isLR) {\n const margin = VERTICAL_PIPE_MARGIN;\n if (wentRight) {\n const pathX = Math.max(start.x, end.x);\n const pathMinY = Math.min(start.y, end.y);\n const pathMaxY = Math.max(start.y, end.y);\n const detourObstacles = obstacles.filter(\n (obs) => obs.minX < pathX && obs.maxX > pathX && // obstacle's x-range contains the path x\n obs.minY < pathMaxY && obs.maxY > pathMinY\n // obstacle's y-range overlaps with path y-range\n );\n if (detourObstacles.length > 0) {\n let visualMaxX = Math.max(start.x, end.x);\n for (const obs of detourObstacles) {\n const obsCenterX = (obs.minX + obs.maxX) / 2;\n if (obs.visualXHalfExtent === void 0 || isNaN(obs.visualXHalfExtent)) {\n continue;\n }\n const visualRight = obsCenterX + obs.visualXHalfExtent + margin;\n visualMaxX = Math.max(visualMaxX, visualRight);\n }\n if (!isNaN(visualMaxX)) {\n maxX = visualMaxX;\n }\n }\n }\n if (wentLeft) {\n const detourObstacles = obstacles.filter(\n (obs) => obs.minX < Math.min(start.x, end.x) + margin && // obstacle extends past the direct path\n obs.minY < Math.max(start.y, end.y) && obs.maxY > Math.min(start.y, end.y)\n // obstacle is in Y range\n );\n if (detourObstacles.length > 0) {\n let visualMinX = Math.min(start.x, end.x);\n for (const obs of detourObstacles) {\n const obsCenterX = (obs.minX + obs.maxX) / 2;\n const visualLeft = obsCenterX - obs.visualXHalfExtent - margin;\n visualMinX = Math.min(visualMinX, visualLeft);\n }\n minX = visualMinX;\n }\n }\n }\n const findBestReturnY = /* @__PURE__ */ __name((detourX) => {\n const goingDown = end.y > start.y;\n const relevantObs = obstacles.filter((obs) => {\n const obsInXRange = Math.min(start.x, end.x) < obs.maxX && Math.max(start.x, end.x) > obs.minX;\n const obsInYRange = Math.min(start.y, end.y) < obs.maxY && Math.max(start.y, end.y) > obs.minY;\n return obsInXRange && obsInYRange;\n });\n let filteredObs = relevantObs;\n if (isLR && relevantObs.length > 0) {\n const obsAtDetourX = relevantObs.filter(\n (obs) => obs.minX < detourX && obs.maxX > detourX\n );\n if (obsAtDetourX.length > 0) {\n filteredObs = obsAtDetourX;\n }\n }\n if (filteredObs.length === 0) {\n return end.y;\n }\n const margin = HORIZONTAL_PIPE_MARGIN;\n if (goingDown) {\n const lowestObsBottom = Math.max(...filteredObs.map((obs) => obs.maxY));\n const bestY = lowestObsBottom + margin;\n if (bestY < end.y - EPS7) {\n return bestY;\n }\n } else {\n const highestObsTop = Math.min(...filteredObs.map((obs) => obs.minY));\n const bestY = highestObsTop - margin;\n if (bestY > end.y + EPS7) {\n return bestY;\n }\n }\n return end.y;\n }, \"findBestReturnY\");\n const trySimplifyWithDetourX = /* @__PURE__ */ __name((detourX) => {\n const bestY = findBestReturnY(detourX);\n const corner1 = { x: detourX, y: start.y };\n const corner2 = { x: detourX, y: bestY };\n const corner3 = { x: end.x, y: bestY };\n const seg1Blocked = checkSegmentBlocked(start, corner1);\n const seg2Blocked = checkSegmentBlocked(corner1, corner2);\n const seg3Blocked = checkSegmentBlocked(corner2, corner3);\n const seg4Blocked = bestY !== end.y ? checkSegmentBlocked(corner3, end) : false;\n if (!seg1Blocked && !seg2Blocked && !seg3Blocked && !seg4Blocked) {\n if (Math.abs(bestY - end.y) < EPS7) {\n return [start, corner1, corner2, end];\n }\n return [start, corner1, corner2, corner3, end];\n }\n return null;\n }, \"trySimplifyWithDetourX\");\n const simplified2 = wentRight && !wentLeft ? trySimplifyWithDetourX(maxX) : wentLeft && !wentRight ? trySimplifyWithDetourX(minX) : null;\n if (simplified2) {\n foundPath = simplified2;\n }\n }\n const fullPoints = [\n pSrcPort,\n ...srcHandleWaypoints,\n ...foundPath,\n ...dstHandleWaypoints.reverse(),\n // Reverse because they're stored anchor->waypoint->port\n pDstPort\n ];\n if (fullPoints.length >= 3) {\n const C = fullPoints[fullPoints.length - 1];\n const B = fullPoints[fullPoints.length - 2];\n const A = fullPoints[fullPoints.length - 3];\n const isHoriz = Math.abs(A.y - B.y) < EPS7 && Math.abs(B.y - C.y) < EPS7;\n const isVert = Math.abs(A.x - B.x) < EPS7 && Math.abs(B.x - C.x) < EPS7;\n if (isHoriz) {\n const signAB = Math.sign(B.x - A.x);\n const signAC = Math.sign(C.x - A.x);\n if (signAB !== 0 && signAB === signAC && Math.abs(B.x - A.x) > Math.abs(C.x - A.x)) {\n fullPoints.splice(-2, 1);\n }\n } else if (isVert) {\n const signAB = Math.sign(B.y - A.y);\n const signAC = Math.sign(C.y - A.y);\n if (signAB !== 0 && signAB === signAC && Math.abs(B.y - A.y) > Math.abs(C.y - A.y)) {\n fullPoints.splice(-2, 1);\n }\n }\n }\n const simplified = [fullPoints[0]];\n for (let k = 1; k < fullPoints.length - 1; k++) {\n if (k === 1) {\n simplified.push(fullPoints[k]);\n continue;\n }\n const prev = simplified[simplified.length - 1];\n const curr = fullPoints[k];\n const next = fullPoints[k + 1];\n if (Math.abs(prev.y - curr.y) < EPS7 && Math.abs(curr.y - next.y) < EPS7) {\n const dir1 = curr.x > prev.x;\n const dir2 = next.x > curr.x;\n if (dir1 !== dir2) {\n simplified.push(curr);\n continue;\n }\n continue;\n }\n if (Math.abs(prev.x - curr.x) < EPS7 && Math.abs(curr.x - next.x) < EPS7) {\n const dir1 = curr.y > prev.y;\n const dir2 = next.y > curr.y;\n if (dir1 !== dir2) {\n simplified.push(curr);\n continue;\n }\n continue;\n }\n simplified.push(curr);\n }\n simplified.push(fullPoints[fullPoints.length - 1]);\n for (let k = 0; k < simplified.length - 1; k++) {\n const p1 = simplified[k];\n const p2 = simplified[k + 1];\n const orientation = Math.abs(p1.x - p2.x) < EPS7 ? \"vertical\" : \"horizontal\";\n const coord = orientation === \"vertical\" ? p1.x : p1.y;\n const from = orientation === \"vertical\" ? Math.min(p1.y, p2.y) : Math.min(p1.x, p2.x);\n const to = orientation === \"vertical\" ? Math.max(p1.y, p2.y) : Math.max(p1.x, p2.x);\n const pipe = getOrAddPipe(orientation, coord, from, to);\n const rSeg = {\n edgeIndex: i,\n segmentIndex: k,\n orientation,\n pipe,\n trackIndex: 0,\n // Initial track\n from,\n to\n };\n allRoutedSegments.push(rSeg);\n edgeSegmentIndices[i].push(allRoutedSegments.length - 1);\n if (!pipe.tracks[0]) {\n pipe.tracks[0] = { index: 0, coord: pipe.coord, segments: [] };\n }\n pipe.tracks[0].segments.push({\n edgeIndex: i,\n segmentIndex: k,\n from,\n to\n });\n }\n }\n const segmentsOverlap = /* @__PURE__ */ __name((s1, s2) => {\n return s1.from < s2.to && s2.from < s1.to;\n }, \"segmentsOverlap\");\n const trySwapSegmentsAcrossTracks = /* @__PURE__ */ __name((s1, s2, t1, t2) => {\n const canS1GoT2 = !t2.segments.some(\n (r) => (r.edgeIndex !== s2.edgeIndex || r.segmentIndex !== s2.segmentIndex) && segmentsOverlap(r, s1)\n );\n const canS2GoT1 = !t1.segments.some(\n (r) => (r.edgeIndex !== s1.edgeIndex || r.segmentIndex !== s1.segmentIndex) && segmentsOverlap(r, s2)\n );\n if (canS1GoT2 && canS2GoT1) {\n s1.trackIndex = t2.index;\n s2.trackIndex = t1.index;\n t1.segments = [\n ...t1.segments.filter(\n (r) => r.edgeIndex !== s1.edgeIndex || r.segmentIndex !== s1.segmentIndex\n ),\n {\n edgeIndex: s2.edgeIndex,\n segmentIndex: s2.segmentIndex,\n from: s2.from,\n to: s2.to\n }\n ];\n t2.segments = [\n ...t2.segments.filter(\n (r) => r.edgeIndex !== s2.edgeIndex || r.segmentIndex !== s2.segmentIndex\n ),\n {\n edgeIndex: s1.edgeIndex,\n segmentIndex: s1.segmentIndex,\n from: s1.from,\n to: s1.to\n }\n ];\n return true;\n }\n return false;\n }, \"trySwapSegmentsAcrossTracks\");\n const createNewTrack = /* @__PURE__ */ __name((pipe) => {\n const idx = pipe.tracks.length;\n pipe.tracks[idx] = { index: idx, coord: pipe.coord, segments: [] };\n return idx;\n }, \"createNewTrack\");\n const moveSegmentToTrack = /* @__PURE__ */ __name((seg, trackIdx) => {\n const oldTrack = seg.pipe.tracks[seg.trackIndex];\n oldTrack.segments = oldTrack.segments.filter(\n (r) => r.edgeIndex !== seg.edgeIndex || r.segmentIndex !== seg.segmentIndex\n );\n seg.trackIndex = trackIdx;\n const newTrack = seg.pipe.tracks[trackIdx];\n newTrack.segments.push({\n edgeIndex: seg.edgeIndex,\n segmentIndex: seg.segmentIndex,\n from: seg.from,\n to: seg.to\n });\n }, \"moveSegmentToTrack\");\n const moveSegmentChainToTrack = /* @__PURE__ */ __name((seg, trackIdx) => {\n const indices = edgeSegmentIndices[seg.edgeIndex];\n for (const idx of indices) {\n const s = allRoutedSegments[idx];\n if (s.pipe === seg.pipe) {\n moveSegmentToTrack(s, trackIdx);\n }\n }\n }, \"moveSegmentChainToTrack\");\n const getAdjacentSegmentsAlongEdge = /* @__PURE__ */ __name((seg) => {\n const indices = edgeSegmentIndices[seg.edgeIndex];\n const idxInList = indices.indexOf(allRoutedSegments.indexOf(seg));\n const adj = [];\n if (idxInList > 0) {\n adj.push(allRoutedSegments[indices[idxInList - 1]]);\n }\n if (idxInList < indices.length - 1) {\n adj.push(allRoutedSegments[indices[idxInList + 1]]);\n }\n return adj;\n }, \"getAdjacentSegmentsAlongEdge\");\n const haveAnyCrossing = /* @__PURE__ */ __name((segA, segB) => {\n if (segA.orientation === segB.orientation) {\n return false;\n }\n const h = segA.orientation === \"horizontal\" ? segA : segB;\n const v = segA.orientation === \"horizontal\" ? segB : segA;\n return v.pipe.coord > h.from && v.pipe.coord < h.to && h.pipe.coord > v.from && h.pipe.coord < v.to;\n }, \"haveAnyCrossing\");\n const findAvailableTrack = /* @__PURE__ */ __name((pipe, seg) => {\n for (const track of pipe.tracks) {\n const overlap = track.segments.some(\n (r) => (r.edgeIndex !== seg.edgeIndex || r.segmentIndex !== seg.segmentIndex) && segmentsOverlap(r, seg)\n );\n if (!overlap) {\n return track.index;\n }\n }\n return -1;\n }, \"findAvailableTrack\");\n const segmentsConflict = /* @__PURE__ */ __name((s1, s2) => {\n if (s1.trackIndex === s2.trackIndex) {\n return segmentsOverlap(s1, s2);\n }\n const adj1 = getAdjacentSegmentsAlongEdge(s1);\n const adj2 = getAdjacentSegmentsAlongEdge(s2);\n return adj1.some((a1) => adj2.some((a2) => haveAnyCrossing(a1, a2)));\n }, \"segmentsConflict\");\n const resolveTrackConflict = /* @__PURE__ */ __name((s1, s2, move) => {\n if (trySwapSegmentsAcrossTracks(\n s1,\n s2,\n s1.pipe.tracks[s1.trackIndex],\n s2.pipe.tracks[s2.trackIndex]\n )) {\n return;\n }\n const avail = findAvailableTrack(s1.pipe, s2);\n move(s2, avail !== -1 ? avail : createNewTrack(s1.pipe));\n }, \"resolveTrackConflict\");\n const resolveHandleConflicts = /* @__PURE__ */ __name((handles) => {\n let crossings = 0;\n for (let i = 0; i < handles.length; i++) {\n for (let j = i + 1; j < handles.length; j++) {\n const h1 = handles[i];\n const h2 = handles[j];\n if (h1.pipe !== h2.pipe) {\n continue;\n }\n if (segmentsConflict(h1, h2)) {\n crossings++;\n resolveTrackConflict(h1, h2, moveSegmentChainToTrack);\n }\n }\n }\n return crossings;\n }, \"resolveHandleConflicts\");\n const destInfoCache = /* @__PURE__ */ new Map();\n const getDestInfo = /* @__PURE__ */ __name((edgeIdx) => {\n if (destInfoCache.has(edgeIdx)) {\n return destInfoCache.get(edgeIdx);\n }\n const indices = edgeSegmentIndices[edgeIdx];\n if (indices.length === 0) {\n const info2 = { dest: 0, deviation: 0, base: 0, delta: 0 };\n destInfoCache.set(edgeIdx, info2);\n return info2;\n }\n const firstSeg = allRoutedSegments[indices[0]];\n const base = firstSeg.pipe.coord;\n let dest = base;\n for (let idx = 1; idx < indices.length; idx++) {\n const seg = allRoutedSegments[indices[idx]];\n if (seg.orientation === \"horizontal\") {\n const candidateA = seg.from;\n const candidateB = seg.to;\n dest = Math.abs(candidateA - base) > Math.abs(candidateB - base) ? candidateA : candidateB;\n break;\n }\n }\n const deviation = Math.abs(dest - base);\n const info = { dest, deviation, base, delta: dest - base };\n destInfoCache.set(edgeIdx, info);\n return info;\n }, \"getDestInfo\");\n const fixSourceHandleCrossings = /* @__PURE__ */ __name(() => {\n let crossings = 0;\n const edgesBySource = /* @__PURE__ */ new Map();\n for (const [i, e] of edges.entries()) {\n if (edgeSegmentIndices[i].length === 0) {\n continue;\n }\n if (!e.start) {\n continue;\n }\n if (!edgesBySource.has(e.start)) {\n edgesBySource.set(e.start, []);\n }\n edgesBySource.get(e.start).push(i);\n }\n const getEdgeDistance = /* @__PURE__ */ __name((edgeIdx) => {\n const edge = edges[edgeIdx];\n if (!edge.start || !edge.end) {\n return 0;\n }\n const srcNode = nodeById.get(edge.start);\n const dstNode = nodeById.get(edge.end);\n if (!srcNode || !dstNode) {\n return 0;\n }\n const dx = (dstNode.x ?? 0) - (srcNode.x ?? 0);\n const dy = (dstNode.y ?? 0) - (srcNode.y ?? 0);\n return Math.abs(dx) + Math.abs(dy);\n }, \"getEdgeDistance\");\n for (const grp of edgesBySource.values()) {\n grp.sort((a, b) => {\n const infoA = getDestInfo(a);\n const infoB = getDestInfo(b);\n if (Math.abs(infoA.deviation - infoB.deviation) > 1) {\n return infoA.deviation - infoB.deviation;\n }\n if (Math.abs(infoA.dest - infoB.dest) > 1) {\n return infoA.dest - infoB.dest;\n }\n const distA = getEdgeDistance(a);\n const distB = getEdgeDistance(b);\n if (Math.abs(distA - distB) > 1) {\n return distB - distA;\n }\n const lenA = edgeSegmentIndices[a].length;\n const lenB = edgeSegmentIndices[b].length;\n if (lenA !== lenB) {\n return lenA - lenB;\n }\n if (lenA === 1) {\n const idxA = edgeSegmentIndices[a][0];\n const idxB = edgeSegmentIndices[b][0];\n if (allRoutedSegments[idxA] && allRoutedSegments[idxB]) {\n const segA = allRoutedSegments[idxA];\n const segB = allRoutedSegments[idxB];\n const distA2 = Math.abs(segA.to - segA.from);\n const distB2 = Math.abs(segB.to - segB.from);\n if (Math.abs(distA2 - distB2) > 1) {\n return distA2 - distB2;\n }\n }\n }\n return 0;\n });\n const handles = grp.map((ei) => allRoutedSegments[edgeSegmentIndices[ei][0]]);\n crossings += resolveHandleConflicts(handles);\n }\n return crossings;\n }, \"fixSourceHandleCrossings\");\n const fixTargetHandleCrossings = /* @__PURE__ */ __name(() => {\n let crossings = 0;\n const edgesByTarget = /* @__PURE__ */ new Map();\n for (const [i, e] of edges.entries()) {\n const indices = edgeSegmentIndices[i];\n if (indices.length === 0) {\n continue;\n }\n if (!e.end) {\n continue;\n }\n if (!edgesByTarget.has(e.end)) {\n edgesByTarget.set(e.end, []);\n }\n edgesByTarget.get(e.end).push(i);\n }\n for (const grp of edgesByTarget.values()) {\n grp.sort((a, b) => {\n const getDist = /* @__PURE__ */ __name((edgeIdx) => {\n const indices = edgeSegmentIndices[edgeIdx];\n if (indices.length < 2) {\n return 0;\n }\n const prev = allRoutedSegments[indices[indices.length - 2]];\n return Math.abs(prev.to - prev.from);\n }, \"getDist\");\n const scoreA = getDist(a);\n const scoreB = getDist(b);\n if (Math.abs(scoreA - scoreB) > 0.1) {\n return scoreA - scoreB;\n }\n return a - b;\n });\n const handles = grp.map(\n (ei) => allRoutedSegments[edgeSegmentIndices[ei][edgeSegmentIndices[ei].length - 1]]\n );\n crossings += resolveHandleConflicts(handles);\n }\n return crossings;\n }, \"fixTargetHandleCrossings\");\n const fixPipeCrossings = /* @__PURE__ */ __name(() => {\n let crossings = 0;\n for (const pipe of pipes) {\n const pipeSegments = [];\n for (const t of pipe.tracks) {\n for (const ref of t.segments) {\n const idx = edgeSegmentIndices[ref.edgeIndex].find(\n (ix) => allRoutedSegments[ix].segmentIndex === ref.segmentIndex\n );\n if (idx !== void 0) {\n pipeSegments.push(allRoutedSegments[idx]);\n }\n }\n }\n pipeSegments.sort((a, b) => a.edgeIndex - b.edgeIndex || a.segmentIndex - b.segmentIndex);\n for (let i = 0; i < pipeSegments.length; i++) {\n for (let j = i + 1; j < pipeSegments.length; j++) {\n const s1 = pipeSegments[i];\n const s2 = pipeSegments[j];\n if (segmentsConflict(s1, s2)) {\n crossings++;\n resolveTrackConflict(s1, s2, moveSegmentToTrack);\n }\n }\n }\n }\n return crossings;\n }, \"fixPipeCrossings\");\n let iterations = 0;\n const MAX_ITER = 10;\n while (iterations < MAX_ITER) {\n let changed = 0;\n changed += fixSourceHandleCrossings();\n changed += fixTargetHandleCrossings();\n changed += fixPipeCrossings();\n if (changed === 0) {\n break;\n }\n iterations++;\n }\n const segmentCoords = /* @__PURE__ */ new Map();\n for (const pipe of pipes) {\n const segments = [];\n pipe.tracks.forEach((t) => {\n t.segments.forEach((s) => {\n segments.push({\n edgeIndex: s.edgeIndex,\n segmentIndex: s.segmentIndex,\n trackIndex: t.index,\n from: s.from,\n to: s.to\n });\n });\n });\n segments.sort((a, b) => a.from - b.from);\n const clusters = [];\n if (segments.length > 0) {\n let currentCluster = [segments[0]];\n let clusterEnd = segments[0].to;\n for (let k = 1; k < segments.length; k++) {\n const s = segments[k];\n if (s.from < clusterEnd) {\n currentCluster.push(s);\n clusterEnd = Math.max(clusterEnd, s.to);\n } else {\n clusters.push(currentCluster);\n currentCluster = [s];\n clusterEnd = s.to;\n }\n }\n clusters.push(currentCluster);\n }\n for (const cluster of clusters) {\n const usedTracks = /* @__PURE__ */ new Set();\n cluster.forEach((s) => usedTracks.add(s.trackIndex));\n const trackScores = /* @__PURE__ */ new Map();\n cluster.forEach((s) => {\n const info = getDestInfo(s.edgeIndex);\n trackScores.set(s.trackIndex, (trackScores.get(s.trackIndex) ?? 0) + info.delta);\n });\n const leftTracks = [...usedTracks].filter((t) => (trackScores.get(t) ?? 0) < -1);\n const rightTracks = [...usedTracks].filter((t) => (trackScores.get(t) ?? 0) > 1);\n const neutralTracks = [...usedTracks].filter((t) => Math.abs(trackScores.get(t) ?? 0) <= 1);\n leftTracks.sort((a, b) => (trackScores.get(b) ?? 0) - (trackScores.get(a) ?? 0));\n rightTracks.sort((a, b) => (trackScores.get(a) ?? 0) - (trackScores.get(b) ?? 0));\n const assignCoord = /* @__PURE__ */ __name((trackIndex, coord) => {\n cluster.filter((s) => s.trackIndex === trackIndex).forEach((s) => {\n const effectiveCoord = straightIntraLaneEdges.has(s.edgeIndex) ? pipe.coord : coord;\n segmentCoords.set(`${s.edgeIndex}-${s.segmentIndex}`, effectiveCoord);\n });\n }, \"assignCoord\");\n let leftCount = 0;\n for (const trackIndex of leftTracks) {\n leftCount++;\n assignCoord(trackIndex, pipe.coord - leftCount * TRACK_SPACING);\n }\n if (neutralTracks.length === 0 && usedTracks.size > 0) {\n const bestTrack = [...usedTracks].sort(\n (a, b) => Math.abs(trackScores.get(a) ?? 0) - Math.abs(trackScores.get(b) ?? 0)\n )[0];\n const leftIdx = leftTracks.indexOf(bestTrack);\n if (leftIdx !== -1) {\n leftTracks.splice(leftIdx, 1);\n }\n const rightIdx = rightTracks.indexOf(bestTrack);\n if (rightIdx !== -1) {\n rightTracks.splice(rightIdx, 1);\n }\n neutralTracks.push(bestTrack);\n }\n let neutralAssigned = 0;\n for (const trackIndex of neutralTracks) {\n if (neutralAssigned === 0) {\n assignCoord(trackIndex, pipe.coord);\n } else {\n const dir = neutralAssigned % 2 === 1 ? 1 : -1;\n const magnitude = Math.ceil(neutralAssigned / 2);\n assignCoord(trackIndex, pipe.coord + dir * magnitude * TRACK_SPACING * 0.5);\n }\n neutralAssigned++;\n }\n let rightCount = 0;\n for (const trackIndex of rightTracks) {\n rightCount++;\n assignCoord(trackIndex, pipe.coord + rightCount * TRACK_SPACING);\n }\n }\n }\n for (const [i, e] of edges.entries()) {\n const indices = edgeSegmentIndices[i] ?? [];\n if (indices.length === 0) {\n continue;\n }\n const newPoints = [];\n const src = nodeById.get(e.start);\n const dst = nodeById.get(e.end);\n const { pSrcPort, pDstPort } = portsForEdge(i, src, dst);\n const lines = indices.map((idx) => {\n const s = allRoutedSegments[idx];\n const coord = segmentCoords.get(`${s.edgeIndex}-${s.segmentIndex}`) ?? s.pipe.coord;\n return {\n orient: s.orientation,\n coord,\n from: s.from,\n to: s.to\n };\n });\n newPoints.push(pSrcPort);\n for (let k = 0; k < lines.length; k++) {\n const line = lines[k];\n const prevPt = newPoints[newPoints.length - 1];\n const prevAlong = line.orient === \"vertical\" ? prevPt.y : prevPt.x;\n const prevTrackCoord = line.orient === \"vertical\" ? prevPt.x : prevPt.y;\n const nextLine = lines[k + 1];\n const hasNextLine = k < lines.length - 1;\n if (Math.abs(prevTrackCoord - line.coord) > EPS7) {\n newPoints.push(pointOnLine(line, prevAlong));\n }\n if (hasNextLine && nextLine.orient === line.orient) {\n if (Math.abs(line.coord - nextLine.coord) > EPS7) {\n const junction = line.orient === \"vertical\" ? (prevAlong + nextLine.from) / 2 : sharedLineEndpointCoord(line, nextLine);\n newPoints.push(pointOnLine(line, junction), pointOnLine(nextLine, junction));\n } else if (k === 0 || k === lines.length - 2) {\n newPoints.push(pointOnLine(line, sharedLineEndpointCoord(line, nextLine)));\n }\n } else if (hasNextLine) {\n newPoints.push(pointOnLine(line, nextLine.coord));\n } else {\n const endAlong = Math.abs(line.from - prevAlong) < Math.abs(line.to - prevAlong) ? line.to : line.from;\n newPoints.push(pointOnLine(line, endAlong));\n }\n }\n const last = newPoints[newPoints.length - 1];\n if (Math.abs(last.x - pDstPort.x) > EPS7 || Math.abs(last.y - pDstPort.y) > EPS7) {\n newPoints.push(pDstPort);\n }\n const filtered = [];\n if (newPoints.length > 0) {\n filtered.push(newPoints[0]);\n }\n for (let k = 1; k < newPoints.length; k++) {\n const p = newPoints[k];\n const prev = filtered[filtered.length - 1];\n if (Math.abs(p.x - prev.x) > EPS7 || Math.abs(p.y - prev.y) > EPS7) {\n filtered.push(p);\n }\n }\n e.points = filtered;\n }\n for (const re of edges) {\n const orig = re.__originalEdge;\n if (orig && re.points) {\n orig.points = re.points;\n }\n }\n data.edges = (data.edges ?? []).filter((e) => !e.isLayoutOnly);\n const nodeBoundaryClamp = /* @__PURE__ */ __name((p, node) => {\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const w = node.width ?? 0;\n const h = node.height ?? 0;\n if (w <= 0 || h <= 0) {\n return p;\n }\n const left = cx - w / 2;\n const right = cx + w / 2;\n const top = cy - h / 2;\n const bottom = cy + h / 2;\n if (p.x < left || p.x > right || p.y < top || p.y > bottom) {\n return p;\n }\n const dLeft = p.x - left;\n const dRight = right - p.x;\n const dTop = p.y - top;\n const dBottom = bottom - p.y;\n const minD = Math.min(dLeft, dRight, dTop, dBottom);\n if (minD === dLeft) {\n return { x: left, y: p.y };\n }\n if (minD === dRight) {\n return { x: right, y: p.y };\n }\n if (minD === dTop) {\n return { x: p.x, y: top };\n }\n return { x: p.x, y: bottom };\n }, \"nodeBoundaryClamp\");\n for (const edge of data.edges) {\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n const srcId = edge.start;\n const dstId = edge.end;\n const src = srcId ? nodeById.get(srcId) : void 0;\n const dst = dstId ? nodeById.get(dstId) : void 0;\n if (src) {\n pts[0] = nodeBoundaryClamp(pts[0], src);\n }\n if (dst) {\n pts[pts.length - 1] = nodeBoundaryClamp(pts[pts.length - 1], dst);\n }\n }\n return data;\n}\n__name(routeEdgesOrthogonal, \"routeEdgesOrthogonal\");\n\n// src/rendering-util/layout-algorithms/swimlanes/layoutCore.ts\nfunction getSwimlaneDirection(data4Layout) {\n return data4Layout.direction ?? \"TB\";\n}\n__name(getSwimlaneDirection, \"getSwimlaneDirection\");\nfunction runSwimlaneLayoutCore(data4Layout) {\n const g = toGraphView(data4Layout);\n const nodeGap = data4Layout.config.flowchart?.nodeSpacing ?? 40;\n const layerGap = data4Layout.config.flowchart?.rankSpacing ?? 100;\n const ignoreCrossLaneEdges = data4Layout.config.swimlane?.ignoreCrossLaneEdges ?? true;\n const optimizeRanksByCrossings2 = data4Layout.config.swimlane?.optimizeRanksByCrossings ?? true;\n const automaticLaneOrdering = data4Layout.config.swimlane?.automaticLaneOrdering ?? false;\n const direction = getSwimlaneDirection(data4Layout);\n const { ordered, coordinates } = sugiyamaLayout(g, {\n nodeGap,\n layerGap,\n ignoreCrossLaneEdges,\n optimizeRanksByCrossings: optimizeRanksByCrossings2,\n automaticLaneOrdering,\n direction\n });\n writeBackToLayoutData(g, ordered, coordinates, { nodeGap, layerGap });\n for (const edge of data4Layout.edges ?? []) {\n delete edge.points;\n }\n routeEdgesOrthogonal(data4Layout, direction);\n for (const edge of data4Layout.edges ?? []) {\n if (!edge.curve || edge.curve === \"basis\") {\n edge.curve = \"rounded\";\n }\n }\n postProcessSwimlaneLayout(data4Layout, direction);\n validateSwimlanesLayout(data4Layout);\n return direction;\n}\n__name(runSwimlaneLayoutCore, \"runSwimlaneLayoutCore\");\n\n// src/rendering-util/layout-algorithms/swimlanes/index.ts\nasync function render(data4Layout, svg) {\n const element = svg.select(\"g\");\n markers_default(element, data4Layout.markers, data4Layout.type, data4Layout.diagramId);\n clear3();\n clear2();\n clear();\n clear4();\n prepareLayoutForSwimlanes(data4Layout);\n const transformedData = createEdgeLabelNodes(data4Layout);\n data4Layout.nodes = transformedData.nodes;\n data4Layout.edges = transformedData.edges;\n const { groups } = await createGraphWithElements(element, data4Layout);\n runSwimlaneLayoutCore(data4Layout);\n await adjustLayout(data4Layout, groups);\n}\n__name(render, \"render\");\nexport {\n render\n};\n"],"names":["createGraphWithElements","element","data4Layout","graph","graphlib.Graph","edgesToProcess","config","getConfig2","rootGroups","clusters","edgePaths","edgeLabels2","nodesGroup","nodeElements","hasDom","node","childNodeEl","insertNode","boundingBox","edge","existingEdge","captureNodeSizes","__name","ROUNDED_CORNER_RADIUS","CORNER_EPSILON","ENDPOINT_EPSILON","buildSegmentList","points","segments","i","segmentIntersection","a1","a2","b1","b2","dxA","dyA","dxB","dyB","denom","dx","dy","tA","tB","isHorizontalSeg","seg","findEdgeIntersections","edges","crossings","edgeA","segmentsA","j","edgeB","segmentsB","si","segA","sj","segB","hit","aHoriz","bHoriz","fmt","n","rounded","pointToString","p","getArcSweepFlag","MIN_JUMP_RADIUS","applyMarkerOffsets","out","startOff","markerOffsets","a","b","ang","endOff","emitJump","jump","ux","uy","sweep","style","cx","cy","pre","post","computeRoundedCorner","prev","curr","next","radius","dx1","dy1","dx2","dy2","len1","len2","nx1","ny1","nx2","ny2","dot","clamped","angle","cutLen","rewriteEdgePath","jumps","rawPoints","bySeg","segLen","list","parts","segStartConsumed","corner","segEndStop","upcomingCorner","segJumps","k","gap","half","isStraightPath","d","curveSupportsLineHops","curve","decodeDataPoints","raw","json","parsed","pts","applyLineJumpsToSvg","edgePathsGroup","groupNode","edgeMeta","e","renderedEdges","pathById","escapedId","pathEl","jumpsByEdge","c","renderedEdge","curveHint","currentD","originalStyle","dasharrayMatch","preservedOValueS","preservedOValueE","newD","newLen","onLen","newDasharray","cleaned","adjustLayout","groups","insertCluster","positionNode","nodeById","startNode","endNode","paths","insertEdge","insertEdgeLabel","positionEdgeLabel","lineHopsConfig","jumpStyle","edgeGeometries","path","siteConfig","getConfig","subGraphTitleTotalMargin","getSubGraphTitleMargins","el","edgeLabels","x","y","pos","utils_default","log","terminalLabels","DEFAULT_SWIMLANE_ID","TOP_LANE_TITLE_BAND_HEIGHT","MIN_TOP_LANE_HORIZONTAL_PADDING","topLaneHorizontalPadding","lane","assignTopLaneTitleRect","width","height","contentTop","top","headerBottom","titleHeight","bottom","prepareLayoutForSwimlanes","layout","direction","nodes","looseNodes","defaultLane","toGraphView","src","dst","allNodes","groupNodes","nonGroupNodes","writeBackToLayoutData","g","ordered","coords","opts","nodeMap","layerGap","nodeGap","layerIndex","layer","orderIndex","id","groupBounds","topLevelGroups","group","children","minX","maxX","minY","maxY","child","cw","ch","pad","horizontalPad","verticalPad","w","h","globalMinY","globalMaxY","maxPad","contentHeight","verticalMargin","laneHeight","centerY","sortedLanes","ax","bx","laneIds","centers","baseWidths","contentWidth","count","laneWidths","u","lowerBound","upperBound","baseW","finalWidth","EDGE_LABEL_LOG_PREFIX","createEdgeLabelNodes","data","nodesToAdd","layoutOnlyEdges","sourceNode","targetNode","labelNodeId","labelLane","labelNode","toLabelVirtual","fromLabelVirtual","newNodes","newEdges","EPS","measuredNodeRect","rectFromCenterSize","nodeBoundsInfoFor","measured","samePoint","epsilon","sameX","sameY","isHorizontalSegment","isVerticalSegment","overlapLength","sameAxisSegmentOverlapLength","orthogonalSegmentsForPoints","result","horizontal","vertical","countOrthogonalBends","bends","dedupeConsecutivePoints","point","last","classifyThreeSegmentRoute","p0","p1","p2","p3","segmentBoundsOverlapRect","rect","buffer","segMinX","segMaxX","segMinY","segMaxY","pointInsideRect","rectContainsRect","outer","inner","rectsOverlap","inflateRect","margin","rectOfNodeBounds","portForRectSide","side","buildOrthogonalPortPath","srcSide","dstSide","anchor","srcH","dstH","midX","intX","intY","midY","sameDirSrc2","sameDirDst2","sameDirSrc","sameDirDst","buildSameSideTrackPath","track","collectRealNodeBounds","nodeInfoById","realNodeRects","info","collectNodeRectEntries","labelNodeRects","entry","collectLayoutNodeRects","includeEdgeLabels","getNodePairGeometry","srcId","dstId","srcInfo","dstInfo","segmentHitsAnyRect","rects","excludeIds","shrink","orthogonalSegmentsCross","endpointTolerance","s1H","s1V","s2H","s2V","horiz","vert","hY","hX1","hX2","vX","vY1","vY2","matchesHorizEndpoint","matchesVertEndpoint","sameAxisSegmentsOverlap","segmentConflictsWithAnyEdge","excludeEdge","skipDegenerateOther","other","oa","ob","orthogonalSegmentsStrictlyCross","aVert","bVert","hXmin","hXmax","vYmin","vYmax","strictlyBetween","value","lo","hi","isCollinearIntermediate","cur","simplifyPolylineOnce","changed","orthogonalizePolyline","prevPrev","deduped","simplifyPolyline","work","guard","EPS2","INSIDE_EPS","CORNER_CLEARANCE","endpointContextFor","nodeByIdMap","minPoints","candidate","segmentEnterPoint","outside","inside","r","clipEndpoint","atStart","step","outsideIndex","insideIndex","clipEdgeEndpointsToNodeBoundaries","context","clearStraightEndpointCornerConnections","snapEndpointToBoundary","endpoint","useApproachSide","toTop","firstDistinctAdjacent","endpointIndex","index","cornerClearanceRange","min","max","clampToCornerClearance","intersectRanges","ranges","range","clearanceRangeForSide","terminalSideForSegment","adjacent","yWithin","xWithin","isHorizontalSide","straightClearanceRange","start","end","srcRect","dstRect","clearStraightEndpointCornerAxis","current","cornerClearedEndpoint","moveCollinearEndpointRun","adjusted","horizontalTerminal","clearEndpointCornerConnection","borderSideForSegment","leavesOutward","from","to","collapseOwnBorderStub","side2","snapAndCollapseEndpoints","snapped","straightCleared","prepareEdgeEndpointsForRenderer","input","newPts","duplicated","buildNodeMap","resolveTopLevelGroupId","parentId","topLevelGroupId","parent","groupDepth","depth","boundsForChildren","applyGroupBounds","bounds","recomputeNestedGroupBounds","groupsByDepth","mirrorAxis","axis","contentNodes","mirror","titleRect","applyBtDirectionTransform","applyLrDirectionTransform","x0","y0","titleBandSize","totalWidth","totalHeight","avgWidth","avgHeight","horizontalScaleFactor","newX","newY","laneNodes","childrenByLane","laneId","bucket","laneBounds","globalMinXChild","globalMaxXChild","fullContentWidth","horizontalMargin","bodyWidth","laneWidth","laneLeft","centerX","laneTop","laneBottom","EPS3","MIN_PORT_SPACING","PORT_SHIFT","TRY_DELTAS","portSwapToLShape","route","isHVH","nodePair","collinearX","collinearY","delta","np0","np1","np2","newSrcY","newSrcX","firstSegDegenerate","secondSegDegenerate","firstSegConflicts","secondSegConflicts","collapseShortTerminalStub","labelRects","rawPts","nLast","endPt","penultPt","prevPt","lastDx","lastDy","lastLen","penultDx","penultDy","lastIsHoriz","lastIsVert","penultIsHoriz","penultIsVert","dstCx","dstCy","newPrev","newEnd","approachFromBelow","approachFromLeft","ownSegmentKey","selfSegments","segmentCrossesOtherEdge","oPts","beforePrev","endpointIds","labelId","lw","lh","bestMidX","bestMidY","bestLen","isHoriz","isVert","EPS_LOCAL","MIN_SHARED","segmentsFor","orthogonallyAligned","separateSharedRenderedTerminalLanes","rectIntersect","terminalLaneFor","nodeId","boundary","railEnd","projectedOverlapLength","sameTerminalFace","exactTerminalLaneConflict","nearTerminalLaneConflict","shared","faceSpan","shiftedCandidate","shift","shiftedBoundary","shiftedRailEnd","railEndIsAdjacent2","rest","railEndIsAdjacent","before","previous","laneIsStraightCollinearConnector","startId","endId","startX","startY","endX","endY","shifts","iteration","lanes","fixed","first","second","fixingNearConflict","candidates","aPreservesStraight","bPreservesStraight","nextLane","collapseRedundantRectangularDoglegs","candidateIsSafe","sourceId","targetId","candidateSegments","segment","otherPoints","candidateSegment","otherSegment","withoutDogleg","p4","terminalVerticalDogleg","terminalHorizontalDogleg","p5","verticalDogleg","horizontalDogleg","liftObstacleHuggingSameSideRails","visibleEdges","pointsFor","replacementEdge","replacement","strictCrossingCount","firstSegments","secondSegments","firstSegment","secondSegment","middleRail","middle","blockingRectsFor","rail","candidateByMovingRail","coord","simplified","currentCrossings","blockers","liftTopLaneTitleBandsAboveRails","validTitleRect","topLaneTitleFor","rawDirection","titleWidth","horizontalSegmentIntersectsTitle","topDelta","shiftLeftLaneTitleBandsLeftOfRails","leftLaneTitleFor","verticalSegmentIntersectsTitle","leftDelta","segmentLeft","swapDestinationTerminalTailsToReduceCrossings","replacementPointsFor","replacements","crossingCount","totalBends","sum","terminalTailFor","tailStart","terminal","candidateWithDestinationTail","tail","firstTurn","connector","pathHasNodeHit","pathHasSharedTrack","edgesByDestination","currentBends","bestReplacements","bestCrossings","bestBends","destinationEdges","firstTail","secondTail","firstCandidate","secondCandidate","candidateCrossings","candidateBends","reassignCrossingExternalRailChannels","endpointRectsFor","srcNode","dstNode","externalRailForSegment","endpointRects","leftBound","rightBound","topBound","bottomBound","collectExternalRails","rails","railsInteract","connectedComponents","seen","queue","component","uniqueCoordsFor","coordinateAssignmentsFor","assignments","used","visit","assignment","replacementsForAssignment","draftByEdge","firstChanged","bestDisplacement","candidateDisplacement","shortcutRedundantOrthogonalJogs","pathLength","segmentRunsAlongRectBorder","shortcutCandidatesAt","isVHV","corners","rawCandidates","key","bestEdge","bestPath","bestLength","currentPoints","currentLength","candidateLength","resolveRenderedOrthogonalCrossings","realNodes","sides","outsideTracks","edgeIndex","outwardTracksForSide","outward","tracks","channel","crossingCountBetweenSegments","crossingCountBetweenPaths","crossingSnapshot","pairs","edgeSet","edgeOrder","addEdge","firstPoints","pairCount","crossingCountWithReplacements","currentAffected","pair","replacementAffected","crossingComponents","snapshot","neighbors","firstNeighbors","secondNeighbors","components","endpointIdsFor","pairSearchGroups","componentSet","componentEndpointIds","crossingCountWithSingleReplacement","currentCrossingsByEdge","totalLength","pathHasSegmentConflict","pathSegments","pathHitsNode","pushOrthogonalCandidate","sideIsHorizontal","localTrackForSameSide","addSameSideCandidates","trackSeeds","seed","addHorizontalToVerticalCandidates","xTrack","yTrack","addVerticalToHorizontalCandidates","addHorizontalPairCandidates","yTracks","srcTrack","dstTrack","addVerticalPairCandidates","xTracks","dedupeCandidatePaths","buildCandidatesForSides","base","srcHorizontal","dstHorizontal","addVerticalDepartureOuterTrackCandidates","departure","externalXTracks","externalYTracks","targetYTracks","targetTrack","addHorizontalDepartureOuterTrackCandidates","targetXTracks","terminalPreservingOuterTrackCandidates","candidatePathsFor","srcPort","currentSegmentsByEdge","sharedTrackConflictsFor","baseSegments","conflicts","otherSegments","pairCandidatesFor","crossingCountByEdge","pairCrossingCount","firstEdge","secondEdge","conflictsOnlyWith","conflict","candidatesShareTrack","pairCandidatesAreCompatible","scorePairReplacement","pairScoreIsBetter","best","bestScoreForOptionPair","pairBest","score","bestPairedReplacement","baseBendsByEdge","baseLengthByEdge","optionsByEdge","scoringContext","crossingEdgeSet","options","option","currentEdgeBends","candidateHitsNode","candidateHasSegmentConflict","pairedReplacement","EPS4","MIN_SHARED2","simplifyDetouredEdges","ANCHOR","buildOrthogonalPathCandidates","pathConflictCount","currentEdge","includeIncidentEdges","currentStart","currentEnd","otherStart","otherEnd","otherPts","pathSegment","BEND_THRESHOLD","nearestSideOfRect","pt","dTop","dBottom","dLeft","dRight","bestDist","faceClaims","addFaceClaim","edgeId","claims","eId","faceIsClaimed","ignoreEdgeId","currentCrossingConflicts","currentNonIncidentConflicts","bestCrossingConflicts","dstPort","pathBends","pathCrossingConflicts","refreshSrc","refreshDst","EPS5","MARKER_CLEARANCE_LENGTH","MARKER_CLEARANCE_HALF_WIDTH","markerClearanceRectFor","terminalIndex","tip","x2","y2","normalizeRect","labelOverlapsOwnMarker","visiblePts","startMarker","endMarker","marker","anchorLabelsToPolyline","allEdgeSegments","foreignNodeRects","laneGroups","isGroup","rect2","LABEL_PLACEMENT_BUFFER","LABEL_LANE_MARGIN","LABEL_ENDPOINT_CLEARANCE","labelOverlapsForeignNode","buffered","nr","labelOverlapsForeignEdge","s","labelOverlapsAnything","placedLabelRects","findContainingLane","laneRect","overlapsPlacedLabel","placed","middleSegments","poolBase","labelLongAxis","rankSegments","pool","aLongAxis","bLongAxis","aFits","bFits","firstVisibleSegment","lastVisibleSegment","ALONG_SEGMENT_TS","anchorAtT","t","clamp","pointInsideRectInclusive","placementForAnchor","centeredRect","centeredLane","containingLane","clampedAnchor","clampedRect","distanceAlongSegment","labelClearsTerminalEndpoints","requiredDistance","tryPool","rankedPool","placement","findLaneContainingFallback","requireEndpointClearance","allowForeignEdgeOverlap","chosen","chosenRect","priorIdx","EPS6","MIN_PORT_SPACING2","PORT_SHIFT2","LABEL_CLEARANCE_BUFFER","pairKey","straightenCollinearSiblingDetours","labelDimById","labelClearanceFor","thisEdge","thisSrcId","thisDstId","targetPair","maxHalf","consider","dim","oSrc","oDst","targetSrc","targetDst","dstBelow","dstEast","labelShift","effectiveShift","deltas","shiftedSrc","shiftedDst","nudgeSharedInteriorSubpaths","segmentsFor2","allSegments","hasCrowdedParallelTrack","ownLabelIds","nodeCenter","sourceDetourContextFor","sourceRect","targetRect","verticalSourceDetour","sourceCenter","targetCenter","targetBelow","sourcePortY","stubY","railX","horizontalSourceDetour","targetRight","sourcePortX","stubX","railY","sourceDetourCandidate","direct","detoured","segmentsIntersect","d1x","d1y","d2x","d2y","cross","eps","validateSwimlanesLayout","issues","nodeRects","edgeSegments","edgeStart","edgeEnd","ownLabelId","crossingPairs","pairKey2","overlaps","issue","postProcessSwimlaneLayout","finalizeRenderedEdges","normalizeGraph","incoming","v","buildSuccessorMap","succs","buildSortedSuccessorMap","successors","buildInDegreeMap","indeg","sortedZeroInDegreeNodes","degree","buildPredecessorSuccessorMaps","includeEdge","preds","buildLayersFromRanks","order","rankOf","maxRank","layers","topoSortIfAcyclic","adj","buildLayerIndex","m","countInversions","values","tmp","left","right","mid","inversions","removeCycles_DFS","gn","arr","color","reversed","dfs","nodesSorted","toReverse","acycEdges","buildTopLaneMap","cache","resolve","createTopLaneResolver","topLaneMap","buildTopLaneOrder","resolveTopLaneOrder","preferredOrder","sourceOrder","sourceLaneIds","resolved","PRECISION","LAYERING","COORDINATES","buildDrivingTree","laneOf","rankHint","topoOrder","topoIndex","idx","chooseParent","rootSet","roots","ta","tb","adjacency","buildAdjacency","adjacencyList","set","componentOf","assignComponents","blocks","computeBlocks","nodeBlocks","block","preorder","postorder","walk","root","ctx","laneNode","laneA","laneB","sameLaneA","sameLaneB","rankA","rankB","idxA","idxB","componentId","stack","discovery","low","edgeStack","time","popBlock","computeSubtreeCrossCounts","tree","indexOf","parentIdx","currentIdx","childList","childIdx","maxLog","up","lcaIndex","aIdx","bIdx","diff","upA","upB","ownCounts","ru","rv","upperIdx","lowerIdx","lca","crossCounts","mergeInto","target","source","visited","accumulator","childMap","parentLayer","map","childLayer","annotateMinimumLayers","minLayer","annotate","minL","compareByRankThenId","childMin","ra","rb","emitNodesInTreeOrder","orderChildren","emitted","emit","deduplicateLayers","createChildOrderer","future","present","crossMap","ca","cb","ma","mb","item","buildMultitreeLayerOrder","rootsSorted","countCrossingsBetweenAdjacent","upper","lower","upperSet","lowerSet","li","vs","totalCrossings","expanded","rUpper","rLower","L","optimizeRanksByCrossings","initialRank","maxPasses","pass","nodesByRank","lb","old","trialLayers","adjustCrossLaneSources","topLaneOf","laneV","outEdges","hasSameLaneSucc","crossLaneCount","laneDst","crossLaneIncoming","hasSameLanePred","laneSrc","newRank","assignLayers_LongestPath","gAcyclic","compact","incAll","inc","laneU","mx","assignLayers_Gravity","revOrder","clampFeasible","desired","ub","iters","relaxOrder","nodeOrder","ps","ss","predAvg","succAvg","it","forwardChanged","backwardChanged","topoSortByGenerationIfAcyclic","frontier","nextFrontier","assignLayers_LaneAwareCompact","nextFree","edgeWeight","nf","makeProperLayering","layering","l","dummy","dummySeq","addDummyAt","dn","edgesSorted","rU","rV","lastIndex","graphWithDummies","median","barycenter","acc","neighborPositionsFor","targetNodes","fixedIndex","neighborPositions","currentOrderTieBreak","currentLayerIndex","ia","ib","countCrossingsBetweenAdjacent2","upperIndex","lowerIndex","sortByHeuristic","sa","sb","reorderLayer","fixedLayer","targetLayer","laneOrder","currIndex","byLane","nodesInLane","sorted","nullNodes","nid","bc","bestIdx","rid","rBc","transposeImprove","layerSet","nextSet","edgesIn","edgesOut","crossingScore","improved","bestScore","nextScore","orderLayers","gWithDummies","assignCoordinates","laneGap","isHorizontal","getNode","getWidth","getHeight","laneOrderGlobal","layerHeights","extraLayerGaps","thisLayerMaxWidth","nextLayerMaxWidth","thisLayerMaxHeight","nextLayerMaxHeight","normalSpacing","requiredSpacing","extraNeeded","lanesUsedSet","hasNullLane","lanesUsed","laneOrderColumns","perLane","nullIds","ids","total","totalNull","widths","cursor","yOffset","layerH","extraGap","byRef","chainEdges","ref","involved","vid","AUTOMATIC_LANE_ORDERING_RESTARTS","hashString","hash","mulberry32","state","deterministicShuffle","shuffled","random","sourceDistance","sourceIndex","distance","laneArrangementCost","weights","position","cost","weight","ai","bi","buildWeightedLaneEdges","existing","greedySwitch","startOrder","sweeps","maxSweeps","nextCost","isBetterCandidate","seedForRestart","restartIndex","weightSignature","optimizeTopLaneOrder","restarts","sugiyamaLayout","ignoreCrossLaneEdges","optimizeRanksByCrossings2","g0","cycleRes","properLayering","coordinates","EPS7","NODE_PADDING","HORIZONTAL_PIPE_MARGIN","VERTICAL_PIPE_MARGIN","ROUTING_MARGIN","ANCHOR_OFFSET","TRACK_SPACING","chooseOrthogonalSide","fallback","absDx","absDy","sharedLineEndpointCoord","line","nextLine","pointOnLine","along","routeEdgesOrthogonal","originalEdges","oe","laneByNodeId","pipes","isLR","assignLane","obstacles","padding","getOrAddPipe","orientation","spanMin","spanMax","pipe","portForSide","getOrthogonalPort","isSource","allRoutedSegments","edgeSegmentIndices","straightIntraLaneEdges","CROSSING_PENALTY","crossingPenalty","edgeIdx","isVertical","penalties","routingOrder","srcLane","dstLane","crossLane","aDist","bDist","isSegmentBlocked","excludeStart","excludeEnd","obs","portGroups","incidentEdgeTotals","determineSide","sideInfoByIdx","preferenceStrength","secondarySide","sourceSideGroups","sideLoad","loadKey","secondary","primaryLoad","secondaryLoad","isDiamondNode","shape","inSidesByNode","inSides","srcKey","dstCoord","dstKey","srcCoord","portOffsets","MIN_PORT_SPACING3","role","sideLength","effectiveLength","spacing","startOffset","offset","offsetKey","edgeHasLabelNode","faceHasLabelNode","applyPortOffset","basePort","portsForEdge","sideInfo","srcTarget","dstTarget","pSrcPort","pDstPort","srcOffset","dstOffset","srcPortSide","dstPortSide","pSrcAnchor","pDstAnchor","srcPortIsVertical","dstPortIsVertical","isBottom","isRight","isPointInObstacle","excludeNodeIds","obstacleDetour","port","opposite","portIsVertical","leavesPositiveSide2","leavesPositiveSide","goDown","srcHandleWaypoints","srcCheck","detour","gapY","gapX","dstHandleWaypoints","dstCheck","hpMargin","anchorsSameX","anchorsSameY","hasPortOffset","srcFaceTotal","dstFaceTotal","faceContested","srcIncidentTotal","dstIncidentTotal","contestedFaceHasLabel","srcContestAllowsCenteredStraight","dstContestAllowsCenteredStraight","fastPathOrientation","fastPathCoord","fastPathFrom","fastPathTo","fastPathPipe","srcPipe","dstPipe","bbMinX","bbMaxX","bbMinY","bbMaxY","pathMinX","pathMaxX","pathMinY","pathMaxY","hMargin","vMargin","hPipes","vPipes","getKey","startKey","endKey","gScore","cameFrom","arrivalDir","openSet","openList","foundPath","checkSegmentBlocked","cornerHV","seg1HV_blocked","seg2HV_blocked","pathHV_blocked","cornerVH","seg1VH_blocked","seg2VH_blocked","currKey","currPt","sortedVPipes","vIdx","hPipesSorted","hIdx","neighbor","nKey","dist","penalty","dirPenalty","destDx","destDy","moveDx","moveDy","bendPenalty","currentDir","moveDir","stepCost","tentativeG","wentRight","wentLeft","pathX","detourObstacles","visualMaxX","obsCenterX","visualRight","visualMinX","visualLeft","findBestReturnY","detourX","goingDown","relevantObs","obsInXRange","obsInYRange","filteredObs","obsAtDetourX","bestY","trySimplifyWithDetourX","corner1","corner2","corner3","seg1Blocked","seg2Blocked","seg3Blocked","seg4Blocked","simplified2","fullPoints","C","B","A","signAB","signAC","dir1","dir2","rSeg","segmentsOverlap","s1","s2","trySwapSegmentsAcrossTracks","t1","t2","canS1GoT2","canS2GoT1","createNewTrack","moveSegmentToTrack","trackIdx","oldTrack","moveSegmentChainToTrack","indices","getAdjacentSegmentsAlongEdge","idxInList","haveAnyCrossing","findAvailableTrack","segmentsConflict","adj1","adj2","resolveTrackConflict","move","avail","resolveHandleConflicts","handles","h1","h2","destInfoCache","getDestInfo","info2","dest","candidateA","candidateB","deviation","fixSourceHandleCrossings","edgesBySource","getEdgeDistance","grp","infoA","infoB","distA","distB","lenA","lenB","distA2","distB2","ei","fixTargetHandleCrossings","edgesByTarget","getDist","scoreA","scoreB","fixPipeCrossings","pipeSegments","ix","iterations","MAX_ITER","segmentCoords","currentCluster","clusterEnd","cluster","usedTracks","trackScores","leftTracks","rightTracks","neutralTracks","assignCoord","trackIndex","effectiveCoord","leftCount","bestTrack","leftIdx","rightIdx","neutralAssigned","dir","magnitude","rightCount","newPoints","lines","prevAlong","prevTrackCoord","hasNextLine","junction","endAlong","filtered","re","orig","nodeBoundaryClamp","minD","getSwimlaneDirection","runSwimlaneLayoutCore","automaticLaneOrdering","render","svg","markers_default","clear3","clear2","clear","clear4","transformedData"],"mappings":"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","x_google_ignoreList":[0]}
|